Git版本:1.7.12.3
正如问题所述,这对我来说似乎是一个非常糟糕的主意。如果没有任何其他标记或确认,git push -f
将强制将所有跟踪分支推送到远程。
如果开发人员有一些过时的分支,即跟踪遥控器,并且他执行该命令,则所有跟踪分支都将回滚到他过时的副本,这会导致丢失有价值的工作。
这可能是偶然发生的,或者是那些对git不熟练的人。看起来git应该在这样一个危险的情况下做更多的手持,并需要一个额外的标志,或要求确认。
对此有补救措施吗?
答案 0 :(得分:6)
从2016年1月开始,我想在这个问题上添加一些更新信息是值得的:
git push --force
在推送当前或所有已更改的分支方面与正常git push
一样完全。git push
推送所有分支或依赖push.default
.gitconfig
应如下所示:[user] name = User Name email = example.mail@gmail.com [push] default = simple
.gitconfig
Unix-like OS
中的cat ~/.gitconfig
,请执行simple
。这个post显示了如何在Windows上执行此操作。2.0
模式)仅在Git 2014-12-17
(在1.7
上发布)中成为默认值。 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 upstream
或git config push.default simple
更改默认推送行为(有关此操作的更多信息,请参阅git help config
。)