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

git push origin sandbox


如果我说

git push origin


可以推送更改我的其他分支,还是只更新我当前的分支?我有三个分支:masterproductionsandbox

git push文档对此不太清楚,所以我想对此做个很好的说明。

哪个分支和遥控器是否完全更新了以下git push命令?

git push 
git push origin


origin上面是一个遥控器。

我了解git push [remote] [branch]只会推送该分支到遥控器。

评论

关于diff工具的配置以及新脚本git difftool,我在另一个SO问题中添加了一个新答案:stackoverflow.com/questions/255202/…

我写了一篇有关git push令人惊讶行为的博客文章,可能对此很感兴趣

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

stackoverflow.com/q/13148066/2157640

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

#1 楼

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

push.default


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


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


评论


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

– CB Bailey
09年6月4日在7:34

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

– jpswain
2010-09-30 4:22

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

–LuckyMalaka
2011年6月9日下午6:37

值得注意的是,从Git 1.7.11开始,有一个新的简单模式。此模式旨在将来成为默认模式。简单的工作像上游一样,但像current一样,要求两端的分支名称相同。

–凯
2012年10月14日20:59

值得注意的是,从Git 2.0开始,简单行为现在是默认行为。

– do0g
15年7月24日在14:26

#2 楼

您可以使用push.default

git config push.default current


设置git的默认行为,或者如果您有很多存储库,并且所有存储库都希望使用相同的行为,则可以使用

>
git config --global push.default current


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

其他选项是:


什么都不做:不推送任何内容
匹配项:推送所有匹配的分支(默认)
current:推送当前分支


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

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

git config --global push.default simple


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

评论


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

–克里斯托弗
2011年10月11日9:46

好;最好建议对所述帖子进行修改,因为没人会看到您的答案,因为它不会获得那么多的投票

–CharlesB
2011-10-11 9:56

如何将其拉到当前分支? git pull的由来?

–弗朗索瓦(Francois)
2012年10月22日12:36

#3 楼

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


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


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

评论


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

– Debajit
09年6月4日在3:53

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

–波特达克
09年6月4日在3:56

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

– Debajit
09年6月4日在4:02

@Debajit对吧!顺便问一个好问题。我一直以为git push将只推送当前分支。显然不是!很高兴知道。

–波特达克
09年6月4日在4:28

这个问题很旧,但对于任何新手,@ 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)
2011-09-19 13:42

#4 楼

我只是将代码提交到一个分支,然后将其推送到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 commit -am“ ...”

–詹姆斯·哈灵顿
15年3月19日在13:58



这个答案和这个问题有关系吗? :?

– Asim K T
16年7月25日在4:36

#5 楼

以下是有关Git Push的非常有用和有用的信息:
Git Push:提示

git push的最常见用法是将本地更改推送到公共上游存储库。假设上游是一个名为“ origin”的远程服务器(如果您的存储库是一个克隆,则为默认远程名称),而要更新到/从该分支的分支被命名为“ master”(默认分支名称),请执行以下操作:git push origin master

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

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

评论


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

–mrgloom
16年7月14日在13:23

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

– Shakeel
17年1月16日,0:32

#6 楼

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

请参阅“请讨论:当您使用“ git push”时应该做什么不说要推送什么?“


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

建议将默认值更改为“ upstream”,即仅推送当前分支,并将其推送到git pull将从中提取的分支。这会将当前分支仅推送到同名的远程分支。

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


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


先前的相关讨论包括:



http://thread.gmane.org/gmane.comp.version-control.git/123350/focus=123541
http://thread.gmane.org/gmane.comp.version -control.git / 166743


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


#7 楼

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

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


将当前分支通过git pub推送到源,或者通过git pub repo-name推送到另一个仓库。好吃。

评论


很好,但不幸的是,它假定该分支在另一个存储库中具有相同的名称。尝试git push -u --repo =“ origin” $ 1;代替。它工作得很好,除了如果您推送到另一个存储库,分支名称将是另一个存储库使用的名称,而不是您从中推送的名称

– Casebash
2012年1月9日在7:11

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

–马特·沙弗(Mat Schaffer)
2012年1月9日在16:22

#8 楼

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

git push origin HEAD


(从这里开始)

#9 楼

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

[push]
  default = current


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

git config --global --get push.default


#10 楼

git push将尝试将所有本地分支推送到远程服务器,这可能是您不想要的。我有几个方便的设置可以处理:

别名“ gpull”和“ gpush”:

在我的〜/ .bash_profile

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


因此,执行“ gpush”或“ gpull”将只推动我的“ currently on”分支。

评论


如果您一直想要gpush的行为,则还可以设置git.push手册页示例部分中提到的remote.origin.push = HEAD(例如“ git config remote.origin.push HEAD”)。

–特雷弗·罗宾逊
10年6月24日在7:57

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

– jpswain
2010-09-30在4:23

是的,因为没有对等。对于拉pull.default

– SamGoody
2012年1月8日在20:36

#11 楼

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

此脚本(称为git-setpush)会将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推入审核分支。它也假定原点是您的远程名称。



git checkout your-branch
git setpush

检出一个分支后调用它,显然它也可以适用于结帐,但是我喜欢脚本做一件事并且做得很好

评论


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

– spazm
15年6月24日在16:22

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

– Fracz
15年7月17日在8:22

#12 楼

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

function gpush()
{
  if [[ "x" == "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" == "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
}