git rebase混合提交

时间:2012-07-24 12:31:33

标签: git

我有一个非常奇怪的问题: 我有两个单独的分支,我正在做一个简单的git rebase --onto branchA tagOnMaster。 这是通过一个过去在我的旧32位机器上完美运行的脚本完成的。现在我切换到新的64位机器,它停止正常工作 它看起来像git mixes提交。
例如,我有两个连续提交,第一次提交更改文件a和b,第二次提交更改文件。现在,rebase正确创建了第一个提交,但第二个提交包含对文件c的更改以及第一次提交中更改的还原。这种恢复的更改会以某种方式留在磁盘上并导致第三次提交出现问题。

我认为有些图片会更好地展示会发生什么:

只改变空间的第一个原始提交: First original commit

第二次原始提交只添加了两个新文件: Second original commit

第一个重新提交的提交 - 这个是正确的: First rebased commit

但是现在它变得很奇怪:除了两个新添加的文件之外,第二个重新提交的提交包含第一个重新提交的提交的反向: Second rebased commit

在第二次提交之后,rebase将继续使用此消息:

  

Database / Scripts / Versions / 2.0.0 / PKG_BODIES / normalinvoices.sql:需要更新
  您必须编辑所有合并冲突然后   使用git add

将它们标记为已解决

查看本地更改后发现,提交1的更改再次出现: unstaged changes

非常会对此有任何见解表示感谢 这是一个已知的错误? 功能?!难道我做错了什么?企业反病毒程序是否有可能以某种方式锁定文件,从而混淆了一切?但我看不出一个反病毒程序如何导致文件存在之前而不是它应该...... 最重要的是:如何让我的rebase再次运作?

1 个答案:

答案 0 :(得分:2)

你的问题是你正在使用rebase - 我认为没有必要。看看“gitk --all&”的屏幕截图会很有帮助。并且知道这个操作的结果你想要什么。

Rebase --onto是一个执行将分支的一部分移动到新基础的命令。

来自git-rebase docs:

以下是如何将基于一个分支的主题分支移植到另一个分支,以假装您使用rebase --onto来分叉来自后一个分支的主题分支。

首先让我们假设您的主题基于分支。例如,主题中开发的功能取决于下一步中的某些功能。

o---o---o---o---o  master
     \
      o---o---o---o---o  next
                       \
                        o---o---o  topic

我们想要从分支主人分叉主题;例如,因为主题所依赖的功能被合并到更稳定的主分支中。我们希望我们的树看起来像这样:

o---o---o---o---o  master
    |            \
    |             o'--o'--o'  topic
     \
      o---o---o---o---o  next

我们可以使用以下命令获取此信息:

git rebase --onto master next topic

...

在您的情况下,省略最后一个值,因此默认情况下使用HEAD。这会给你带来麻烦。我认为你把“rebase --onto”的语法与用于简单rebase的简写混淆了:

git rebase master topic

这最后一个命令实际上意味着:

git checkout topic # switch to topic branch
git rebase master # rebase topic branch on master

希望有所帮助!