Git - 废除之前的提交记录,强制推送到远程

4

首先,让我解释一下我的情况:

我在新创建的仓库中有一个名为 script 的文件。

然后我进行了以下操作:

git add script
git commit -m 'initial commit'

git push -u origin master

但后来我意识到我需要去掉注释的 script 文件版本,所以我做了以下操作:

-- 使用sed删除了 script 中的注释

git rm script
git add script-no-comments

Git 识别文件被重命名,这是可以的。

然后:

git commit -am 'comments removed'

git push origin master

现在我本地和远程都有两个提交,第一个是带有注释的文件,另一个则没有。

我的问题是:我如何在本地删除第一个提交,保留最新的无注释版本,然后强制推送到远程,从而覆盖那里的提交。 我不担心提交的 sha 更改,因为只有我才会 pull?

此外,这样做是否会永久删除那个带注释的版本,因为我不想让它被恢复?

2个回答

7
你无法“删除”第一个提交,但你可以将你所做的两个提交压缩成一个提交。
你可以通过git rebase -i HEAD~2来实现这一点,但我个人觉得以下方法更容易:
将你的分支指针移回到第一个提交:
git reset --hard HEAD~

将之前提交的更改暂存:

git merge --squash HEAD@{1}

提交你的更改,将它们合并成一个提交。
git commit --amend

强制将新的单次提交推送到服务器:
git push -f

在执行 git merge --squash ... 命令后,我收到了“nothing to squash, already up-to-date”的消息。 - branquito
@branquito 抱歉,应该是HEAD@{1}而不是{0} - user229044
这会永久删除 script 的第一个版本,以至于如果有人试图这样做,它将无法通过任何方式恢复。 - branquito
1
不会的。你已经将该提交推送到服务器上,它将保留在那里,直到Git决定进行垃圾回收,通常需要大约2周时间。除非有人专门去寻找它,否则没有人能够访问该提交。如果这是一个实际的安全问题,您应该查看成千上万现有的资源,以便在意外提交和推送后从Git存储库中清除敏感数据。这是一个非常熟悉的主题。 - user229044

1
你可以进行交互式的 `rebase`,将这两个提交压缩成一个:
git rebase -i HEAD~2

请按编辑器中的说明操作,您还可以更改提交消息。

原始提交仍然存在(但不可达),您可以通过垃圾回收将其删除:

git gc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接