显然它可以,见here - 至少这是我看到它的方式。
合并前。位于master
的远程分支origin
位于左侧。两个分支都是一样的。
现在假设我和我的朋友都做了一些工作,我的朋友先把他的工作推到了远程分支,我已经在当地投入了我的工作。
在这种情况下,我不能简单git push
,因为这会导致commited by other
从远程仓库中删除(我想我可以为此执行`git push -f,但是再次 - 这将覆盖我朋友的提交。
文章建议git pull origin master
(fetch
改变origin
回购master
分支和merge
对我的更改本地master
分支)重写我本地master
分支中的提交历史记录!怎么会这样?我认为合并只能创建一个新的合并提交,而不会改变现有的提交。但在这种情况下,提交顺序已经改变 - 现在commited by other
首先出现,然后出现local commit
。
因此,知道pull与fetch(更新本地存储在我的PC上的远程跟踪分支origin/master
)相同,然后将更新的origin/master
合并到本地分支{{ 1}},在这种情况下会产生相同的结果 - 合并是否会改变本地master
分支中过去提交的顺序?
答案 0 :(得分:4)
但在这种情况下,提交顺序已经改变 - 现在由其他人提交,然后是我的本地提交。
这不是真的 - 您的本地提交和“由其他人提交”是 peer 或兄弟姐妹。新的合并提交将它们都作为父项。那有意义吗?您的提交历史记录至少不会更改。
我似乎无法访问您发布的网站,但网址中的标题是指合并和重新定位,并避免“rebase hell”。重新定位确实改变了你的历史;也许这就是作者所说的。
编辑以回复评论:如果您在本地A-B-C
本地且A-B-D
位于遥控器上,则在获取并合并后,您的本地内容将如下所示:
A--B--C--M
\--D-/
换句话说,C
和D
都有B
作为父级,C
和D
都是{{1}的父母}}。推后,远程分支也将如下所示。
现在起初,您可能会认为,“所以我的历史确实会发生变化,因为M
过去只有一个孩子,现在它有两个”。但是git不存储指向子节点的指针,它只存储指向父节点的指针。并且B
仍然拥有单亲C
,因此您的历史记录不会发生变化。由于B
仍然有单亲D
,因此远程的历史记录也没有改变。
答案 1 :(得分:1)
David说的是真的,两个提交是兄弟姐妹,合并提交是他们的孩子。但是,如果您确实想要下拉远程提交的功能""你的本地提交,你可以做git pull --rebase
,这将提取所有远程提交,然后在没有合并提交的情况下重放你的提交。
答案 2 :(得分:0)
merge 需要两个或多个分支,并创建一个提交,用于交换所有父项中的更改(根据需要解决冲突;用户必须决定如何)。 git
本身不会改变历史记录。
要更改历史记录,您必须通过git rebase
或明确为此类手术设计的其他命令明确请求。毋庸置疑,它们很危险,必须非常谨慎地使用。