Git从历史中删除某些提交,但保留他们的更改

时间:2017-02-14 14:44:29

标签: git git-remote

以下是该方案:

我已将PHP CMS更新为新版本。在这样做时,指南建议在更换旧文件之前保留旧文件。是的,这是愚蠢的,因为我可以使用Git旅行。我没有。

我做了什么:

  1. 将包含源文件的某些文件夹重命名为" old_whatever"。文件夹一起包含几千个文件。
  2. 提交更改。
  3. 粘贴新文件夹。我们现在有两次几千个文件。
  4. 提交更改。
  5. 更新CMS。
  6. 删除旧文件夹。
  7. 提交更改。
  8. 邦。现在,git有一些非常大的提交,因为所有文件实际上都是重复的。我不需要这些步骤成为历史。我确实希望保持当前状态,所以:我希望保持文件结构与步骤7中的完全相同。我想转储第2步和第4步。

    额外信息:步骤1和步骤7之间的文件差异最多只有1%或2%。但是由于我采取的步骤,Git认为所有这些都是新文件,我认为。

    当我现在尝试将提交推送到远程时,推送的更改突然变为3.54 GB,高达几百MB。

1 个答案:

答案 0 :(得分:2)

您想要实现的是一个互动的rebase。你将告诉Git“我想在commit x和commit z之间重写我的历史”。然后git将向您显示一个文本文件,就像您可以编辑的脚本,以指示您要对每个提交执行的操作(更新其消息,删除它,与以前合并等)。然后,当你完成后,保存文件,让魔法发生。

基本命令是:

git rebase -i

我强烈建议研究这个命令是如何工作的,并且可能在另一个存储库上执行一些测试以便很好地理解。当您管理此命令时,您将了解它的强大程度。这完全符合您当前的需求。

文档:https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History

祝你好运;)

注意:将一些提交“合并”为1的操作名为“Squashing Commits”