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

时间:2009-06-04 02:45:57

标签: git branch git-branch git-push

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

git push origin sandbox

如果我说

git push origin

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

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

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

git push 
git push origin
上面的

origin是遥控器。

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

12 个答案:

答案 0 :(得分:1519)

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

答案 1 :(得分:198)

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

答案 2 :(得分:197)

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

  

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

来自git-push man page

的示例部分

答案 3 :(得分: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

答案 4 :(得分:24)

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

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

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

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

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

答案 5 :(得分: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

  

以前的相关讨论包括:

  

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

答案 6 :(得分:18)

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

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

将当前分支推送到git pub或另一个带git pub repo-name的仓库。可口。

答案 7 :(得分:9)

您可以使用命令

推送当前分支
@Singleton
@DependsOn("DefaultEmailService")
public class CustomerService implements UserHandlingService {

    private DefaultEmailService mailService;

    @Inject
    public CustomerService(DefaultEmailService mailService) {       
        this.mailService = mailService;
    }
}


@Singleton
@Startup
public class DefaultEmailService implements EmailService {

    public DefaultEmailService() {  
    }
}

(取自here

答案 8 :(得分: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”将只推送我的“当前开启”分支。

答案 9 :(得分:7)

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

 $query = "SELECT COUNT(*) as num FROM {$tableName}";
 $total_pages = mysql_fetch_array(mysql_query($query));
 $total_pages = $total_pages['num'];
 if (!empty($total_pages)) {
     echo $total_pages . " Results found.";
 } else {
     echo "Sorry! No results found.";
 }

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

[push]
  default = current

答案 10 :(得分:3)

我不是使用别名,而是更喜欢创建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以进入审核分支。它还假设origin是您的远程名称。

使用

签出分支后调用它
git checkout your-branch
git setpush

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

答案 11 :(得分: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
}