Git でリベースの取り消し
このチュートリアルでは、Git のブランチで行われた rebase
を元に戻す方法について説明します。
リベースとは、ブランチのベースを新しいベースに移動する操作です。メインブランチに基づく機能ブランチがあるとします。次に、メインブランチにいくつかの新しいコミットがあります。これらの新しいブランチに基づいて、機能ブランチをリベースしたい場合があります。
この rebase
操作を再考するかもしれません。新しい機能ブランチをメインブランチの新しいコミットに基づいて作成する必要はなくなりました。
機能ブランチは、メインブランチから最初にブランチしたときのコミットに基づいている必要があります。したがって、これを実現するには、ブランチで実行された rebase
操作を元に戻す必要があります。
これを例を挙げて説明します。
Git のブランチで git reflog
と git reset
を使用して行われた rebase
を元に戻する
main
ブランチがあり、その上に新しいブランチ feature1
を作成したとします。
そして、main
ブランチでいくつかのコミットが発生したとしましょう。これらの新しいコミットに基づいて、新しいブランチ feature1
の rebase
を実行しました。これは元に戻したい操作です。
rebase
を元に戻すには、Git の reflog
コマンドを使用できます。git reflog
を使用すると、rebase
が開始する直前にブランチのヘッドコミットを決定できます。
次に、ブランチ feature1
(rebase
が実行されたブランチ)で git reflog
コマンドを実行します。
$ git reflog
b745978 HEAD@{0}: rebase: that commit
4sd7c1c HEAD@{1}: rebase: this commit
adf3d3d HEAD@{2}: checkout: moving from main to feature1
...
HEAD@{2}
が rebase
操作の直前のコミットであったことがわかります。
次のように、git reset
を使用して、このコミットへのブランチをリセットできます。
$ git reset HEAD@{2} --hard
上記のコマンドを実行すると、ブランチ feaure1
は rebase
の直前の状態になります。
または、次のように git reset
を使用して rebase
を元に戻すこともできます。
$ git reset --hard ORIG_HEAD
ORIG_HEAD
は、操作前の HEAD
の位置を記録するために HEAD
を大幅に移動するコマンドによって作成されます。これにより、ブランチの先端を実行前の状態に簡単に戻すことができます。
この代替アプローチの注意点は、ORIG_HEAD
を変更する可能性のある不要な rebase
の後に他の操作を実行してはならないということです。reset
、rebase
、または merge
。
したがって、これらのメソッドを使用して、Git のブランチで不要な rebase
を元に戻すことができます。