【发布时间】:2012-12-14 18:18:33
【问题描述】:
知道这会改变历史记录,我想从存储库的历史记录中删除一些意外提交。我希望所有其他提交保留其存储库的状态。所以我要删除的提交的更改将被它们之后的提交覆盖。
我怎样才能在 Git 中做到这一点,我怎样才能将它也应用到或仅应用到 Github 上的存储库?
【问题讨论】:
知道这会改变历史记录,我想从存储库的历史记录中删除一些意外提交。我希望所有其他提交保留其存储库的状态。所以我要删除的提交的更改将被它们之后的提交覆盖。
我怎样才能在 Git 中做到这一点,我怎样才能将它也应用到或仅应用到 Github 上的存储库?
【问题讨论】:
如果我理解正确,“挤压”就是你想要的。
-A-B-C-D-E-F-G-H
鉴于上述历史记录,您应该在要压缩的第一个提交之前选择提交。假设您要将 F 和 E 压缩为 D,H 压缩为 G,所以第一个之前的提交是 C。
git rebase -i C
您将看到一个编辑器,其中包含一个包含如下内容的文本文件:
pick D
pick E
pick F
pick G
pick H
修改为:
pick D
squash E
squash F
pick G
squash H
您将被要求查看新提交的提交消息,
生成的历史将如下所示:
-A-B-C-D'-G'
请注意您总是将较新的提交压缩到较旧的提交中,反之亦然。因此pick G 和squash H。把它想象成在你的历史继续前进之后修改一个提交。
PS:要将其放入您的 GitHub 存储库,您必须强制推送 git push -f origin(假设 origin 是您的 GitHub 远程)。
PPS:有关详细信息,请参阅man page of git-rebase。
【讨论】:
A-B-C-D-G?
-A-B-C-D'-G',我编辑了我的答案。但是D'=D+E+F 和G'=G+H。
A-B-C-D 开始,然后将C 压缩为B。结果是A-B'-D 还是A-B'-D'?