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にて、
> 戻すコミットを積むより、その対応をしたコミットを消した方がいいです。
とのことだったので、ちょうどいい機会なので挑戦しました。
確認
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)
結果
git push --force-with-lease とはなんなのか?
PUSHの際、ローカルrefとリモートrefを比較しローカルが最新か判定し、最新でなければPUSHが失敗するというもの。
※ただし、直前にfetchしているとPUSHが成功してしまうので注意
他人の変更を上書きするおそれのある git push --force でなく、最後に fetch したタイミング以降に他人が push していたら失敗する git push --force-with-lease を使う方が良い。
参考記事