关于Git:我遇到了合并冲突。如何中止合并?

I ran into a merge conflict. How can I abort the merge?

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

1
2
3
unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

我知道文件的另一个版本是好的,而我的版本是坏的,所以应该放弃所有的更改。我该怎么做?


由于您的pull不成功,那么HEAD是您分行最后一次"有效"承诺:

1
git reset --hard HEAD

你想要的另一件事是让他们的改变超越你的改变。

Git的旧版本允许您使用"他们的"合并策略:

1
git pull --strategy=theirs remote_branch

但是,正如Git维护人员Junio Hamano在这条消息中所解释的那样,这已经被删除了。如链接中所述,您可以这样做:

1
2
git fetch origin
git reset --hard origin


如果您的Git版本大于等于1.6.1,则可以使用git reset --merge

另外,正如@michael johnson所提到的,如果您的Git版本大于等于1.7.4,您还可以使用git merge --abort

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

从Git合并手册页

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

合并进行中,出现MERGE_HEAD

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

如果在开始合并之前您不想提交更改,只需在合并之前提交git stash,在完成合并或中止合并之后提交git stash pop


1
git merge --abort

Abort the current conflict resolution process, and try to reconstruct
the pre-merge state.

If there were uncommitted worktree changes present when the merge
started, git merge --abort will in some cases be unable to
reconstruct these changes. It is therefore recommended to always
commit or stash your changes before running git merge.

git merge --abort is equivalent to git reset --merge when
MERGE_HEAD is present.

http://www.git-scm.com/docs/git-merge


我想是你需要的。

注意,git revert的意思与svn revert的意思非常不同,在subversion中,revert将放弃(未提交的)更改,将文件从存储库返回到当前版本,而git revert则"撤消"提交。

git reset应该与svn revert相当,也就是说,放弃你不想要的改变。


在这个特定的用例中,您并不真正希望中止合并,只需要以特定的方式解决冲突。

也不需要用不同的策略重置和执行合并。Git已经正确地突出显示了冲突,接受其他方面更改的要求仅适用于此文件。

对于冲突中未合并的文件,git将提供索引中该文件的公共基础、本地和远程版本。(这是git mergetool在3路Diff工具中读取它们的地方。)您可以使用git show查看它们。

1
2
3
4
5
6
7
8
# common base:
git show :1:_widget.html.erb

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

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

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

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

或者,当git大于等于1.6.1时:

1
git checkout --theirs _widget.html.erb


它如此简单。

1
git merge --abort

当遇到这种类型的问题时,git本身会向您显示解决方案,并运行git status命令。

1
git status

希望这能帮助人们。


由于评论认为git reset --mergegit merge --abort的别名,因此值得注意的是,考虑到存在MERGE_HEAD的情况,git merge --abort只相当于git reset --merge。这可以在合并命令的git帮助中读取。

1
git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

合并失败后,在没有MERGE_HEAD的情况下,可以用git reset --merge撤消合并失败,但不一定用git merge --abort撤消合并失败,因此它们不仅是同一事物的新旧语法。

我个人认为,对于类似于上述场景的场景,git reset --merge更加强大,并且总体而言,合并失败。


如果您最终遇到合并冲突,并且没有任何要提交的内容,但是在应用下面提到的所有命令之后仍然显示合并错误,

1
2
3
4
git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin

请删除

.git\index.lock

文件[Cut Paste to some other location in case of recovery]然后根据您想要的版本输入下面的任何命令。

1
2
git reset --hard HEAD
git reset --hard origin

希望有帮助!!!!


自Git 1.6.1.3以来,git checkout已经能够从合并的任何一边签出:

1
git checkout --theirs _widget.html.erb

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

1
2
3
git stash
git merge --abort
git stash pop

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


我发现以下内容对我有效(将单个文件还原为预合并状态):

1
git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*