3

I have 2 branches (both locally and remotely on github). I will call them BranchA and BranchB. I have BranchA with commits c1, c2 and c3. I have BranchB only with commit c1. Both branches are totally updated with github, and I can check that BranchA has c1,c2 and c3 and BranchB has only c1.

I want to push from local BranchA to remote BranchB. To do this I try:

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

When I do this, I get a strange output:

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

When I go to github I see that BranchB is not updated and still only has c1. Then, if I run the command again, it returns that everything is up to date.

This was confusing me, but it got worse since when I try to do the command without the full ref, like this:

git push origin BranchA:BranchB

...it worked.

I am very confused by this. I searched for it and I thought that using the full ref (/refs/heads/ for example) would never do any harm.

Why is this happening? Shouldn't it work when I specify the full branch name?

4

1 回答 1

3

正如prahlad venkata 评论的那样,遥控器上的参考是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/BranchAand refs/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 发送一个 set 请求BranchB。他们的 Git 根据此请求计算出您可能打算设置他们的refs/heads/BranchB, 并按照您的意思(它认为)做,而不是按照您的要求做。这个特殊的技巧只有在他们已经有了一个时才有效,因为如果他们还没有refs/heads/BranchB,他们的 Git 不会尝试同样的猜测。

于 2018-01-24T19:42:49.563 回答