解决的Git上拉过程中合并有利于自己的变化冲突解决的Git上拉过程中合并有利于自己的变化冲突(Res

2019-05-14 09:45发布

如何解决有利于拉动变化的混帐合并冲突?

基本上,我需要删除从工作树所有冲突的更改,而不必经过所有的冲突与git mergetool ,同时保留所有无冲突的变化。 最好这样做同时拉动,而不是事后。

Answer 1:

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

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.

注:由于该男子页称,“我们的”合并的策略选择是由“我们的”合并战略非常不同。



Answer 2:

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

或者,简单地说,默认库:

git pull -X theirs

如果你已经在冲突状态...

git checkout --theirs path/to/file


Answer 3:

如果你已经在冲突状态,和你想只接受所有他们的:

git checkout --theirs .
git add .

如果你想要做的相反:

git checkout --ours .
git add .

这是相当激烈的,所以一定要确保你真的想这样做之前,消灭一切会是这样。



Answer 4:

行,所以,想象我只是在这种情况下:

您尝试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

出人意料的是,我不能在网上很容易找到这个答案。



Answer 5:

git pull -X theirs答案可能创建一个丑陋的合并提交,或发出

错误:您当地的下列文件中的更改将被合并被覆盖:

如果你想简单地忽略从回购的客户机上的任何本地修改的文件,例如,应始终是一个起源的一面镜子,运行这个(更换master与你想要的分支):

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

它是如何工作的? git fetchgit pull ,但没有合并 。 然后git reset --hard让你的工作树匹配的最后一次提交。 所有的本地更改在回购文件将被丢弃 ,但新的本地文件将被单独留在家中。



Answer 6:

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

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

所以,如果你已经在合流状态,并且要保留冲突文件的主版本:

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


Answer 7:

请没有,有时这是行不通的

git的结帐--ours路径/到/文件

要么

git的结帐--theirs路径/到/文件

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

git checkout HEAD -- path/to/file

要么:

git checkout MERGE_HEAD -- path/to/file

当我们做到这一点,我们是很好的:

git add .

如果你想了解更多,请参阅托雷克这里的精彩职位: git的结帐--ours不会未合并的文件列表中删除文件



Answer 8:

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

如果你想接受冲突文件中的所有更改 ,然后执行以下步骤。

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

同样,你可以像接受所有其他的做选择,接受所有电流等,



Answer 9:

从https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging

这将基本上做一个假的合并。 它会记录一个新的合并有两个分支作为父母犯,但它甚至不会看你归并的分支,它只是记录作为合并的结果就是当前分支确切的代码。

 $ git merge -s ours mundo 

合并由“我们的”战略提出。

 $ git diff HEAD HEAD~ 

你可以看到,有我们的分支和合并的结果之间没有差异。

这通常是从根本上欺骗的Git,以为以后做一个合并时的分支已经合并有用。 例如,假设你分出发布分支,也做了一些工作,你将要在某个时候合并到master分支。 在此期间需要被移植入您的发布分支上掌握一些bug修正。 您可以修正错误的分支合并到发布分支,也合并-s我们在同一个分支到你的主分支(即使修复已经存在),因此,当你以后再合并发布分支,没有从修正错误的冲突。

我发现一个情况,如果我想大师,以反映新的特性分支的变化是有用的。 我注意到,-Xtheirs不无冲突合并在某些情况下,如...

$ 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我们的战略合并,这将创建假的承诺是topicFoo的只是状态。 $ git的合并-s我们的主

检查创建合并提交

$ git log

现在签出主分支

$ git checkout master

合并特性分支回,但这次使用-Xtheirs递归策略,它将会与主分支topicFoo的状态您呈现。

$ git merge -X theirs topicFoo


文章来源: Resolve Git merge conflicts in favor of their changes during a pull