git-merge如何处理二进制文件

时间:2015-03-25 15:45:28

标签: git

让我们考虑一下这种情况:

      o---o---o      slave
     /         \
o---o---B---o---o    master

我有一堆二进制文件。其中一些在slavemaster中没有变化,其他一些在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如何合并二进制文件?

1 个答案:

答案 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

我希望它能澄清一点......