为什么`git push -f` force会推送所有跟踪分支?

时间:2012-10-17 14:34:05

标签: git

Git版本:1.7.12.3

正如问题所述,这对我来说似乎是一个非常糟糕的主意。如果没有任何其他标记或确认,git push -f将强制将所有跟踪分支推送到远程。

如果开发人员有一些过时的分支,即跟踪遥控器,并且他执行该命令,则所有跟踪分支都将回滚到他过时的副本,这会导致丢失有价值的工作。

这可能是偶然发生的,或者是那些对git不熟练的人。看起来git应该在这样一个危险的情况下做更多的手持,并需要一个额外的标志,或要求确认。

对此有补救措施吗?

3 个答案:

答案 0 :(得分:6)

从2016年1月开始,我想在这个问题上添加一些更新信息是值得的:

  1. 正如hobbs所说,git push --force在推送​​当前或所有已更改的分支方面与正常git push一样完全
  2. git push推送所有分支或依赖push.default
  3. 的此配置的单个分支
  4. post中的详细信息,但为了仅推送当前分支,您的.gitconfig应如下所示:
  5. 
        [user]
                name = User Name
                email = example.mail@gmail.com
        [push]
                default = simple
    
    
    1. 要查看.gitconfig Unix-like OS中的cat ~/.gitconfig,请执行simple。这个post显示了如何在Windows上执行此操作。
    2. 仅推送当前分支(2.0模式)仅在Git 2014-12-17(在1.7上发布)中成为默认值。
    3. 使用Git 1.7(或已从matching更新过)的用户,return __x.size() == __n && _Traits::compare(__x.data(), __s, __n) == 0; 模式为默认模式(推送所有分支机构)。

答案 1 :(得分:3)

如上所述,git push默认行为是在遥控器上推送具有匹配名称的所有分支。

正如文件中提到的关于-f / - force:

  

通常,该命令拒绝更新不是的远程引用   用于覆盖它的本地ref的祖先。此标志禁用   校验。这可能导致远程存储库丢失提交;用它   小心。

因此,在-f行为中添加额外的检查就像问“你确定要删除文件吗?”然后“你真的确定吗?”

git push的默认行为将在未来的主要版本的git中更改,无论是1.9还是2.0,但肯定不会在1.8中,只推送您正在处理的分支。在这种情况下,您可以设置以下选项:

git config remote.origin.push HEAD

但是如果你使用-f并且你在一个过时的分支上,你的担忧仍然存在。

答案 2 :(得分:2)

因为git push -f执行git push所做的事情,只有-f。并且因为git push默认配置为在没有分支参数的情况下推送所有匹配的分支。您应该git config push.default upstreamgit config push.default simple更改默认推送行为(有关此操作的更多信息,请参阅git help config。)