我遇到了合并冲突。如何终止合并?
我使用git pull
并发生合并冲突:
unmerged: _widget.html.erb You are in the middle of a conflicted merge.
我知道该文件的其他版本是好的,而我的是不好的,因此我的所有更改都应该放弃。我怎样才能做到这一点?
解决方案
我认为这是我们需要的" git reset"。
注意,'git revert'的含义与Subversion中的'svn revert'完全不同,revert将丢弃我们(未提交的)更改,将文件从存储库返回到当前版本,而`git revert'则"撤消"犯罪。
git reset应该等效于svn revert,即丢弃我们不需要的更改。
由于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已经正确地突出显示了冲突,并且接受其他方面的更改的要求仅针对此文件。
对于冲突中的未合并文件,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版本> = 1.6.1,则可以使用git reset --merge。
另外,正如@Michael Johnson提到的,如果git版本> = 1.7.4,我们还可以使用git merge --abort。
与往常一样,在开始合并之前,请确保我们没有未提交的更改。
从git merge手册页
当存在MERGE_HEAD
时,git merge --abort
等同于git reset --merge
。
合并正在进行时,将显示" MERGE_HEAD"。
另外,关于开始合并时未提交的更改:
如果我们有更改,不想在开始合并之前提交,只需在合并之前" git stash"存储它们,并在合并或者中止后" git stash pop"。
保留工作副本状态的另一种方法是:
git stash git merge --abort git stash pop
我通常不建议这样做,因为它实际上就像在Subversion中合并一样,因为它在接下来的提交中丢弃了分支关系。
从Git 1.6.1.3git checkout
可以从合并的任何一侧进行检出:
git checkout --theirs _widget.html.erb