合并是否可以更改分支的提交历史记录?

时间:2016-02-17 21:48:26

标签: git merge

显然它可以,见here - 至少这是我看到它的方式。

合并前。位于master的远程分支origin位于左侧。两个分支都是一样的。

enter image description here

现在假设我和我的朋友都做了一些工作,我的朋友先把他的工作推到了远程分支,我已经在当地投入了我的工作。

enter image description here

在这种情况下,我不能简单git push,因为这会导致commited by other从远程仓库中删除(我想我可以为此执行`git push -f,但是再次 - 这将覆盖我朋友的提交。

文章建议git pull origin masterfetch改变origin回购master分支和merge对我的更改本地master分支)重写我本地master分支中的提交历史记录!怎么会这样?我认为合并只能创建一个新的合并提交,而不会改变现有的提交。但在这种情况下,提交顺序已经改变 - 现在commited by other首先出现,然后出现local commit

因此,知道pull与fetch(更新本地存储在我的PC上的远程跟踪分支origin/master)相同,然后将更新的origin/master合并到本地分支{{ 1}},在这种情况下会产生相同的结果 - 合并是否会改变本地master分支中过去提交的顺序?

enter image description here

3 个答案:

答案 0 :(得分:4)

  

但在这种情况下,提交顺序已经改变 - 现在由其他人提交,然后是我的本地提交。

这不是真的 - 您的本地提交和“由其他人提交”是 peer 或兄弟姐妹。新的合并提交将它们都作为父项。那有意义吗?您的提交历史记录至少不会更改。

我似乎无法访问您发布的网站,但网址中的标题是指合并和重新定位,并避免“rebase hell”。重新定位确实改变了你的历史;也许这就是作者所说的。

编辑以回复评论:如果您在本地A-B-C本地且A-B-D位于遥控器上,则在获取并合并后,您的本地内容将如下所示:

A--B--C--M
   \--D-/

换句话说,CD都有B作为父级,CD都是{{1}的父母}}。推后,远程分支也将如下所示。

现在起初,您可能会认为,“所以我的历史确实会发生变化,因为M过去只有一个孩子,现在它有两个”。但是git不存储指向子节点的指针,它只存储指向父节点的指针。并且B仍然拥有单亲C,因此您的历史记录不会发生变化。由于B仍然有单亲D,因此远程的历史记录也没有改变。

答案 1 :(得分:1)

David说的是真的,两个提交是兄弟姐妹,合并提交是他们的孩子。但是,如果您确实想要下拉远程提交的功能""你的本地提交,你可以做git pull --rebase,这将提取所有远程提交,然后在没有合并提交的情况下重放你的提交。

答案 2 :(得分:0)

merge 需要两个或多个分支,并创建一个提交,用于交换所有父项中的更改(根据需要解决冲突;用户必须决定如何)。 git本身不会改变历史记录。

要更改历史记录,您必须通过git rebase或明确为此类手术设计的其他命令明确请求。毋庸置疑,它们很危险,必须非常谨慎地使用。