Git rebase 混合提交。

4
我有一个非常奇怪的问题: 我有两个分支,正在执行简单的git rebase --onto branchA tagOnMaster。这是通过一个脚本完成的,在我的旧32位机器上完美运行。现在我换到了一台新的64位机器,它停止正确地工作了。
看起来Git混合了提交记录。
例如,我有两个连续的提交,第一个提交更改文件a和b,第二个提交更改文件c。现在,重新贴基正确地创建了第一个提交,但第二个提交包含了对文件c的更改以及第一个提交中更改的一个还原。然而,这些撤销更改在磁盘上留下了问题,在第三次提交中引起问题。
我认为一些图片可以更好地说明发生了什么:
第一个原始提交只更改了一个空格: First original commit 第二个原始提交只添加了两个新文件: Second original commit 第一个rebase后的提交-这个是正确的: First rebased commit 但现在变得奇怪了:第二个rebase后的提交包含了第一个rebase后的提交的相反结果,以及两个新添加的文件: Second rebased commit 在第二个提交之后,rebase失败并显示以下消息:
Database/Scripts/Versions/2.0.0/PKG_BODIES/normalinvoices.sql: needs update You must edit all merge conflicts and then mark them as resolved using git add
查看本地更改后发现第一次提交的更改又出现了: unstaged changes非常希望能得到任何有关此问题的见解。
这是一个已知的bug吗?一个特性!? 我做错了什么吗?公司的反病毒程序是否会锁定文件并搞乱一切?但我看不出反病毒程序如何导致某个文件早于应该存在的位置...
最重要的是:如何让我的重新贴基再次工作?

你能发一下你用的脚本吗? - vergenzt
为了重现这个问题,我已经放弃了脚本,现在我只是在master分支上执行git rebase --onto branchA tagOnMaster - Daniel Hilgarth
1个回答

2
您的问题在于使用了rebase --onto,但我并没有看到这个命令的必要性。如果能够提供"gitk --all &"的截图并且说明您希望得到什么样的结果,那将会非常有帮助。
Rebase --onto是一个移动分支的部分内容到新基础的命令。
以下是来自git-rebase文档的描述:
假设您想要将一个基于next分支的主题分支转移到另一个分支上,并且想要让它看起来像是从后者分支上派生出来的,您可以使用rebase --onto命令。
首先,我们假设您的主题分支基于next分支。例如,主题中开发的一个功能依赖于next分支中的某些功能。
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

希望这有所帮助!

谢谢你的回答。我想要实现的其实非常简单:我想要在分支branchA上复制自tagOnMaster以来master上的所有提交。我不认为使用git rebase master branchA可以实现这一点。在我的情况下,我使用rebase --ontomaster上重新定位所有新提交到branchA上,检出branchA,快进到master,然后将master重置为origin/master。如果有更简单的方法实现这个目标,我会很高兴听取您的建议。但是我无法理解为什么这会引入奇怪的问题,尤其是因为它之前是有效的(续)。 - Daniel Hilgarth
git rebase master branchA - 将把branchA的所有更改基于master的末端,其中包括tagOnMaster。也就是说,在这种情况下,您将将主分支作为上游,将branchA作为主题分支。对我来说,这个方向似乎更合理。否则,我会在您的序列中看到一些矛盾。在我深入挖掘之前,我需要至少在您的操作之前查看“gitk --all”的快照。 - Eugene Sajine
顺便问一下,为什么不尝试指定完整的命令,看看会发生什么?例如:"git rebase --onto branchA tagOnMaster master" - Eugene Sajine
感谢您抽出时间调查此问题。如果旧计算机尚未被报废,我将在该计算机上使用相同的代码库进行测试,以查看是否可以使其再次正常工作。 - Daniel Hilgarth
git 1.7.11有所改善,但仍无法正常工作。然而,我发现git checkout branchA后跟git cherry-pick tagOnMaster..master是我应该使用的命令,因为它恰好符合我的要求。 - Daniel Hilgarth
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接