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

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

git push origin sandbox

如果我说

git push origin

这是否也会在我的其他分支中推送更改,或者它只更新我当前的分支?我有三个分支:masterproductionsandbox

git push留档对此不是很清楚,所以我想澄清一下。

以下git push命令准确更新哪些分支和远程?

git pushgit push origin

上面的origin是一个遥控器。

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

715594 次浏览

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

适当地别名“gull”和“gush”:

在我的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`'

因此,执行“gush”或“gull”将仅推送我的“当前处于状态”分支。

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

push.default

定义如果命令行上没有给出refspec、远程中没有配置refspec以及命令行上给出的任何选项都没有隐含refspec,git ush应采取的操作。可能的值是:

  • nothing:不要推任何东西

  • matching:(默认在Git 2.0之前)推送所有匹配的分支

    两端具有相同名称的所有分支都被认为是匹配的。

  • upstream:将当前分支推送到其上游分支(tracking是上游的不建议使用的同义词)

  • current:将当前分支推送到同名分支

  • simple:(Git 1.7.11新增,默认为Git 2.0后)类似上游,但如果上游分支名称与本地分支名称不同,则拒绝推送

    这是最安全的选择,非常适合初学者。

简单,当前和上游模式适用于那些在完成工作后想要推出单个分支的人,即使其他分支尚未准备好推出

命令行示例:

查看当前配置:

git config push.default

要设置新配置:

git config push.default current

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

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

来自#0手册页的示例部分

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

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

将当前分支推送到带有git pub的源或带有git pub repo-name的另一个存储库。美味。

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

git config push.default current

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

git config --global push.default current

此设置中的当前意味着默认情况下,当您执行git推送时,您将只推送当前分支

其他选择是:

  • 无:不要推任何东西
  • 匹配:推送所有匹配的分支(默认)
  • 跟踪:将当前分支推送到它正在跟踪的任何位置
  • 当前:推送当前分支

更新-新的方法来做到这一点

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

git config --global push.default simple

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

我只是将我的代码提交到一个分支并将其推送到github,如下所示:

git branch SimonLowMemoryExperimentsgit checkout SimonLowMemoryExperimentsgit add .git commit -a -m "Lots of experimentation with identifying the memory problems"git push origin SimonLowMemoryExperiments

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

见“请讨论:当你没有说要推送什么时,“git推送”应该做什么?

在当前设置(即#0),#1不带参数将推送本地和远程存在的所有同名分支
当开发人员推送到他自己的公共存储库时,这通常是合适的,但在使用共享存储库时,如果不是危险的话,可能会令人困惑。

建议是将默认值更改为“#0”,即仅推送当前分支,并将其推送到git ull将从中拉取的分支。
另一个候选分支是“current”;这只会将当前分支推送到同名的远程分支。

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

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

以前的相关讨论包括:

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

与其使用别名,我更喜欢创建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

请注意,当我们使用#0时,它将目标设置为refs/for/XXX以推送到审查分支。它还假设起源是您的远程名称。

在检出分支后调用它

git checkout your-branchgit setpush

它显然可以适应也做结帐,但我喜欢脚本做一件事,把它做好

以下是关于GitPush的非常方便和有用的信息:Git推送:只是提示

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

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

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

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

我在我的. bashrc文件中添加了以下函数来自动执行这些任务。它做git推送/git拉取+当前分支的名称。

function gpush(){if [[ "x$1" == "x-h" ]]; thencat <<EOFUsage: gpushgit: for current branch: push changes to remote branch;EOFelseset -xlocal bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`git push ${bname}set +xfi}
function gpull(){if [[ "x$1" == "x-h" ]]; thencat <<EOFUsage: gpullgit: for current branch: pull changes fromEOFelseset -xlocal bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`git pull ${bname}set +xfi}

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

git push origin HEAD

(取自这里

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

[push]default = current

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

git config --global --get push.default

git2.37.0中的新配置

运行以设置自动安装远程,而不是更改推送默认行为

git config --global --add --bool push.autoSetupRemote true

它工作得很好push.default是simpleupstream

参考:答案twitter文档提交