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

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


当前回答

在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 pull-X他们的答案可能会创建一个难看的合并提交,或者发出

错误:您对以下文件的本地更改将被合并覆盖:

如果您想简单地忽略对repo中文件的任何本地修改,例如,在始终应为源镜像的客户端上,请运行以下命令(用所需的分支替换master):

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

它是如何工作的?git fetch执行git pull,但不合并。然后gitreset-hard使您的工作树与上一次提交相匹配。您对回购中文件的所有本地更改都将被丢弃,但新的本地文件将被保留。

我发现我需要指定origin-main作为要合并到的分支。

git merge **origin main** --strategy-option theirs

要解决与特定分支中版本的所有冲突,请执行以下操作:

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

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