git:在refspecs中使用远程引用进行推送

时间:2012-02-13 17:09:19

标签: git

有人可以解释我(或引导我一个很好的参考)以下问题吗?

我知道下面是我必须使用的正确推送命令:

git push origin refs/heads/master:refs/heads/master

   (I also know that it has short forms, like:
        git push origin master:master
        or
        git push origin master)

但是,有一段时间,我在推动之后做了2次(错误地):

  (1) git push origin refs/heads/master:refs/remotes/heads/master

  (2) git push origin refs/heads/master:refs/remotes/origin/master

git报告两个命令都没有错误,虽然在(1)中,我没有远程名称“head”。

  • 我的第一个问题是:在这些情况下git如何推送到远程存储库?它们会损害我的远程存储库吗?

  • 第二个问题是:根据http://progit.org/book/ch9-3.html,“refs / remotes”下的所有内容都是远程引用 这是要知道最后一次服务器通信时相应远程分支上的最后一个提交ID。它只是为了那个 (例如,仅供参考),是否有任何git命令使用这些引用?

更新我对该命令的发现(2)

我通过以下方式再次仔细验证了命令(2)的行为:

  • 备份远程存储库
  • 做(2)
  • 比较两个存储库(当前存储和备份)

我发现当前的差异(由命令(2)影响的那个)

  • 在“objects”文件夹中,创建了2个新文件:一个是.pack文件,另一个是.idx文件
  • 在“refs”文件夹中,新的refs创建了“remotes / origin / master”

我注意到命令(2)的输出是

Counting objects: 842, done.
Compressing objects: 100% (337/337), done.
Writing objects: 100% (651/651), 336.30 KiB, done.
Total 651 (delta 243), reused 612 (delta 218)
To file:///data/resto/central-repo
 * [new branch]      master -> origin/master

现在我做了另一个测试:

  • 将远程仓库克隆为2个本地回购
  • 在一个本地仓库中,我对文件进行了更改,提交,推送(git push origin master)
  • 在其他本地仓库中

    • 我对文件进行了更改,提交
    • 推送   git push origin master:master

      我收到了来自git的错误消息:"...! [rejected] master -> master (non-fast-forward)..."这就是我所期待的

    • 然后我用命令(2)推了一下,结果就是我上面提到的那个。

所以显然(2)与git push origin master不同。

“refs”文件夹in the remote存储库的含义是什么?命令(2)创建一个新的“refs” 远程存储器,它指的是什么?

1 个答案:

答案 0 :(得分:1)

  1. (2)推送与git push origin master非常相似。但不确定(1)。

  2. 如“Are there different meanings to the concept of 'tracking' in git?”中所述,refs/remotes名称空间用于跟踪分支:即表示“远程存储库中最后一次远程跟踪分支的分支状态”更新”。
    这些引用是git fetch的用法,以便了解要提取的提交(与您在回购中已有的提交相比)
    请参阅SO撰稿人git: fetch and merge, don’t pull撰写的博文“Mark Longair”了解更多信息。