使用git rebase追溯性地将提交放到不同的分支上?

使用git rebase追溯性地将提交放到不同的分支上?,git,rebase,Git,Rebase,我有一些承诺: - 1 - 2 - 3 - 4 - 5 (HEAD, master) 后来我注意到2&3真的应该去他们自己的分支。它们完全独立于提交4和提交5,我可以使用git-rebase来实现吗 - 1 - 4 - 5 (HEAD, master) \ 2 - 3 (TestBranch) 最重要的是,Commit 2和Commit 3的SHA1是否会与重基之前一样 如果您签出3,则可以在该点创建一个新分支TestBranch,并获得所需的分支 然后您可以返回到分支

我有一些承诺:

 - 1 - 2 - 3 - 4 - 5 (HEAD, master)
后来我注意到2&3真的应该去他们自己的分支。它们完全独立于提交4和提交5,我可以使用
git-rebase
来实现吗

 - 1 - 4 - 5 (HEAD, master)
    \
     2 - 3 (TestBranch)

最重要的是,
Commit 2
Commit 3
的SHA1是否会与重基之前一样

如果您签出
3
,则可以在该点创建一个新分支
TestBranch
,并获得所需的分支


然后您可以返回到分支
master
,使用
git rebase-i HEAD~6
,删除
2
3
,方法是删除它们的行。

首先,请注意,所需的TestBranch只指向当前提交3;您不必做任何事情,只需
git branch TestBranch
即可实现这一点。记住,分支只是指向提交的指针。这应该可以回答您关于提交2和3的SHA1的问题。您根本没有更改这些提交,因此它们的SHA1当然是相同的

要将当前分支(主分支)放在您想要的位置(提交1、4、5),您确实需要重新设置基础。这是其交互模式的一个非常简单的例子。首先,运行:

git rebase -i <commit 1> master     # -i is a synonym for --interactive

提交4'和5'与提交4和5具有相同的差异,但具有不同的父级,因此它们是不同的提交。

我已将您的提交列表修改为更标准的图形,您将在git手册页和整个internet中看到。如果您喜欢垂直列表,欢迎您重新编辑它-但我建议颠倒顺序。底部是最新的,这与像
git log
这样的命令的输出以及
gitk
和其他历史查看器中的视图的输出相反。我还假设Head实际上是
Head
,并且您也签出了一个分支;我把它命名为master。谢谢@Jefromi,让这个问题更容易理解。你为什么要使用交互式rebase来创建TestBranch?你可以直接在提交3时创建它。确切地说,我错误地认为在1和3之间存在虚假提交。难道不可能在TestBranch master上使用git rebase--而不是交互式rebase吗?@Sven:当然,是的。我倾向于推荐交互式的,因为你能准确地看到你在做什么,尽管我个人可能是非交互式的。
- 1 - 4' - 5' (HEAD, master)
   \
    2 - 3 (TestBranch)