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

Gwy*_*fey 2391 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.
Run Code Online (Sandbox Code Playgroud)

我知道该文件的其他版本是好的,我的是坏的所以我的所有更改都应该放弃.我怎样才能做到这一点?

Pat*_*otz 2119

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

git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

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

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

git pull --strategy=theirs remote_branch
Run Code Online (Sandbox Code Playgroud)

但是这已被删除,正如Junio Hamano(Git维护者)在此消息中所解释的那样.如链接所述,您可以这样做:

git fetch origin
git reset --hard origin
Run Code Online (Sandbox Code Playgroud)

  • 正如最新的回答中所述,从版本1.6.1开始,可以使用'git reset --merge' (147认同)
  • 通过执行以下操作,您可以通过执行以下操作来实现硬重置:`git fetch origin` - >`git reset origin(软重置,您的更改仍然存在)` - >`git checkout file_to_use_their_version_of another_file (将您自己的更改重新加入以匹配原点)`我再也不使用git pull了.因为在我的最新代码和原点之间的斗争中,原点应该总是赢,我总是`git fetch`和`git rebase origin`.这实际上使我的合并和冲突寥寥无几. (47认同)
  • `git merge --abort`是更可取的. (9认同)
  • 我同意.我也想首先获取,然后检查上游的变化(`git log .. @ {upstream}`或`git diff .. @ {upstream}`).在那之后,和你一样,我会改变我的工作. (7认同)
  • 我使用`git merge -X他们的remote_branch`而不是`git pull --strategy =他们的remote_branch`作为`theirs`看起来像`recursive`的选项 (5认同)
  • 没有策略`他们的'. (5认同)
  • 除此之外,如果您还想要清理一些未跟踪的文件,我建议运行"git clean -f". (2认同)

Car*_*arl 1866

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

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

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

来自git merge手册页

git merge --abort相当于git reset --merge什么时候MERGE_HEAD存在.

MERGE_HEAD 合并正在进行时存在.

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

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

  • 我希望这个答案有更多的选票!在这一点上,它似乎是许多情况下最相关的解决方案. (41认同)
  • 由于git v1.7.4 git merge --abort也有效. (26认同)
  • 有趣 - 但手册吓到了我.什么时候适合使用?你何时需要指定可选的`<commit>`?#GitMoment:-o (3认同)
  • `git merge --abort` 只是 `git reset --merge` 的同义词吗?这个名字当然更有意义,但它是否具有相同的功能? (2认同)

ign*_*nis 487

git merge --abort
Run Code Online (Sandbox Code Playgroud)

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

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

git merge --abort相当于git reset --merge什么时候 MERGE_HEAD存在.

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

  • 从git v1.7.4开始就可以使用它.它是git reset --merge的别名. (16认同)
  • 不适用于章鱼合并冲突. (2认同)

Jag*_*hal 136

它如此简单.

git merge --abort
Run Code Online (Sandbox Code Playgroud)

当您遇到此类问题并运行git status命令时,Git会向您显示解决方案.

git status
Run Code Online (Sandbox Code Playgroud)

希望这会对人们有所帮助.

  • 这已经在几个不同的答案中说明了 (3认同)

Dav*_*ous 92

我认为这是git reset你需要的.

请注意,这git revert意味着一些非常不同的东西,比如说,svn revert在Subversion中,revert会丢弃你的(未提交的)更改,将文件从存储库返回到当前版本,而git revert"撤消"提交.

git reset应该做相当于svn revert,即丢弃你不想要的更改.


CB *_*ley 75

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

也没有特别需要重置和执行与不同策略的合并.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
Run Code Online (Sandbox Code Playgroud)

解决冲突以逐字使用远程版本的最简单方法是:

git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb
Run Code Online (Sandbox Code Playgroud)

或者,使用git> = 1.6.1:

git checkout --theirs _widget.html.erb
Run Code Online (Sandbox Code Playgroud)

  • 我认为`git 1.6.1`命令很有意义,而且很好.这正是我想要的.我认为1.6.1之前的解决方案不够优雅,需要了解应该与合并解析过程分离的git的其他部分.但新版本很棒! (10认同)
  • 谢谢你的提示.不过这不是一个糟糕的git用户界面吗? (5认同)

Han*_*bib 64

对于 git >= 1.6.1:

git merge --abort
Run Code Online (Sandbox Code Playgroud)

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

git reset --merge
Run Code Online (Sandbox Code Playgroud)

或者

git reset --hard
Run Code Online (Sandbox Code Playgroud)


The*_*hal 48

您可以中止合并步骤:

git merge --abort
Run Code Online (Sandbox Code Playgroud)

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

git checkout --ours file1 file2 ...
Run Code Online (Sandbox Code Playgroud)

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

git checkout --theirs file1 file2 ...
Run Code Online (Sandbox Code Playgroud)


Mar*_*n G 35

由于评论表明这git reset --merge是别名git merge --abort,因此值得注意的git merge --abort是,只有git reset --merge当a MERGE_HEAD存在时才相等.这可以在git help for merge命令中读取.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
Run Code Online (Sandbox Code Playgroud)

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

就个人而言,我发现git reset --merge对于类似于上述场景的场景更加强大,并且一般来说合并失败.

  • 这里的"合并失败"究竟是什么意思?合并冲突或其他什么?或者改写它:MERGE_HEAD何时不存在?我的后续问题是了解更好地使用"git reset --merge". (2认同)

Nir*_*hta 26

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

git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin
Run Code Online (Sandbox Code Playgroud)

请删除

git的\ index.lock

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

git reset --hard HEAD
git reset --hard origin
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!


naa*_*eya 26

For scenario like this, I did git fetch and git pull, then realized that upstream branch was not master branch, which resulted in unwanted conflicts.

git reset --merge 
Run Code Online (Sandbox Code Playgroud)

This reverted back without resetting my local changes.


Dan*_*iel 21

可能不是OP想要的,但对我来说,我尝试将稳定分支合并到功能分支,但存在太多冲突。我没有设法重置更改,因为 HEAD 已被多次提交更改,因此简单的解决方案是强制签出到稳定分支。然后您可以签出到另一个分支,它将与合并之前一样。

git checkout -f master

git checkout side-branch


Ala*_*Dea 18

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

git checkout --theirs _widget.html.erb
Run Code Online (Sandbox Code Playgroud)


Ala*_*Dea 17

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

git stash
git merge --abort
git stash pop
Run Code Online (Sandbox Code Playgroud)

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


sas*_*rsl 7

为了避免陷入此类麻烦,可以扩展该方法并在合并之前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...
Run Code Online (Sandbox Code Playgroud)

致力于解决冲突。

# 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
Run Code Online (Sandbox Code Playgroud)

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

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