让我们考虑一下这种情况:
o---o---o slave
/ \
o---o---B---o---o master
我有一堆二进制文件。其中一些在slave
或master
中没有变化,其他一些在slave
上发生了变化。
合并期间:
git checkout master
git merge slave
Git向我展示了这个:
warning: Cannot merge binary files: foo.bin (HEAD vs. foo)
Auto-merging: foo.bin
CONFLICT (content): Merge conflict in foo.bin
Automatic merge failed; fix conflicts and then commit the result.
分析:
foo
双方都改变了。我同意Git让我解决冲突。但是,bar
只在master
上发生了变化,Git没有问我什么。他决定从master
改变,而我希望他考虑slave
。
如何更好地控制git如何合并二进制文件?
答案 0 :(得分:1)
Git没有提出任何要求,因为您在foo
上进行了更改,并且您应该知道,如果没有人在slave
分支上更改此文件,则此更改将在合并后直接进行。
让我们来看看这个简单的例子:
o-- slave
/ \
o--o--o master
^ origin
你可以用它来重现它:
git init
dd if=/dev/urandom of=foo bs=100k count=1
dd if=/dev/urandom of=bar bs=100k count=1
git add .
git commit -m "Added binary files foo and bar"
git branch origin
git checkout -b slave
dd if=/dev/urandom of=foo bs=100k count=1
git commit -m "Modified foo" .
git checkout master
dd if=/dev/urandom of=bar bs=100k count=1
git commit -m "Modified bar" .
一旦你读完了合并,你可能会这样做:
git checkout master
git merge slave
Merge made by the 'recursive' strategy.
foo | Bin 102400 -> 102400 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
你注意到git注意到了关于foo的变化,但没有注意到bar。这是因为bar在slave
分支上没有变化。
如果您希望保留slave
栏。您需要阻止git为您完成合并。你可以这样做:
git checkout master
git merge slave --no-commit
git checkout slave bar # I want to keep bar from slave
git commit -m "Commit successuful"
稍后您可以检查一切是否正常:
git diff --stat master~1 origin
git diff --stat slave origin
git diff --stat master slave
我希望它能澄清一点......