解决合并冲突后如何完成合并?

时间:2010-03-18 23:43:09

标签: git git-merge

我已阅读Git社区图书的Basic Branching and Merging部分。

所以我按照它创建了一个分支:experimental

然后我:

  1. 切换到实验分支(git checkout experimental)
  2. 进行一系列更改
  3. 提交它(git commit -a)
  4. 切换到主分支(git checkout master)
  5. 进行一些更改并提交
  6. 切换回实验(git checkout experimental)
  7. 将主变更合并到实验(git merge master)
  8. 有一些冲突,但在我解决之后,我确实'git add myfile'

  9. 现在我被卡住了,我无法回到主人身上

  10. 当我做的时候

     $ git checkout master
    error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.
    

    我做了:

    $ git rebase --abort
    

    没有进行任何重组?

    我做了:

    $  git add res/layout/socialhub_list_item.xml
    $ git checkout master
    error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.
    

    我能做些什么才能回到主分支?

12 个答案:

答案 0 :(得分:219)

合并期间发生冲突时,您必须手动完成合并提交。听起来你已完成前两个步骤,编辑冲突的文件,然后对它们运行git add以将它们标记为已解决。最后,您需要实际提交与git commit的合并。此时,您将能够再次切换分支。

答案 1 :(得分:98)

  

如何在解决合并冲突后完成合并?

使用Git 2.12(2017年第一季度),您将拥有更自然的命令:

git merge --continue

commit c7d227dJeff King (peff)(2016年12月15日) commit 042e290commit c261a87commit 367ff69Chris Packham (cpackham)(2016年12月14日)。
Junio C Hamano -- gitster --于2016年12月27日commit 05f6e1b合并)

请参阅2.12 release notes

  

merge:添加&{39; --continue'选项作为' git commit'

的同义词      

教导' git merge' --continue选项,允许'继续'一个   完成合并。
  解决冲突后完成合并的传统方式是使用' git commit'   现在使用' git rebase'等命令和' git cherry-pick'拥有' --continue'选项将此选项添加到' git merge'提供一致的用户界面。

答案 2 :(得分:22)

如果你在合并/ rebase期间遇到困难,你总是可以

git reset --hard

将您的工作恢复到上次提交的状态。这将从工作树中丢失您的更改,因此如果您在合并之前进行了本地修改,它们将在此之后消失 - 这就是为什么在您进行本地修改时不建议合并的原因。 :)

答案 3 :(得分:9)

只需git commit

可选git abort它:
I ran into a merge conflict. How can I abort the merge?

为了让合并更轻松,请安装kdiff3并将其配置为mergetool。说明:http://doodkin.com/2016/05/29/git-merge-easy-github-this-branch-has-conflicts-that-must-be-resolved-use-the-command-line/

该页面包含以下视频:https://www.youtube.com/watch?v=Cc4xPp7Iuzo

答案 4 :(得分:8)

每当使用命令git merge brancha branchb合并两个分支时,有两种可能性:

  1. 一个分支(比如brancha)可以通过跟随其提交历史来到达另一个分支(比如branb)。在这种情况下,git只需快进头部指向最近的分支(在此case branchb)。

    2.但是如果两个分支在某个较旧的点分歧,那么git会创建一个新的快照并添加一个指向它的新提交。所以,如果你正在合并的分支之间没有冲突,git会顺利地创建一个新的提交。

  2.   

    运行git log以在合并两个非冲突分支后查看提交。

    现在回到合并分支之间存在合并冲突的有趣情况。我在页面https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

    中引用此内容
      

    Git尚未自动创建新的合并提交。在您解决冲突时,它已暂停该过程。如果要在合并冲突后的任何时候查看哪些文件未合并,您可以运行git status

    因此,如果存在合并冲突,您需要解决冲突,然后使用git add filename添加对登台区域所做的更改,然后使用命令git commit提交更改。由于冲突而被git暂停。我希望这可以解释您的查询。另外,请访问上面的链接以了解详细信息。如有任何疑问,请在下面发表评论,我们乐意为您提供帮助。

答案 5 :(得分:6)

手动解决冲突后的下一步是: -

  1. git add。
  2. git status(这将显示继续自动合并过程所需的命令)
  3. [命令git建议,例如git merge --continuegit cherry-pick --continuegit rebase --continue]

答案 6 :(得分:2)

添加完所有文件后,下一步是“ git commit ”。

“ git status”将建议操作:在底部列出尚未添加的文件,一旦完成,将在顶部建议进行提交,以解释当前分支的合并状态。

