如何解决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))))

其他回答

如果你已经处于冲突状态,并且你想接受他们的一切:

git checkout --theirs .
git add .

如果你想做相反的事情:

git checkout --ours .
git add .

这是非常激烈的,所以在做这件事之前,一定要确保你真的想把所有的东西都这样抹掉。

2023年更新!

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

git merge [branch] --strategy-option ours

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

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

git merge [branch] --strategy-option theirs

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

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

git pull -X theirs

git pull origin master

git pull-X他们的答案可能会创建一个难看的合并提交,或者发出

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

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

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

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

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

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

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

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