为什么“git rebase”会在舞台和工作副本中留下相反的修改?

时间:2012-11-01 18:45:06

标签: git svn git-svn git-rebase git-stage

我正在使用git-svn作为svn客户端。我不时会遇到以下问题。

  1. 我从本地git分支中的几个提交开始,一个空白阶段和一个干净的工作副本。

  2. 我在windows命令行中输入“git svn rebase”来获取团队的修改并在我们之后提交我的提交以保持线性历史记录(这是使用git-svn所必需的)

  3. 一切顺利,团队的内容被提取,我的提交在那之后被重新定位,但是......

    我最终修改了工作副本,并修改了阶段中的文件,工作副本的修改是阶段修改的完全相反。

    < / LI>

    我通常只是通过取消暂存阶段中的所有内容来解决这个问题,这会恢复工作副本中的修改,这很好,但我真的很想了解这里发生了什么。

    问题:这是一个错误,还是我用git rebase无法理解的东西?

    注意:我在以后使用“git svn fetch”和“git rebase”时遇到了问题。

    注意:我在带有大型svn存储库的Windows上使用git(10000多个文件,150000+版本),我也使用git-extensions。 编辑我用它只探索存储库并提交。我从windows命令行做了其他任何事情。

    编辑:根据其中一条评论的要求,这里有两个截图,可帮助您了解问题。第一个是工作副本的内容,第二个是舞台的内容。您可以很容易地看到两者都是完全相反的:

    工作副本: enter image description here

    舞台(恢复工作副本修改,非常直观:相同的图像,红色和绿色交换): enter image description here

    编辑:我刚刚在一个非常简单的案例中重现了这个问题:我的提交只修改了一个文件,在“git svn rebase”期间提取的提交很少,而且没有一个提交修改过的文件 我查了一下“gitk --all”。它与git-extensions和“git status”完全相同 这是gitk的输出。我们从下到上看:

    • 最后3行是在重新定位时获取的3次提交。它们都没有触及我的档案。
    • 来自top的第3行显示我在rebase之后的提交:它一切都很好,它添加了它应该添加的内容并删除它应该删除的内容。
    • 第二行显示索引的内容:它包含 还原我的提交
    • 的修改
    • 第一行显示工作副本的内容:它包含与我的提交相同的修改,IE将恢复索引中的修改。

    enter image description here

    编辑:以下是发生问题的“git svn rebase”之后.git目录的内容:

    17/02/2012  04:57                 0 ArmuazEm5Z
    05/04/2012  02:28                 0 BeMzRLwWcu
    06/11/2012  14:37                90 COMMIT_EDITMSG
    01/11/2012  15:42               628 config
    15/02/2012  04:21                73 description
    16/02/2012  13:22                 0 fuMhUevkYu
    05/11/2012  15:53         1 703 279 gitk.cache
    05/07/2012  03:49                 0 gJfUbdRuG9
    06/11/2012  14:42                23 HEAD
    11/07/2012  03:14    <DIR>          hooks
    21/02/2012  03:22                 0 II5HPacSJd
    06/11/2012  14:42         5 439 960 index
    15/10/2012  13:18    <DIR>          info
    16/02/2012  08:16                 0 jerS1GtBYS
    17/02/2012  04:57                 0 Kg64sq9pzS
    15/02/2012  23:36                 0 lbe0yALJYy
    15/10/2012  13:17    <DIR>          logs
    19/10/2012  16:58    <DIR>          objects
    06/11/2012  14:42                41 ORIG_HEAD
    25/10/2012  11:02             2 795 packed-refs
    05/07/2012  03:49                 0 PpxYa5z0Hc
    02/11/2012  10:00    <DIR>          refs
    15/02/2012  23:36                 0 sm6ociDGGF
    06/11/2012  14:42    <DIR>          svn
    21/02/2012  03:22                 0 vEqtL0Yiqd
    05/04/2012  02:28                 0 VFwn3laTEV
    16/02/2012  13:22                 0 XYoiLqY5BM
    16/02/2012  08:16                 0 z9vL8lRT7t
                  22 File(s)      7 146 889 bytes
                   6 Dir(s)  54 105 219 072 bytes free
    

    编辑:如果您有兴趣跟踪此问题,我在git@vger.kernel.org邮件列表中报告了一个错误,其中“[git-svn] [错误报告]索引处于异常状态在git svn rebase之后“在主题中。

1 个答案:

答案 0 :(得分:3)

这似乎是一个错误。如果您的工作目录和索引在rebase之前是干净的,那么在rebase之后它们应该是干净的;或者你应该得到一个合并冲突,并有机会清理它并继续改变。

看起来由于某种原因,您的索引在应用本地修改后仍处于失效状态。

基本上,存储库的当前状态有三个主要视图。有HEAD提交,它是最后一次提交时存储库的状态,以及你的下一次提交将是什么的子代。在你的rebase期间正在适当更新; HEAD现在是您的本地提交,基于您从上游存储库获得的内容进行了重新设置。

有索引,它应该包含你下次提交状态的视图。这似乎是问题所在。从干净的树中成功进行rebase后,索引应该看起来与HEAD具有相同的存储库视图,但它似乎得到了上游存储库包含的过时视图。在上游存储库顶部应用本地修补程序后,它看起来没有更新。

还有你的工作副本;磁盘上的实际文件。出于某种原因,当您执行rebase时,头部提交正在正确更新,并且工作树正在正确更新(或者被单独保留),但索引处于引用原始提交的状态。你正在变相。这意味着如果您将索引与您的重定向提交进行比较,看起来您已经还原了您的更改,并且如果您将工作副本与索引进行比较,则看起来您已将其重新添加回来。

要检查的一些事项:

  1. 在这样一个有问题的rebase之后,你能告诉我们.git目录的内容吗?只需.git顶级文件列表即可。实际上,完整列表(包括文件名,修改日期和权限)可能会提供更多信息。
  2. 您是否在任何类型的网络文件系统上使用它,或者其他任何奇怪的东西?网络文件系统有时会出现文件遗失的问题;我想知道这是不是发生在你身上。
  3. 您使用的是什么版本的Git?