我遇到了合并冲突。 我怎样才能中止合并?
我用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 --merge
时git 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 --merge
时git reset --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 --merge
是git 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*