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


282

我已经阅读了Git社区手册的“ 基本分支和合并”部分。

因此,我按照它创建了一个分支:experimental

然后我:

  1. 切换到实验分支(git checkout实验)
  2. 做一堆改变
  3. 提交它(git commit -a)
  4. 切换到master分支(git checkout master)
  5. 进行一些更改并在那里提交
  6. 切换回实验性(git checkout实验性)
  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在修复之后执行a会导致Please, commit your changes before you can merge.What
as a break

2
带有显式路径的git commit在“说明”的手册页中记录为“ 3”。通过列出文件作为commit命令的参数,在这种情况下,提交将忽略索引中进行的更改,而是记录列出文件的当前内容(Git必须已经知道);”,并且在'- -only'选项。我很确定合并消息是由假设您已经阅读了commit命令的工作原理的人编写的,并且可以识别该描述中“ partial”一词的含义(如果尚未识别的话),至少一遍又一遍。@jww
jthill's

1
那么,为什么该案例研究值得认真阅读以理解,而手册却没有呢?@jww
jthill's

1
好吧,使用git显然比您准备要获得的阅读理解更好。我也许比您确定的更加不确定git中的错误。
jthill

1
使用Git 2.12(2017年第一季度),您很快就可以完成git merge --continue。请参阅下面的答案
VonC

Answers:


267

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


如果使用“ git gui&”进行提交-您可能不会意识到分支状态不再“合并”。跟踪“ git status”有助于确保您的分支状态正确。
Tony Ashworth 2015年

4
尝试git commit -am "your commit message"同时执行添加和提交。
vaheeds,2017年

3
git commit确实有效。最好使用它来为您填充默认的合并提交消息。我避免使用`git commit -am',因为它将覆盖该消息
Arijoon

1
尝试git push
alper

我在以下情况下遇到这种情况->我将X分支与Y分支合并。然后我意识到我在分支Y中做错了,所以我解决了这个问题,然后“修改”了Y分支中的更改。由于修改,git没有创建新的提交。因此,当我将X分支与更新的Y分支合并时,就会产生冲突。顺便说一句,谢谢您的回答。
Doga

157

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

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

git merge --continue

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

请参阅2.12版本说明

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

教“ git merge--continue选项,该选项允许通过完成合并来“继续”合并。
解决冲突后完成合并的传统方式是使用' git commit'。
现在,带有' git rebase'和' git cherry-pick'之类的命令具有' --continue'选项,将这样的选项添加到' git merge'中可以提供一致的UI。


我已经准备好发表评论,说明最近在2017年第一季度的2.12中如何添加了此评论,但随后我重新阅读了答案的第一行。难怪在2.10版上找不到我的选项!
cjsimon

1
我尝试了git merge --continue,Git Bash无法将其识别为命令。但是有效的是git commit -m“ Commit message”
Mimi

2
@Mimi OK,但是您使用的是Git 2.12还是更高版本?
VonC

@VonC您是正确的,我使用的是旧版Git!
米米

23

万一您在合并/重新设置期间陷入困境,可以随时

git reset --hard

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


15
强制性警告:git reset --hard丢弃未提交的更改
Geoffrey Hale

2
为什么不git merge --abort这样做,没有丢失任何东西的风险呢?
亚历山大·乔治


11

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

  1. 一个分支(让我们说分支b)可以通过遵循其提交历史来到达另一个分支(让我们说分支b)。在这种情况下,git只是简单地将头部快速地指向最近的分支(在这种情况下是分支b)。

    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暂停的命令来提交更改。我希望这可以解释您的查询。也可以访问上面的链接以获得详细的了解。如有任何疑问,请在下面发表评论,我们将竭诚为您服务。


7

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

  1. git添加
  2. git status(这将向您显示继续自动合并过程所需的命令)
  3. [命令GIT中所暗示的,例如git merge --continuegit cherry-pick --continuegit rebase --continue]

16
没有git merge --continue
Hola Soy Edu Feliz Navidad

@HolaSoyEduFelizNavidad这是不正确的。冲突发生后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".
Zie

5
有变基-继续,而不是合并
Hola Soy Edu Feliz Navidad

git merge --continue,这就是我要尝试的结果error: unknown option 'continue'。我很确定您的答案是错误的,因为git-merge手册页没有列出它。您正在使用哪个版本的Git?我正在使用git version 1.8.5.2 (Apple Git-48)。我也尝试过MacPorts git version 2.9.3
jww

1
使用Git 2.10简单合并的命令是普通的老式git commit
克里斯Charabaruk

2

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

当遇到冲突的行时,Git将使用视觉标记来编辑受影响文件的内容,这些视觉标记会在冲突内容的两侧进行标记。

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

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

参考文章:Git merge


2

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

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


1

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

当您执行$ git merge时,实际上是git尝试将当前分支快速前进到引用分支所在的提交(换句话说,两个分支名称都指向同一提交)。这种情况对于git最简单应对,因为没有新的提交。想一想主人跳到分支上令人毛骨悚然的嘴唇上。可以设置--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状态验证文件的位置。如果尚未提交合并的文件。您需要执行此操作才能完成合并。


0

可能已经晚了。这是因为您的git HEAD未更新。这个表扬可以解决这个问题git reset HEAD

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.