首页 文章

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

提问于
浏览
1252

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

git push origin sandbox

如果我说

git push origin

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

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

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

git push 
git push origin

origin 上面是一个遥控器 .

我知道 git push [remote] [branch] 只会将该分支推送到远程 .

12 回答

  • 1478

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

    git config push.default current
    

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

    git config --global push.default current
    

    此设置中的 current 表示默认情况下,当您执行 git push 时,您将 only push the current branch

    其他选择是:

    • 什么都没有:不要推东西

    • 匹配:推送所有匹配的分支(默认)

    • tracking:将当前分支推送到跟踪的任何分支

    • current:推送当前分支


    UPDATE - NEW WAY TO DO THIS

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

    git config --global push.default simple
    

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

  • 7

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

  • 198

    我已将以下函数添加到我的.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
    }
    
  • 8

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

    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
    
  • 2

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

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

    git push origin HEAD
    

    (摘自here

  • 7

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

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

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

  • 19

    我更喜欢创建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

  • 195

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

    [push]
      default = current
    

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

    git config --global --get push.default
    
  • 17

    (2012年3月)
    Beware: that default "matching" policy might change soon (sometimes after git1.7.10+)

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

    在当前设置中(即push.default = matching),不带参数的git push将推送本地和远程同名的所有分支 . 这通常适用于开发人员推送到自己的公共存储库时,但在使用共享存储库时可能会造成混淆 . 建议是将默认值更改为“上游”,即仅推送当前分支,并将其推送到分支git pull将从中拉出 . 另一位候选人是“当前”;这会将当前分支仅推送到同名的远程分支 . 到目前为止所讨论的内容可以在这个帖子中看到:

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

    以前的相关讨论包括:

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

  • 3

    这是关于 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 会将更改从本地主分支推送到远程分段分支(如果存在) .

  • 54

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

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

    git pub 或其他仓库 git pub repo-name 推送到当前分支 . 可口 .

相关问题