リベースをロールバックする方法をGit


102

Gitでは、リベースに満足できない場合、どのようにリベースをロールバックしますか?

Gitにはリベース用のドライランがありません。リベースを実行し、まだプッシュしていない場合、それが発生しなかったかのように、以前にロールバックするにはどうすればよいですか?


4
git rebase --abort
olibiaz 2016

2
「失敗した」とはどういう意味ですか?リベースを完了しましたが、結果が気に入らないのですか?それとも、競合にぶつかって、途中でリベースを停止したいですか?競合する未完成のリベースをプッシュすることはできないため、前者を推測します、2つの異なる質問であるため質問します。
エドワードトムソン

はい、前者。ありがとう。
user1615666 2016

回答:


211

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エントリに戻ります。


11
もう1つの便利なショートカット:リベースはORIG_HEAD、リベースされるブランチの元のハッシュ値に設定されます。したがって、の番号2を見つけるのではなく、...をHEAD@{2}使用できORIG_HEADますが、それでも邪魔されない場合に限りORIG_HEADます。一連のGitコマンドがそれを設定します(さまざまな状況下で、リベース、am、リセット、およびマージ)。
torek 2016

1
ありがとうございます!これに関する大きな助け:)
アレック

1
あなたは私のソースコードのバック....後にこの$ gitのリセットHEADを使用し感謝@ {2} --hard
レザはrahmad

ローカルブランチを削除して再度プルすることを提案することに対する私の賛成票を取得します!
quicklikerabbit

1
これは命の恩人です。あなた@Robbieありがとう
ネルソンKatale

42

Rebaseは、古い状態のバックアップをとして保持しORIG_HEADます。
したがって、次のコマンドを実行して、最後のリベースを元に戻すことができます。

git reset --hard ORIG_HEAD

1
そのタグがどこに文書化されているか知っていますか?
ベン

これにはいくつかの欠点がありますか、それとも新しい機能ですか?これは、reflogをふるいにかけるよりもはるかに簡単なようです。
12527 4819

それは新しいことではありません。しかし、通常はリベースの直後に使用し、数回のリベースなどの後で遡及的に戻ることはできません。これらの複雑な状況では、再ログの内容を探しますが、「おっと、私は何をしたのですか?どうすれば元に戻すことができますか?それは今?」それはうまく機能します。
メリジー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.