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

时间:2008-09-19 13:21:00

标签: git version-control git-merge merge-conflict-resolution git-merge-conflict

我使用了git pull并发生了合并冲突:

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

我知道该文件的其他版本是好的,而且我的版本很糟糕所以我的所有更改都应该放弃。我怎么能这样做?

17 个答案:

答案 0 :(得分:1972)

由于pull未成功,因此HEAD(不是HEAD^)是您分支机构的最后一次“有效”提交:

git reset --hard HEAD

你想要的另一件事是让他们的改变超越你的改变。

旧版本的git允许您使用“他们的”合并策略:

git pull --strategy=theirs remote_branch

但是已经删除了,正如this message by Junio Hamano(Git维护者)中所解释的那样。如the link中所述,您可以这样做:

git fetch origin
git reset --hard origin

答案 1 :(得分:1781)

如果你的git版本是> = 1.6.1,你可以使用git reset --merge

另外,正如@Michael Johnson所提到的,如果你的git版本是> = 1.7.4,你也可以使用git merge --abort

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

来自git merge man page

git merge --abort出现时,

git reset --merge相当于MERGE_HEAD

合并正在进行时,

MERGE_HEAD存在。

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

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

答案 2 :(得分:444)

git merge --abort
  

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

     

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

     

git merge --abort相当于git reset --merge时   MERGE_HEAD存在。

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

答案 3 :(得分:83)

我认为你需要git reset

请注意,git revert表示与svn revert非常不同的东西 - 在Subversion中,恢复将丢弃您的(未提交的)更改,将文件从存储库返回到当前版本,而{git revert 1}}“撤消”提交。

git reset应该相当于svn revert,即丢弃不需要的更改。

答案 4 :(得分:74)

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

也没有特别需要重置并使用不同的策略执行合并。 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

答案 5 :(得分:65)

它是如此简单。

git merge --abort

当您遇到这种类型的麻烦并运行git status命令时,Git本身会向您显示解决方案。

git status

希望这对人们有帮助。

答案 6 :(得分:48)

对于git> = 1.6.1:

git merge --abort

对于较旧版本的git,这可以完成此工作:

git reset --merge

git reset --hard

答案 7 :(得分:32)

由于评论表明git reset --mergegit merge --abort的别名,因此git merge --abort只相当于git reset --merge,因为MERGE_HEADgit merge --abort is equivalent to git reset --merge when MERGE_HEAD is present. ,所以值得注意当下。这可以在git help for merge命令中读取。

MERGE_HEAD

合并失败后,如果没有git reset --merge,则可以使用git merge --abort撤消失败的合并,但不一定使用git reset --merge撤消合并,因此它们不仅仅是旧的同一事物的新语法

我个人认为{{1}}对于类似于上述场景的场景更加强大,并且通常会失败合并。

答案 8 :(得分:30)

对于这种情况,我做了"ApplicationInsights": { "InstrumentationKey": "yourinstrumentationkey" } git fetch,然后意识到上游分支不是主分支,这导致了不必要的冲突。

git pull

此操作已还原,无需重置我的本地更改。

答案 9 :(得分:23)

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

git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin

请删除

  

<强> 的.git \ index.lock

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

git reset --hard HEAD
git reset --hard origin

希望有所帮助!!!

答案 10 :(得分:17)

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

git checkout --theirs _widget.html.erb

答案 11 :(得分:15)

保留工作副本状态的替代方法是:

git stash
git merge --abort
git stash pop

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

答案 12 :(得分:3)

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

git checkout -f master

git checkout side-branch

答案 13 :(得分:2)

您可以中止合并步骤:

git merge --abort

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

git checkout --ours file1 file2 ...

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

git checkout --theirs file1 file2 ...

答案 14 :(得分:1)

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

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

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

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

# Checkout the topic branch
git checkout topic-branch-1

# Create a _test_ branch on top of this
git checkout -b test

# Attempt to merge master
git merge master

# If it fails you can abandon the merge
git merge --abort
git checkout -
git branch -D test  # we don't care about this branch really...

致力于解决冲突。

# Checkout the topic branch
git checkout topic-branch-1

# Create a _test_ branch on top of this
git checkout -b test

# Attempt to merge master
git merge master

# resolve conflicts, run it through tests, etc
# then
git commit <conflict-resolving>

# You *could* now even create a separate test branch on top of master
# and see if you are able to merge
git checkout master
git checkout -b master-test
git merge test

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

涉及?是的,但它不会干扰我的主题或主分支,直到我准备好了。

答案 15 :(得分:1)

我发现以下内容对我有用(将单个文件恢复为合并前状态):

git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*

答案 16 :(得分:-10)

源树

因为您没有提交合并,所以只需双击另一个分支(这意味着将其签出),然后当sourcetree询问您放弃所有更改然后同意:)

更新

我看到很多否决票,但有任何麻烦……我将留下这个答案,该答案适用于那些使用SourceTree作为git客户端的人(因为我-当我寻找OP提出的问题的解决方案时)