为什么/何时应该使用强制推送?

5
我经常阅读有关如何进行强制推送的文章,其中提到所有未被拉取的远程仓库提交都将丢失。如果不需要特定的提交,也可以创建一个新分支,这在我看来更为常见,因为即使您现在不需要特定的代码或其他数据,也可能会在以后需要,我不认为有任何理由销毁它。
所以我的问题是,我有什么理由进行强制推送呢?

2
有一种情况需要使用强制推送,那就是当你不小心在已经推送到远程的提交中留下了敏感信息时。 - jub0bs
VonC在他的回答中提到,即使是强制推送后,数据仍然存在,因此您无法删除敏感信息,或者我错过了什么? - bpoiss
@bpoiss 我已经编辑了答案来回答你的问题。 - VonC
4个回答

6

我经常看到有关如何强制推送的文章,以及没有拉取的远程仓库中的所有提交都会丢失

不完全正确:旧版本提交仍然在git reflog中引用。
即使您强制将代码推送到GitHub,您作为存储库所有者仍然可以查看被新历史覆盖的先前分支HEAD SHA1。请参见“GitHub是否记住提交ID?”。
否则您需要联系GitHub支持

那么我的问题是,我强制推送的原因是什么?

每当您是在一个分支上独自工作时(或者在fork的情况下是在一个仓库中),您可以强制推送。 这在拉取请求的情况下很常见,其中Web GUI足够智能以更新自身以考虑新的历史记录:您可以在将其重新设置为upstream/master之上的自己的分支上进行强制推送(假设您是唯一在该分支上工作的人)。 这是三角形工作流程的一部分。

https://cloud.githubusercontent.com/assets/1319791/8943755/5dcdcae4-354a-11e5-9f82-915914fad4f7.png


OP bpoiss在评论中提到:

VonC在他的回答中提到,即使强制推送后数据仍然存在,因此您无法删除敏感信息,或者我错过了什么?

要在远程存储库上删除敏感信息,您需要在远程服务器端执行一些命令:

$ git reflog expire --expire=now --all
$ git gc --prune=now

(来源:删除敏感数据)

这意味着,当将敏感数据推送到GitHub时,您需要联系GitHub支持


4
我经常遇到的情况是这样的:
  • 在github上有主库
  • 也在github上进行了fork操作
  • 本地克隆
工作在本地完成,然后推送到fork。然后创建一个拉取请求,并提供代码审查。代码审查发现有些小问题(例如错别字等),这些问题在长期运行中不会作为单独的提交非常有用。代码审查过程包括评论,然后进行小的修复提交,直到审核人员满意。
为了在主库中提供更合理的长期提交集,开发人员使用rebase来减少拉取请求中的提交集(通常为1),强制将其推送到fork中,然后当测试通过时,将其合并到主库中。
基本上,这依赖于fork仅用于代码审查。这将给那些已经fork了该分支的人带来麻烦,但预期不会发生这种情况。

3
Git会尽力确保您不会在没有意识到的情况下覆盖[他人的]历史记录。也就是说,如果您有一个远程跟踪分支,并通过git filter-branch或git rebase更改了历史记录,则默认情况下Git不会允许您推送,因为历史记录不匹配。
通过强制推送,您告诉Git您知道自己在做什么,并且它将信任您的判断。也就是说,Git将不再帮助您,并允许您覆盖原本正在保护的引用。
我遇到的唯一有效场景是:
  • 当通过git rebase <branch>git rebase -i HEAD~12来变基分支时,您将无法在没有它的情况下保存变基的工作。
  • 当通过git filter-branch修改大量历史记录区段,或者可能通过BFG Repo Cleaner等工具进行修改。

在任何其他情况下强制推送都可能非常危险。由于Git假定您知道自己在做什么,所以您有可能丢失历史记录。


2

最常见的情况是当您将敏感数据推送到远程仓库时。但是,如果在您强制推送之前有其他人拉取了代码,他仍然可以访问您的私人数据。


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