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