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

Gwyn Morfey 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.

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

Pat Notz.. 2119

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

git reset --hard HEAD

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

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

git pull --strategy=theirs remote_branch

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

git fetch origin
git reset --hard origin

  • 正如最新的回答中所述,从版本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认同)

Carl.. 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认同)

ignis.. 487

git merge --abort

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

如果在合并开始时存在未提交的工作树更改,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认同)

Jagruttam Pa.. 136

它如此简单.

git merge --abort

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

git status

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

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

David Precio.. 92

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

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

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


CB Bailey.. 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

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

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

Martin 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.

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

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

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

Nirav Mehta.. 26

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

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

希望有所帮助!


naamadheya.. 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 

This reverted back without resetting my local changes.


Alain O'Dea.. 18

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

git checkout --theirs _widget.html.erb


Alain O'Dea.. 17

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

git stash
git merge --abort
git stash pop

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


归档时间:

查看次数:

1625921 次

最近记录:

11 月,1 周 前