【问题标题】:How do I finish the merge after resolving my merge conflicts?解决合并冲突后如何完成合并?
【发布时间】:2011-01-29 06:25:03
【问题描述】:

我已阅读 Git 社区手册的 Basic Branching and Merging 部分。

所以我跟着它创建了一个分支:experimental

然后我:

  1. 切换到实验分支(git checkout experimental)
  2. 进行大量更改
  3. 提交它(git commit -a)
  4. 切换到master分支(git checkout master)
  5. 进行一些更改并在那里提交
  6. 切换回实验性(git checkout experimental)
  7. 将主更改合并到实验(git 合并主)
  8. 存在一些冲突,但在我解决它们后,我执行了 'git add myfile'

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

当我这样做时

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

我该怎么做才能回到我的主分支?

【问题讨论】:

  • 修复冲突后,执行添加,然后尝试使用git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts" 执行提交,结果是fatal: cannot do a partial commit during a merge. .当然,“部分提交” 似乎没有在 git 手册页的任何地方记录或讨论。在修复后执行 git merge 会导致 Please, commit your changes before you can merge. 多么糟糕的工具...
  • 带有显式路径的 git 提交在说明中的手册页中记录为“3.通过列出文件作为提交命令的参数,在这种情况下,提交将忽略索引中暂存的更改,而是记录列出文件的当前内容(Git 必须已经知道);”以及在“- -only' 选项。我很确定合并消息是由假设您已阅读提交命令的工作原理的人编写的,并且可以识别该描述中“部分”一词的含义,如果还没有的话,那么至少再次更仔细。@jww
  • 那么,为什么该案例研究值得仔细阅读以便理解,而联机帮助页却没有呢? @jww
  • 嗯,使用 git 显然需要比您准备获得的更好的阅读理解能力。我可能更不确定这是 git 的错误,而不是您确定的错误。
  • 使用 Git 2.12(2017 年第一季度),您很快就会简单地执行 git merge --continue。见my answer below

标签: git git-merge


【解决方案1】:

在合并过程中发生冲突时,您必须手动完成合并提交。听起来您已经完成了前两个步骤,编辑有冲突的文件,然后在它们上运行git add 以将它们标记为已解决。最后,您需要使用git commit 实际提交合并。届时您将能够再次切换分支。

快速提示:您可以使用git commit -am "your commit message" 同时对跟踪的文件执行添加和提交操作。 (来源:@vaheeds)

