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