100

最近、作業中のブランチをリベースしました。木の歴史は次のようなものでした。

1 = 2 = 3 = 4
     \
      5 = 6 = 7
           \
            8

変更内容 (図の 8 番) をマスター ブランチにリベースしたいと考えていました (現在、図の 4 をコミットするまで)。だから私は次のことをしました:

git checkout my_branch
git rebase master

< 多くの git mergetool/git rebase --skip を使用して競合を解決します >

私が実行したときだけ:

git checkout my_branch
git diff master

違いはありません。ブランチを失ったことはありません (保存したパッチから変更を再作成できます) が、実行したマージ/リベースが見つかりません。私は何を間違えましたか?私の変更がマスターとマージされた状態で、リベースがまだどこかに残っていますか、それとももう一度行う必要がありますか?

4

1 に答える 1

224

違いが見られない場合は、変更が失われた可能性があります。を使用git reflogして、リベースの前に存在していたブランチを特定しgit reset --hard <my-branch-tip-before-rebase>、元のブランチを取り戻すために使用できます。はい、もう一度プロセスを実行する必要があります。:-(

どうやって同じように見えるようになったのかよくわかりません。あなたが与えたコマンドで次のように表示されることを期待していました:

1 = 2 = 3 = 4              (master)
     \       \
      \       5' = 6' = 8' (my_branch)
       \
        5 = 6 = 7

この場合、おそらく次を使用する必要がありましたrebase --onto

git rebase --onto master <commit id for 6> my_branch

これにより、次のようなグラフが表示されます。

1 = 2 = 3 = 4              (master)
     \       \
      \       8'           (my_branch)
       \
        5 = 6 = 7

変更が失われる限り、マージの競合に対処するには少し練習が必要です。特に、ほとんど同じに見える大きなブロックがいくつかある場合はそうです。私は常に、コミットによって導入された実際の差分を確認し、その変更を引き出して、適切な方法でブランチに既にあるものとマージしようとしています。あなたの変更がそこで失われた可能性があることは簡単にわかります。

覚えておくべきことが1つあります。大量のマージ競合が予想されない場合 (ソースが十分に分岐していないと感じているため)、競合が発生しているのは、何か間違ったことをしているという警告フラグです。を実行してバックアップし、git rebase --abortブランチを調査して、競合が予想されるかどうかを再度確認することをお勧めします。競合が発生した場所を必ずメモしておいてください (通常、リベースによってコマンド ラインに移動する直前に「適用中 ...」が表示されます)。通常は、ここから開始するのが最適です。

競合は避けられず、解決するのが面倒な場合があります。しかし、練習すれば、この問題に遭遇することは少なくなると思います。

ブランチ間で変更を移植する方法の詳細については、git rebaseの man ページを参照してください。「rebase --onto」で検索してください。最初のヒットで、別のブランチへの変更の移植について説明しているセクションにたどり着くはずです。

于 2012-10-31T09:58:50.657 に答える