我遇到了合并冲突。如何终止合并?

时间:2020-03-06 14:25:52  来源:igfitidea点击:

我使用git pull并发生合并冲突:

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

我知道该文件的其他版本是好的,而我的是不好的,因此我的所有更改都应该放弃。我怎样才能做到这一点?

解决方案

我认为这是我们需要的" git reset"。

注意,'git revert'的含义与Subversion中的'svn revert'完全不同,revert将丢弃我们(未提交的)更改,将文件从存储库返回到当前版本,而`git revert'则"撤消"犯罪。

git reset应该等效于svn revert,即丢弃我们不需要的更改。

由于pull操作失败,因此HEAD(不是HEAD ^)是分支上的最后一个"有效"提交:

git reset --hard HEAD

我们想要的另一件事情是让他们的更改优先于更改。

较旧版本的git允许我们使用"其"合并策略:

git pull --strategy=theirs remote_branch

但这已被删除,正如Junio Hamano(Git维护者)在此消息中所解释的。如链接中所述,我们可以执行以下操作:

git fetch origin
git reset --hard origin

在这种特定的用例中,我们实际上并不想中止合并,而只是以特定的方式解决冲突。

也不特别需要重置并执行具有不同策略的合并。 git已经正确地突出显示了冲突,并且接受其他方面的更改的要求仅针对此文件。

对于冲突中的未合并文件,git会在索引中提供该文件的通用基本版本,本地版本和远程版本。 (这是git mergetool从三向差异工具中读取它们的地方。)我们可以使用git show来查看它们。

# common base:
git show :1:_widget.html.erb

# 'ours'
git show :2:_widget.html.erb

# 'theirs'
git show :3:_widget.html.erb

使用逐字远程版本解决冲突的最简单方法是:

git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb

或者,使用git> = 1.6.1:

git checkout --theirs _widget.html.erb

如果git版本> = 1.6.1,则可以使用git reset --merge。

另外,正如@Michael Johnson提到的,如果git版本> = 1.7.4,我们还可以使用git merge --abort。

与往常一样,在开始合并之前,请确保我们没有未提交的更改。

从git merge手册页

当存在MERGE_HEAD时,git merge --abort等同于git reset --merge

合并正在进行时,将显示" MERGE_HEAD"。

另外,关于开始合并时未提交的更改:

如果我们有更改,不想在开始合并之前提交,只需在合并之前" git stash"存储它们,并在合并或者中止后" git stash pop"。

保留工作副本状态的另一种方法是:

git stash
git merge --abort
git stash pop

我通常不建议这样做,因为它实际上就像在Subversion中合并一样,因为它在接下来的提交中丢弃了分支关系。

从Git 1.6.1.3git checkout可以从合并的任何一侧进行检出:

git checkout --theirs _widget.html.erb