2016-09-29 2 views
0

すべてをリベース:gitのを行うとき、私は奇妙なconflitを取得なぜ

ログが似ているコミットマイ:

commit 1e17b836cce12d497ef86e5b2c45410c93caf3a2 
    add 4 
commit cbf7e720313ef6c918a8d4117df007eabe2ef92b 
    add 3 
commit 951f86964102e17cdf3e3c2978c1adf8d5cdfab7 
    add 2 
commit a275ad4e6716b950d86ce8885d766bba803fc9e0 
    add 1 
commit d14904ad7fa9142cbc38489d1d621d1a157aa0cd 
    init commit 

基本的には、initはコミット空のファイルで、それぞれが、私は応じ持つ1行を追加してコミット数。

drop 951f869 add2 
pick cbf7e72 add3 
pick 1e17b83 add4 

そして、それを保存します。今、私はそれを変更、私はリベースを修正するために私の履歴を示しgit rebase -i HEAD~3

使用する必要があります誰かが私に言った、私はそのadd 2操作を除去するが、他の人を維持したいと言います。それから私は、競合エラーを得た:

error: could not apply cbf7e72... add3 

When you have resolved this problem, run "git rebase --continue". 
If you prefer to skip this patch, run "git rebase --skip" instead. 
To check out the original branch and stop rebasing, run "git rebase --abort". 

は、それから私は、競合がどこにあるかチェックするためにGitの差分を使用し、私が得た:ここ

diff --cc test 
index 56a6051,5f5fbe7..0000000 
--- a/test 
+++ b/test 
@@@ -1,1 -1,3 +1,7 @@@ 
- 1 
++<<<<<<< HEAD 
++1 
++======= 
+ 1 
+ 2 
-3 
++3 
++>>>>>>> cbf7e72... add3 

私の質問は次のとおりです。

この衝突を計算取得する方法でる?私の4行はどこですか?このrebaseの競合はコンテンツを完全に破壊し、現在の競合ファイルに基づいて正しいコンテンツを解決する方法がない正しいdiffを示していません。

これにはどのような正しい方法がありますか?結果の出力を伴う1つのステップバイステップの例は高く評価されます。

答えて

2

コード行にテキストを使用すると説明が簡単になる場合があります。私はちょうど各コミットでファイルを作成し、対応するコミットで新しい行を追加します。例えば

最終的なファイルは、次のようになります

First Line 
Second Line 
Third Line 
Fourth Line 

をそれから私は、インタラクティブなリベースを行うとき、私はこのプロンプト取得します:=========上記

<<<<<<< HEAD 
First Line 
======= 
First Line 
Second Line 
Third Line 
>>>>>>> 8ba3272... Added Third Line 

すべてを====は元のもので、後はすべて3回目のコミット後の状態でした。 3行目に行を追加しようとしているためにマージの競合があり、まだ行が1つもありません。だからこそ、これを解決する必要があります。あなたは出力になりたい場合は、次の

First Line 
Third Line 

あなたはどれだけあなたが希望< < < < < < <を削除し、>>>>>>>>>>>>>>マーカーと入力する必要がありますファイルを見たい場合は、git add、次にgit rebase --continueを実行します。

次に、4番目のコミットを追加しようとしました。もう1つマージ競合が4番目の行を追加しようとしています。だから、あなたは同じようにその矛盾を解決する必要があります。続いて別のgit rebase --continueを入力して、対話型リベースを終了します。 (第2行を追加することにコミット削除されている)を

First Line 
Third Line 
Fourth Line 

をしてgit logはこれを示すだろう:

最終的なファイルは次のようになります

commit 9064bd9d9efece49c0cf2dacd41be98e8cb70d01 
Author: Kief Kraken 
Date: Thu Sep 29 11:05:44 2016 -0700 

    Added fourth Line 

commit cdcd1a33fb7b41e583fdb8098b266b0fb6898aca 
Author: Kief Kraken 
Date: Thu Sep 29 11:05:21 2016 -0700 

    Added Third Line 

commit 7744551b481d4c6f7f5da038c56f3044d8b000d2 
Author: Kief Kraken 
Date: Thu Sep 29 10:52:20 2016 -0700 

    Added first line 

commit e8e76881002e361401bbaaa22140660ed026fd04 
Author: Kief Kraken 
Date: Thu Sep 29 10:51:56 2016 -0700 

    first commit 

を、これがために良いですがインタラクティブなリベースについて学ぶことをお勧めします。私は、これらのタスクをより簡単に管理し、エラーの余地の少ないマージツールを使用することを強く推奨します。

+0

ありがとうございます。私は何が起こっているのか理解した後、少し混乱しています。たとえば、最初の競合を取る: 'Add Third Line'からの変更なしに' Third Third Line 'コミットがどのように見えるのか行と他の人によって行われた3行目を追加する、私たちの例は簡単に伝えるが、実際には、それは多くの場所があります) – Kuan

0

だけで実行します。

git mergetool 

をmergetoolは "自動的に" の競合を解決することが期待されます。次に、実行:

完了です。

"kdiff3"のようなグラフィックマージツールをインストールすることを検討してください。

1

コミットadd3をコミットに再バインドしている間に競合が発生するadd1。履歴のこの時点では、行4はありませんでした。これは、後でadd4が書き換えられたコミットadd3にリベースされたときに追加されます。

このように、ファイルに1行目と3行目を含むように修正してから、git addという結果を返して、git rebase --continueに進みます。私は、ライン4の導入のコンテキストが変更されたので、今度も同じような対立が再び起こると思います。どちらも簡単に解決できます。


Btw:diff3スタイルのコミットマーカーを使用することを強くお勧めします。それらは、競合する変更が導入される前の状態を示している=======|||||||間の競合行の3番目のバージョンを含むであろう

git config merge.conflictstyle diff3 

これによってイネーブルされます。これにより、各サイドが実際にどのような変更を行ったかを簡単に確認できるため、より多くの情報に基づいて、正しい競合解決が可能になります。

+0

ありがとうございます、これは今よりはるかに意味がありますが、とても複雑です。 add3が私によって行われないと解決しなければならないことを私が知ることができる簡単な方法はありますか? – Kuan

+0

複雑さは、さまざまな歴史的なバージョンで作業しているという事実から来ており、実際にはこの複雑さを隠す方法はありません。しかし、私がコミットして追加したように、diff3スタイルの衝突マーカーを使用すると、競合を解決するときに正しい選択をするのがずっと簡単になります。 – cmaster