[英]Default behavior of "git push" without a branch specified
我使用以下命令推送到我的远程分支:
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 配置中设置 push.default 来控制默认行为。 从git-config(1) 文档:
push.default
定义如果命令行上没有给出 refspec、远程中没有配置 refspec 并且命令行上给出的任何选项都没有暗示 refspec 时 git push 应该采取的操作。 可能的值为:
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
您可以使用 push.default 为您的 git 设置默认行为
git config push.default current
或者如果您有很多存储库并且想要所有存储库都一样
git config --global push.default current
此设置中的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
手册页的示例部分
我只是将我的代码提交到一个分支并将其推送到 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
会将更改从本地 master 分支推送到远程 master 分支。
git push origin master:staging
会将更改从本地 master 分支推送到远程 staging 分支(如果存在)。
(2012 年 3 月)
当心:默认的“ matching
”政策可能很快就会改变
(有时在 git1.7.10+ 之后) :
请参阅“ 请讨论:当你不说要推送什么时,“git 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
我只是把它放在我的 .gitconfig 别名部分并喜欢它的工作原理:
pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"
将使用git pub
或另一个使用git pub repo-name
repo 将当前分支推送到 origin。 可口。
您可以在.gitconfig
中更改该默认行为,例如:
[push]
default = current
要检查当前设置,请运行:
git config --global --get push.default
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
以推送到审查分支。 它还假设 origin 是您的远程名称。
在签出分支后调用它
git checkout your-branch
git setpush
它显然也可以适应结帐,但我喜欢脚本做一件事并且做得很好
我已将以下函数添加到我的 .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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.