git合并父分支在子分支不工作



我有父分支A和子分支B。There are few commits in 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

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,但创建了一个默认的提交消息说"合并"而不是"合并起源"。在您的例子中,步骤2确认A已经是最新的,所以这个细节没有什么区别)

在步骤2中,您有效地执行了

git checkout A
git fetch
git merge

现在默认情况下,git fetchorigin中获取,这在步骤1中已经完成了。git mergeAlready up to date只是意味着你的A分支在当时已经是最新的,因为当你运行git merge(或git pull)而不带参数时,默认情况是将origin/<my-current-branch>合并到<my-current-branch>中。

在步骤3中,您只是试图重做您在步骤1中已经完成的合并:

git checkout B
git merge A

所以B已经是a的最新版本也就不足为奇了

查看提交图

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

这是一个简单的命令行,但是所有的可视化提交图查看器都有显示所有分支的选项:

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

如果在每个操作之后运行该语句,那么事情的状态应该是相当明显的。

p我最喜欢的git日志命令实际上是这个,我在.gitconfig中将其别名为git loga:

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