Git Rebase包含特定提交

Git Rebase包含特定提交,git,Git,我希望了解实现这一目标的正确策略。当我针对Bar对分支Foo进行重新基化时,我得到以下分支输出 Foo: A-O-X-Y-Z Bar: A-B-C-D 我想问的是,是否可以重新设置基础并只包含一组特定的提交(X,Y,Z)?我想实现这一点,这样就排除了提交 I ran: git checkout Foo git rebase Bar # fix merge errors and push Resulting Foo branch: A-B-C-D-O-X-Y-Z 很容易达到你想要的结果。 您

我希望了解实现这一目标的正确策略。当我针对Bar对分支Foo进行重新基化时,我得到以下分支输出

Foo:
A-O-X-Y-Z
Bar:
A-B-C-D
我想问的是,是否可以重新设置基础并只包含一组特定的提交(X,Y,Z)?我想实现这一点,这样就排除了提交

I ran:
git checkout Foo
git rebase Bar
# fix merge errors and push

Resulting Foo branch:
A-B-C-D-O-X-Y-Z

很容易达到你想要的结果。 您需要的命令是:

Desired Result:
A-B-C-D-X-Y-Z
这种形式的
rebase
,将两个引用作为参数(现在忽略
——到Bar
),是以下两个命令的快捷方式:

git rebase --onto Bar Foo~3 Foo
工作原理 如果没有
--on Bar
,上面的
rebase
命令将从当前分支(
Foo
)获取无法从
Foo~3
访问的提交,并将其保存在临时区域中。然后它将当前分支重置为
Foo~3
,并按原始顺序逐个应用保存的提交

使用
--on Bar
,保存和恢复提交的方式相同,但恢复开始于由
Bar
标识的提交之上,而不是
Foo~3

总之,上面的命令从分支
Foo
(以及
Foo
分支)获取最近的3次提交,并将它们放在提交标识栏的顶部

警告 如果在运行此命令后,无法从分支开始访问commit
O
,则它将从历史记录中消失。它不会立即移除。如果您知道它的散列,或者通过检查
git reflog
的输出,您仍然可以访问它一段时间。Git将在一段时间后(通常约两周)完全删除它,如果它不再可以使用分支、标记或reflog访问

事实上,任何东西都不会立即移除;即使是从一个分支“移动”到另一个分支的
git-rebase
“提交”实际上也被复制了,原始文件仍在存储库中,可以访问但不可见


在Git网站上阅读更多信息,或在终端上运行
Git help rebase

您可以使用
rebase to
cherry pick
git checkout Foo
git rebase --onto Bar Foo~3