为什么 `git push -f` 命令会强制推送所有跟踪分支?

6

Git版本:1.7.12.3

正如问题所述,这对我来说似乎是一个非常糟糕的想法。在没有任何附加标志或确认的情况下,git push -f将强制推送所有跟踪分支到远程。

如果开发人员有几个过时的分支正在跟踪远程,并且执行该命令,则所有跟踪分支都会回滚到他过时的副本,这会导致有价值的工作丢失。

这可能是意外的,也可能是由于某些不太熟练的git用户而造成的。在这种危险情况下,Git似乎应该做更多的辅助工作,并要求使用附加标志或询问确认。

这个问题有解决方法吗?

3个回答

9
自2016年1月至今,值得在此问题中添加一些更新的信息:
1. 如hobbs所说,git push --force在推送当前或所有更改的分支方面与普通的git push是完全相同的。 2. git push会根据push.default的配置来推送所有分支或单个分支。 3. 更多细节请参见此帖子,但要仅推送当前分支,您的.gitconfig应如下所示:
    [user]
            name = 用户名
            email = example.mail@gmail.com
    [push]
            default = simple
4. 要在类Unix操作系统中查看您的.gitconfig,只需执行cat ~/.gitconfig即可。这个帖子展示了如何在Windows上完成此操作。 5. 仅推送当前分支(simple模式)成为Git 2.0(发布于2014-12-17)中的默认选项。 6. 那些使用Git 1.7的人(或从1.7更新的人),其默认模式为matching模式(推送所有分支)。

3
如所述,git push的默认行为是将所有与远程相匹配的分支一起推送。
正如文档中所说的-f / --force:
通常,该命令拒绝更新不是本地ref祖先的远程ref。这个标志禁用了检查。这可能会导致远程存储库丢失提交;请小心使用。
因此,在-f行为中添加额外的检查就像询问“您确定要删除文件吗?”然后再问一次“您真的确定吗?”
在未来的git主要版本(1.9或2.0)中,git push的默认行为将更改为仅推送您正在工作的分支。在此之前,您可以设置以下选项:
git config remote.origin.push HEAD

但是,如果您使用了-f选项,并且您处于过时的分支上,则仍然存在问题。

2
因为git push -fgit push的作用相同,只是多了一个-f选项。而且如果没有指定分支参数,git push默认会推送所有匹配的分支。你应该执行git config push.default upstreamgit config push.default simple来改变默认的推送行为(更多信息请参见git help config)。

7
默认行为是“配置git push以推送所有匹配的分支,如果没有给出参数”,因此说“对提问者来说这相当严厉”有些过分了! - Mark Longair

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