如何解决git合并冲突以支持拉取的更改?

我希望从工作树中删除所有冲突的更改,而不必使用gitmergetool处理所有冲突,同时保持所有无冲突的更改。最好是,我想在拉的时候做,而不是事后。


当前回答

VS代码(集成Git)IDE用户:

如果要接受冲突文件中的所有传入更改,请执行以下步骤。

1. Go to command palette - Ctrl + Shift + P
2. Select the option - Merge Conflict: Accept All Incoming

类似地,您可以使用其他选项,如“全部接受”、“全部接受当前”等。,

其他回答

在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 diff --name-only --diff-filter=U | xargs git checkout ${branchName}

因此,如果您已经处于合并状态,并且希望保留冲突文件的主版本:

git diff --name-only --diff-filter=U | xargs git checkout master

VS代码(集成Git)IDE用户:

如果要接受冲突文件中的所有传入更改,请执行以下步骤。

1. Go to command palette - Ctrl + Shift + P
2. Select the option - Merge Conflict: Accept All Incoming

类似地,您可以使用其他选项,如“全部接受”、“全部接受当前”等。,

解决了。通过以下简单步骤解决所有冲突。

git fetch && git reset --hard origin/master

git pull -X theirs

git pull origin master