rebase 后为什么顺序是 v1<- v2 <- v3.5 <- v3 而不是 v1<- v2 <- v3 <- v3.5

2021-09-18 14:14:06 +08:00
 rationa1cuzz
[develop]> git checkout -b my_feat
[my_feat]> git checkout develop
[develop]> vi v3
[develop]> git add . && git commit -m "v3" && git push
[develop]> git checkout my_feat
[my_feat]> vi v3.5
[my_feat]> git add . && git commit -m "v3.5"
[my_feat]> git checkout develop
[develop]> git rebase my_feat
[develop]> git log --oneline --graph
* bf99dd35 v3
* bf99dd34 v3.5
* bf99dd33 v2
* bf99dd32 v1
[develop]> git rebase my_feat //无法 push 提示需要 pull
[develop]> git rebase origin/develop
* bf99dd35 v3.5
* bf99dd34 v3
* bf99dd33 v2
* bf99dd32 v1
develop]> git push
好奇为什么?第一次 git rebase my_feat 的时候后提交 commit 还跑到前面去了,重新 git rebase origin/develop 就正常了
983 次点击
所在节点    问与答
2 条回复
xiadong1994
2021-09-18 15:21:55 +08:00
你的 develop 是 1 、2 、3,my_feat 是 1 、2 、3.5,你在 develop 上 rebase my_feat,develop 与 my_feat 相比多一个 commit 3,这个 commit 就会被 re 到 my_feat 这个 base 上,所以是 1 、2 、3.5 、3 。你的 origin/develop 此时还是 1 、2 、3 因为没有 push,你 pull 了以后本地 develop 包含了所有远程分支的 commit 所以 history 没变,这时你再 rebase 到 origin/develop,那么本地 develop 分支与新 base origin/develop 的区别就是多了 v3.5,这个 commit 被 re 到了 origin/develop 这个 base 上,就变成了 1 、2 、3 、3.5 。
msg7086
2021-09-18 18:32:06 +08:00
因为你把 develop 的根基改变了。

Rebase 的中文翻译,变基,其实算是比较贴切的。

第一次运行的时候,
develop 上是 1 - 2 - 3
my_feat 上是 1 - 2 - 3.5
你在 develop 上变基 my_feat,就是说,my_feat 作为新的根基,在这之上,把 develop 的提交追加上去。
那么 my_feat 的 1 - 2 - 3.5,到这里不变,后面加上 develop 里多出来的 3,自然就是你说的结果了。

第二次运行的时候,
develop 上是 1 - 2 - 3.5 - 3
origin/develop 上是 1 - 2 - 3
你现在是让 develop 去变基 origin/develop,就是说,origin/develop 作为新的根基,在这之上,把 develop 的提交追加上去。
那么 origin/develop 的 1 - 2 - 3,到这里不变,后面加上 develop 里多出来的 3.5,这就是你最终看到的结果了。

关键点在于,变基时,基是不会改变的,所以第一次你的根基是 my_feat,那么 my_feat 是什么样,就是什么样,3 是不可能插入到 my_feat 的中间去的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/802757

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX