3

gitをテストして、自分の仕事に使用できるかどうかを調べています。私は小さな問題に遭遇しましたが、実際のコードで実際の問題になる可能性があります。私のファイルは次のようになります。text.txt123 4ローカルブランチ「branch1」があり、ブランチとマスターの両方で変更をコミットしました。マスターでは、ブランチの最初の行を2番目の行に変更しました。したがって、マスターの差分は次のようになります。

+1 master
 2
 3
 4

ブランチの場合は次のとおりです。

 1
-2
+2b1
 3
 4

git merge branch1を実行すると、競合が解決されます。

<<<<<<< HEAD
1 master
2
=======
1
2b1
>>>>>>> branch1
3
4

これは簡単に解決できることを私は知っています。しかし、とにかく、これはどのように対立しますか。gitはこれをマージできるべきではありませんか?

4

2 に答える 2

5

いくつかのコメント:

  • まず、このような小さな例はとにかくマージされません:

    警告: バイナリ ファイルをマージできません: afile.txt (HEAD と abranch)
  • 次に、コンテキストとは無関係に解決する必要があることがわかっている「小さな」マージ競合が多数ある場合は、コンテキストをmaster無視して、最初にブランチを の上にリベースしてみてください。

    git rebase -C0 マスター

次に、ブランチを にマージしますmaster

これは一般に、 rebase のすべてのコンテキストを無視することはお勧めできませんが、変更について確信がある場合(「コンテキストをまったく必要としない変更」など) は機能します。

git rebase の man ページから:

-C<n>

<n>各変更の前後で、少なくとも周囲のコンテキストの行が一致していることを確認してください。
周囲のコンテキストの行が少ない場合、それらはすべて一致する必要があります。
デフォルトでは、コンテキストは無視されません。


簡単にテストできます (ここでは PowerShell セッションで、Xp で Git1.6.5.1 を使用)。

最初に小さなバットユーティリティを作成しますgenfile.bat

echo hello, World %1 > afile.txt
echo hello, World %2 >> afile.txt
echo hello, World 3 >> afile.txt
echo hello, World 4 >> afile.txt
echo hello, World 5 >> afile.txt

次に、レポを作成してファイルを追加します。

PS D:\git\tests\mergeLines> git init m0
PS D:\git\tests\mergeLines> cd m0
PS D:\[...]\m0> D:\git\tests\mergeLines\genfile.bat 1 2
PS D:\[...]\m0> git add -A
PS D:\[...]\m0> git ci -m "afile to be modified concurrently"

ファイルは次のようになります。

hello, World 1
hello, World 2
hello, World 3
hello, World 4
hello, World 5

ブランチで変更する

PS D:\[...]\m0> git co -b abranch
PS D:\[...]\m0> D:\git\tests\mergeLines\genfile.bat 1 2_modified
PS D:\[...]\m0> git ci -a -m "afile modified in abranch"

あなたが持っているでしょう:

hello, World 1
hello, World 2_modified
hello, World 3
hello, World 4
hello, World 5

次に、マスターで変更します

PS D:\[...]\m0> git co master
PS D:\[...]\m0> D:\git\tests\mergeLines\genfile.bat 1_master 2
PS D:\[...]\m0> git ci -a -m "afile modified in master"

これにより、次のことが得られます。

hello, World 1_master
hello, World 2
hello, World 3
hello, World 4
hello, World 5

最初の実験のためにそのレポを複製します(つまり、 へのabranchマージmaster

PS D:\[...]\m0> cd ..
PS D:\git\tests\mergeLines> git clone m0 m1
PS D:\git\tests\mergeLines> cd m1
PS D:\[...]\m1> git co -b abranch origin/abranch
PS D:\[...]\m1> git co master
PS D:\[...]\m1> git merge abranch

それはあなたに衝突を与えます:

Auto-merging afile.txt
CONFLICT (content): Merge conflict in afile.txt
Automatic merge failed; fix conflicts and then commit the result.

PS D:\[...]\m1> type afile.txt
<<<<<<< HEAD
hello, World 1_master 
hello, World 2 
=======
hello, World 1 
hello, World 2_modified 
>>>>>>> abranch
hello, World 3 
hello, World 4 
hello, World 5 

最初のレポを再度複製します。今回はコンテキストなしで最初abranchに の上にリベースします。master

PS D:\[...]\m1> cd ..
PS D:\git\tests\mergeLines> git clone m0 m2
PS D:\git\tests\mergeLines> cd m2
PS D:\[...]\m2> git co -b abranch origin/abranch
PS D:\[...]\m2> git rebase -C0 master

ファイルは静かにマージされます:

hello, World 1_master
hello, World 2_modified
hello, World 3
hello, World 4
hello, World 5

もちろん、元に戻してmergeにするmasterと、結果は早送りマージになります。abranch

PS D:\git\tests\mergeLines\m2> git co master
Switched to branch 'master'
PS D:\git\tests\mergeLines\m2> git merge abranch
Updating c8f48b4..8bee1d2
Fast forward
 afile.txt |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
于 2009-11-18T13:04:12.010 に答える
4

2 つの変更を分離するコンテキストがないため、正しい解決方法が明確ではありません。コンテキストの 1 行での変更は、ブロック "1/2" を "1 master/2" に変更し、ブロック "1/2/3" を "1/2b1/3" に変更します。

最初のパッチの結果に 2 番目の「パッチ」を適用しようとすると、パッチを正常に適用するために必要なコンテキストが一致しないため、エラーが解決されます。パッチには「1/2/3」が必要ですが、「1 マスター/2/3」があります。

より複雑なシナリオでは十分なコンテキストが重要です。ローカル ブランチが十分な数の行を移動し、元の場所でチェックされた最小限のコンテキストが十分であった場合、警告なしにマージが間違った場所にパッチを適用するのは簡単です。パッチが適用されるべきではないときにまだ適用されていることは不特定です。

于 2009-11-18T10:43:24.387 に答える