首页 文章

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

提问于
浏览
2029

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

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

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

10 回答

  • 16

    由于评论表明 git reset --mergegit merge --abort 的别名,因此值得注意 git merge --abort 仅相当于 git reset --merge ,因为存在 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 --abortso they are not only old and new syntax for the same thing 撤消 .

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

  • 406

    我认为你需要的是 git reset .

    请注意, git revert 表示与 svn revert 非常不同的东西 - 在Subversion中,revert将丢弃您的(未提交的)更改,将文件从存储库返回到当前版本,而 git revert "undoes"提交 .

    git reset 应该相当于 svn revert ,也就是说,丢弃不需要的更改 .

  • 1665

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

    git checkout --theirs _widget.html.erb
    
  • 1

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

    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
    
  • 14
    git merge --abort
    

    中止当前的冲突解决过程,并尝试重建合并前的状态 . 如果合并开始时存在未提交的工作树更改,则git merge --abort在某些情况下将无法重建这些更改 . 因此,建议在运行git merge之前始终提交或存储更改 . 当MERGE_HEAD存在时,git merge --abort相当于git reset --merge .

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

  • 1833

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

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

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

    来自git merge man page

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

    合并正在进行时存在 MERGE_HEAD .

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

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

  • 73

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

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

    请删除

    .git \ index.lock

    file [在恢复的情况下将粘贴剪切到其他位置],然后根据所需的版本输入以下任何一个命令 .

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

    希望有所帮助!

  • 30

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

    git stash
    git merge --abort
    git stash pop
    

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

  • 19

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

    也没有特别需要重置和执行与不同策略的合并 . 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.erb
    git add _widget.html.erb
    

    或者,使用git> = 1.6.1:

    git checkout --theirs _widget.html.erb
    
  • 74

    我发现以下内容适用于我(将单个文件还原为预合并状态):

    git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*
    

相关问题