首页 > 解决方案 > 子分支中的git合并父分支不起作用

问题描述

我有父分支 A 和子分支 B。A 中的提交很少。

我尝试使用以下命令将我的 B 更新为 A。

git pull origin A

然后

git checkout A
git pull
git checkout B
git merge A

对于第一个命令,我遇到了合并冲突,我解决并推送了我的更改。但是 A 的所有变化并没有反映在 B 中。

对于第二个和第三个命令,我尝试并得到结果为 Already up to date.

如何使用 A 的所有更改更新 B

标签: gitbitbucket

解决方案


TL;DR您的第一个操作完成了您在最后一个操作中仍在尝试执行的合并。

细节

要了解发生了什么,让我们用git pull等效的两步命令替换:每次运行git pull时,您真正在做的事情git fetch后面跟着git merge.

因此,在第 1 步中,您有效地做到了:

git fetch origin
git merge A  #(almost, see below)

假设您当时在分支 B 上,您解决并提交的冲突将 A 合并到 B 中。

(#almost:它实际上确实如此git merge origin/A,但会创建一个默认提交消息,说“合并 A”而不是“合并原点/A”。在您的情况下,步骤 2 确认 A 已经是最新的,所以这个细节不会有任何区别)

在第 2 步中,您有效地做到了

git checkout A
git fetch
git merge

现在默认情况下git fetch从 获取origin,您已经在步骤 1 中完成了。这git merge句话Already up to date只是意味着您的 A 分支当时已经与 origin 保持同步,因为默认是在您运行时origin/<my-current-branch>合并(或)没有争论。<my-current-branch>git mergegit pull

在第 3 步中,您只是尝试重做已在第 1 步中完成的合并:

git checkout B
git merge A

因此,B 已经相对于 A 是最新的也就不足为奇了。

检查您的提交图

当我试图弄清楚我的沙箱中发生了什么时,我总是使用一个工具来直观地显示我的整个提交图,包括所有分支。

这是一个简单的命令行来执行此操作,但所有可视提交图查看器都可以选择显示所有分支:

git log --graph --format=oneline --all --decorate

如果你在每次操作后运行它,事情的状态应该是相当明显的。

PS:我最喜欢的 git log 命令实际上是这个,我git loga在我的.gitconfig

git log --color --graph --all --format=format:"%Cred%ad %Cgreen%h %Cblue%an%Cred%d %Creset%s" --date=short

推荐阅读