gitのやらかし、その対処法と小技集
社内システム開発部の黒瀬です。
gitは便利ですね。エンジニアの方であれば、毎日のようにcommitしてpullして、時々resetやrebaseして…と活用されているのではないでしょうか。
ただ、うっかり操作を間違えると大変な目に遭うことも少なくありません。gitあるある、というやつです。
本記事では、「やらかし」やその一歩手前の困りごとの対処法や、「知っててよかったな」「便利だな」と思った小技などをまとめてみました。
間違えてgit reset --hard
履歴からコマンド実行しててうっかり…
git reflog
まだ大丈夫です。だいたいreflogに残っています。
git reset --hard <戻したいHEAD>
戻れます。
git pullしたらローカルが大変になった
思ったよりたくさんコンフリクトした、など。時を戻したい場合は
git reset --hard ORIG_HEAD
ORIG_HEAD = pullする前の世界。
pullだけでなく、rebase/merge/resetなどで失敗した直後、なかったことにしたい時にも使えます。
前後不覚になった
そもそもこのブランチ、何が入ってる?今まで何があった?私は何をした?
もうわからなくなった時は
git log --oneline --graph
CUIでもコミットログを見やすい感じにできます。
コミットログを見て一旦落ち着きましょう。
tigを入れるともっと見やすいのでtigもおすすめです。
stash迷子
git stash
便利ですね。なんと、1ファイルだけ待避もできます。
git stash push path/to/file
便利ですが、乱用するとすぐ「さっきのあの変更どうしたっけ…」状態になります。私だけでしょうか。
溜めすぎたので整理したいとき
git stash list
これでstashしたもの一覧を出して、
git stash show stash@{2}
git stash drop stash@{2}
stashのインデックスを指定して変更したファイルを確認、不要なものはdropで削除。
git stash show -p stash@{2}
-p オプションをつければ、ファイルの変更差分も見られます。
そもそも迷子になりたくないとき
git stash push -m "comment"
-m オプションでコメント付きでstashすると良いですね。
ローカルブランチがもうぐちゃぐちゃになった
全部忘れてリモートに合わせる
git fetch origin
git reset --hard origin/{ブランチ名}
すっきりしますが、ローカルの変更は消えるので注意しましょう。
ローカルの変更は残してすっきりしたい
①未コミットファイルがある時は退避
git stash push -u -m "comment"
-u オプションをつけると、未追跡ファイルも一緒に退避できます。
②今の状態をブランチにしておく
git branch rescue-20260120
これでコミットも残せる。
③git reset --hard/{ブランチ名} した後、stashや必要なコミットを取り込む
stashしたものを復活させたり
git stash list
git stash apply stash@{0}
残しておいたrescue-20260120ブランチのコミットを取り込みたい時は
git cherry-pick {コミットID}
cherry-pickで欲しいものだけ反映します。
rebase、resetなどで歴史を変えたけどremoteにpushしたい
リモートブランチへの強制pushはできるだけやりたくないけど、あわよくば…という時は
git push --force-with-lease
--force-with-leaseオプションをつけると、ローカルとリモートを比較して、ローカルが最新の場合のみpush、そうでなければ失敗してくれます。他の人のコミットを吹き飛ばしてしまうことがなくなります。
もりもりコード書いた/直したけど、ファイルの一部だけコミットしたい
git add -p
同じファイルの中で、選別しながらaddできます。慣れると戻れない。
「git操作は怖い」と常々思いますが、やらかしてしまっても、戻る道はだいたい残っています。
また、便利な機能や小技を知っていくと、日々の開発が少しずつ進めやすくなるのと、(多分)少しずつgitが好きになっていくかも知れません。
いつかどこかでgitの操作に少し迷ったとき、この記事がほんの少しでも参考になれば幸いです。
最後までお読みくださりありがとうございました。
Discussion