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

问题描述 投票:1295回答:12

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

git push origin sandbox

如果我说

git push origin

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

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

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

git push 
git push origin

上面的origin是一个遥远的。

据我所知,git push [remote] [branch]只会将该分支推送到遥控器。

git branch git-branch git-push
12个回答
1532
投票

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

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

7
投票

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

[push]
  default = current

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

git config --global --get push.default

3
投票

我更喜欢创建git-XXX脚本而不是使用别名,所以我可以更容易地控制它们(我们的开发人员在他们的路径上都有一定的源控制dir用于此类事情)。

这个脚本(称为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以进入审核分支。它还假定origin是您的远程名称。

签出分支后调用它

git checkout your-branch
git setpush

它显然可以适应结帐,但我喜欢do one thing and do it well的脚本


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
}

199
投票

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


197
投票

git push origin将推动在origin上具有匹配远程分支的本地分支的所有变化至于git push

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

来自git-push man page的例子部分


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

24
投票

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

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

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

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

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


19
投票

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

见“Please discuss: what "git push" should do when you do not say what to push?

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

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

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

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

以前的相关讨论包括:

要加入讨论,请将您的消息发送至:[email protected]


18
投票

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

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

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


9
投票

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

git push origin HEAD

(来自here


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

© www.soinside.com 2019 - 2024. All rights reserved.