git pull --rebase是如何工作的?远程提交历史中会显示什么?

jpfvwuh4  于 2023-09-29  发布在  Git
关注(0)|答案(1)|浏览(95)

我在做一个项目。假设我克隆了一个包含A->B->C次提交的仓库“my_repo”。在本地,我在day 1上提交D,但不推送。有人在day 2上执行了一个提交E,并将其推送,从而在repo中将提交历史记录为A->B->C->E。当我在第3天执行git pull --rebase时,我的本地提交历史变成了A->B->C->E->D,尽管D是在两天前提交的。我希望它是按时间顺序排列的A->B->C->D->E。如果我现在将我的修改推送到远程分支,提交历史会是什么样子?任何人都可以帮助这个。

eeq64g8w

eeq64g8w1#

git pull --rebase的工作原理是先运行git fetch,然后运行git rebase,在新获取的提交之上获取 * 您的本地 * 提交(简化;它涉及一些reflog魔法来找出哪些本地提交需要被重定基)。
初始病史:

A-B-C        < main, origin/main

本地提交后:

A-B-C        < origin/main
     `-D     < main

提取后:

A-B-C--E     < origin/main
     `-D     < main

rebase将获取你的 local 提交,这些提交是上游无法访问的,并在上游之上重放它们。唯一一个不能从上游到达,但可以从本地分支到达的提交是commit D。upstream中的最新提交是E。换句话说:Git将重放提交范围E..D;它只包含D
变基后:

A-B-C-E      < origin/main
       `-D'  < main

推送后:

A-B-C-E-D'   < main, origin/main

D移到E之前意味着你需要让Git忘记原来的E,在C上重新创建D',然后在D'上创建一个新的E'。然后,你需要告诉项目中的其他人,忘记他们本地克隆中的原始E,并获得新的重写提交。

相关问题