2013-09-24 9 views
6

に使用してGitのリベースを元に戻す:は、私が使用して、マスターに対する私のブランチ<code>version2</code>をリベース

git rebase --onto master version1 version2 

どのように私はこれを元に戻すことができますか?

私は現在git reflog

をした、それを元に戻すには、git statusは(version2に)私を与える:

Your branch and 'origin/version2' have diverged, 
and have 2563 and 222 different commits each, respectively. 
nothing to commit (working directory clean) 

私はこのリベースを元に戻します。

答えて

6

あなたはそれをリベースので、あなたはnを参照のN番目の前の位置である<reference>@{n}構文を使用して、あなたがする必要があるすべてはその第1回前の位置への分岐のハードリセットされ、version2ブランチを変更していないと仮定すると、 :

git checkout version2 
git reset --hard [email protected]{1} 
+0

あなたはそれについて私の答えで読むことができます[@での "記号" /記号/文字はGitの意味ですか?](http://stackoverflow.com/questions/17910096/what-does-the- git/17910097#17910097)、最後のセクション。 –

12

git rebaseを元に戻すための非常に簡単な方法は、ブランチラベルを元に戻すことです。

現在のversion2ブランチのヒントを放棄したい場合は、git reflog(あなたのように)から開始できます。私もここにrebaseステップが含まれる、と私はいくつかの「本当の」略し参照文献に残しておきます:ブランチのHEADがあった場所。ここ

$ git checkout branch 
$ git rebase --onto master start-after branch 
... rebase output ... 
# oops! dag-nab-it! didn't mean to do that! 

$ git reflog 
<rev..> [email protected]{0}: rebase finished: returning to refs/heads/branch 
<rev..> [email protected]{1}: rebase: some commit msg... 
05f7dc8 [email protected]{2}: rebase: checkout master 
aa4e140 [email protected]{3}: checkout: moving from master to branch 

aa4e140です。これはORIG_HEADでもご覧になれます。

$ git log -1 --oneline ORIG_HEAD 
aa4e140 some commit msg... 

(あなたは、あなたが適切な場所に行っていることを確認する必要がある場合は、ログのより多くを使用しています。)

あなたには、いくつかの他のgitのをやった場合リベース後のもの、ORIG_HEADが移動した可能性がありますが、reflogは正しい値を持ちます。 ORIG_HEADとreflogに表示されている内容が一致する場合は、間違いなく正しい値を持っています。いずれにしても、適切な値が設定されていることを確認してください(保存されていない変更はありません。git statusはクリーンです)。必要に応じてgit stashを使用してください。

また、version2というラベルの履歴が表示されるgit reflog version2もお試しください。

は今ちょうど現在のそれはまだあなたが変更-にターゲットたいものだと確信し、分岐がメイク強制コミット:

$ git branch 
... see that you're still on "branch" or "version2" or whatever 
$ git reset --hard aa4e140 

ほら、物事が戻って正確にあなたがgit rebaseを実行する前に彼らがいた方法です。

あなたがORIG_HEADを変更するために何もしていない場合、それはすべてこれよりもさらに簡単です:

$ git log ORIG_HEAD # make sure that's what you want 
... 
$ git branch  # make sure you're on `version2` 
... 
$ git reset --hard ORIG_HEAD 
HEAD is now at ... 

しかしreflog方法がより一般的な(リベース後の月についてのために働く、どんなにですその間にやったこと)。

は(ここでは期間は設定可能です。git reflogマニュアルを参照してくださいデフォルトの30日間の有効期限はREFLOGエントリのために通常より古いコミットの場合で、「ブランチの現在の先端から到達できません」です。 。リベース前)


この作業の理由を理解への鍵は単純です:git rebase古いコミットを保持します。 はコミット・グラフに新しいコミットを追加した後、というラベルを移動します。ラベルを移動すると、古いコミットを見るのが難しくなります。既定では表示されず、「reflog」にしか表示されませんが、まだそこに残っています。ラベルを元に戻し、新しいコミットは表示されないもので、古いものはすべて戻ってきます!

+0

最後の段落の説明をありがとうございます。私が見た他の答えのどれもそれをしていません。 – bunnyhero

+0

bunnyheroと同意します。リベースをリセットすることは意味がありませんでした。実際にgitで何も失われていないことを理解し、gitXはrefオブジェクトによって到達できないコミットツリーの部分を表示しません –

関連する問題