「修正をなかったことにする」タイミングは3つあります。
- まだコミット前(楽勝)
- まだプッシュ前(軽傷)
- プッシュしちゃった!(重傷)
この3つの状況に合わせ、それぞれの戻し方を試してみます。
下準備
以下のようなスモール環境で実験してみましょう。(TurtoiseGit さえあれば可能です)
ローカルに git リポジトリを作成
適当な空フォルダ(test.git とします)を作成し、右クリック > Git ここにリポジトリを作成(Bare を作成に ✔)
ローカル git リポジトリをクローン
ここでは適当に D:\temp 下に作成しました。右クリック > Git クローン(複製)
テキストファイルを1つ作成し、コミット&プッシュ
0123456789 とだけ書かれた a.txt を作成し、(1) としてコミット&プッシュ
右クリック > ログを表示
でコミットログを確認するとこのようになっています。
ここまでで下準備は完了です。
「編集してしまったテキスト」をやり直す(コミット前)
この場合は楽勝。
a.txt を 右クリック > TurtoiseGit > 変更の取り消し
で元通り。
変更した内容を取っておきたい場合は、どこか Git 範囲外にコピーしておきましょう。
コミットを元に戻す
コミットしてしまった場合は、クローンディレクトリを 右クリック > Git同期
。
コミットを選択して 右クリック > このコミットの変更を戻す
OK
ファイルが再び!マークに戻っており、コミットウィンドウを開くとコメントには「Revert "(2)"」と書かれ、再びコミット可能になっています。
正しくは「(2) のコミットをなくす」のではなく、「(2) のコミットの上に (1) の(やり直し)コミットを追加する」といった方が正しいです。
この状態でプッシュしたログ履歴に、失敗したはずの (2) が含まれているのがわかります。
完全に消す方法もおそらく「なくはない」と思いますが、危険そう。
プッシュ
コミットのみならず、プッシュまでしてしまった…。重傷です。
基本的に「プッシュ」は絶対問題ないと判断した後、行うもの。やり直しはあまりオススメできません。
とはいえ、Git に慣れていない時ほどこういう「やらかし」をやってしまうもの。
Git フォルダを 右クリック > TurtoiseGit > ログを表示
。
(1) を選択 > 右クリック > "main" をここへリセット > Hard
強制的に(1)まで戻します。
(1) を選択 > 右クリック > "main" をここへリセット > Mixed
コミット&プッシュする前に戻します。(1) の後、編集したテキストも残ります。
注意点
ローカルを戻すことは出来ましたが、プッシュしたリポジトリは (2) のままです。
(ここを間違えると、色々と死ぬので注意してください)
複数人で使っている Git リポジトリのやり直しは、間が悪いと「Git 平行世界線」が出来上がってしまい、他のスタッフと違う世界線で永遠に出会えない…という最悪の事態を引き起こすことがあります。
そのため、本当に必要になった場合は Git に詳しい人にお伺いを立て、言われた通りにするのが無難です。
一番いいのは、適当にプッシュしないこと