2012-10-17 60 views
1

Git版本:1.7.12.3为什么`git push -f`力推动所有跟踪分支?

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

如果开发人员有几个过时的分支机构正在跟踪远程,并且他执行了该命令,那么所有跟踪分支将被回滚到他过期的副本,这会导致宝贵的工作损失。

这可以意外完成,或由某人不熟悉git。这真的好像git应该在这样一个危险的情况下多做一些手工操作,并且需要一个额外的标志,或者要求确认。

这是否有补救措施?

回答

6

由于它是一月2016,现在,我想这是值得一些更新的信息添加到这个问题:

  1. 正如霍布斯所说,git push --force行为正是像正常git push在推动方面当前或所有的改变了分支。
  2. git push推动要么所有分支机构或单一依赖的push.default
  3. 更多细节在这个post此配置,但为了推动当前分支而已,你.gitconfig应该看起来像:
 

    [user] 
      name = User Name 
      email = [email protected] 
    [push] 
      default = simple 

  1. 为了看到您的.gitconfigUnix-like OS只是做cat ~/.gitconfig。这post显示如何在Windows上做到这一点。
  2. 仅推送当前分支(simple模式)仅在Git 2.0(发布于2014-12-17)中成为默认值。
  3. 那些正在使用Git 1.7(或已从1.7更新的人)的matching模式为默认模式(推送所有分支)。
2

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

+6

对于提问者来说,如果默认行为是“你配置了git push来推送所有匹配的分支,如果没有给出参数”,这就相当苛刻! –

3

如上所述,git push的默认行为是推送远程所有分支名称匹配的名称。

由于单证说,有关-f/- 力:

通常情况下,命令拒绝更新远程裁判不是一个 祖先的地方裁判所使用的覆盖它。该标志禁用 检查。这会导致远程存储库丢失提交;小心使用它 。

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

git push的默认行为在git的未来主要版本(1.9或2.0,但肯定不是1.8)中会改变,只会推送您正在使用的分支。直到这种情况下,您可以设置以下选项:

git config remote.origin.push HEAD 

但还是如果使用-f和你对你的担忧仍然存在过时的分支。

相关问题