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


1366

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

git push origin sandbox

如果我说

git push origin

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

git push文件是不是很清楚这一点,所以我想澄清这一点为好。

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

git push 
git push origin

origin 上面是一个遥控器。

我知道git push [remote] [branch]这只会将那个分支推到远程。


:关于的比较工具,一般的配置,新的脚本的git difftool,我在这等太问题增加了一个新的答案stackoverflow.com/questions/255202/...
VonC

67
我做了一个博客帖子有关的令人惊讶的行为git push,这可能会感兴趣
马克Longair

1
@Mark:在其他工作中,仅将当前分支推入其跟踪的上游。真好
VonC


help.github.com/articles/pushing-to-a-remote将此链接放在此处可为像我这样的新手提供即时帮助
MycrofD

Answers:


1591

您可以通过在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

11
可能值得注意的是,这是v1.6.3中的新功能:kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt
CB Bailey 2009年

8
这个“ push.default”对于使用多个存储库是最伟大的事情。将其设置为“跟踪”,一切都很好。与分支--set-upstream结合使用,使推拉方式更加方便。
jpswain 2010年

13
“跟踪”是“上游”的不赞成使用的同义词:kernel.org/pub/software/scm/git/docs/git-config.html
LuckyMalaka 2011年

22
值得注意的是,从Git 1.7.11开始,有一个新simple模式。此模式旨在将来成为默认模式。simple的工作方式类似于upstream,但是like current要求两端的分支名称相同。

9
值得注意的是,从Git 2.0开始,该simple行为现在是默认行为。
do0g

209

您可以使用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


29
是的,我阅读了您所指的答案,但该答案仅告诉您该做什么,而不是该怎么做。所以我添加了答案,因此设置它所需的所有信息都在同一页面上。
Christoffer

3
好; 最好建议对上述帖子进行修改,因为没人会看到您的答案,因为它不太可能获得那么多的选票
CharlesB 2011年

如何将其拉到当前分支?git pull的由来?
弗朗索瓦·

200

git push origin将推动地方分支机构已经在匹配的远程分支的所有更改origin至于git push

像一样工作git push <remote>,其中<remote>当前分支的远程服务器(如果没有为当前分支配置远程服务器,则为源)。

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


2
是的,这很清楚。我可能正在运行较旧版本的git(1.6.1.1 Mac OS X),其手册页中没有这些示例。
PlagueHammer

可能我正在运行1.6.3.1。我确实在我链接的网站上找到了它。
baudtack

2
因此,在我的情况下,所有本地分支都具有相同的远程“起源”,“ git push”将与“ git push origin”完全相同,后者将仅推送在远程具有相应分支的本地分支。
PlagueHammer

@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”。这可能是有用的stackoverflow.com/questions/3741136/git-push-f-vs
Dylan Valade

54

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

17
这个答案和这个问题有关系吗?:?
阿西姆·KT

26

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

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

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

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

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


git push origin branch_name由于某种原因,不仅要推送branch_name分支,还要推送我的其他本地分支(git版本1.9.1)。
mrgloom

git push origin master:staging是一个很棒的隐藏宝石!
Shakeel

19

(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


18

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

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

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


4
很好,但不幸的是,它假定该分支在另一个存储库中具有相同的名称。试试吧git push -u --repo="origin" $1;。它工作得很好,除非您推送到另一个存储库,否则分支名称将是另一个存储库使用的名称,而不是您从中推送的名称
Casebash 2012年

嘿,谢谢!让我想做一个更完整的版本,在推送之前检查跟踪状态。但由于我在存储库之间很少有不同的分支名称,因此我会坚持我的。
Mat Schaffer 2012年


8

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的行为,则还可以设置git-push手册页的示例部分中提到的remote.origin.push = HEAD(例如“ git config remote.origin.push HEAD”)。
Trevor Robinson

5
如果您查看以上“ Brian L”的帖子,则没有必要。
jpswain 2010年

1
是的,因为没有对等。for pull pull.default
SamGoody 2012年

8

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

[push]
  default = current

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

git config --global --get push.default

3

我更喜欢创建git-XXX脚本,而不是使用别名,这样我就可以更轻松地对它们进行源代码控制(我们的开发人员在此类事情的路径上都有特定的源代码控制目录)。

该脚本(称为git-setpush)会将value的config值设置为remote.origin.push只会推送当前分支的内容:

#!/bin/bash -eu

CURRENT_BRANCH=$(git branch | grep '^\*' | cut -d" " -f2)
NEW_PUSH_REF=HEAD:refs/for/$CURRENT_BRANCH

echo "setting remote.origin.push to $NEW_PUSH_REF"
git config remote.origin.push $NEW_PUSH_REF

请注意,在使用时Gerrit,它会将目标设置refs/for/XXX为推送到评论分支。它还假定origin是您的远程名称。

在签出一个分支后调用它

git checkout your-branch
git setpush

很显然,它也可以进行结帐,但是我喜欢脚本来做一件事并且做得很好


将Gerrit设置为remote.origin.push的好主意。我的本地要素分支feature/fix_fubar都指向更通用的上游分支,例如masterdevelop,因此这将指向错误的上游。Gerrit控制的存储库的本地流量是什么样的?
spazm

如果您在gerrit上只有一个“目标”分支,请尝试git config remote.origin.push HEAD:refs/for/master
fracz

2

我已将以下功能添加到我的.bashrc文件中,以自动执行这些任务。它执行git push / git pull +当前分支的名称。

function gpush()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpush
git: for current branch: push changes to remote branch;
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git push ${bname}
    set +x
  fi
}

function gpull()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpull
git: for current branch: pull changes from
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git pull ${bname}
    set +x
  fi
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.