git push origin development和git push origin HEAD:development之间的区别

3

在使用 Git 作为工具的几周后,我现在正在努力弄清楚 GIT 的真正工作方式。于是我从简单的事情开始:

git checkout -b test origin/development`   //Creating new local branch from development

Create new text file called test.txt

git add . //Set files that will be committed
git commit -m "this is a test" // Committing

接下来是我的疑问:
当我尝试推送操作时:
git push origin development

日志显示:一切都是最新的。
如果我尝试进行推送:
git push origin HEAD:development

它的工作方式符合预期。

在我的调研中,我发现 HEAD 意味着当前分支的名称。因此,如果是这样的话,对我来说就没有任何意义。

两者之间有什么区别?

git push origin development

并且

git push origin HEAD:development

可能是 [git push origin head?] 的重复问题?(https://dev59.com/IGbWa4cB1Zd3GeqPZrh9) - Basilevs
不是这样,@Basilevs。他在问push到origin master和origin head之间的区别。我在问origin master和origin HEAD:master之间的区别。 - Rodrigo Borba
3个回答

3

git push origin development命令会将development分支推送到远程仓库。

git push origin HEAD:development命令会将当前分支推送到远程的development分支。

很可能您不在本地的development分支上。请考虑使用以下命令检查:

git status

命令。


2
git push remote-name some-name

尝试将任何名为“some-name”的本地分支推送到远程分支同样命名为some-name,并解析为remote-name/some-name。在底层,它会查找每个位置(本地、远程)下匹配的refs分支名称。
由于您的development本地副本未被修改,因此您会收到一条消息,表示它是最新的,没有需要推送的内容。
另一个版本
git push remote-name HEAD:development

如果您通过HEAD提供了一个明确的分支,那么它将跳过在本地和远程refs中寻找匹配分支名称的部分。

它仍然使用远程refs来确定远程分支development。但是,它会使用当前分支(您的新test分支)的HEAD来推送提交。

如果您想从test分支简单地执行git push并正确地从test推送到remote/development,您可以将push的默认行为配置为"upstream"设置(请注意,术语"tracking"是"upstream"的旧术语,后者更受青睐)。

请执行:

git config --global push.default upstream

为确保普通的git push仅尝试将当前分支推送到其已注册的上游分支,您需要进行设置。
如果没有进行该设置,在git 2.0之前的版本中,普通的git push模式默认为尝试将所有本地分支都推送到其配置的远程同名上游分支。而对于git 2.0及更高版本,默认设置为simple,它与upstream相似,但是还会在当前分支名称与其配置的远程不同名时无法进行推送。
使用“upstream”设置是一个好选择,因为(a)它允许轻松地推送分支,而不必考虑它们的名称是否匹配其上游名称;(b) 对于2.0之前的版本,它限制了对git push的裸调用仅影响当前分支,因此如果您正在同时开发多个分支,则git push将不会意外地推送与当前分支工作无关的其他工作;(c)除非您尝试将某个分支推送到当前分支的非配置上游分支,否则您不需要特别命名远程和分支形式的git push,我认为这是最有意义的。即,只有在不从本地分支推送到其自然、配置的上游目标时,您才需要冗长地拼写分支名称。即使是2.0的simple设置也无法满足此需求。 remote-name通常为origin,但可以通过各种git命令或直接在.gitconfig文件中添加的任何配置的远程来设置。

Git在一段时间前更改了推送的默认设置,您正在描述1.9及更早版本。 - Andrew C
更新以描述git 2.0中的“simple”默认设置。 - ely

0

git push origin development

这个命令会尝试推送你本地的开发分支。通过这种类型的git push命令,Git会认为本地分支和远程跟踪分支具有相同的分支名称。

来自Git push的manpage

git push origin master 在源代码库中查找与master匹配的引用(最有可能是refs/heads/master),并使用它更新origin存储库中的相同引用(例如refs/heads/master)。如果远程不存在master,则会创建它。


我已经掌握了GIT PUSH的功能,我的问题是关于push到HEAD:BRANCH和push到BRANCH之间的区别。 - Rodrigo Borba
@RodrigoBorba 这个问题是关于git命令的语法,区别已经在manpage中定义。 - gzh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接