【问题标题】:Why does `git push -f` force push ALL of the tracking branches?为什么 `git push -f` 会强制推送所有的跟踪分支?
【发布时间】:2012-10-07 20:28:51
【问题描述】:

Git 版本:1.7.12.3

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

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

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

有办法解决这个问题吗?

【问题讨论】:

    标签: git


    【解决方案1】:

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

    1. 正如 hobbs 所说,git push --force 在推送当前或所有更改的分支方面的行为完全与普通 git push 一样。
    2. git push 根据push.default 的此配置推送所有分支或单个分支
    3. post 中有更多详细信息,但为了仅推送当前分支,您的 .gitconfig 应如下所示:
    [用户] 名称 = 用户名 电子邮件 = example.mail@gmail.com [推] 默认 = 简单
    1. 要在Unix-like OS 中看到您的.gitconfig,只需执行cat ~/.gitconfig。这个post 展示了如何在 Windows 上执行此操作。
    2. 仅推送当前分支(simple 模式)仅在 Git 2.0(发布于 2014-12-17)中成为默认设置。
    3. 使用 Git 1.7(或从 1.7 更新)的用户将 matching 模式作为默认模式(推送所有分支)。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      git config remote.origin.push HEAD
      

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 当它是默认行为时,提问者说“你配置 git push 以推送所有匹配的分支如果没有给出参数”是相当苛刻的!
        猜你喜欢
        • 2020-09-26
        • 2010-10-24
        • 2014-02-04
        • 2014-03-23
        • 1970-01-01
        • 2013-10-05
        • 2016-08-09
        • 2018-02-12
        • 1970-01-01
        相关资源
        最近更新 更多