【Git】特定のコミットに戻したい

2023年12月14日

Github DesktopでGUI管理している時に、操作によって過去のコミット情報が消える、リポジトリも戻ってしまった場合にその作業自体を取り消して復活させる方法についてになります

コミットの並び替えを実行したが、コンフリクト多発したので、無かったことにしたい

Github DesktopのGUI画面でhistory(履歴)に残っている分にはいいのですが、表示されていない場合でもGit内部ではコミット履歴が残っています
次の作業でその履歴情報を使ってコミットを戻すことを行います

コマンド入力するプロンプトウィンドウの表示

Github desktop のメニューから選択します

Gitのインストールが促される場合は、それに従いインストールします

reflogの確認

reflogは非常に便利なコマンドです

以降、ターミナルでの作業になります

Gitでコミットの並び替え(例えば rebase を使用した場合)を無かったことにしたい場合は、git reflog を使用して以前の状態に戻すことができます。以下の手順を試してみてください。

最初に、git reflogを実行してGitの履歴を確認します。これにより、HEADが過去にどのコミットを指していたかの一覧が表示されます。

入力するコード

git reflog

実行結果

6de8007 HEAD@{1}: rebase (pick): URxxxx後
c4e50d5 HEAD@{2}: rebase (pick): Sqxxxxxxxニメーション追加
44af376 HEAD@{3}: rebase (pick): Sqxxxxxxxション修正
b32942d HEAD@{4}: rebase (pick): Squxxxxxxxxクオン時に敵の協調表示追加
0d94d85 HEAD@{5}: rebase (pick): ゲーxxxxxx限付きで実装
2f4d1e4 HEAD@{6}: rebase (pick): Lookxxxxxxの変更機能の実装
2de3d92 HEAD@{7}: rebase (pick): 一時保存

...以下略

適切なコミットを見つける

git reflog の出力から、rebaseや並び替えを行う前の状態に相当するコミットを探します。通常、このコミットは「rebase」や「commit」などの操作が表示される前の状態です。

...抜粋
9a8fe8b HEAD@{20}: rebase (pick): ダッxxxxxxxの実装
e0a139d HEAD@{21}: rebase (pick): 自xxxxxxxんに変更
28bc6c5 HEAD@{22}: rebase (pick): PLAxxxxxxxのRemove
c7ecee9 HEAD@{23}: rebase (start): checkout 3d6c6800edec4xxxxxxxe61afb539edd^
ebe904c (main) HEAD@{24}: commit: PLAxxxxxxxemove
5df1cf4 HEAD@{25}: commit: シーンの保存
c838ea0 HEAD@{26}: commit: 一時保存
6a4ff5c HEAD@{27}: commit: Mixamxxxxxxxョン複数追加(Runなど)
3c0391d HEAD@{28}: commit: メッセxxxxxxxドウのUI追加
169b8a1 HEAD@{29}: commit: NPCのxxxxxxxImageの幅を合わせるように変更
b42742f HEAD@{30}: commit: PushBuxxxxxxxョンの「Show」と「Out」を作成
0f1ff2d HEAD@{31}: commit: NPCxxxxxxx動を修正

戻したい状態のHeadの確認

目的のコミットを見つけたら、そのコミットのID(例: HEAD@{2})を使用して、以下のコマンドを実行します。

git reset --hard HEAD@{N}

ここで、Ngit reflogで見つけたコミットの番号です。

上記のサンプルで「シーンの保存」のコミットまで戻したい場合は、Nは25になっています

5df1cf4 HEAD@{25}: commit: シーンの保存

ここに戻すので、

git reset --hard HEAD@{25}

実行後の結果

Updating files: 100% (2405/2405), done.
HEAD is now at 5df1cf4 シーンの保存

注意点として、git reset --hardは現在の作業ディレクトリとインデックスの状態を完全に消去し、指定したコミットの状態に戻します。したがって、この操作を行う前に、重要な変更が失われないように確認してください。

また、これらの操作はローカルリポジトリにのみ影響を与えます。リモートリポジトリに既に変更をプッシュしている場合は、リモートの状態を更新する必要があります。これには、通常、強制プッシュ(git push -f)が必要ですが、共同で作業しているリポジトリでは慎重に行う必要があります。

参考

reflog

reflog は Git のコマンドの一つで、リポジトリの参照ログ(Reference Logs)を表示するために使われます。Git の reflog は、特定のリポジトリにおけるローカルな操作の履歴を保持します。これにはブランチのチェックアウト、コミット、リセット、マージなどの操作が含まれます。

主な利点は以下の通りです:

  1. 履歴の追跡:ローカルリポジトリで行われた変更の履歴を追跡できます。これは、何か間違った操作をした場合に、どの時点に戻ればいいのかを知るのに役立ちます。
  2. データの回復:誤って削除されたブランチやコミットを回復する際に役立ちます。たとえば、git reset --hard を使ってコミットを失った場合でも、reflog を参照してそのコミットに戻ることが可能です。
  3. デバッグと分析:過去の操作を振り返り、何が起きたのかを理解するのに役立ちます。

reflog の使用例:

git reflog

このコマンドは、現在のリポジトリにおける最近の操作のリストを表示します。各エントリは、操作のID(ハッシュ)、操作のタイプ、説明文が含まれています。これにより、特定の時点に戻るためのハッシュ値を見つけることができます。

要するに、reflog は Git の強力なツールであり、特に複雑な操作を行った後や間違いを修正する必要がある場合に非常に便利です。

コミットログをコマンドで操作