用于对父分支已变基的子分支进行变基的 git 命令是什么?

问题描述 投票:0回答:2

注意:这与这里的问题不同有没有办法在父分支变基后对子分支进行变基?因为子分支在父分支时不是“最新的”已重新设定。

显示多个 git 提交图来说明我的问题和理解以及我知道要执行的命令。

这种情况已经发生过多次,我们有一个

devel
分支,其中一个大型功能(
feature/one
分支)正在由多个人处理。 为了保持理智,每个开发人员都会从
feature/one
分支出来并执行一项子任务。 子任务会定期合并到
feature/one

  1. 初始提交图。 分支是:
    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
分支。

  1. 首先重新调整原始功能/一个以包含
    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 
  1. 执行上面的 git 命令后,我们得到下图
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
2个回答
1
投票

是的,

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)

0
投票

我对如何对父分支已变基的子分支进行变基的理解是否正确?

正确吗?有点儿。理想的?没有。

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
© www.soinside.com 2019 - 2024. All rights reserved.