假设:
git init
git commit --allow-empty -m a
git commit --allow-empty -m b
git commit --allow-empty -m c
我有:
$ git log --oneline
<c-sha1> c
<b-sha1> b
<a-sha1> a
我想:
$ git log --oneline master
<c-sha1> c
<a-sha1> a
$ git log --online slave
<?-sha1> b
我tried:
git checkout --orphan slave
git rebase --keep-empty --onto slave <b-sha1>
答案 0 :(得分:1)
要创建从属提交,请执行:
git checkout <b-sha1> --orphan slave
git commit -C <b-sha1>
然后要删除旧的b提交,请执行:
git rebase --onto <a-sha1> <b-sha1> master
请注意,如果尚未推送b-sha1
,则只能执行第二步,因为您永远不应重写推送提交的历史记录。
另请注意,提交c的快照内容现在会有所不同,因为它不再具有来自commit b的任何更改(从技术上讲,在您的示例中它们不会是,因为您正在做空提交,但如果他们是&#34;真实&#34;提交他们将是)。如果那不是你想要的,那么不要做git rebase --onto
,而是做一个交互式的rebase:
git checkout master
git rebase -i <a-sha1>
您的编辑器会弹出如下内容:
pick <b-sha1> Commit message for B
pick <c-sha1> Commit message for C
复制C的提交消息,并将文件的内容更改为:
r <b-sha1> Commit message for B
f <c-sha1> Commit message for C
关闭你的编辑器,然后会弹出一个新编辑器,其中包含B的提交消息;将其替换为C的提交消息,然后关闭编辑器。然后你就完成了。