353

我已经阅读了Git Community Book 的Basic Branching and Merging部分。

所以我遵循它并创建一个分支:experimental.

然后我:

  1. 切换到实验分支(git checkout experimental)
  2. 做一堆改变
  3. 提交它(git commit -a)
  4. 切换到主分支(git checkout master)
  5. 进行一些更改并在那里提交
  6. 切换回实验(git checkout 实验)
  7. 将主更改合并到实验(git merge master)
  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.

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

4

12 回答 12

328

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

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

于 2010-03-18T23:52:38.433 回答
229

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

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

git merge --continue

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

git merge --continue --no-edit

请参阅Jeff King ( )提交的 c7d227d(2016 年 12 月 15 日) 。 请参阅Chris Packham ( )的提交 042e290提交 c261a87提交 367ff69(2016 年 12 月 14 日) 。(由Junio C Hamano 合并 -- --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。

于 2016-12-28T20:55:54.137 回答
27

万一你在合并/变基过程中卡住了,你总是可以

git reset --hard

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

于 2010-03-20T11:33:57.617 回答
12

每当您使用 command 合并两个分支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 暂停的命令提交更改。我希望这能解释您的询问。也请访问上面的链接以了解详细信息。如有任何疑问,请在下面发表评论,我很乐意提供帮助。

于 2016-09-23T18:43:33.967 回答
12

只是git commit它。

可选git abort
我遇到了合并冲突。如何中止合并?

为了让合并更轻松,安装 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

于 2016-09-23T18:53:12.623 回答
9

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

  1. 混帐添加。
  2. git status (这将向您显示继续自动合并过程所需的命令)
  3. [命令 git 建议,例如git merge --continue, git cherry-pick --continue, git rebase --continue]
于 2016-02-19T14:00:46.957 回答
3

解决冲突的步骤:

  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. 运行"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" (add some message when you are going to commit, if not then it will open vi or vim editor where you need to press "esc:q!" then press "enter")
  2. run again "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 push"

于 2020-08-19T02:29:49.637 回答
2

我要明确的第一件事是分支名称只是特定提交的别名。提交是 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 验证文件的位置。如果您尚未提交合并的文件。您需要这样做才能完成合并。

于 2016-09-25T01:09:54.163 回答
2

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

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

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

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

参考文章:Git 合并

于 2018-05-22T12:06:38.157 回答
2

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

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

于 2018-06-19T12:44:39.823 回答
2

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

于 2019-04-24T06:02:32.147 回答
0

Another option also, I tried stash and worked fine for me without any commit

After you resolve all conflicts,

-> git stash

-> git stash apply stash@{0}

worked fine, you can switch to another branch also after this.

于 2021-07-30T18:53:08.143 回答