Git改变了无关的历史

时间:2018-03-20 14:01:44

标签: git

我正试图在Git中使用两个不相关的分支进行变基。

| 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?

1 个答案:

答案 0 :(得分:2)

正如ElpieKay在评论中指出的那样,对于这个特定的例子,你需要--keep-empty。一般来说,Git倾向于抛弃,或者不首先做出承诺,对树没有任何改变。没有理由 这样做 - 连续两次使用相同树的提交是正常情况;它出现在git merge -s ours例如 - 但确实如此。

在非交互式,非樱桃选择模式下使用git rebase时,Git使用git format-patch将每个提交转换为补丁,git am(应用邮箱格式的补丁) )重新应用它们,制作原始提交的副本。 format-patch命令无法格式化&#34;什么都不做&#34;修补程序,因此当您使用-k--keep-empty时,Git会切换到使用git cherry-pick来复制提交。

还有其他选项迫使rebase使用挑选,例如--interactive--merge。采摘樱桃默认省略&#34;空&#34;提交并且还需要--keep-empty,无论是直接调用,还是来自其他类型的rebase。