Gitでは、リベースに満足できない場合、どのようにリベースをロールバックしますか?
Gitにはリベース用のドライランがありません。リベースを実行し、まだプッシュしていない場合、それが発生しなかったかのように、以前にロールバックするにはどうすればよいですか?
Gitでは、リベースに満足できない場合、どのようにリベースをロールバックしますか?
Gitにはリベース用のドライランがありません。リベースを実行し、まだプッシュしていない場合、それが発生しなかったかのように、以前にロールバックするにはどうすればよいですか?
回答:
reflogを使用して、リベースが開始される前の最初のアクションを見つけてから、リセットして、ハードに戻すことができます。例えば
$ git reflog
b710729 HEAD@{0}: rebase: some commit
5ad7c1c HEAD@{1}: rebase: another commit
deafcbf HEAD@{2}: checkout: moving from master to my-branch
...
$ git reset HEAD@{2} --hard
これで、リベースが開始される前に戻る必要があります。
リセットする適切な場所を見つけるには、「リベース」で始まらない、一番上に最も近いエントリを選択するだけです。
リベースがブランチで行った唯一のことである場合、つまりプッシュされていないコミット/変更がない場合は、でローカルブランチを削除しgit branch -D
てから、もう一度チェックアウトすることができます。
$ git checkout my-branch
$ git rebase master
// not happy with result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch
または、同じ効果を得るには、-hardをoriginブランチにリセットできます。
$ git reset --hard origin/my-branch
他のプッシュされていないコミットがあるときにこれを行った場合、それらは失われます。その場合は、上記のreflogアプローチを使用して、コミットを行ったreflogエントリに戻ります。
ORIG_HEAD
、リベースされるブランチの元のハッシュ値に設定されます。したがって、の番号2を見つけるのではなく、...をHEAD@{2}
使用できORIG_HEAD
ますが、それでも邪魔されない場合に限りORIG_HEAD
ます。一連のGitコマンドがそれを設定します(さまざまな状況下で、リベース、am、リセット、およびマージ)。
Rebaseは、古い状態のバックアップをとして保持しORIG_HEAD
ます。
したがって、次のコマンドを実行して、最後のリベースを元に戻すことができます。
git reset --hard ORIG_HEAD