git push --force-with-lease で間違った(必要のない)コミットをなかったことに

git操作中、例えば入れたくないファイルをgit addしてcommitしてpushしてしまった。

※コミット前に、diff --stagedで確認するのはもちろんですが。

そういうときに、git push --force-with-leaseを使用して、コミット自体をなかったことにしようという話です。

Git上で、そのファイルを無かったことにするには、
①gitignoreに追記して、再度プッシュする
②git push --force-with-leaseでコミットを無かったことにする。(履歴からも消せる)

ただFBCにて、
> 戻すコミットを積むより、その対応をしたコミットを消した方がいいです。


とのことだったので、ちょうどいい機会なので挑戦しました。

確認

f:id:Barnum:20211121165847p:plain


git rebase -i HEAD~5

これを打つと、最新のコミット5件(数字が最新のコミットn件を表す)が編集出来るようになります。
※ここで注意点なのですが、編集する必要のないものを含まないように、数字は調整されてください。
例えば、削除しないものでも、このあとの編集作業を行うと、自分も共同編集者としてコミット履歴にのこり、それはそれで面倒くさくなってしまいます。

fjord-books_app % git rebase -i HEAD~5
hint: Waiting for your editor to close the file...
pick f35a5a0 git fetchは不要なのでREADMEから削除
pick f09865d Update README
pick 07e7de3 Implement kaminari
pick 06dfe90 Implement page method
pick f712266 Japaneseize kaminari

今回は、これを消したいのです。
★pick f712266 Japaneseize kaminari

vimでの操作

i を打つと文字が打てるようになります。

pick f35a5a0 git fetchは不要なのでREADMEから削除
pick f09865d Update README
pick 07e7de3 Implement kaminari
pick 06dfe90 Implement page method
drop f712266 Japaneseize kaminari

編集
drop f712266 Japaneseize kaminari
これが削除を意味します。

esc : wq 
を打ちます。

これで不要なコミットが消えました。


Successfully rebased and updated refs/heads/my-pagination.

変更分をpushする。

fjord-books_app % git poh --force-with-lease
Enumerating objects: 31, done.
Counting objects: 100% (31/31), done.
Delta compression using up to 4 threads
Compressing objects: 100% (18/18), done.
Writing objects: 100% (21/21), 2.17 KiB | 370.00 KiB/s, done.
Total 21 (delta 14), reused 4 (delta 3)
remote: Resolving deltas: 100% (14/14), completed with 8 local objects.
To https://github.com/shugoStr/fjord-books_app.git
+ f712266...c5c4a69 HEAD -> my-pagination (forced update)


結果

f:id:Barnum:20211121170016p:plain

git push --force-with-lease とはなんなのか?


PUSHの際、ローカルrefとリモートrefを比較しローカルが最新か判定し、最新でなければPUSHが失敗するというもの。
※ただし、直前にfetchしているとPUSHが成功してしまうので注意


他人の変更を上書きするおそれのある git push --force でなく、最後に fetch したタイミング以降に他人が push していたら失敗する git push --force-with-lease を使う方が良い。




参考記事

qiita.com


ohbarye.hatenablog.jp

ruby version 変更

ゴール

インストールされていない、Rubyの3.0.1をインストールする。

# インストールされているバージョン確認
FJORD % rbenv versions
  system
  2.5.8
  2.6.5
  2.7.2
* 3.0.2 (set by /Users/myMBP/.rbenv/version)

# バージョン指定にて、インストール
FJORD % rbenv install 3.0.1
Downloading openssl-1.1.1l.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1
Installing openssl-1.1.1l...
Installed openssl-1.1.1l to /Users/myMBP/.rbenv/versions/3.0.1

Downloading ruby-3.0.1.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.1.tar.gz
Installing ruby-3.0.1...
ruby-build: using readline from homebrew
Installed ruby-3.0.1 to /Users/myMBP/.rbenv/versions/3.0.1


# インストール確認
FJORD % rbenv versions     
  system
  2.5.8
  2.6.5
  2.7.2
  3.0.1
