解决 Git 合并冲突以利于拉动期间的更改

我该如何解决 git merge 冲突以利于更改?

基本上,我需要从工作树中删除所有冲突的更改,而不必使用git mergetool经历所有冲突,同时保留所有无冲突的更改。最好在拉动时这样做,而不是在之后。

答案

git pull -s recursive -X theirs <remoterepo or other repo>

或者,简单地,对于默认存储库:

git pull -X theirs

如果您已经处于冲突状态...

git checkout --theirs path/to/file

您可以使用递归 “他们的” 策略选项

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 checkout --theirs .
git add .

如果要执行相反的操作:

git checkout --ours .
git add .

这太剧烈了,因此请确保您确实要在执行此操作之前先将所有内容清除掉。

好了,想象一下我刚刚遇到的情况:

您尝试进行merge ,或者cherry-pick ,但是您停止了

$ 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

令人惊讶的是,我在网络上找不到这个答案。

git pull -X theirs答案可能会造成丑陋的合并提交,或发出

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

如果您只想忽略对存储库中文件的任何本地修改,例如在应该始终是源镜像的客户端上,请运行此命令(用所需的分支替换master ):

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

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

要解决与特定分支中的版本的所有冲突:

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

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

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

请不要这样,有时这是行不通的

git checkout - 我们的路径 / 到 / 文件

要么

git checkout - 他们的路径 / 到 / 文件

我是这样做的,假设HEAD 是我们的,MERGE_HEAD 是他们的

git checkout HEAD -- path/to/file

要么:

git checkout MERGE_HEAD -- path/to/file

完成此操作后,我们会很好:

git add .

如果您想了解更多,请在这里查看 torek 的精彩文章: git checkout - 我们不会从未合并的文件列表中删除文件

VS Code(集成 Git)IDE 用户:

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

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

同样,您可以对其他选项执行操作,例如 “ 全部接受”,“全部接受当前” 等,

git merge 之后,如果您遇到冲突并且想要自己或他们的

git checkout --theirs .
git checkout --ours.

我有一个长期运行的next-version分支的文件吨缺失的那些就改变了develop ,在不同的地方已被添加在两个分支的文件,等等。

我想将next-version分支的全部内容带入develop ,所有操作都可以一次完成。

以上对我有用的命令的组合是:

git merge -X theirs next-version
# lots of files left that were modified on develop but deleted on next-version
git checkout next-version .
# files removed, now add the deletions to the commit
git add .
# still have files that were added on develop; in my case they are all in web/
git rm -r web

这不是一个新的答案,只是结合了许多答案中的一部分,部分是为了确保您可能需要所有这些答案。