如何解决git合并冲突以支持拉取的更改?
我希望从工作树中删除所有冲突的更改,而不必使用gitmergetool处理所有冲突,同时保持所有无冲突的更改。最好是,我想在拉的时候做,而不是事后。
如何解决git合并冲突以支持拉取的更改?
我希望从工作树中删除所有冲突的更改,而不必使用gitmergetool处理所有冲突,同时保持所有无冲突的更改。最好是,我想在拉的时候做,而不是事后。
当前回答
我有一个长期运行的下一个版本分支,对开发时更改的文件、在两个分支的不同位置添加的文件等进行了大量删除。
我想将下一个版本分支的全部内容进行开发,所有内容都在一次巨大的合并提交中。
对我有效的上述命令组合是:
git merge -X theirs next-version
# lots of files left that were modified on develop but deleted on next-version
git checkout next-version .
# files removed, now add the deletions to the commit
git add .
# still have files that were added on develop; in my case they are all in web/
git rm -r web
这不是一个新的答案,只是结合了许多答案中的一部分,部分是为了保证你可能需要所有这些答案。
其他回答
解决了。通过以下简单步骤解决所有冲突。
git fetch && git reset --hard origin/master
git pull -X theirs
git pull origin master
如果你已经处于冲突状态,并且你想接受他们的一切:
git checkout --theirs .
git add .
如果你想做相反的事情:
git checkout --ours .
git add .
这是非常激烈的,所以在做这件事之前,一定要确保你真的想把所有的东西都这样抹掉。
在Emacs使用smerge模式中,为了使用我的或他们的冲突标记来解决所有冲突标记,我们可以定义:
(defun aj/smerge-keep-mine-all ()
""
(interactive)
(save-excursion
(beginning-of-buffer)
(while (ignore-errors 'user-error (progn (smerge-next) t))
(smerge-keep-mine))))
(defun aj/smerge-keep-other-all ()
""
(interactive)
(save-excursion
(beginning-of-buffer)
(while (ignore-errors 'user-error (progn (smerge-next) t))
(smerge-keep-other))))
从…起https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging这基本上会进行一次假合并。它将记录新的合并提交两个分支都是父分支,但它甚至不会查看分支您正在合并。它将简单地记录为合并的结果当前分支中的确切代码。$git合并-我们的mundo通过“我们的”战略实现的合并。$git diff头部~你可以看到,我们所在的分支机构没有什么不同以及合并的结果。这通常有助于基本上欺骗Git,使其认为稍后进行合并时,分支已被合并。例如你分支了一个发布分支,并为此做了一些工作您将希望在某个时刻合并回主分支。在里面同时,需要将master上的一些错误修复程序向后移植到您的释放分支。您可以将错误修复分支合并到版本中分支,并将我们的同一分支合并到您的主分支中(即使修复程序已经存在),因此当您稍后合并再次发布分支,错误修复没有冲突。
如果我想让master反映新主题分支的变化,我发现这种情况很有用。我注意到,在某些情况下,Xtheir不会没有冲突地合并。。。例如
$ git merge -Xtheirs topicFoo
CONFLICT (modify/delete): js/search.js deleted in HEAD and modified in topicFoo. Version topicFoo of js/search.js left in tree.
在这种情况下,我找到的解决方案是
$ git checkout topicFoo
在topicFoo中,首先使用-s ours策略在master中合并,这将创建一个假的提交,这正是topicFoo的状态。$git merge-s我们的主
检查创建的合并提交
$ git log
现在签出主分支
$ git checkout master
将主题分支合并回去,但这次使用-Xtheir递归策略,这将为您呈现一个具有topicFoo状态的主分支。
$ git merge -X theirs topicFoo
git checkout——我们的/他们的并不专门解决冲突。它从我们/他们的文件中检出(取出整个文件)。
假设我们有一个文件foo,其中包含两个committes/branches/trees/whatever中的更改。如果存在由他们引入的冲突以及修改,并且我们希望使用我们的(然后使用签出)来解决冲突,我们的foo将丢弃引入冲突的更改以及修改。
使用SED
使用他们的解决方案:
sed-i-e'/^''/^=====//,/^========/d'-e'/^>>>>>>/d'foo
-i就地修改文件,/^^^===========</,/^=====/d删除(我们的)和(包括)之间的所有内容/^>>>>>>>/d删除剩余的冲突标记-e为SED指定多个模式foo文件
使用我们的解决方案:
sed-i-e'/^'>''''</d'-e'/^=====/,/^>>>>>>/d'foo
我编写了一个脚本,您可以调用gitresolve-o/-t/-b。
创建自定义合并工具
您可以创建自定义合并工具。在上述sed脚本的基础上,您可以在git配置中添加如下内容:
[mergetool "ours"]
cmd = "sed -i -e '/^<<<<<<</d' -e '/^=======/,/^>>>>>>>/d' -- $MERGED"
并将其称为gitmergetool--tool=ours