我们正在将分支A合并到分支B中。在分支A中,我们删除了一些文件。当合并到分支B时,我们不想删除分支B中的文件。我们希望除文件删除之外的其他合并更改。我们怎么做到这一点?
请注意,相关文件没有合并冲突(即:它们尚未在分支B中触及)。
答案 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)
我可以想到两种可能的解决方案:
Rebase分支A,以便所有删除提交都在分支的“结尾”。然后将这些删除之前的最后一次提交合并到分支B中。当然,如果使用基于分支A的工作进行重新定位会导致任何克隆的repos出现问题,这可能不是一个可行的解决方案。
直接与分支A合并,然后使用git revert
“撤消”具有删除的提交。这里的缺点是你需要找到哪些提交“撤消”。如果有很多这样的话,手动运行git revert
会非常耗时。
如果这些都不适合你,我道歉。我只是在这里集思广益。希望其他人提出更好的想法。
答案 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." )
因为在这两种情况下文件的本地副本都是正确的,唯一要做的就是将索引条目标记为(正确)合并。