如何解决git合并冲突以支持拉取的更改?
我希望从工作树中删除所有冲突的更改,而不必使用gitmergetool处理所有冲突,同时保持所有无冲突的更改。最好是,我想在拉的时候做,而不是事后。
如何解决git合并冲突以支持拉取的更改?
我希望从工作树中删除所有冲突的更改,而不必使用gitmergetool处理所有冲突,同时保持所有无冲突的更改。最好是,我想在拉的时候做,而不是事后。
当前回答
我发现我需要指定origin-main作为要合并到的分支。
git merge **origin main** --strategy-option theirs
其他回答
2023年更新!
如果您想接受所有当前更改并忽略任何传入的更改,可以执行以下操作:
git merge [branch] --strategy-option ours
[branch]应替换为要合并到当前分支中的分支的名称。
相反,如果您知道要覆盖任何当前更改并接受来自传入更改的所有冲突,则可以使用他们的策略:
git merge [branch] --strategy-option theirs
接受远程更改(他们的),如果发生冲突,您将收到以下错误:
fatal: Not possible to fast-forward, aborting.
因此,您可能希望快速地拉动并接受他们的更改:
$ git pull -X theirs --ff
在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))))
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
好吧,想象一下我刚才的情景:
你尝试合并,或是樱桃采摘,但你被阻止了
$ git cherry-pick 1023e24
error: could not apply 1023e24... [Commit Message]
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
现在,您查看了冲突的文件,并且确实不想保留更改。在我上面的例子中,文件仅在IDE自动添加的新行上发生冲突。要撤消更改并接受其更改,最简单的方法是:
git checkout --theirs path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php
与此相反(用您的版本覆盖传入的版本)是
git checkout --ours path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php
令人惊讶的是,我在网上很难找到这个答案。