不指定分支的情况下,“git push”的默认行为

1531

我使用以下命令将代码推送到远程分支:

git push origin sandbox

如果我说

git push origin

这会将更改推送到我的其他分支吗,还是只会更新当前分支? 我有三个分支:masterproductionsandbox

git push 的文档对此并不十分清晰,因此我想为此澄清一下。

以下 git push 命令会更新哪些分支和远程分支?

git push 
git push origin

origin 是一个远程仓库。

我理解 git push [remote] [branch] 只会将该分支推送到指定的远程仓库。


关于一般的差异工具配置以及新脚本git difftool的配置,我在这个SO问题的另一个答案中添加了一个新的回答:https://dev59.com/SHVC5IYBdhLWcg3wjx5d#949242 - VonC
73
我曾经写过一篇关于git push行为令人惊讶的博客文章,可能会引起你的兴趣。这是链接:http://longair.net/blog/2011/02/27/an-asymmetry-between-git-pull-and-git-push/ - Mark Longair
2
@Mark:在其他工作中,只将当前分支推送到其已跟踪的上游。不错。 - VonC
1
https://dev59.com/E2cs5IYBdhLWcg3wGQDF - Palec
将此链接放在这里,以便像我这样的新手立即获得帮助:https://help.github.com/articles/pushing-to-a-remote/ - MycrofD
13个回答

1783

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

push.default

定义了在命令行中未给出refspec、远程未配置refspec以及命令行选项未暗示任何refspec时,git push应采取的操作。可能的值包括:

  • nothing:不推送任何内容

  • matching:(Git 2.0之前的默认值)推送所有匹配的分支

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

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

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

  • simple:(Git 1.7.11中新增,Git 2.0之后成为默认值)类似于upstream,但如果上游分支的名称与本地名称不同,则会拒绝推送

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

simple、current和upstream模式适用于希望在完成工作后推出单个分支的人,即使其他分支尚未准备好推出也可以使用。

命令行示例:

要查看当前配置:

git config push.default

设置新的配置:

git config push.default current

11
值得注意的是,这个功能是在1.6.3版本中新增的:https://github.com/git/git/blob/master/Documentation/RelNotes/1.6.3.txt - CB Bailey
11
“push.default” 是处理多个仓库非常好用的东西。将其设置为“tracking”,就可以愉快地使用了。再加上“branch --set-upstream”命令,就可以让推送和拉取变得更加方便了。 - jpswain
17
"tracking" 是“upstream”的一个废弃同义词:http://www.kernel.org/pub/software/scm/git/docs/git-config.html - 0xPixelfrost
26
值得注意的是,从Git 1.7.11开始,有一个新的“simple”模式。该模式预计将成为未来的默认模式。 “simple”与“upstream”类似,但与“current”一样,要求两端的分支名称相同。 - Kai
11
值得注意的是,从Git 2.0开始,“simple”行为现在成为默认设置。 - do0g
显示剩余15条评论

241

你可以通过 push.default 来设置 Git 的默认行为。

git config push.default current

或者如果您有许多存储库,并且希望所有存储库都有相同的设置,则

git config --global push.default current

在这种设置中,“current”表示默认情况下,当您执行 git push 时,您将仅推送当前分支。

其他选项包括:

  • nothing :不推送任何内容
  • matching :推送所有匹配的分支(默认)
  • tracking :将当前分支推送到它正在跟踪的分支
  • current :推送当前分支

更新 - 新方法

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

git config --global push.default simple

据传闻,这是一种与当前功能相同的新设置,并将在 git 版本 2.0 中成为默认设置。


30
我看了你提到的那个答案,但它只告诉了要做什么,而没有告诉如何做。因此,我添加了我的答案,这样设置所需的所有信息都在同一页上。 - Christoffer
3
好的,最好建议修改该帖子,因为没人会看到你的回答,因为它不太可能得到很多投票。 - CharlesB
如何拉取当前分支?git pull origin? - Francois

210

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

工作方式类似于 git push <remote>,其中 <remote> 是当前分支的远程(如果当前分支未配置远程,则为 origin)。

来自git-push man 页面的示例部分


2
没错,这就很清楚了。我可能正在运行一个较旧的 git 版本(1.6.1.1 Mac OS X),它在 man 页面中没有这些示例。 - Debajit
可能我正在运行1.6.3.1版本。但是我确实在我链接的网站上找到了它。 - baudtack
2
所以,在我的情况下,所有本地分支都有相同的远程“origin”,“git push”将与“git push origin”完全相同,它只会推送那些在远程存在相应分支的本地分支。 - Debajit
@Debajit 没错!顺便说一下,这是个好问题。我一直以为 git push 只会推送当前分支。显然不是这样!知道这点非常好。 - baudtack
5
这个问题很旧了,但对于任何新人来说,@docgnome是正确的。只运行“git push origin”将推送所有分支,而不仅仅是当前分支。使用“git push -f -v -n origin development”来强制推送名为development的分支。使用-n标志模拟git push的结果,以便您可以提前查看哪些分支将受到影响。如果看起来没问题,那么运行“git push -f -v origin development”。这可能会有用https://dev59.com/6m865IYBdhLWcg3wlvmq。 - Dylan Valade
这个答案很久以前是正确的,但现在已经误导人了。几乎没有用户会使用旧版本的git默认使用“push.default=matching”行为。 - Tao

51

我刚刚把我的代码提交到了一个分支并将其推送到了 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

3
你可以将提交代码的命令简化为 git commit -am "..." - James Harrington
21
这个回答与问题有关吗?:? - Asim K T
似乎每个人都决定随意给出一个与Git相关的答案。 - Farid

28

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

最常用的git push用途是将本地更改推送到公共上游存储库。假设上游是命名为“origin”的远程仓库(如果你的仓库是一个克隆,则是默认的远程名称),要更新或从中获取的分支名为“master”(默认分支名称),则使用以下命令: git push origin master

git push origin将所有本地分支的更改推送到与origin远程存储库匹配的分支。

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

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


由于某种原因,git push origin branch_name 不仅推送 branch_name 分支,还会推送其他我本地的分支(git 版本 1.9.1)。 - mrgloom
"git push origin master:staging" 是一个非常棒的隐藏功能! - Shakeel

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

git push

git push origin HEAD

(引自这里


这似乎是避免重新输入长分支名称以便第一次将它们推送到远程的好方法。HEAD不太长,您不会改变git的默认行为+1。 - Eric Goerens

19

(2012年3月)
警告:默认的“匹配”策略可能很快会发生改变
(可能在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


18

我刚把这个放在我的.gitconfig别名部分,并且非常喜欢它的工作方式:

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

使用 git pub 将当前分支推送到 origin,或使用 git pub repo-name 推送到另一个仓库。很方便。


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

12

你可以在.gitconfig文件中更改这种默认行为,例如:

[push]
  default = current

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

git config --global --get push.default

9

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"将只推送我“当前使用”的分支。

3
如果你始终希望gpush的行为表现,也可以设置remote.origin.push=HEAD(例如,“git config remote.origin.push HEAD”),正如git-push手册中的示例部分所提到的那样。 - Trevor Robinson
5
如果你看一下“Brian L”上面的帖子,那么这并不是必需的。 - jpswain
1
这是因为“pull.default”没有相应的等效项。 - SamGoody

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