Git:如何不合并文件删除

时间:2016-02-12 16:59:37

标签: git git-merge

我们正在将分支A合并到分支B中。在分支A中,我们删除了一些文件。当合并到分支B时,我们不想删除分支B中的文件。我们希望除文件删除之外的其他合并更改。我们怎么做到这一点?

请注意,相关文件没有合并冲突(即:它们尚未在分支B中触及)。

3 个答案:

答案 0 :(得分:3)

这里有一个可能的解决方案,不依赖于单独提交中的删除:

# Do all the merging but do not commit the result
git merge --no-commit branchA
# Look at what has changed
# Beside the list of modified files, there is also a list of all deleted files
git status
# Restore the deleted files (from the current commit on branchB)
git checkout HEAD -- file1 file2
# Now commit the merge
git commit

不是逐个列出所有已删除的文件,而是可以使用(未​​经过全面测试)剪切(受this answer to another question启发):

git diff-index --cached --diff-filter=D -z --name-only HEAD | xargs -0 git checkout HEAD --

答案 1 :(得分:0)

我可以想到两种可能的解决方案:

  1. Rebase分支A,以便所有删除提交都在分支的“结尾”。然后将这些删除之前的最后一次提交合并到分支B中。当然,如果使用基于分支A的工作进行重新定位会导致任何克隆的repos出现问题,这可能不是一个可行的解决方案。

  2. 直接与分支A合并,然后使用git revert“撤消”具有删除的提交。这里的缺点是你需要找到哪些提交“撤消”。如果有很多这样的话,手动运行git revert会非常耗时。

  3. 如果这些都不适合你,我道歉。我只是在这里集思广益。希望其他人提出更好的想法。

答案 2 :(得分:0)

如果您想自动执行此操作,您可以调整git-merge-one-file(只要您安装了git,就可以libexec/git-core进行调整)并手动运行合并。

git merge --no-commit --no-ff -s ours $topic            # set up parents
git read-tree -um $(git merge-base @ $topic) @ $topic   # handle really trivial cases
git merge-index -o $tweaked_git_merge_one_file -a       # everything else, do my way

并且调整非常简单,请处理$1$1.案例,其中您的分支机构没有做任何事情,但另一个分支机构删除了它,就像您添加它的.$2.情况一样另一个分支没有做任何事情。所以

-"$1.." | "$1.$1" | "$1$1.")
+"$1.." | "$1.$1" )

-".$2.")
+".$2." | "$1$1." )

因为在这两种情况下文件的本地副本都是正确的,唯一要做的就是将索引条目标记为(正确)合并。