我遇到了合并冲突。 我怎样才能中止合并?

我用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

另外,正如@迈克尔·约翰逊所提到的,如果你的git版本大于1.7.4,你也可以使用git merge --abort

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

从git合并手册页

git merge --abort相当于当存在git reset --mergegit reset --merge

MERGE_HEAD在合并进行时存在。

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

如果您在开始合并之前不想提交,那么只需在merge和git stash pop之前将它们git stash pop在合并或放弃它之后。

 git merge --abort 

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

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

git merge --abort相当于当存在git reset --mergegit reset --merge

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

在这个特定的用例中,你并不是真的想中止合并,只是以特定的方式解决冲突。

没有特别的需要重新设置和与不同的策略进行合并。 这个冲突已经被git正确地强调了,接受其他方面的变化只是针对这个文件。

对于冲突中的未合并文件,git使索引中文件的公共基础,本地和远程版本可用。 (这是从git mergetool的3-way diff工具中读取的地方。)你可以使用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

注意, git revert意味着与svn revert非常不同的东西 – 在Subversion中,revert将放弃你的(未提交的)更改,从存储库返回文件到当前版本,而git revert “撤消”提交。

git reset应该做相当于svn revert ,就是放弃你不想要的更改。

由于意见提示, git reset --mergegit merge --abort的别名,所以值得注意的是git merge --abort只相当于git reset --merge因为MERGE_HEAD是存在的。 这可以在合并命令的git帮助中读取。

 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 reset --merge更加强大,并且一般而言失败的合并。

由于Git 1.6.1.3 git checkout已经能够从合并的任何一方签出:

 git checkout --theirs _widget.html.erb 

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

 git stash git merge --abort git stash pop 

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

我发现以下工作对我来说(恢复单个文件预合并状态):

 git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*