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

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

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

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

答案

由于您的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 版本 > = 1.6.1,则可以使用git reset --merge

另外,就像 @Michael Johnson 提到的那样,如果您的 git 版本 > = 1.7.4,您还可以使用git merge --abort

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

git merge 手册页

git merge --abort相当于git reset --mergeMERGE_HEAD存在。

合并正在进行时,出现MERGE_HEAD

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

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

git merge --abort

中止当前的冲突解决过程,并尝试重构合并前状态。

如果合并开始时存在未提交的工作树更改,则git merge --abort在某些情况下将无法重构这些更改。因此,建议始终在运行 git merge 之前提交或存储更改。

git merge --abort相当于git reset --mergeMERGE_HEAD存在。

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

它是如此简单。

git merge --abort

当您遇到此类故障并运行 git status 命令时,Git 本身会向您显示解决方案。

git status

希望这对人们有帮助。

我认为这是您需要的git reset

注意git revertsvn revert git revert含义非常不同 - 在 Subversion 中,revert 将丢弃您(未提交的)更改,将文件从存储库返回到当前版本,而git revert “撤消” 提交。

git reset应该等效于svn revert ,也就是说,放弃不需要的更改。

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

也不特别需要重置并执行具有不同策略的合并。 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 reset --merge是一个别名git merge --abort ,但值得注意的是git merge --abort只相当于git reset --merge给出一个MERGE_HEAD存在。可以在 git help for merge 命令中阅读。

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在与上述情况类似的情况下合并功能更为强大,并且合并失败通常。

对于这种情况,我做了git fetchgit pull ,然后意识到上游分支不是 master 分支,这导致了不必要的冲突。

git reset --merge

还原后无需重置我的本地更改。

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

git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin

请删除

.git \ index.lock

文件(将其剪切粘贴到其他位置,以备恢复),然后根据需要的版本输入以下任何命令。

git reset --hard HEAD
git reset --hard origin

希望有帮助!!!

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

git checkout --theirs _widget.html.erb