当使用git merge将主题分支“B”合并为“A”时,我得到了一些冲突。我知道所有的冲突都可以用B的版本解决。
我知道git合并是我们的。但我想要的是类似git merge -s的东西。
为什么它不存在?如何在与现有git命令冲突合并后实现相同的结果?(git从B中检出所有未合并的文件)
仅仅丢弃分支A中的任何东西(合并提交点到树的B版本)的“解决方案”不是我想要的。
当使用git merge将主题分支“B”合并为“A”时,我得到了一些冲突。我知道所有的冲突都可以用B的版本解决。
我知道git合并是我们的。但我想要的是类似git merge -s的东西。
为什么它不存在?如何在与现有git命令冲突合并后实现相同的结果?(git从B中检出所有未合并的文件)
仅仅丢弃分支A中的任何东西(合并提交点到树的B版本)的“解决方案”不是我想要的。
当前回答
我觉得你真正想要的是
git checkout -B mergeBranch branchB
git merge -s ours branchA
git checkout branchA
git merge mergeBranch
git branch -D mergeBranch
这看起来很笨拙,但应该有用。我唯一不喜欢这个解决方案的是git的历史会令人困惑…但至少历史记录将被完全保存,您不需要为删除的文件做什么特别的事情。
其他回答
这并不一定能回答最初发帖者的问题,但我在这里遇到的情况是,我已经尝试了合并,但最终发生了冲突。通常我在IDE中管理冲突,但当我无法访问时,可以使用以下REGEX来查找并替换“their”内容的差异:
Replce <<<<<<< HEAD\n[^•>]+\n==========\n([^•>]+)>>>>>>> .+\n with \1
(以防其他人因为和我一样的原因登陆这个页面)。
从现在起,我一直使用Paul Pladijs的答案。我发现,你可以做一个“正常的”合并,发生冲突,所以你这样做
git checkout --theirs <file>
通过使用来自其他分支的修订来解决冲突。如果对每个文件执行此操作,则会得到与预期相同的行为
git merge <branch> -s theirs
无论如何,这种努力比合并策略要多!(这是用git 1.8.0版本测试的)
这将合并现有的baseBranch中的newBranch
git checkout <baseBranch> // this will checkout baseBranch
git merge -s ours <newBranch> // this will simple merge newBranch in baseBranch
git rm -rf . // this will remove all non references files from baseBranch (deleted in newBranch)
git checkout newBranch -- . //this will replace all conflicted files in baseBranch
类似的选项是——strategy-option(简称-X)选项,它接受他们的选项。例如:
git checkout branchA
git merge -X theirs branchB
但是,它更等于-X而不是-s。关键的区别在于-X执行常规的递归合并,使用所选的一方解决任何冲突,而-s则将合并更改为完全忽略另一方。
在某些情况下,使用-X their而不是假设的-s their的主要问题是删除文件。在这种情况下,只需运行git rm,并输入已删除文件的名称:
git rm {DELETED-FILE-NAME}
在那之后,他们的-X可能会像预期的那样工作。
当然,使用git rm命令执行实际删除操作将首先防止冲突的发生。
这一个使用了git管道命令读树,但是使得整个工作流程更短。
git checkout <base-branch>
git merge --no-commit -s ours <their-branch>
git read-tree -u --reset <their-branch>
git commit
# Check your work!
git diff <their-branch>