我正在尝试对 Git 中的两个不相关分支进行 rebase 。
| A A A A A | => | A A A A A B B |
| B B |
但是,这样做时,我只剩下来自分支 M
的提交。
示范:
$ git init && git ci -m "MASTER branch" --allow-empty
[master (root-commit) 05abfe5] MASTER branch
$ git co --orphan FEATURE && git ci -m "FEATURE branch" --allow-empty
Switched to a new branch 'FEATURE'
[FEATURE (root-commit) 122671d] FEATURE branch
$ git rebase master
First, rewinding head to replay your work on top of it...
$ git lg
* 05abfe5 - (HEAD -> FEATURE, master) MASTER branch (18 seconds ago) <Niklas Rosenstein>
我对最后一条命令的期望是
$ git lg
* 122671d - (HEAD -> FEATURE) FEATURE branch (1 second ago) <Niklas Rosenstein>
* 05abfe5 - (master) MASTER branch (18 seconds ago) <Niklas Rosenstein>
- 这是预期的行为吗?如果是,为什么?我本以为会出现“无法重新定位不相关的历史记录”错误,就像使用
git merge
而不是这种行为一样。 - 如何修复
git rebase
命令以执行如上所述的 rebase ?
最佳答案
正如 ElpieKay 在评论中指出的那样,对于这个特定示例,您需要 --keep-empty
。 Git 通常倾向于丢弃,或者一开始就不做,不会对树进行任何更改的提交。它没有理由必须这样做——连续两次提交使用同一棵树是正常情况;例如,它发生在 git merge -s ours
中——但确实如此。
当在非交互、非 cherry-picking 模式下使用 git rebase
时,Git 使用 git format-patch
将每个提交变成一个补丁,并且 git am
(应用邮箱格式的补丁)重新应用它们,制作原始提交的副本。 format-patch 命令无法格式化“什么都不做”的补丁,因此当您使用 -k
或 --keep-empty
时,Git 会切换到使用 git cherry-pick
复制提交。
还有其他选项可以强制 rebase 使用 cherry-pick,例如 --interactive
和 --merge
。 cherry-pick 也默认省略“空”提交并且还需要--keep-empty
,无论是直接调用,还是从其他类型的 rebase 调用。
关于不相关历史的 Git rebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49386323/