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

我使用了git pull并遇到了合并冲突:

unmerged:   some_file.txt
You are in the middle of a conflicted merge.

如何放弃对文件的更改并仅保留拉出的更改?

2415995 次浏览

我认为这是你需要的git reset

请注意,git revert的含义与svn revert非常不同-在Subversion中,还原将丢弃您的(未提交的)更改,将文件从存储库返回到当前版本,而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 origingit reset --hard origin

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

也没有特别需要重置和使用不同的策略执行合并。git已正确突出显示冲突,并且接受其他方更改的要求仅适用于这一个文件。

对于冲突中的未合并文件,git在索引中提供文件的公共基础、本地和远程版本。(这是git mergetool在3路差异工具中读取它们的位置。)您可以使用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.erbgit 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_HEAD时,git merge --abort等价于git reset --merge

当合并正在进行时,MERGE_HEAD存在。

此外,关于启动合并时未提交的更改:

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

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

git stashgit merge --abortgit stash pop

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

由于Git1.6.1.3#0已经能够从合并的任何一侧签出:

git checkout --theirs _widget.html.erb
git merge --abort

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

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

git merge --abort等价于git reset --merge,当MERGE_HEAD已存在。

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

评论表明git reset --mergegit merge --abort的别名。值得注意的是,在存在MERGE_HEAD的情况下,git merge --abort仅等效于git reset --merge。这可以在git帮助合并命令中读取。

当存在MERGE_HEAD时,git合并--abort等效于git重置--合并。

失败的合并后,当没有MERGE_HEAD时,失败的合并可以用git reset --merge撤消,但不一定用git merge --abort撤消。它们不仅是同一事物的新旧语法

就个人而言,我发现git reset --merge对于类似于所描述的场景更强大,并且通常失败的合并。

我发现以下方法对我有效(将单个文件恢复到预合并状态):

git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*

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

git reset --hard HEADgit pull --strategy=theirs remote_branchgit fetch origingit reset --hard origin

请删除

. git\index.lock

文件[在恢复的情况下剪切粘贴到其他位置],然后根据您想要的版本输入以下任何命令。

git reset --hard HEADgit reset --hard origin

希望有帮助!!!

对于git>=1.6.1:

git merge --abort

对于旧版本的git,这将完成工作:

git reset --merge

git reset --hard

您可以中止合并步骤:

git merge --abort

否则,您可以保留您的更改(您在哪个分支上)

git checkout --ours file1 file2 ...

否则,您可以保留其他分支更改

git checkout --theirs file1 file2 ...

为了避免陷入这种麻烦,可以扩展git merge --abort方法并创建合并前的独立测试分支

案例:你有一个主题分支,它没有被合并,因为你分心了/出现了一些事情/你知道,但它(或)准备好了。

现在有没有可能将其合并到master中?

测试分支中工作以估计/找到解决方案,然后放弃测试分支并在主题分支中应用解决方案。

# Checkout the topic branchgit checkout topic-branch-1
# Create a _test_ branch on top of thisgit checkout -b test
# Attempt to merge mastergit merge master
# If it fails you can abandon the mergegit merge --abortgit checkout -git branch -D test  # we don't care about this branch really...

努力解决冲突。

# Checkout the topic branchgit checkout topic-branch-1
# Create a _test_ branch on top of thisgit checkout -b test
# Attempt to merge mastergit merge master
# resolve conflicts, run it through tests, etc# thengit commit <conflict-resolving>
# You *could* now even create a separate test branch on top of master# and see if you are able to mergegit checkout mastergit checkout -b master-testgit merge test

最后再次签出主题分支,应用测试分支的修复并继续PR。最后删除test和master-test。

参与?是的,但在我准备好之前,它不会扰乱我的主题或主分支。

可能不是OP想要的,但对我来说,我试图将一个稳定的分支合并到一个功能分支,并且有太多的冲突。由于HEAD被许多提交更改,我没有设法重置更改,因此简单的解决方案是强制签出到稳定的分支。然后你可以签出到另一个分支,它将和合并前一样。

git checkout -f master

git checkout side-branch