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(スタッシュ)とは、「作業中の変更を一旦、一時的な場所に棚上げしておく」機能のことです。

手順:

  1. 現在の未コミットの変更を保存する。
  2. git stash push -m "作業Aの中間点"
  3. 作業Bに取り組む(ここでクリーンな状態になる)。
  4. 作業Bが完了した後、一時保管した作業Aを取り戻す。
  5. git stash pop

この仕組みを使うことで、「切り替えたいけどコミットするほどではない」という曖昧な状態の変更を安全に管理できます。

3. 厄介な「コンフリクト(競合)」解決術

複数のブランチで同じファイルを同時に編集した結果、Gitがどちらを採用すべきか判断できず「マージコンフリクト」が発生することがあります。これはエラーではなく、「あなたが手動で決めてほしい」というサインです。

具体的な手順:

  1. コンフリクトが発生したファイルを開きます。
  2. エディタ内で以下のマーカー(目印)を見つけます。これらが競合している箇所です。
  3. <<<<<<< HEAD (現在のブランチの内容) [コードA] ======= (区切り線) [コードB] `>>>>>>> feature/branch-name` (取り込みようとしているブランチの内容)
  4. 開発者は、この3つのブロック全体を見ながら、「最終的にどういう形にしたいか」を判断し、手動で適切なコード(A, Bの組み合わせや新しいコードC)に編集します。マーカーは全て削除してください。
  5. ファイルが綺麗になったらステージングエリアに追加します。
  6. git add [コンフリクトを解決したファイル名]
  7. マージコミットを完了させます。
  8. git commit -m "Resolve merge conflict"

まとめ

Gitは強力なツールですが、そのコマンドの挙動には常に「破壊的な選択肢」と「安全な選択肢」が存在します。もし、「この操作がデータを失う可能性があるか?」という疑念を持ったら、一度立ち止まり、`git reflog` の履歴を確認するか、最も安全性の高い `git revert` を使う癖をつけることが、トラブルシューティングの第一歩となります。

これらのコマンドを理解し、いつどのコマンドを使うべきかを把握すれば、Gitはあなたの最強の武器となるでしょう。

コメント

このブログの人気の投稿

モノレポ vs マルチレポ 徹底比較

ESP32 Wi-Fi 接続ガイド

KiCadでPCB作成入門