TL;DR:是的,你的命令顺序是正确的。
您可以使用git rebase experimental 稍微缩短它。
长
使用git checkout 或git 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
现在有必要将提交 I 和 J 复制到新的、略有不同的提交,这些提交使用提交 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 log 或git rev-list 生成的提交列表开头:
git rebase [--onto <target>] <upstream>
使用当前分支作为这些提交的来源,<em>upstream</em>..HEAD 作为可能被复制的提交的初始列表。1
由于您的 upstream 参数是 develop 或 experimental,因此列表将由以下人员生成:
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>
这意味着您可以使用experimental 或develop 作为git rebase 的upstream 参数。两者效果相同。
如果您将--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 的技巧,但由于它变得复杂,所以我们不要深入探讨。