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

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


当前回答

如果您已经处于冲突状态,并且不想逐个签出路径。你可以试试

git merge --abort
git pull -X 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 merge --strategy-option theirs

来自男子:

ours
    This option forces conflicting hunks to be auto-resolved cleanly by 
    favoring our version. Changes from the other tree that do not 
    conflict with our side are reflected to the merge result.

    This should not be confused with the ours merge strategy, which does 
    not even look at what the other tree contains at all. It discards 
    everything the other tree did, declaring our history contains all that
    happened in it.

theirs
    This is opposite of ours.

注意:正如手册页所说,“我们”的合并策略选项与“我们”合并策略非常不同。

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

git diff --name-only --diff-filter=U | xargs git checkout ${branchName}

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

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

2023年更新!

如果您想接受所有当前更改并忽略任何传入的更改,可以执行以下操作:

git merge [branch] --strategy-option ours

[branch]应替换为要合并到当前分支中的分支的名称。

相反,如果您知道要覆盖任何当前更改并接受来自传入更改的所有冲突,则可以使用他们的策略:

git merge [branch] --strategy-option theirs