如何在不影响之后的提交的情况下编辑旧提交

Posted

技术标签:

【中文标题】如何在不影响之后的提交的情况下编辑旧提交【英文标题】:How to edit an old commit without affecting the one after it 【发布时间】:2022-01-15 23:19:13 【问题描述】:

我有 2 个提交,我们称它们为 A 和 B,B 是一个很好的提交,但 A 有一些文件需要删除,而且我对 git 有点陌生,所以我真的不知道该怎么做这种情况。

顺便说一句,使用 bitbucket。

【问题讨论】:

【参考方案1】:

这里有 2 种更新提交的机制(它们都没有真正更新提交 - 它们是不可变的):

    您基于另一个提交创建了一个新提交(通过修改、变基、重置、过滤分支等多种方式进行)。您的下一次提交也必须开始引用新的提交,因此也必须复制这些提交。所有提交都将获得新的哈希值。如果没有人引用旧的提交,那么在某些时候它们将被 GC'ed。 git replace 与另一个提交。这会保留旧的和新的提交。只是当 Git 看到对旧的引用时,它会假装引用另一个。

第一个选项是从 git 存储库中删除提交及其数据的真正方法。但它是侵入性的,需要用力推动。第二个选项是轻量级的,不需要重新创建提交历史。但它并没有真正删除它们指向的错误提交和数据——仍然可以找到它们,只是变得更难了。

【讨论】:

【参考方案2】:

更合适的解决方案可能是git rebase。提交 B 保持不变,而提交 A 被编辑。

例如。

git rebase -i HEAD~2

将 rebase 来自 HEAD 的 2 个提交。其中 HEAD 是当前提交

git 接下来会提示你描述你想对每个提交做什么。在列表中找到提交 A 并将第一个单词替换为 edit 然后退出并保存(很可能您在 vim 中)。这将使您的 git 处于可以继续进行编辑的状态,例如 git rm -f --cached somefile.txt

完成编辑后,只需运行git rebase --continue 即可。使用 git rebase 编辑的提交 A

【讨论】:

以上是关于如何在不影响之后的提交的情况下编辑旧提交的主要内容,如果未能解决你的问题,请参考以下文章

在不使用反向补丁的情况下从分支中删除旧的 Git 提交? [复制]

如何在不删除最新提交的情况下恢复到上一个​​提交?

如何在不重新加载的情况下提交表单? [复制]

如何在不重新加载页面的情况下提交表单[重复]

如何获取将在不提交的情况下提交的所有表单值[重复]

如何在不刷新的情况下提交表单?