我使用以下命令推送到我的远程分支:
git push origin sandbox
如果我说
git push origin
这会推动我的其他分支的变化,还是只更新我当前的分支?我有三个分支:master
,production
和sandbox
。
git push
文档对此并不十分清楚,因此我想澄清这一点。
哪些分支和遥控器执行以下git push
命令更新?
git push
git push origin
上面的origin
是一个遥远的。
据我所知,git push [remote] [branch]
只会将该分支推送到遥控器。
您可以通过在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
您可以在.gitconfig
中更改该默认行为,例如:
[push]
default = current
要检查当前设置,请运行:
git config --global --get push.default
我更喜欢创建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的脚本
我已将以下函数添加到我的.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
}
您可以使用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
这是一个引入的新设置,其工作方式与当前相同,并且根据谣言将从v 2.0默认为git
git push origin
将推动在origin
上具有匹配远程分支的本地分支的所有变化至于git push
像
git push <remote>
一样工作,其中<remote>
是当前分支的远程(或原点,如果没有为当前分支配置远程)。
来自git-push
man page的例子部分
我只是将我的代码提交到分支并将其推送到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
这是关于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
会将更改从本地主分支推送到远程分段分支。
(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]
我只是把它放在我的.gitconfig别名部分,并喜欢它的工作原理:
pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"
将使用git pub
或git pub repo-name
的另一个回购将当前分支推送到原点。可口。
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”将仅推送我的“当前打开”分支。