没有指定分支的 “git push” 的默认行为

我使用以下命令来推送到我的远程分支:

git push origin sandbox

如果我说

git push origin

这是否也会推动其他分支的更改,还是只会更新当前分支?我有三个分支: masterproductionsandbox

git push文档对此并不十分清楚,因此我想彻底澄清一下。

以下git push命令可以准确更新哪些分支和远程站点?

git push 
git push origin

上面的origin是一个遥控器。

我知道git push [remote] [branch]只会将该分支推送到远程。

答案

您可以通过在 git 配置中设置 push.default 来控制默认行为。从git-config(1)文档中

push.default

定义在命令行上未提供 refspec,远程没有配置 refspec 且命令行上提供的任何选项均未暗示 refspec 时 git push 应当采取的操作。可能的值为:

  • nothing都不要:不要推任何东西

  • matching :推送所有匹配的分支

    在两端具有相同名称的所有分支都被认为是匹配的。

    这曾经是默认设置,但自 Git 2.0 起就没有了( simple是新的默认设置)。

  • upstream :将当前分支推到其上游分支( tracking是上游不推荐使用的同义词)

  • current :将当前分支推送到同名的分支

  • simple :(Git 1.7.11 中的新功能)类似于上游,但是如果上游分支的名称与本地分支不同,则拒绝推送

    这是最安全的选择,非常适合初学者。

    此模式已成为 Git 2.0 中的默认模式。

简单,当前和上游模式适用于那些希望在完成工作后推出单个分支的人,即使其他分支尚未准备好推出

命令行示例:

要查看当前配置:

git config --global push.default

设置新配置:

git config --global push.default current

您可以使用 push.default 为 git 设置默认行为

git config push.default current

或者,如果您有许多存储库,并希望所有存储库都相同

git config --global push.default current

此设置中的当前意味着默认情况下,您在执行git push 时才推送当前分支

其他选项是:

  • 什么都不要:不要推任何东西
  • match:推送所有匹配的分支(默认)
  • 跟踪:将当前分支推到要跟踪的任何位置
  • 当前:推当前分支

更新 - 执行此操作的新方法

从 Git 1.7.11 开始,请执行以下操作:

git config --global push.default simple

这是新引入的设置,其工作方式与当前设置相同,根据传闻,v 2.0 将默认设置为 git

git push origin将推进,在具有匹配的远程分支机构的地方分支机构的所有变化origin至于git push

git push <remote> ,其中<remote>是当前分支的远程对象(如果未为当前分支配置任何远程对象,则为源)。

git-push手册页的 “示例” 部分中

我只是将我的代码提交到一个分支,并将其推送到 github,如下所示:

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments

这是有关Git Push的非常方便和有用的信息: Git Push:Just the Tip

git push 最常见的用途是将本地更改推送到公共上游存储库。 :假设上游是远程命名为 “原点” 和分支从被命名为 “主”(默认分支名称)进行更新,以 /(如果您的存储库是一个克隆默认的远程名称),这是用做git push origin master

git push origin将更改从所有本地分支推送到源远程的匹配分支。

git push origin master将把更改从本地 master 分支推送到远程 master 分支。

git push origin master:staging将把更改从本地 master 分支推送到远程分段分支(如果存在)。

(2012 年 3 月)
注意:默认的 “ matching ” 策略可能会很快更改
(有时在 git1.7.10 + 之后)

请参阅 “ 请讨论:当您不说要推送什么时,应该执行什么 “git push”?

在当前设置 (即push.default=matching )中, 不带参数的git push将推送本地和远程存在的具有相同名称的所有分支
这通常在开发人员推送到其自己的公共存储库时是适当的,但是在使用共享存储库时,如果不是危险的话,可能会造成混淆。

建议将默认值更改为 “ upstream ,即仅推送当前分支,然后将其推送到 git pull 将要提取的分支。
另一个候选人是 “ current ”。这只会将当前分支推送到同名的远程分支。

在此线程中可以看到到目前为止已讨论的内容:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

先前的相关讨论包括:

要加入讨论,请将您的消息发送至:git@vger.kernel.org

我只是将其放在我的. gitconfig 别名部分中,并且喜欢它的工作方式:

pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"

将使用git pub或使用git pub repo-name另一个回购将当前分支推送到源。可口。

您可以使用命令推送当前分支

git push origin HEAD

(从这里出发)

git push 将尝试将所有本地分支推送到远程服务器,这可能是您不想要的。我有一些便利设置可以解决此问题:

别名 “gpull” 和 “gpush” 分别为:

在我的〜/ .bash_profile 中

get_git_branch() {
  echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
}
alias gpull='git pull origin `get_git_branch`'
alias gpush='git push origin `get_git_branch`'

因此,执行 “gpush” 或 “gpull” 将仅推动我的 “当前打开” 分支。

您可以在.gitconfig更改默认行为,例如:

[push]
  default = current

要检查当前设置,请运行:

git config --global --get push.default