3

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

我认为一些图像会更好地显示发生了什么:

第一个原始提交,它只是改变了一个空间: 第一次原始提交

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

第一次重新提交 - 这个是正确的: 第一次重新提交

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

在第二次提交之后,rebase 无法继续显示此消息:

Database/Scripts/Versions/2.0.0/PKG_BODIES/normalinvoices.sql:需要更新
您必须编辑所有合并冲突,然后使用 git add 将它们标记为已解决

查看本地更改会发现从提交 1 开始的更改再次出现: 未分阶段的变化

真的很感激对此的任何见解。
这是一个已知的错误?一个特点?!难道我做错了什么?公司防病毒程序是否有可能以某种方式锁定文件并因此搞砸了一切?但是我看不到防病毒程序如何导致文件比它应该更早地存在......
最重要的是:如何让我的变基再次工作?

4

1 回答 1

2

您的问题是您正在使用 rebase --onto 我认为没有必要。查看“gitk --all &”的屏幕截图并了解此操作的结果会有所帮助。

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

来自 git-rebase 文档:

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

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

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

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

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

希望有帮助!

于 2012-07-24T17:16:12.600 回答