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

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

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

显示多个 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
1个回答
0
投票

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

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

将更多工作重新定基到重新定基的功能上/可以而且应该一次性完成。这正是创建

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.