git diff other_branch
显示差异而git merge other_branch
什么也没做,我感到很难过。将“缺失”代码合并到my_branch
中的正确方法是什么?
这SO answer表明了与我相似的情况。
o---A---B---C-------G my_branch
\ \ /
--*D*---E---F other_branch
当我这样做时, D 中的更改不会自动合并到my_branch
git checkout my_branch
git merge other_branch
将 F 引入 G
我当然可以manually create a patch并将其应用于my_branch
,如下所示:
git diff other_branch my_branch > patchfile
git checkout my_branch
patch -p1 < patchfile
但是我想要做到这一点,而不是弄乱git日志。使用补丁方法,git将记录 D 和我最新补丁中的更改,这些更改彼此独立(代码流失)。我希望简化git log
,并确保其他人在git merge my_branch
执行{{1}}时不会发生意外情况(悄悄地和阴险地)。
答案 0 :(得分:3)
您似乎同时有两个问题。
假设您所描述的历史记录如下:
my_branch
v
----A---B---C-------G
\ \ /
--*D*---E---F
^
other_branch
为什么差异不为空:
这种情况是由您提到的命令产生的,即在my_branch
上,然后执行git merge other_branch
。此操作生成合并提交G
并向前移动当前分支(my_branch
),但将other_branch
移至原来的位置。这就是合并总是有用的!当然,此时my_branch
(G
)和other_branch
(F
)之间仍然存在差异 - 毕竟它们指向不同的提交。
如果您希望两个分支相同,可以通过以下方式向上移动other_branch
:
git checkout other_branch; git merge my_branch
- 这是快进合并,因为G
是F
other_branch
上!] git branch -D other_branch; git branch other_branch my_branch
- 这将删除other_branch
,然后在{{1}的同一位置重新创建它目前是my_branch
- 这将移动 git checkout other_branch; git reset --hard my_branch
指向other_branch
当前指向的位置执行一个步骤后,my_branch
和my_branch
都将指向other_branch
。
为什么提交G
的更改不在D
(my_branch
)
Git合并历史,而不是变化。这通常意味着Git将采用合并的两个方面(如果可用的话,还有他们最年轻的共同祖先提交,即merge-base),并尝试将它们组合在一起。由于Git提交是快照,而不是更改集/增量/差异,因此在实际合并中不使用其他提交或更改的信息。
使用合并库,Git进行所谓的三向合并,使用共同的祖先来尝试巧妙地解决双方的变化。如果不能,它将中断合并并要求用户解决冲突。
历史记录中 可能发生的事情是提交G
或E
还原(或覆盖)F
的更改 - 这可能发生了在合并期间D
中产生E
或实际(手动)更改。
正如您在评论中提到的那样,您经常在提交之间切换并进行编辑。因此,您将进行大量浮动更改(Git在结账时进行未提交的更改),这可能很难说明更改应该去哪里以及实际执行的位置。尝试通过在更改分支之前提交任何更改或使用git stash
缓冲它们来避免这种情况。