【讨论】:

  • 如果您使用“git gui &”进行提交 - 您可能没有意识到您的分支状态不再是“合并”。跟进“git status”有助于确保您的分支状态正确。
  • 尝试git commit -am "your commit message"同时执行添加和提交。
  • git commit 确实有效。最好使用它来为您填充默认的合并提交消息。我避免使用 `git commit -am" 因为它会覆盖消息
  • 试试git push
  • 我在以下场景中遇到了这种情况 -> 我将 X 分支与 Y 分支合并。然后我意识到我在 Y 分支中做错了,所以我修复了它,然后我“修改”了我在 Y 分支中的更改。因为修改 git 没有创建新的提交。因此,当我将 X 分支与更新的 Y 分支合并时,它产生了冲突。顺便说一句,感谢您的回答。
【解决方案2】:

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

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

git merge --continue

如果您不想在继续/恢复合并时编辑消息:

git merge --continue --no-edit

commit c7d227d(2016 年 12 月 15 日)Jeff King (peff)
请参阅Chris Packham (cpackham)commit 042e290commit c261a87commit 367ff69(2016 年 12 月 14 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 05f6e1b,2016 年 12 月 27 日)

2.12 release notes

merge:添加“--continue”选项作为“git commit”的同义词

教“git merge--continue 选项,该选项允许“继续” 通过完成合并。
解决冲突后完成合并的传统方法是使用“git commit”。
现在,像 'git rebase' 和 'git cherry-pick' 这样的命令有一个 '--continue' 选项,将这样的选项添加到 'git merge' 会呈现一致的 UI。

【讨论】:

  • 我正准备发表评论,说明这是如何在 2017 年第一季度的 2.12 中最近添加的,但后来我重新阅读了您答案的第一行。难怪我在 2.10 版上找不到该选项!
  • 我尝试了 git merge --continue 并且 Git Bash 无法将其识别为命令。但有效的是 git commit -m "Commit message"
  • @Mimi 好的,但是您使用的是 Git 2.12 或更高版本吗?
  • @VonC 你是对的,我使用的是旧版本的 Git!
  • 这很方便,但是merge 没有--no-edit 参数,用于我不需要编辑提交消息的情况。 git commit --no-edit 工作得很好
【解决方案3】:

如果您在合并/变基过程中遇到困难,您可以随时

git reset --hard

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

【讨论】:

  • 强制警告:git reset --hard 丢弃未提交的更改
  • 为什么不只是git merge --abort,没有丢失任何东西的风险?
【解决方案4】:

git commit吧。

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

为了让合并更轻松,安装 kdiff3 并将其配置为合并工具。说明: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

【讨论】:

    【解决方案5】:

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

    1. 一个分支(比如说brancha)可以通过另一个分支(比如说branchb)通过遵循其提交历史来到达。在这种情况下,git只需快进head以指向最近的分支(在这种情况下是branchb) .

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

    合并两个不冲突的分支后,运行git log 以查看提交。

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

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


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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

      • 没有 git merge --continue
      • @HolaSoyEduFelizNavidad 这是不正确的。 Zie git 冲突后输出如下:- error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
      • 有rebase --continue,没有merge --continue
      • git merge --continue,这是我正在尝试做的,结果是 error: unknown option 'continue'。我敢肯定你的答案是错误的,因为git-merge man page 没有列出它。你使用的是什么版本的 Git?我正在使用git version 1.8.5.2 (Apple Git-48)。我也尝试过使用 MacPorts git version 2.9.3
      • 使用 git 2.10 进行简单合并,该命令很简单 git commit
      【解决方案7】:

      我要明确的第一件事是分支名称只是特定提交的别名。提交是 git 的作用,当你拉,推合并等等。每个提交都有一个唯一的 id。

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

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

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

      【讨论】:

        【解决方案8】:

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

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

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

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

        参考文章:Git merge.

        【讨论】:

          【解决方案9】:

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

          "git status" 将建议做什么:尚未添加的文件列在底部,一旦它们全部完成,它会在顶部建议一个提交,它解释了当前分支的合并状态。

          【讨论】:

            【解决方案10】:

            可能晚了。这是因为你的 git HEAD 没有更新。 这个推荐可以解决git reset HEAD

            【讨论】:

              【解决方案11】:

              解决冲突的步骤:

              1. 首先“结帐”到您要与其他分支合并的分支 分支(BRANCH_NAME_TO_BE_MERGED)

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

              "git 合并原点/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.
              

              现在您可以看到它显示“冲突(内容)”,对于那些具有“冲突”的文件,查看您的代码并解决它们

              1. run "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 提交” (当你要提交时添加一些消息,如果没有,它将打开 vi 或 vim 编辑器,你需要按“esc:q!”然后按“enter”)
              2. 再次运行“git status”

               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 推送”

              【讨论】:

              • 如果你没有遇到任何冲突,那么在第2步之后,使用第7步直接推送到git
              【解决方案12】:

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

              解决所有冲突后,

              -> git 存储

              -> git stash apply stash@{0}

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

              【讨论】:

                猜你喜欢
                • 2012-03-01
                • 2021-07-28
                • 1970-01-01
                • 2015-10-15
                • 2019-04-19
                • 2014-09-13
                • 2019-08-26
                • 2020-12-17
                • 1970-01-01
                相关资源
                最近更新 更多