【发布时间】:2020-08-03 16:27:56
【问题描述】:
假设我有以下提交历史:
* E (HEAD -> mybranch, origin/mybranch) Foo 3
|
* D Foo 2
|
* C Update readme
|
* B Foo 1
|
* A Initial commit
我想从初始提交中变基并删除所有名为“Foo”的提交,所以我运行
git rebase -i --root
但是,这会创建一个新的、不相关的历史,如下所示:
* C' (HEAD -> mybranch) Update readme
|
* A' Initial commit
* E (origin/mybranch) Foo 3
|
* D Foo 2
|
* C Update readme
|
* B Foo 1
|
* A Initial commit
另一方面,如果我跑步
git rebase -i A # where "A" is the commit SHA
我得到了预期的分支行为:
* C' (HEAD -> mybranch) Update readme
|
| * E (origin/mybranch) Foo 3
| |
| * D Foo 2
| |
| * C Update readme
| |
| * B Foo 1
|/
* A Initial commit
那么为什么git rebase --root 的行为会产生不相关的历史记录,我可以让它像我预期的那样表现吗?
【问题讨论】:
-
您需要在执行
git rebase -i --root选项时在交互式 rebase 中包含您采取的步骤。 -
指定
--root使rebase 在每次提交时运行,最终结果是您实际上也将创建一个新根。你说“从最初的提交”,你的意思是你想不理会最初的提交吗?如果是这样,那么使用--root不是您想要的,而是第二个命令是您想要的。 -
我的问题是,如果第二个命令执行您想要的操作,为什么您希望
--root表现得像第二个命令。那你不能简单地使用第二个命令吗? -
@TimBiegeleisen 实际上只是
drop所有名为Foo的提交,其他提交为pick -
--root是保证制作不相关的历史。这就是--root的意义所在。 (要查找当前提交的根的哈希 ID,请使用git rev-list --max-parents=0 HEAD。如果您愿意,可以为此提交命名,或者根据需要多次命名。)