如何重做压缩分支上的一些选定提交

How to redo squash some selected commits on branch

如何重做或撤消压缩分支上的某些选定提交, 简而言之,我的问题是

  1. 第一次

commits is A-B-C-D-E-F-G

  1. 压缩一些提交后它们是

commits is AB-C-D-EF-G

  1. 但现在我需要重做第二步,并像这样压缩提交步骤
 commits is A-B-CD-E-FG

有什么不对的地方让我指正。我只是想简化我的查询

您从 1.2. 的操作重写了您的历史记录,因此 2. 中的 G 与 [=13] 的哈希值不同=] 在 1.

重新记谱:

  1. first time

commits is A-B-C-D-E-F-G

  1. 压缩一些提交后它们是

commits is AB-C'-D'-EF-G'


要撤消重写,您需要获取原始 G 提交(而非 G')的哈希值。

您的本地 git 存储库应该仍然在其 reflog 中:

# in the following list of commits, spot the one that would match your initial commit :
git reflog

# you will have a shorter list if you look at the reflog of your working branch :
git reflog my/branch

一旦你有了那个散列:

  • 确保你有一个干净的 repo(如果你有本地更改:隐藏它们或丢弃它们),
  • 运行 git reset --hard <that hash>,
  • 然后重新压缩。

关于git reset --hard的强制警告:

git reset --hard 是为数不多的破坏性 git 命令之一:如果您的磁盘(跟踪文件)上有未存储在 git 中的更改,此命令将强制删除这些更改,并将文件内容重新设置为目标提交的内容。

这就是为什么建议首先查看您的本地更改,并确定您放弃的更改并不重要的原因。保留它们的方法很简单:只需创建一个提交或存储——它们至少可以在之后从 reflog 访问。