没有指定分支的“git push”的默认行为
我使用以下命令推送到我的远程分支:
git push origin sandbox
如果我说
git push origin
是否也推动了我其他分支的变化,还是只更新我目前的分支? 我有三个分支: master
, production
和sandbox
。
git push
文件不是很清楚,所以我想澄清一下这个好。
哪个分支和遥控器能够完成以下git push
命令的更新?
git push git push origin
上面的origin
是一个遥远的。
我明白, git push [remote] [branch]
将只推动该分支到远程。
您可以通过在gitconfiguration中设置push.default来控制默认行为。 从git-config(1)文档 :
push.default
定义git push在命令行中没有给定refspec的情况下应该执行的操作,远程没有configurationrefspec,并且命令行中给出的任何选项都没有暗示refspec。 可能的值是:
-
nothing
:不要推动任何东西 -
matching
:推送所有匹配的分支所有两端同名的分支被认为是匹配的。
这是Git 1.x中的默认值。
-
upstream
:将当前分支推送到其上游分支(tracking
是上游的废弃同义词) -
current
:将当前分支推送到同名分支 -
simple
:(像Git 1.7.11一样新)像上游,但拒绝推动,如果上游分支的名字是不同于本地这是最安全的select,非常适合初学者。
这将成为Git 2.0中的默认设置。
简单的,现在的和上游的模式适用于那些在完成工作后想要推出一个分支的人,即使其他分支还没有准备好被推出
命令行示例:
要查看当前configuration:
git config --global push.default
要设置新的configuration:
git config --global push.default current
git push origin
会推送在origin
上具有匹配的远程分支的本地分支上的所有改变至于git push
像
git push <remote>
,其中<remote>
是当前分支的远程(或者源,如果没有为当前分支configuration远程)。
从git-push
手册页的示例部分
您可以使用push.default为您的git设置默认行为
git config push.default current
或者如果你有很多的存储库,并希望所有的相同
git config --global push.default current
在这个设置中的电stream意味着,默认情况下,你只会推动当前的分支,当你做混帐推
其他选项是:
- 没有:不要推动任何东西
- 匹配:推送所有匹配分支(默认)
- 跟踪:将当前分支推送到正在跟踪的任何地方
- 当前:推送当前分支
更新 – 新的方法来做到这一点
从Git 1.7.11开始,请执行以下操作:
git config --global push.default simple
这是一个新的设置介绍,以同样的方式工作,并将被默认从v 2.0根据谣言
我只是将我的代码提交给一个分支,并将其推送到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:只是提示
git push最常见的用途是将你的本地修改推送到你的公共上游信息库。 假设上游是一个远程名为“origin”(默认的远程名称,如果你的版本库是一个克隆)并且要更新的分支被命名为“master”(缺省分支名称),那么这个命令是通过: git push origin master
git push origin
将把所有本地分支的变化推送到原始远程的匹配分支。
git push origin master
会把本地主分支的变化推送到远程主分支。
git push origin master:staging
如果它存在的话, git push origin master:staging
将会把更改从本地主分支推送到远程分段分支。
(2012年3月)
注意:默认的“ matching
”策略可能会很快改变
(有时在git1.7.10 +之后) :
请参阅“ 请讨论:什么”git推“应该做,当你不说什么推动?
在当前的设置 (即
push.default=matching
), 没有参数的git push
会推送所有本地和远程同名的分支 。
当开发人员推送到自己的公共存储库时,这通常是合适的,但是如果使用共享存储库时不是危险的话,可能会造成混淆。build议是将默认值更改为'
upstream
' ,即只推送当前分支,并将其推到分支git拉将从中拉。
另一个候选人是“current
”; 这只将当前分支推送到相同名称的远程分支。到目前为止,已经讨论过的内容可以在这个主题中看到:
http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694
先前的相关讨论包括:
- http://thread.gmane.org/gmane.comp.version-control.git/123350/focus=123541
- http://thread.gmane.org/gmane.comp.version-control.git/166743
要join讨论,请发送邮件到:git@vger.kernel.org
我只是把它放在我的.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”将只推我的“当前”分支。
你可以用命令推送当前分支
git push origin HEAD
(从这里拿)
您可以在.gitconfig
更改该默认行为,例如:
[push] default = current
要检查当前设置,请运行:
git config --global --get push.default
我更喜欢创buildgit-XXX脚本,而不是使用别名,所以我可以更容易地控制它们(我们的开发人员在他们的path上都有一个特定的源代码控制目录)。
这个脚本(名为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文件中以自动执行这些任务。 它做git push / git pull +当前分支的名字。
function gpush() { if [[ "x$1" == "xh" ]]; 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" == "xh" ]]; 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 }