【问题标题】:Git push -f on branch affecting masterGit push -f 在影响 master 的分支上
【发布时间】:2014-10-21 07:00:18
【问题描述】:

假设我从 master 创建了一个分支,并对我的分支 commit1、commit2 进行了一些提交。与此同时,另外两个人将两个拉取请求合并到 master,因此我的分支将落后 2 个提交。如果我进行一些更改并在我的分支上执行 git push -f ,这会删除来自 master 的最后两个拉取请求吗?

另外,是否有可能看到两个提交是如何使用 Github 从 master 中删除的?是否为此目的保留了任何日志记录/历史记录? 感谢您的任何回答。

【问题讨论】:

    标签: git github git-branch


    【解决方案1】:

    git push -f 获取您的本地副本,并将其强制发送到远程,不管怎样。远程成为您本地分支的精确副本。这意味着远程分支上而不是本地分支上的所有内容都将被删除;没有撤消这一点。 -f 标志不应该被使用,除非你有目的地重写历史。

    不可能“删除”提交。您只能使用重写历史的“-f”来覆盖它们。因此,如果由于-f 而丢失了某些东西,它将永远不会回来。它永远丢失了。也就是说,你的历史已经被重写了,所以无法在 github 中看到历史。


    来自the spec

    -f

    --强制

    通常,该命令拒绝更新不是祖先的远程引用 用于覆盖它的本地参考。还有,当 使用--force-with-lease 选项,该命令拒绝更新其远程引用 当前值与预期值不符。

    此标志禁用这些检查,并可能导致远程存储库 丢失提交;小心使用。

    请注意,--force 适用于所有推送的 ref, 因此将它与 push.default 设置为匹配或多次推送一起使用 使用remote.*.push 配置的目标可能会覆盖其他引用 比当前分支(包括严格落后的本地参考 他们的远程对手)。要强制只推送到一个分支,请使用 + 在要推送的 refspec 前面(例如 git push origin +master to force 推送到主分支)。请参阅<refspec>... 部分了解 详情。

    【讨论】:

    • 我明白了,本地副本是指一切,而不仅仅是执行它的分支?谢谢!
    • @Tad 不,只有分支。 (除非分支是master)
    • 不知何故,即使我在一个落后 2 个提交的分支上执行 git push -f ,来自 master 的 2 个提交也消失了。如果不是这个,你知道还有什么原因造成的吗?
    • @Tad 它仍然可能是 -f 标签,因为 force 也可以更改引用。武力会导致一些非常奇怪的行为。我在规范的回答中添加了一条注释。注意最后一段
    • 如前所述,-f 会覆盖 refs。如果您落后了两次提交,则意味着您覆盖了这些提交。您应该在使用强制推送覆盖远程之前重新调整您的分支...
    【解决方案2】:

    从个人经验来看,我希望与@Humdinger 有所不同。正如What is the difference between git push.default=current and push.default=upstream? 中提到的,push.default 设置可以改变 git push 的行为。例如,如果 push.default=matching,则 git push 会导致所有分支都被推送,即所有两端具有相同名称的分支都被认为是匹配的。

    在您的情况下,如果您有 push.default=matching 并且如果您的克隆是 master 后面的两个提交,您将覆盖 master 分支以及远程分支(假设分支!= master),即使您只是想要将更改推送到您的分支上。拥有 push.default=upstream 应该可以避免这个问题。

    【讨论】:

    • 不知道 push.default=matching 设置。感谢您的信息。
    【解决方案3】:

    不,推送你的分支不会影响master,即使你使用-f。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 2011-07-15
      • 2020-08-01
      相关资源
      最近更新 更多