如何合并二进制文件?

时间:2010-01-18 22:03:09

标签: git

我在my_branch中有一个二进制文件,当我需要对它进行更改时,git当然不会合并它。

所以我现在所做的是:

git checkout my_branch
# make a change to gui.bin
mv gui.bin ~/
git commit -a
mv ~/gui.bin .
git commit -a
# git rebase to 1 commit
git checkout master
git merge my_branch

但有更简单的方法吗?

2 个答案:

答案 0 :(得分:21)

我不太确定你的测试用例是什么。你似乎正在把gui.bin移开,然后把它放回原来......

通常,二进制文件不需要合并,您只想从一个地方或另一个地方选择最终版本。在真正需要合并的地方,你需要一个自定义合并工具,或者使用某种编辑器和大量的人工干预。

我注意到您在示例中使用了commit -a。避免不必要冲突的第一步是不提交任何可能偶然触及的二进制文件,除非您想要提交它们。如果您git add只需要提交和提交没有-a的文件,那么这将有所帮助。或者,如果只有一个您不想提交的文件,则可以add -u并在提交之前重置它。

git add -u
git reset -- dontcommit.dat
git commit

当您合并分支并同时更改二进制文件时,您可能希望保留一个版本而不是另一个版本。在合并之后,git告诉你它们在你的二进制文件中存在冲突,你可以告诉git使用你所在的分支中的版本,如下所示:

git checkout --ours binary.dat
git add binary.dat

或者您正在合并的分支:

git checkout --theirs binary.dat
git add binary.dat

答案 1 :(得分:11)

您可以使用内置的binary合并驱动程序:

binary: Keep the version from your branch in the work tree, but
leave the path in the conflicted state for the user to sort out.

示例.gitattributes行:

*.bin -crlf -diff merge=binary

告诉git不要添加行结尾,不要添加diff,并保留本地版本

http://git-scm.com/docs/gitattributes

仅保留您的工作副本......

另一种方法是使用自定义合并驱动程序:

[merge "binmerge"]
  name = my binary merge script
  driver = binmerge.sh %O %A %B

这可以检查冲突的文件与应该总是被本地版本覆盖的文件列表...

使用合并驱动程序,在配置中定义它,然后在.gitattributes中指定它应该使用的路径,如下所示:

*.bin -crlf -diff merge=binmerge

将调用binmerge.sh来处理合并。它基本上可以做类似的事情:

#!/bin/sh
echo "Performing merge of binary object ($1, $2, $3)"
touch $2
exit 0