Git合并文件,实际上是尝试为一个文件重新合并

时间:2012-01-10 01:07:06

标签: git

我正在将一个分支合并到我的上游分支。您可以将其视为两个分支之间的合并。现在,在我手动处理所有合并冲突之后,我做了一个全新的构建,发现其中一个源文件有编译错误。

为了解决这个问题,我想重新对这个文件进行合并,但是没有为我已合并的其余文件做错。那么,有没有办法解决这个问题,而无需从头开始做到这一点。

为了更好地解释它,假设上游存在三个文件A,B和C.我运行git pull来获取远程分支中的内容与这些内容合并。现在,我看到合并冲突,我逐个文件地手动解决这些问题。在进行编译时,我看到文件A和C编译正常,而B有错误。所以,现在我想从开始重新合并B而不浪费我合并A和C的努力。

3 个答案:

答案 0 :(得分:3)

您可以运行git merge-file,它会进行3向合并。如果HEAD是你刚才做的合并,那么类似下面的内容应该有效:

git cat-file blob HEAD^:fileB > fileB # revert fileB to its pre-merge condition
git cat-file blob $(git merge-base HEAD^ HEAD^2):fileB > fileB.base # write the base version to fileB.base
git cat-file blob HEAD^2:fileB > fileB.other # write the other version of fileB
git merge-file fileB fileB.base fileB.other

这将重新运行合并并将合并结果(包括冲突)写回fileB(此时您可以删除fileB.basefileB.other)。

修改

如果你还没有实际运行git add fileB(例如,如果git status显示合并冲突),并且你的磁盘上有git-merge-one-file脚本(在我的情况下它就是坐着)在/usr/libexec/git-core/git-merge-one-file),然后您可以运行git merge-index /path/to/git-merge-one-file fileB,它会为您重新合并该文件。

答案 1 :(得分:3)

由于您还没有提交,您可以查看文件的未合并版本:

git checkout --merge path/to/file

然后您可以根据需要重新解决冲突。 (-m--merge的同义词。)

答案 2 :(得分:1)

听起来像合并导致解决方案没有达到良好状态。只需编辑您需要更改的文件,以便编译所有内容并通过所有测试。如果您希望在合并之前将某些文件从状态中拉出,

git checkout origin/branch_you_want -- fileA fileB

现在只需修改你的合并提交:

git add -A
git commit --amend -C HEAD

这将重复使用相同的消息。您现在应该看到合并提交处于良好状态。

更新:

警告!在进行合并并使用--amend时,您可能记录了一个您不想要的冲突解决方案!请参阅rerere:http://progit.org/2010/03/08/rerere.html