Gitトラブル対処法:commit、reset、revertの違いを徹底解説するガイド
致命的なバグ、コミット前の後悔。Gitでつまずいた時の「救命」トラブルシューティングガイド
Gitは開発における最強の味方ですが、その強力さゆえに、「あれ?戻せない?」「このファイルどうした?」といった思わぬ落とし穴にはまることがあります。本記事では、多くの開発者が一度は経験する、コミットやブランチ操作に関する「事故」をリカバリーするための実戦的な対処法をご紹介します。
1. 「やりたいことをUndoしたい」時の2つの選択肢:reset vs revert
最も混乱しやすいのが、「間違ったコミットを取り消す」操作です。この場合、使用するコマンドによって結果が全く異なるため、目的を明確にすることが重要です。
Scenario A: コミット自体を存在しなかったことにしたいとき(開発途中のデータ削除など)
まだ共有しておらず、純粋にローカルの履歴から取り除きたい場合に使用します。これはコミットされた内容そのものを巻き戻すのではなく、「コミットという記録」を消去します。
git reset --hard は非常に強力なコマンドです。実行すると、指定した時点以降のローカルでの未コミット・コミット済みの作業は全て消滅しますので、本当に元に戻して問題ないか二度確認してください。基本的な使い方:
git reset --hard [ターゲットのコミットID]
Scenario B: 過去の変更を無効化し、履歴に残したいとき(公開済みバグ修正など)
すでにリモートリポジトリにプッシュしてしまい、「この変更は元に戻すべきだった」という場合がこれにあたります。`revert` はその名の通り「取り消す (revert)」動作を行います。変更自体は撤回しますが、その記録(コミット)として履歴に残るため、チームでの作業において安全性が高い方法です。
git revert [対象のコミットID]
2. 「未コミットだが重要なデータ」を一時保管する方法:Stashing
今まさに進めている機能Aが中途半端で、急遽、別のバグ修正Bに取り組まなければならない状況はよくあります。しかし、ファイルを全てコミットするほどではない...そんな時に役立つのが git stash です。
Stash(スタッシュ)とは、「作業中の変更を一旦、一時的な場所に棚上げしておく」機能のことです。
手順:
- 現在の未コミットの変更を保存する。
- 作業Bに取り組む(ここでクリーンな状態になる)。
- 作業Bが完了した後、一時保管した作業Aを取り戻す。
git stash push -m "作業Aの中間点"
git stash pop
この仕組みを使うことで、「切り替えたいけどコミットするほどではない」という曖昧な状態の変更を安全に管理できます。
3. 厄介な「コンフリクト(競合)」解決術
複数のブランチで同じファイルを同時に編集した結果、Gitがどちらを採用すべきか判断できず「マージコンフリクト」が発生することがあります。これはエラーではなく、「あなたが手動で決めてほしい」というサインです。
具体的な手順:
- コンフリクトが発生したファイルを開きます。
- エディタ内で以下のマーカー(目印)を見つけます。これらが競合している箇所です。
- 開発者は、この3つのブロック全体を見ながら、「最終的にどういう形にしたいか」を判断し、手動で適切なコード(A, Bの組み合わせや新しいコードC)に編集します。マーカーは全て削除してください。
- ファイルが綺麗になったらステージングエリアに追加します。
- マージコミットを完了させます。
<<<<<<< HEAD (現在のブランチの内容)
[コードA]
======= (区切り線)
[コードB]
`>>>>>>> feature/branch-name` (取り込みようとしているブランチの内容)
git add [コンフリクトを解決したファイル名]
git commit -m "Resolve merge conflict"
まとめ
Gitは強力なツールですが、そのコマンドの挙動には常に「破壊的な選択肢」と「安全な選択肢」が存在します。もし、「この操作がデータを失う可能性があるか?」という疑念を持ったら、一度立ち止まり、`git reflog` の履歴を確認するか、最も安全性の高い `git revert` を使う癖をつけることが、トラブルシューティングの第一歩となります。
これらのコマンドを理解し、いつどのコマンドを使うべきかを把握すれば、Gitはあなたの最強の武器となるでしょう。
コメント
コメントを投稿