Foo:
A-O-X-Y-Z
Bar:
A-B-C-D
我希望了解实现这一目标的正确策略是什么。当我对 Bar 进行分支 Foo 的变基时,我得到以下分支输出。
I ran:
git checkout Foo
git rebase Bar
# fix merge errors and push
Resulting Foo branch:
A-B-C-D-O-X-Y-Z
我想问的是,是否可以变基并仅包含一组特定的提交(X,Y,Z(?我想实现这一点,因此排除"O"
提交。
Desired Result:
A-B-C-D-X-Y-Z
很容易达到你想要的结果。 您需要的命令是:
git rebase --onto Bar Foo~3 Foo
这种将两个引用作为参数(暂时忽略--onto Bar
(的rebase
形式是以下两个命令的快捷方式:
git checkout Foo
git rebase --onto Bar Foo~3
工作原理
如果没有--onto Bar
,上面的rebase
命令从当前分支(Foo
(获取无法从Foo~3
访问的提交,并将它们保存在临时区域中。然后,它将当前分支重置为Foo~3
,并按原始顺序逐个应用保存的提交。
使用--onto Bar
,提交的保存和恢复以相同的方式发生,但恢复从Bar
而不是Foo~3
标识的提交开始。
总而言之,上面的命令从分支Foo
(连同Foo
分支(获取最近的 3 次提交,并将它们放在由Bar
标识的提交之上。
警告!
如果在运行此命令后,无法从分支开始访问提交O
,它将从历史记录中消失。它不会立即删除。如果您知道它的哈希值或通过检查git reflog
的输出,您仍然可以访问它一段时间。如果无法使用分支、标签或 reflog 访问它,Git 将在一段时间后(通常大约两周(完全删除它。
事实上,没有立即删除任何内容;甚至git rebase
从一个分支"移动"到另一个分支的提交实际上也被复制了,并且原始文件仍在存储库中,它们是可访问的,但不可见。
在 Git 网站上阅读有关git rebase
的更多信息,或在终端上运行git help rebase
。