HEAD:master和HEAD有什么区别?

时间:2018-07-03 13:18:13

标签: git

git push https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME_PRODUCTION.git HEAD

git push https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME.git HEAD:master

看起来HEAD:master可以覆盖.gitignore文件,而HEAD无法。

2 个答案:

答案 0 :(得分:4)

区别在于远程服务器上的目标分支。

假设您坐在分支foobar上。

git checkout foobar
..workwork..
git push origin HEAD

HEAD 您当前的本地分支机构的最新版本。因此,在此示例中,它表示foobar。因此,此命令将简单地将foobar发送到远程服务器。在远程服务器上,它将更新/覆盖与您发送的分支“匹配” *)的分支。通常,这意味着发送foobar foobar。这里没有惊奇。

另一方面

git checkout foobar
..workwork..
git push origin HEAD:master

明确指示git将您的HEAD 作为管理员发送。就是说,它将最新的foobar作为master发送到远程服务器上。就是这样,就是这样。您本地的master不会更改,并且不会被更改。远程foobar(如果存在)将不会更改。但是,远程master现在将与本地foobar

同步

*)是客户端(您的本地端)决定要在远程端选择哪个分支。本地分支和远程分支之间的默认映射保留在您的.git/config文件中。绝对有可能使您的本地分支机构aaa自动发送到远程aaa或远程bbb,因此实际上我无法告诉您git push origin xxxx到底将xxxx推送到何处分支-它取决于映射-您可以通过--set-upstream或仅通过编辑配置文件来更改它们。另一方面,git push origin xxx:yyy的确切含义是:将x作为y发送。


对于.gitignore部分-它无关紧要。拉或推都没有.gitignore。忽略Git不会阻止您在任何地方进行任何操作。它只会协助不提交不需要的文件。即使在这种情况下,它也不会阻止您,因为您始终可以通过git add -f添加任何文件,并且在推送过程中,此类文件将像普通文件一样(实际上是)发送到任何远程。

请注意,您显示的这两个命令使用不同的存储库:

... git.heroku.com/$HEROKU_APP_NAME_PRODUCTION.git ... git.heroku.com/$HEROKU_APP_NAME.git

也许这就是让您认为git-ignore有所作为的原因吗?

答案 1 :(得分:0)

git push的常规语法是:

git push <remote> <refspec>

最后一个参数,即您感兴趣的参数,通常采用<local-branch>:<remote-branch>的形式,表示“将名为my的分支推送到远程的分支”。有几种快捷方式:

  • git push <remote> <branch>(无:,例如git push origin master)是git push <remote> <branch>:<branch>的快捷方式,即将本地分支推送到具有相同分支的远程分支名称。

  • git push <remote> HEAD意味着将当前分支推送到遥控器上具有相同名称的分支。这是您在问题中编写的第一个命令。

您提到的第二个命令是一般情况:HEAD:master的意思是“将当前分支推送到远程存储库上的master分支”。

如果您发现有所不同,则说明您位于master以外的本地分支上,说my-branch。仅HEAD会推送到遥控器上的my-branch。无论您当前处于哪个分支,HEAD:master都会推送到master