* 3.0.2 (set by /Users/myMBP/.rbenv/version)


# グローバルでRubyのバージョン変更(PJ単位でなく、PC単位での一括変更)
FJORD % rbenv global 3.0.1 

# 変更されているかを確認
FJORD % rbenv versions    
  system
  2.5.8
  2.6.5
  2.7.2
* 3.0.1 (set by /Users/myMBP/.rbenv/version)
  3.0.2

Ruby
FJORD % ruby -v
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin21]

以上です。

参考

グローバルとローカルの挙動の違いについて

mogulla3.tech

rails server でちゃんと終了できていなかった時のこと。

はじめに

現在FBCにて、Railsのプラクティスにいよいよ取り組んでいます。
Railsの教科書にチャレンジしていますが、その中で起きたエラー内容についてちょっと調査してみました。

tatsu-zine.com

エラー:

f:id:Barnum:20211110192418p:plain
エラー
NameError in BooksController#show
uninitialized constant Book::PictureUploader
Extracted source (around line #2):
1
2
3
              
class Book < ApplicationRecord
  mount_uploader :picture, PictureUploader
end

Rails.root: /Users/myMBP/work/sandbox/my_web_apps/books_app

Application Trace | Framework Trace | Full Trace
app/models/book.rb:2:in `<class:Book>'
app/models/book.rb:1:in `<main>'
app/controllers/books_controller.rb:62:in `set_book'
Request
Parameters:

uninitialized constant とは

エラー内容:
qiita.com

> Book::PictureUploader
を定義していない旨のエラーが出ていました。

ただし、本を写経していたので、タイポでも無い限り間違いであるはずがないと確信していたので、どうしたものかと悩んでいました。
※本自体は、他の受講生が多数クリアしていたので。

エラー名で検索してみる

下記の様に命名規則違反でも、当エラーが発生するようです。

【Rails】uninitialized constant UsersController というエラーが出たときの対処法 | FREE SWORDER


またジャストのエラー文言かぶりでしたが、こちらでも解消せず。

Railsチュートリアル中にNameError: uninitialized constant Micropost::PictureUploaderが出た時の対処法 - Qiita


spring stop
spring ってなんなんだ
> Spring は Rails アプリケーションの preloader(プリローダー)の gem です。Rails アプリケーションをバックグラウンドで走らせたままにしておくことにより(pre + load = 前もってロードしておく)、bin/rails や bin/rake コマンドの2回目以降の起動時間が短縮されます。


qiita.com

原因

そもそもサーバー起動時に、下記画像の文言が出ており、


f:id:Barnum:20211110200723p:plain

サーバーの停止がうまくいっていなかった模様。
そこでサーバー停止について、調べる。


qiita.com


> cat tmp/pids/server.pid

.pidふぁいるとは


f:id:Barnum:20211110195404p:plain


そして、killしてから立ち上げてみる。


f:id:Barnum:20211110200824p:plain


成功!

じゃあ、なんでサーバー起動が正常でない時のエラーがモデルについてのエラーなのか

uninitialized constant とは何なのかに立ち返る。

qiita.com


> クラスの読み込みが上手くいっていない。
rubyファイルを実行した時にrails sした直後は実行時点でクラスを読み込んでいないので、app/models/user.rbファイルを探しにいく。
app/models/user.rbというファイルがあれば、ファイルをオープンしてクラスを読み込む
しかし、app/models/user.rbというファイルがない、ファイルの中にUserというクラスが定義されていない場合、uninitializedエラーが起きる

ここでいう、user.rbが、book.rbである。
Railsには、標準でPumaというWebサーバが付随しています。
サーバーからアクセスするも→book.rbが読み込めない→ファイルの定義間違えてない?というエラーになる。


参考記事:

サーバー立ち上げの時の文言をしっかり見ていたら、
ここにたどり着けたはず。いつも勉強になります。

k-koh.hatenablog.com


しっかりエラーハンドリングまで載っているサイト。
大変参考になります。

pikawaka.com

git checkout -b のあとにやること

ブランチ作成あとにやること、ToDo

まずは、ローカルに作成と移動。

git checkout -b develop_memo-app
Switched to a new branch 'develop_memo-app'


確認する。

sinatra % git b -a
  Develop
* develop_memo-app ★登録したい
  develop_tmp
  main
  remotes/origin/Develop
  remotes/origin/develop_tmp
  remotes/origin/main


リモートへの登録

git poh

【github】ローカルでブランチ作成して、リモートにプッシュして反映させるまで

実行コマンド

新規ブランチ作成&移動
1. git co -b

ローカル確認
2. git b -a

リモートへプッシュ
3. git poh

  • >git push origin HEAD

リモート確認
4. git b -a

実際の流れ

sinatra % git b -a
Develop_1
develop
develop_db
develop_tmp

main

remotes/origin/Develop_1
remotes/origin/develop
remotes/origin/develop_db
remotes/origin/develop_tmp
remotes/origin/main
sinatra %
sinatra %
sinatra % git co -b develop_memo
Switched to a new branch 'develop_memo'
sinatra % git b -a
Develop_1
develop
develop_db

develop_memo

develop_tmp
main
remotes/origin/Develop_1
remotes/origin/develop
remotes/origin/develop_db
remotes/origin/develop_tmp
remotes/origin/main
sinatra % git push origin HEAD
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'develop_memo' on GitHub by visiting:
remote: https://github.com/shugoStr/memo-app/pull/new/develop_memo
remote:
To github.com:shugoStr/memo-app.git
* [new branch] HEAD -> develop_memo

【github】Githubのウェブ上で切り出したブランチをリモート・ローカルに反映させる

※git bは、git branchのことです。

状況

Github.comのウェブ上で新規ブランチを作成したとする。

develop_tmp ★これが今回反映したいブランチ


f:id:Barnum:20211023172332p:plain

ウェブ上で作成しただけでは、リモートブランチへの反映はない。
(追跡ブランチ)

リモートブランチに反映させる

git fetch
で反映させる。

sinatra % git fetch              
From github.com:shugoStr/memo-app
 * [new branch]      develop_tmp -> origin/develop_tmp

確認する。

sinatra % git b -a                 
* Develop_1
  Develop_1_tmp
  Develop_main
  develop_db
  main
  remotes/origin/Develop
  remotes/origin/Develop_1
  remotes/origin/develop_db
  remotes/origin/develop_tmp ★ここ
  remotes/origin/main

ローカルに反映させる。

git checkout hoge

sinatra % git checkout develop_tmp
Branch 'develop_tmp' set up to track remote branch 'develop_tmp' from 'origin'.
Switched to a new branch 'develop_tmp'

sinatra % git b -a                
  Develop_1
  Develop_1_tmp
  Develop_main
  develop_db
* develop_tmp ★ここ
  main
  remotes/origin/Develop
  remotes/origin/Develop_1
  remotes/origin/develop_db
  remotes/origin/develop_tmp
  remotes/origin/main

webだと作成自体は便利ですが、
反映などで結局必要なのでどちらがいいのでしょうか。
ブランチの切り出しの間違いは、前者のwebからがミスが少なそうです。

createdb のエラー対応

実行コマンド:

createdb hoge


エラー内容:

error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory
	Is the server running locally and accepting connections on that socket?

解決策:

sinatra % brew services start postgresql
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
sinatra % brew services stop postgresql
Stopping `postgresql`... (might take a while)
==> Successfully stopped `postgresql` (label: homebrew.mxcl.postgresql)
sinatra % brew services restart postgresql
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)


理由:


> createdb: could not connect to database template1: could not connect to server:
No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
> これは、サーバが起動していないか、createdbが想定している状態でサーバが起動していないかを示しています。 こちらも、インストール手順を点検するか管理者に相談し

=>サーバーをスタートさせる。または、リロードして設定の反映を完了させる。


参考:

www.postgresql.jp


rcmdnk.com