4

Git版本:1.7.12.3

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

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

这可能是意外完成的,也可能是由对 git 不太熟悉的人完成的。看起来 git 在这种危险的情况下应该做更多的事情,并且需要一个额外的标志,或者要求确认。

有没有办法解决这个问题?

4

3 回答 3

8

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

  1. 正如霍布​​斯所说,就推动当前或所有更改的分支而言,git push --force其行为与正常情况完全相同。git push
  2. git push推送所有分支或单个分支,这取决于push.default
  3. 这篇文章中的更多细节,但为了只推送当前分支,你.gitconfig应该看起来像:
    [用户]
            名称 = 用户名
            电子邮件 = example.mail@gmail.com
    [推]
            默认 = 简单

  1. 为了看到你.gitconfigUnix-like OScat ~/.gitconfig。这篇文章展示了如何在 Windows 上执行此操作。
  2. 仅推送当前分支(simple模式)仅在 Git 2.0(发布于2014-12-17)中成为默认值。
  3. 那些正在使用 Git 1.7(或从 更新1.7)的人将matching模式作为默认模式(推送所有分支)。
于 2016-01-21T15:25:02.927 回答
3

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

正如文档所说的 -f/--force:

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

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

git push 的默认行为将在未来的 git 主要版本(1.9 或 2.0 但肯定不会在 1.8 中)发生变化,仅推送您正在处理的分支。在这种情况下,您可以设置以下选项:

git config remote.origin.push HEAD

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

于 2012-10-17T17:40:09.903 回答
2

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

于 2012-10-17T14:53:52.433 回答