【问题标题】:Git push with full refspec not working带有完整参考规范的 Git 推送不起作用
【发布时间】:2018-07-03 11:28:16
【问题描述】:

我有 2 个分支(本地和远程在 github 上)。我将它们称为 BranchA 和 BranchB。 我有带有提交 c1、c2 和 c3 的 BranchA。 我只有带有提交 c1 的 BranchB。 两个分支都用 github 完全更新了,我可以检查 BranchA 有 c1、c2 和 c3,BranchB 只有 c1。

我想从本地 BranchA 推送到远程 BranchB。为此,我尝试:

git push origin refs/heads/BranchA:refs/remotes/origin/BranchB

当我这样做时,我得到一个奇怪的输出:

Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/<username>/<repo>.git
   <hash>  BranchA -> origin/BranchB

当我去 github 时,我看到 BranchB 没有更新,仍然只有 c1。 然后,如果我再次运行该命令,它会返回所有内容都是最新的。

这让我很困惑,但是当我尝试执行命令没有完整的参考时,情况变得更糟了,就像这样:

git push origin BranchA:BranchB

...成功了。

我对此感到非常困惑。我搜索了它,我认为使用完整的 ref(例如 /refs/heads/)永远不会造成任何伤害。

为什么会这样?当我指定完整的分支名称时它不应该工作吗?

【问题讨论】:

  • 出于好奇,您为什么使用完整的参考规范?
  • 命令中 BranchB 的远程完整参考规范将是 refs/heads/BranchB。
  • @evolutionxbox 没有什么特别的原因,我只是想对于初学者来说,我想通过设置完整路径来尝试“不太可能失败”。我错了:)
  • @prahladvenkata 是的,似乎是这样。谢谢

标签: git github push refspec


【解决方案1】:

作为prahlad venkata commented,遥控器上的引用是refs/heads/BranchB,而不是refs/heads/remotes/BranchB

请记住,当使用git push 或其对应物git fetch 时,有两个 Git 和两个存储库参与该过程。让我们称它们为您的(matovski 的)和 GitHub 的。

您的 Git 有一个名为 BranchA 的分支,其全名是 refs/heads/BranchA。此名称存储一个(单个)哈希 ID。

他们的 Git 有一个名为 BranchB 的分支,其全名是 refs/heads/BranchB。他们的 Git 可能还有一个名为 BranchA 的分支。这些名称还存储哈希 ID(每个一个)。

当您的 Git 与 GitHub 的 Git 对话时,您的 Git 会看到他们的 refs/heads/BranchA 和他们的 refs/heads/BranchB。您的 Git 想记住这两个名称和 ID 对,但如果您的 Git 将它们存储为 refs/heads/BranchArefs/heads/BranchB,您的 Git 将覆盖您自己的分支。所以你的 Git 会重命名它们的分支名称,将 refs/heads/ 替换为 refs/remotes/origin/

换句话说,refs/remotes/origin/BranchB你的Git 对他们Git 的refs/heads/BranchB 的记忆。但是当您的 Git 与他们的 Git 对话时,您的 Git 必须告诉他们的 Git:请设置您的 refs/heads/BranchB。如果您的 Git 要求他们的 Git 设置他们的 refs/heads/origin/BranchB,那将设置他们的 Git 记忆第三个 Git 的 refs/heads/BranchB(正如您刚刚看到的,有时是允许的!在这种情况下它只是没有用处,因为GitHub 的 Git 存储库不单独使用这些)。

当您使用简写语法 git push origin BranchA:BranchB 时,您的 Git 会向其 Git 发送设置 BranchB 的请求。他们的 Git 根据这个请求计算出,您可能打算设置他们的refs/heads/BranchB,并按照您的意思(它认为)做,而不是按照您的要求做。这个特殊的技巧只有在他们已经拥有refs/heads/BranchB 时才有效,因为如果他们还没有,他们的 Git 不会尝试同样的猜测。

【讨论】:

  • 因此,由于在这种情况下,我将这些信息传递给遥控器,因此我指向了错误的信息。知道了。很好的答案!谢谢。
猜你喜欢
  • 2023-03-26
  • 2013-08-21
  • 1970-01-01
  • 2020-03-27
  • 2018-02-28
  • 2011-04-07
  • 2017-12-30
  • 2012-09-30
  • 2011-03-12
相关资源
最近更新 更多