【问题标题】:How to rebase branch from develop to another new branch create from develop?如何将分支从开发变基到另一个从开发创建的新分支?
【发布时间】:2021-11-04 19:46:11
【问题描述】:

我想从开发和变基功能分支创建实验分支,该分支有 2 次提交,但我犯了一些错误,结果就像这个问题一样:How to remove first commit of a specific branch?
现在我可以通过 Mr.Gaël J. 的解决方案进行修复,并想再次重做。
下面的命令会实现我想要的吗?提前谢谢你。

===== Create experimental branch =====
git checkout develop
git pull origin develop
git checkout -b experimental
**Add Note.txt and put some text
git add -A
git commit -m "Experimental branch commit for experimental development"
git push origin experimental

===== Rebase feature branch to experimental branch =====
git checkout feature
git rebase --onto experimental develop feature
git push -f origin feature

【问题讨论】:

    标签: git backlog


    【解决方案1】:

    TL;DR:是的,你的命令顺序是正确的。

    您可以使用git rebase experimental 稍微缩短它。

    使用git checkoutgit switch 选择develop 尖端的提交:

    git switch develop
    

    您现在将该提交作为 current 提交,并将该分支名称作为 当前分支名称; 我喜欢将其绘制为:

    ...--G--H   <-- develop (HEAD)
             \
              I--J   <-- feature
    

    大写字母代表提交哈希 ID。

    现在您可以创建一个新的分支名称experimental,并将其设为当前分支:

    git switch -c experimental    # or git checkout -b experimental
    

    制作:

    ...--G--H   <-- develop, experimental (HEAD)
             \
              I--J   <-- feature
    

    您现在所做的新提交会增加名称 experimental

              K   <-- experimental (HEAD)
             /
    ...--G--H   <-- develop
             \
              I--J   <-- feature
    

    现在有必要将提交 IJ 复制到新的、略有不同的提交,这些提交使用提交 K 作为 I 副本的父级,并使用 I 的副本作为J 的父级。 git rebase 命令执行这种复制。

    如果你给git rebase一个branch参数,它会在那个参数上运行一个初始的git switch(或git checkout)。我觉得这是不明智的(最近在 Git 邮件列表中发现了一个错误,在这个区域),我更喜欢自己单独的 git switch,但你可以运行:

    git rebase --onto experimental develop feature
    

    消除单独的git checkout feature 步骤。正如我所说,我不会;我会先运行git switch feature

    git rebase 将复制的提交集以git loggit rev-list 生成的提交列表开头:

    git rebase [--onto <target>] <upstream>
    

    使用当前分支作为这些提交的来源,<em>upstream</em>..HEAD 作为可能被复制的提交的初始列表。1

    由于您的 upstream 参数是 developexperimental,因此列表将由以下人员生成:

    git log develop..HEAD
    

    或:

    git log experimental..HEAD
    

    如果您在此过程中尝试这两个命令,您将看到它们产生相同的输出。原因是两点运算符A..B左侧 告诉Git 什么提交 使用右侧告诉 Git使用什么提交,减去任何被左侧覆盖的内容。这些操作中的每一个都通过查找 last 提交(由哈希 ID 或分支名称或 HEAD 名称命名)并向后工作。

    feature 上的 last 提交是 J,倒数第二个是 I,后面的提交是 H,以此类推。排除列表要么从K 开始,然后返回到H,然后从那里向后继续,或者从H 开始,然后从那里向后工作。提交 K 不在 inclusion 列表中,所以如果它在 exclusion 列表中,这是“免费的”:没有任何事情发生。 p>

    这意味着您可以使用experimentaldevelop 作为git rebaseupstream 参数。两者效果相同。

    如果您将--onto 参数用于git rebase,则您在文字--onto 之后提供的提交哈希ID 或名称设置rebase 操作的目标。如果你省略它,upstream 设置目标。2你想要的 target这个案例是experimental

    由于experimental 用作upstream 参数,因此命令:

    git rebase experimental
    

    足够了,您不需要单独的--onto

    git rebase 进程现在将运行,使用 Git 的内部 分离 HEAD 模式,一次以正确的顺序复制每个提交:

                I'  <-- HEAD
               /
              K   <-- experimental
             /
    ...--G--H   <-- develop
             \
              I--J   <-- feature
    

    I复制到I'之后,然后:

                I'-J'  <-- HEAD
               /
              K   <-- experimental
             /
    ...--G--H   <-- develop
             \
              I--J   <-- feature
    

    J 复制到J' 之后。 合并冲突可能在每次提交的复制过程中发生,但如果没有,Git 将自行处理这一切。最后,一旦两个提交都被复制,Git 会将分支名称 feature 拉到最后一个复制的提交上,并重新附加特殊名称 HEAD

                I'-J'  <-- feature (HEAD)
               /
              K   <-- experimental
             /
    ...--G--H   <-- develop
             \
              I--J   ???
    

    rebase 就完成了。


    1在生成列表期间或之后,有时可能会从该列表中减去特定的提交。在您的情况下,不会减去任何内容,因此我们可以忽略这一点,只需使用您在运行 git log 时将看到的列表。

    2如果省略这两个名称,还有一个涉及--fork-point 的技巧,但由于它变得复杂,所以我们不要深入探讨。

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 2013-10-12
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多