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


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

git push origin sandbox

如果我说

git push origin

这会推动我的其他分支的变化,还是只更新我当前的分支?我有三个分支: masterproduction 和 sandbox

git push 文档对此并不十分清楚,所以我想澄清这一点。

哪些分支和遥控器执行以下操作 git push 命令更新完全?

git push 
git push origin

origin 上面是一个遥控器。

我明白那个 git push [remote] [branch] 将仅将该分支推送到远程。


1214
2018-06-04 02:45


起源


关于diff工具的配置,以及新脚本git difftool,我在这个另外的SO问题中添加了一个新的答案: stackoverflow.com/questions/255202/... - VonC
我做了一个 博客文章 关于令人惊讶的行为 git push,这可能是有趣的 - Mark Longair
@Mark:在其他工作中,只将当前分支推送到其跟踪的上游。尼斯。 - VonC
stackoverflow.com/q/13148066/2157640 - Palec
help.github.com/articles/pushing-to-a-remote 把这个链接放在这里,立即帮助像我这样的新手 - MycrofD


答案:


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

push.default

如果在命令行上没有给出refspec,在远程中没有配置refspec,并且命令行上给出的任何选项都没有暗示refspec,则定义git push应采取的操作。可能的值是:

  • nothing:不要推任何东西

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

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

    这是Git 1.x中的默认值。

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

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

  • simple:(在Git 1.7.11中新增)像上游一样,但如果上游分支的名称与本地分支不同,则拒绝推送

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

    这将成为Git 2.0中的默认设置。

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

命令行示例:

要查看当前配置:

git config --global push.default

要设置新配置:

git config --global push.default current

1424
2018-06-04 03:16



值得注意的是,这是v1.6.3中的新功能: kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt - CB Bailey
这个“push.default”是处理多个回购的最好的事情。将其设置为“跟踪”,你们都很好。结合分支--set-upstream这些使推拉方式更加方便。 - jpswain
“tracking”是“upstream”的已弃用的同义词: kernel.org/pub/software/scm/git/docs/git-config.html - MartinVonMartinsgrün
值得注意的是,从Git 1.7.11开始,有一个新的 simple 模式。此模式将在未来成为默认模式。 simple 像 upstream,但是喜欢 current 要求两端的分支名称相同。 - Kai
值得注意的是,从Git 2.0开始 simple 行为现在是默认值。 - do0g


git push origin 将推送具有匹配远程分支的本地分支上的所有更改 origin 至于 git push 

git push <remote>,哪里 <remote> 是当前分支的远程(或原点,如果没有为当前分支配置远程)。

来自的示例部分 git-push 手册页


197
2017-10-06 10:45



是的,这说清楚了。我可能正在运行旧版本的git(1.6.1.1 Mac OS X),但在手册页中没有这些示例。 - PlagueHammer
可能我正在运行1.6.3.1。我确实在我链接的网站上找到了它。 - baudtack
因此,在我的情况下,所有本地分支具有相同的远程“origin”,“git push”将与“git push origin”完全相同,“git push origin”将仅推送在远程中具有相应分支的本地分支。 - PlagueHammer
@Debajit吧!顺便问一下很棒的问题。我一直认为git push只会推动当前的分支。显然不是!很高兴知道。 - baudtack
这个问题很老,但对于任何新人来说,@ docgnome都是对的。只运行'git push origin'将推送所有分支而不是仅当前分支。使用'git push -f -v -n origin development'强制推送名为development的分支。使用-n标志来模拟git push结果,以便您可以预先看到哪些分支将受到影响。如果它看起来不错那么运行'git push -f -v origin development'。这可能很有用 stackoverflow.com/questions/3741136/git-push-f-vs - Dylan Valade


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

git config push.default current

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

git config --global push.default current

当前 在此设置中意味着默认情况下您将 只推动当前分支 当你这样做 git push

其他选择是:

  • 没有:不要推动任何东西
  • 匹配:推送所有匹配的分支(默认)
  • 跟踪:将当前分支推送到跟踪的任何分支
  • current:推送当前分支

更新 - 新方式做到这一点

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

git config --global push.default simple

这是一个引入的新设置,其工作方式与当前相同,并且根据谣言将从v 2.0默认为git


194
2017-11-06 10:05



是的我读了你所指的答案,但那个答案只说明要做什么,而不是怎么做。所以我添加了我的答案,所以设置它所需的所有信息都在同一页面上。 - Christoffer
好;最好建议对该帖子进行编辑,因为没有人会看到你的答案,因为它不太可能获得尽可能多的票数 - CharlesB
怎么会去拉到目前的分支? git拉起源? - Francois


我只是将我的代码提交到分支并将其推送到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

55
2017-08-09 08:02



您可以将提交压缩为`git commit -am“...”` - James Harrington
这个答案与这个问题有什么关系吗? :? - Asim K T


这是一个非常方便和有用的信息 Git PushGit Push:只是提示

git push最常见的用途是将本地更改推送到公共上游存储库。假设上游是名为“origin”的远程(默认远程名称,如果您的存储库是克隆),并且要更新到/来自的分支被命名为“master”(默认分支名称),这可以通过以下方式完成: git push origin master

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

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

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


22
2018-03-17 11:13



git push origin branch_name 由于某种原因,推动不仅 branch_name 分支,还有其他我的本地分支(git版本1.9.1)。 - mrgloom
git push origin master:staging 是一个很棒的隐藏宝石! - Shakeel


(2012年3月)
当心:默认“matching“政策很快就会改变
(有时在git1.7.10之后)

见“请讨论:当你不说什么推动时,“git push”应该做什么?

在当前设置中 (即 push.default=matchinggit push 没有参数将推送本地和远程存在的所有分支使用相同的名称
  这通常适用于开发人员推送到自己的公共存储库时,但在使用共享存储库时可能会造成混淆。

提案是 将默认值更改为'upstream,即只推动当前分支,并将其推到分支git pull将拉出。
  另一位候选人是'current“;这会将当前分支仅推送到同名的远程分支。

到目前为止所讨论的内容可以在这个帖子中看到:

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

以前的相关讨论包括:

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


19
2018-03-15 00:50





我只是将它放在我的.gitconfig别名部分,并喜欢它的工作原理:

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

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


17
2018-06-04 02:49



这很好,但不幸的是,假设分支在另一个存储库中具有相同的名称。尝试 git push -u --repo="origin" $1; 代替。它工作得很好,除非你推送到另一个存储库,分支名称将是另一个存储库使用的名称,而不是你推送的名称 - Casebash
嘿谢谢!让我想做一个更完整的版本,在推送之前检查跟踪状态。但是我现在会坚持使用它,因为我很少在回购之间有不同的分支名称。 - Mat Schaffer


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”将仅推送我的“当前打开”分支。


8
2018-06-23 07:50



如果你总是想要gpush的行为,你也可以设置remote.origin.push = HEAD(例如“git config remote.origin.push HEAD”),如git-push手册页的examples部分所述。 - Trevor Robinson
如果您通过“Brian L”查看上述帖子,则无需这样做。 - jpswain
因为没有等等。拉拉.default - SamGoody


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

git push origin HEAD

(取自 这里


7
2017-10-24 17:10





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

[push]
  default = current

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

git config --global --get push.default

7
2018-04-19 15:55