注意:这与这里的问题不同有没有办法在父分支变基后对子分支进行变基?因为子分支在父分支时不是“最新的”已重新设定。
显示多个 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 - 这对我来说似乎不同
我对如何对父分支已变基的子分支进行变基的理解正确吗?
正确吗?有点儿。理想的?没有。
将更多工作重新定基到重新定基的功能上/可以而且应该一次性完成。这正是创建
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