使用git rebase --update-refs后分支分叉,疑惑该参数实际作用
关于
git rebase --update-refs的误解解析 先给你掰明白--update-refs到底是干嘛的:
这个参数是Git 2.38之后才有的,它只会在当前分支做rebase的时候,自动更新和当前分支直接连在一起的本地分支引用——简单说,就是如果某个本地分支的最新提交,是当前分支rebase前的直接父节点,而且这个父节点在rebase后被改成新的提交了,Git会把那个分支的指针移到新提交上。但它绝对不会帮你自动把所有上游的祖先分支都挨个rebase一遍,也不会碰和当前分支没直接关联的分支。
你的问题出在哪
你本来想在F3.1上跑git rebase --update-refs develop,让F1、F2、F3都自动挂到最新的DEV_2上,但没成功,核心原因有两个:
- 没从最底层分支开始操作:你的分支链是
DEV → F1 → F2 → F3,直接在最顶层的F3上rebase到develop,只会把F3以及之前F1、F2的所有提交,重新复制一份挂到DEV_2上,生成新的提交链。但F1、F2的分支指针还停在原来DEV_1上面的旧提交,自然就分叉了。 --update-refs的能力有限:就算你给F3设了上游是F2,F2设了上游是F1,这个参数最多也就帮你更新F2的指针(如果F2的最新提交是F3的直接父节点),但不会自动去碰F1——因为F1是更上层的祖先,不在当前F3 rebase操作的“直接关联范围”里。
正确的堆叠分支rebase步骤
要让所有堆叠分支都挂到最新develop上,得从最底层的分支开始一步步来:
- 切到F1分支,把它rebase到最新的develop:
git checkout F1 git rebase develop - 切到F2分支,rebase到更新后的F1上,用
--update-refs可以确保F1的指针是最新的(其实这步可选,因为F1已经更过了):git checkout F2 git rebase --update-refs F1 - 最后切到F3分支,rebase到更新后的F2上:
git checkout F3 git rebase --update-refs F2
这么操作完,F1、F2、F3就会依次挂到最新的DEV_2上,形成你想要的线性结构。
为啥强制推送后会分叉
你rebase后的F3是挂在DEV_2上的新链,但F1、F2还在DEV_1的旧链上,强制推F3之后,远程仓库就同时存在新旧两条分支链,自然就分叉了。你把分支重置回原结构是对的,不然团队成员拉代码会乱套。
内容的提问来源于stack exchange,提问作者Bing Bang
相关产品推荐
相关产品推荐

