【问题标题】:Git Rebase seems to have worked but all commits are still showing in the log... what state am I in?Git Rebase 似乎有效,但所有提交仍显示在日志中......我处于什么状态?
【发布时间】:2011-07-29 07:01:54
【问题描述】:

我想我使用 rebase 压缩了最后 40 次提交。 我遵循本指南以确保我没有做任何愚蠢的事情 - http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

问题是,我认为我做了一些愚蠢的事情。

(交互式)文本文件无法保存,所以看起来变基失败了,但它给出的消息和下面的其他一些东西表明它可能已经工作了。

不知道我在哪里或做什么(甚至我的名字是什么)。 这是我所做的:

  • 我输入了 git rebase -i HEAD~40
  • 出现了一个文本文件,我对其进行了编辑,将所有行更改为以 'squash' 开头,除了顶部的行
  • 我在 Windows 上,使用 EditPad...无法保存文件!哦不……(只读/权限?)。
  • 我将它保存到一个随机目录中。
  • 命令行显示某种成功(不幸的是我丢失了消息)。不知道怎么会成功,也不知道我保存的文件在哪里……

  • git rebase --continue 说“没有 rebase 正在进行?

  • git reflog 表明它有效(至少据我所知,最近 40 次提交中显示了“rebase”这个词)例如:

    9992445 HEAD@{8}: rebase: 报告工作

  • 但运行 git log 会显示所有 40 个提交,我只是“重新定位”

这看起来不太好。有谁知道我现在是什么状态? 我陷入了困境,这是一个僵尸变基吗?

【问题讨论】:

  • 你有其他分支指向你的 rebase 提交吗?

标签: git rebase


【解决方案1】:

如果无法保存变基“待办事项列表”,则说明你的变基不起作用。

压缩大量提交的最简单方法是使用 git reset --soft HEAD~40 然后 git commit 处理您的新消息 - 假设您想要压缩所有提交。

【讨论】:

  • 谢谢,这是一个很好的解决方案(我忘了询问提示/解决方案,但你已经给了它)
  • 这个解决方案有效,因为这是我最终解决这种情况的方法
【解决方案2】:

这个问题是关于git rebase -i 行为的一个稍微令人惊讶的方面。如果您关闭编辑器窗口而不进行任何更改,那么 rebase 仍然会发生。1(这与弹出提交消息的编辑器时的操作非常不同,后者退出编辑器而不进行任何操作任何更改都会中止提交。)

在您的情况下,由于您将交互式变基列表保存在其他地方,然后退出编辑器,git 假设您只想像以前一样重新应用所有这些提交 - 它无法告诉您将文件保存在其他地方。如果历史在HEADHEAD~40 之间是线性的,那么历史将完全相同(包括每个提交的对象名称),但如果它是非线性的,您将重写您的历史,使其成为线性的(并且所以对于某些提交会有不同的对象名称)。

您可能需要在 reflog 中检查 HEAD 在 rebase 之前和之后具有相同的对象名称(哈希)以检查这一点。

1 虽然在我使用的版本中,如果 git 可以判断结果将完全相同,它不会费心实际重新应用提交,只需在引用日志。但是,在您的情况下显然没有进行这种优化,因为您可以在 reflog 中看到每个提交的重新应用。

【讨论】:

  • 谢谢,这就是我希望的解释
猜你喜欢
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2017-11-04
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多