不相关历史的 Git rebase

标签 git

我正在尝试对 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>

  1. 这是预期的行为吗?如果是,为什么?我本以为会出现“无法重新定位不相关的历史记录”错误,就像使用 git merge 而不是这种行为一样。
  2. 如何修复 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/

相关文章:

git - 如何在同一台机器上使用和克隆 github 和 aws (CodeCommit) 存储库?

Eclipse 一直在重新检查我的 git 存储库。我如何关闭它或更改间隔?

c++ - 使用多个存储库的项目的 git 子模块的替代方案

android - repo 初始化一个特定的提交

git - 撤消尚未推送的 Git merge

windows - Octopress博客部署错误 'rake aborted! No such file or directory - git remote -v'

git - 有没有办法确定我的本地克隆是否是某个 github 存储库的分支?

git - 损坏的 dockerfile : github deploy key no longer copied correctly

windows - 在 Windows 上使用单个命令通过 git log 获取第一行

git - gitlab 中的 Maven 发布