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 を元に戻すことができます。