git - 默认行为的"git push"没有指定一个分支

  显示原文与译文双语对照的内容

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


git push origin sandbox

如果我说的话

 
git push origin

 

这是否也在我的其他分支中更改了更改,还是只更新了当前分支? 我有三个分支:masterproductionsandbox

git push 文档对此不太清楚,所以我想澄清一下。

下面的git push 命令使用哪些分支和远程命令进行更新?


git push 
git push origin

上面的origin 是一个远程。

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

时间:

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

 
push.default

 

定义了行动 git push 应该如果没有 refspec 命令行, 没有refspec在远程配置,没有任何隐含的refspec 命令行 上给出的选项。 可能的值是:

  • nothing: 不要推任何东西

  • matching: 推入所有匹配的分支

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

    这是 Git 1. x. 中的默认值

  • upstream: 将当前分支推送到上游分支( tracking 是上游的一个废弃的同义词)

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

  • simple: ( 在 Git 1.7.11中新建) 类似上游,但如果分支的上游名称与本地名称不同,则拒绝推送

    这是最安全的选项,对于初学者来说是 well-suited 。

    这将成为 Git 2.0中的默认值。

简单,当前和上游模式是为那些想在完成工作后推出一个分支的人,即使其他分支还没有准备好推出

命令行 示例:


git config --global push.default current

git push origin 将把在 origin 处具有匹配远程分支的本地分支的所有更改推送到 git push

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

git-push 手册页列表中的示例部分

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


git config push.default current

或者如果你有很多仓库,并且你想要的都是一样


git config --global push.default current

当前默认这种设置意味着你只推动当前分支当你 git push

其他选项是:

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

更新- 执行这里任务的新方式

在 Git 1.7.11中执行以下操作:


git config --global push.default simple

这是一个新的设置,它的工作方式与当前相同,将根据谣言从默认为 git

我刚将代码提交到一个分支,并将它的推送到了 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

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


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

将当前分支推到 git pub 或者其他带有 git pub repo-name的仓库。 美味。

这是一个非常方便的和有用的信息关于 git push : git push: 仅提示

git push 最常见的用法是将本地更改推送到公共上游仓库。 假设上游是一个远程命名的"原点"( 如果存储库是一个克隆),并且要更新到/来自"母版"的分支被命名为( 默认分支名称),这就完成了: git push origin master

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

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

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

: git-push: 只是

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"将只推动我的"当前在上"分支。

我宁愿创建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

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

我已经将以下函数添加到。bashrc文件中,以自动执行这些任务。


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
}

...