答案 7 :(得分:2)

解决冲突的步骤:

  1. 首先要“结帐”到要与另一个分支合并的分支 分支机构(BRANCH_NAME_TO_BE_MERGED)

"git checkout "MAIN_BRANCH"
  1. 然后使用命令将其与“ MAIN_BRANCH”合并:

git merge origin / BRANCH_NAME_TO_BE_MERGED


Auto-merging src/file1.py
CONFLICT (content): Merge conflict in src/file1.py
Auto-merging src/services/docker/filexyz.py
Auto-merging src/cache.py
Auto-merging src/props.py
CONFLICT (content): Merge conflict in src/props.py
Auto-merging src/app.py
CONFLICT (content): Merge conflict in src/app.py
Auto-merging file3
CONFLICT (content): Merge conflict in file3
Automatic merge failed; fix conflicts and then commit the result.

现在您可以看到它向那些带有“ CONFLICT”的文件显示“ CONFLICT(内容)”,查看您的代码并对其进行解析

  1. 运行“ git status” =>它会向您显示需要添加哪些文件(已解决):

 Unmerged paths:
      (use "git add <file>..." to mark resolution)

        both modified:   file3
        both modified:   src/app.py
        both modified:   src/props.py
        both modified:   src/utils/file1.py
  1. 解决所有冲突后,请使用以下git命令逐个添加每个文件

git add file3
git add src/app.py
git add src/props.py
git add src/utils/file1.py
  1. “ git commit” (如果要提交,请添加一些消息,如果没有,那么它将打开vi或vim编辑器,您需要在其中按“ esc:q!”,然后按“输入”)
  2. 再次运行“ git状态”

 On branch MAIN_BRANCH
  Your branch is ahead of 'origin/MAIN_BRANCH' by 10 commits.
  (use "git push" to publish your local commits)

7. “ git push”

答案 8 :(得分:1)

我想说清楚的第一件事是分支名称只是特定提交的别名。一个提交是git工作,当你拉,推合并等等。每个提交都有一个唯一的ID。

当你执行$ git merge时,实际发生的是git尝试将当前分支快进到引用分支所在的提交(换句话说,两个分支名称都指向同一个提交。)此场景是最容易让git处理,因为没有新的提交。想想大师跳到lilipad你的分支是令人不寒而栗的。可以设置--no-ff标志,在这种情况下git将创建一个新的提交,无论是否存在任何代码冲突。

在您尝试合并的两个分支之间存在代码冲突的情况下(通常两个分支的提交历史记录在过去共享一个公共提交),快进将不起作用。 git可能仍然能够自动合并文件,只要在冲突的文件中两个分支都没有更改同一行。在这种情况下,git将为您合并冲突的文件并自动提交它们。您可以通过执行$ git diff --cached来预览git的功能。或者您可以将--no-commit标志传递给merge命令,该命令将在您需要添加和提交的索引中保留已修改的文件。但你可以$ git diff这些文件以查看合并将改变的内容。

第三种情况是当有冲突时git无法自动解决。在这种情况下,您需要手动合并它们。在我看来,这是最容易做的合并,如araxis merge或p4merge(免费)。无论哪种方式,您都必须逐个完成每个文件。如果合并似乎被卡住了,请使用$ git merge --continue来推动它。 Git应该告诉你它是否无法继续,如果是这样,为什么不呢。如果你觉得你在某个时候点亮了合并,你可以做$ git merge -abort,任何合并都会撤消,你可以重新开始。完成后,您合并的每个文件都将是一个需要添加和提交的已修改文件。您可以使用$ git status验证文件的位置。如果您尚未提交合并文件。您需要这样做才能完成合并。您必须先完成合并或中止合并才能切换分支。

答案 9 :(得分:1)

当您尝试合并的两个分支都改变了同一文件的相同部分时,会发生合并冲突。您可以使用git status生成冲突列表。

当遇到冲突的行时,Git将使用标记冲突内容两侧的可视指示符编辑受影响文件的内容。

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

当您修复冲突的文件并准备合并时,您所要做的就是运行git addgit commit来生成合并提交。提交后,git push对分支进行更改。

参考文章:Git merge

答案 10 :(得分:0)

可能已经晚了。这是因为您的git HEAD未更新。 此建议可以解决git reset HEAD

答案 11 :(得分:0)

还有另一个选择,我尝试了 stash 并且在没有任何提交的情况下对我工作得很好

解决所有冲突后,

-> git 存储

-> git stash 应用 stash@{0}

工作正常,您也可以在此之后切换到另一个分支。