当我已经推送到远程后,如何覆盖或替换提交记录?

52

我正在与一组人一起进行敏感项目的开发,我们所有的资源都放在Github上。最近我提交了一个版本,但稍后发现我的提交中有很多错误。我已经在本地修复了这些错误,即将再次提交。然而,有没有办法可以推送并覆盖我上次提交的版本?我的原因是,我不希望其他人查看我的初始提交以及它所做的更改...

基本上,我想用新的提交覆盖旧的提交。这样其他组员就无法查看旧的提交信息了。


1
您可以修改您的提交 (git commit --amend),或者如果数据更加敏感,则可以按照 https://help.github.com/articles/remove-sensitive-data/ 上的说明进行操作。 - adrianbanks
1
这将改变历史。而且,由于您已经提交了另一个提交,这很可能会更加困难。为了以后参考,要更改您所做的最后一次提交,您可以使用 git commit --amend;这也需要强制推送。 - Jeremy Rodi
@ABMagil 我的问题与提交信息无关,而是与更改和历史记录有关。 - sparta93
1
a) 解决方案是相同的。 b) 提交消息在 git 中被视为与您提交的代码更改相同。如果您想要更改其中任何一个,那么就从 git 的角度来看,您正在更改历史记录。 - ABMagil
2个回答

62
通常情况下,一旦在Github(或公共仓库)上发布了某些内容,就没有办法确保没有其他人有坏提交。
但如果你只是想要更清晰的代码历史记录,那么你需要在本地和远程项目上覆盖历史记录。
如果你还没有用你的更改创建新的提交,你需要使用git commit --amend修改你的旧提交。
如果你已经创建了新的提交,你需要使用git rebase -i将你的提交压缩到旧的提交之上。
在你在本地进行这些更改并验证你的提交看起来符合你的要求后,你需要使用git push --force来覆盖Github远程上的历史记录。
这是一个关于如何在git中重写历史记录的教程,它解释了this answer中列出的两种方法。

9
git push --force 的翻译是“强制推送”,虽然有风险但还是很受欢迎。 - Andrzej Rehmann
我最近也遇到了类似的问题,但在我的情况下,我已经在本地有了更多的提交。解决方案是将它们压缩成一个单独的提交并强制推送到上游。好处是我正在Github上向主分支发起Pull Request,并且它更新了PR的新历史记录,只有1个提交。这个问题帮助我实现了它。 - VictorHMartin

1
我不建议你这样做,因为GIT并不适用于删除或编辑提交。你可以撤销之前的提交,然后再次提交“有效”的代码。
或者您可以使用Rebase您的分支。 或者查看这个答案

2
“GIT 不是用来删除和/或编辑提交的。” 我认为好的开发实践不建议这样做,但 GIT 是“意味着”它有能力并且有很好的理由进行此操作;比如当提交了不应该提交的敏感信息时。 - rainabba

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