注意:这与这里的问题不同有没有办法在父分支变基后对子分支进行变基?因为子分支在父分支时不是“最新的”已重新设定。
显示多个 git 提交图来说明我的问题和理解以及我知道要执行的命令。
这种情况已经发生过多次,我们有一个
devel
分支,其中一个大型功能(feature/one
分支)正在由多个人处理。 为了保持理智,每个开发人员都会从 feature/one
分支出来并执行一项子任务。 子任务会定期合并到 feature/one
。
devel
脱离 main
,feature/one
脱离 devel
,以及 more-work
脱离功能/一。 由于 main
对此问题的其余部分没有影响,因此不会在任何后续提交图中显示。o--o--o (main)
\
A---B---C (devel)
\
D---E---F (feature/one)
\
G---H (more-work) # one sub-task.
feature/one
分支已准备好合并,因此必须首先对其进行重新设置。 为此,使用 git rebase
命令如下:
git checkout devel
git pull
git checkout feature/one
git rebase devel
这些命令确保您拥有最新的开发分支,然后您可以重新建立基础。 2. 生成的 git 提交图为:
A---B---C (devel)
\ \
\ D2--E2--F2 (rebased feature/one)
\
D---E---F (original feature/one, now detached from feature/one branch)
\
G---H (more-work)
这给出了想要的结果,并且是我已经成功使用多次的正常情况。
注意:哈希值 D2 代表提交 D,但具有新的哈希值,与 E2 和 F2 类似。
接下来,我想将
more-work
合并到 feature/one
。
重要提示:IMO 择优挑选会更简单地达到预期结果。
以下是使用
git rebase –onto feature/one
所需的多个(2 个步骤)。这意味着 more-work
需要首先重新基于原始 feature/one
(以包括 F
提交),然后再到 rebased feature/one
分支。
F
提交。 我不确定 git 命令是否可以执行此操作,因此未显示它,但生成的 git 提交图将如下所示:A---B---C (devel)
|\ \
| \ D2--E2--F2 (rebased feature/one)
| \
| D---E---F (original feature/one, now detached from feature/one branch)
| \
\ G---H (more-work)
\
D3---E3---F3 (original feature/one rehashed a 2nd time)
\
G2---H2 (more-work (rebased))
此时,
more-work
重新基址分支现在包含在哈希F
中所做的更改,这允许使用git rebase --onto feature/one
命令,如下所示
git rebase --onto feature/one F3-hash more-work
A---B---C (devel)
|\ \
| \ D2--E2--F2 (feature/one after rebase)
| \ \
| \ G3---H3 (more-work (rebased-2nd-time))
| \
| D---E---F (original feature/one, now detached from feature/one branch)
| \
\ G---H (more-work)
\
D3---E3---F3 (original feature/one rehashed a 2nd time)
\
G2---H2 (more-work (rebased))
就这么简单。 😊
我对如何对父分支已重新建立基础的子分支进行重新建立基础的理解是否正确?
以下是我发现的相关链接,以形成我对 git rebase 如何工作的理解。
有没有办法在父分支变基后变基子分支? - 这个问题/答案与这里的问题不同,因为子分支当时与父分支不是“最新的”父级被重新设置。我的信念是需要多次变基,正如我在提交图中所示的那样。
如何更改我的父分支?这记录在 https://git-scm.com/docs/git-rebase 的 git 文档中,并显示了如何将
topic
分支从next
分支(在我的示例中又称为 devel
)到 master
分支。
o---o---o---o---o master
\
o---o---o---o---o next
\
o---o---o topic
这个问题和我的问题之间最大的区别是,我的示例没有来自下一个 HEAD 的主题。
rebase 到 master 的命令很简单。
git rebase --onto master next topic
导致
o---o---o---o---o master
| \
| o'--o'--o' topic
\
o---o---o---o---o next
其他搜索正在回答其他问题
重新建立已从分支的分支 - 不相关。
带有子分支的 git rebase master - 这对我来说似乎不同
是的,
git rebase --onto feature/one F3-hash more-work
是执行此操作的规范方法,但您不需要两个“步骤”来进行变基。对第一个分支进行变基 (git rebase deve feature/one
),然后对第二个分支进行变基(请参阅第一个变基命令)。
您也可以尝试一个简单的
git rebase feature/one more-work
– Git 通常足够聪明,可以找出哪些提交已经是新父级的一部分。
另一种方法是同时对两个分支进行变基,如果您已经知道一个分支是另一个分支的直系后代,并且您需要将它们都变基到新的上游:
git rebase --update-refs devel more-work`
这将重新设定
devel
和 more-work
之间的所有提交,并更新您的 feature/one
引用(即分支)。由此产生的历史记录将是:
A---B---C (devel)
\
D2--E2--F2 (rebased feature/one)
\
G2---H2 (rebased more-work)
我对如何对父分支已变基的子分支进行变基的理解是否正确?
正确吗?有点儿。理想的?没有。
将
more-work
变基到变基 feature/one
可以而且应该一次性完成。这正是创建 rebase --onto
的场景。
* 9a7c139 (HEAD -> more-work) H
* 922d375 G
| * 978c327 (feature/one) F
|/
* bce6cab E
* 3cf018e D
| * 9c2aeeb (devel) C
|/
* 0c5017f B
* 8914d3a A
* fbc5771 (master) Initial commit
feature/one
上重新调整
devel
git switch feature/one && git rebase devel
* 6f50942 (HEAD -> feature/one) F
* 3cad97b E
* d0f8a97 D
* 9c2aeeb (devel) C
| * 9a7c139 (more-work) H
| * 922d375 G
| * bce6cab E
| * 3cf018e D
|/
* 0c5017f B
* 8914d3a A
* fbc5771 (master) Initial commit
more-work
到 feature/one
E_sha1=bce6cab
git rebase --onto feature/one $E_sha1 more-work
* 6cb28df (HEAD -> more-work) H
* 1fc20f8 G
* 6f50942 (feature/one) F
* 3cad97b E
* d0f8a97 D
* 9c2aeeb (devel) C
* 0c5017f B
* 8914d3a A
* fbc5771 (master) Initial commit