当我第一次推送本地创建的分支时,我希望git push origin
自动设置上游引用。
我知道git push -u
,但我不想考虑我之前是否使用过-u
或以其他方式设置了上游参考。换句话说,我希望git push
在没有上游的分支的任何推送上自动产生git push -u
的效果。
这可能吗?如果它需要别名或实用程序脚本,那很好。
答案 0 :(得分:26)
由于我不认为使用git配置是可行的,所以你可以在bash中做到这一点:
[[ $(git config "branch.$(git rev-parse --abbrev-ref HEAD).merge") = '' ]] && git push -u || git push
如果当前分支有远程跟踪分支,则会调用git push
,否则会调用git push -u
答案 1 :(得分:23)
注意:new default push policy "simple
"依赖于具有上游分支的分支这一事实意味着:
设置上游分支被视为自愿步骤,而不是隐藏的自动步骤
当“
git push [$there]
”没有说明推送内容时,我们到目前为止使用了传统的“匹配”语义(只要已经有相同名称的分支,所有分支都被发送到远程)那里)。我们将使用“
simple
”语义将当前分支推送到具有相同名称的分支,仅当当前分支设置为与该远程分支集成。<登记/> 有一个用户首选项配置变量“push.default
”来改变它。
从mechanicalfish answer开始构建,你可以定义一个别名,右引号("
)转义(\"
):
git config alias.pu "![[ $(git config \"branch.$(git rev-parse --abbrev-ref HEAD).merge\") = '' ]] && git push -u || git push"
git pu origin
Sc0ttyD建议in the comments以下别名:
alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
多行:
alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] &&
git push -u origin $(git symbolic-ref --short HEAD) ||
git push'
答案 2 :(得分:18)
您可以使用git config
和git config --global push.default current
对其进行配置。
文档:https://git-scm.com/docs/git-config#git-config-pushdefault
答案 3 :(得分:14)
我遇到了同样的问题。我找到了这个别名(.gitconfig)
[alias]
track = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`"
用法:git track
每个新分支一次(当前已签出)。然后按正常推动:)
答案 4 :(得分:11)
@VonC和@Frexuz的答案很有帮助,但他们的两个解决方案都给我带来了错误。使用他们的答案,我拼凑了一些对我有用的东西:
[alias]
pu = ![[ $(git config "branch.$(git symbolic-ref --short HEAD).merge") = '' ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push
这导致执行git push -u origin $BRANCHNAME
或git push
,具体取决于是否定义了其上游(属性branch.$BRANCHNAME.merge
)。
在命令行中输入此别名将需要转义码,因此使用编辑器插入正确的文件($HOME/.gitconfig
(全局),.git/config
(本地)可能最容易),或/etc/gitconfig
(系统))
答案 5 :(得分:3)
我使用这个简单的Bash脚本解决了这个问题。它不适用于现有分支,但如果使用此功能创建所有分支,则始终会自动设置上游分支。
function con { git checkout -b $1 && git push --set-upstream origin $1; }
$ 1代表你在con
之后传递的第一个参数,所以它就像在做:
git checkout -b my-new-branch && git push -u my-new-branch
......只是这样做:
con my-new-branch
答案 6 :(得分:3)
简短答案
如果您想明确表示并使用-u
选项,但是不想输入:
git push -u origin my-long-and-c0mpl1c4t3d-branch-name`
然后您可以使用以下别名:
[alias]
push-u = !git push -u origin $(git symbolic-ref --short HEAD)
只需键入:
git push-u
好答案
通常,对-u
(--set-upstream
的简称)的需求是在我们刚刚创建新的本地分支并将其推向上游时。远程存储库尚无此分支,因此我们需要以下内容:
git checkout -b foo # Create local branch
git commit -m "Foo" # Create local commit
git push -u origin foo # Create and track remote branch, and push commit
git commit -m "Bar" # Create local commit
git push # Push commit
个人而言,我喜欢在创建远程分支时需要使用git push -u
进行显式表示:这是一项非常重要的操作,将一个新的分支共享给整个世界。
但是,我讨厌我们必须显式地编写git push -u origin foo
。键入不仅很麻烦,而且更重要的是,它很容易出错!输入分支名称时容易出错,并且新的远程分支不会与本地分支具有相同的名称!实际上,在大多数情况下,您希望上游存储库为origin
,并且希望上游分支与本地分支具有相同的名称。
因此,我在.gitconfig
中使用以下别名,该别名是出色的answer provided by Mark的子集:
[alias]
push-upstream = !git push --set-upstream origin $(git symbolic-ref --short HEAD)
现在,我们可以执行以下操作,这些操作仍然很明确,但不易出错:
git checkout -b foo # Create local branch
git commit -m "Foo" # Create local commit
git push-upstream # Create and track remote branch, and push commit
git commit -m "Bar" # Create local commit
git push # Push commit
答案 7 :(得分:3)
如果只想通过较少的按键使用内置的git功能,只需键入:
$ git push -u o
标签 H
标签
和自动完成功能将为您提供
$ git push -u origin HEAD
要在OSX上启用自动编译功能,请设置~/.git-completition.bash
文件with this content,并将以下行添加到~/.bash_profile
文件中,然后重新启动终端:
# git branch autocomplete
if [ -f ~/.git-completion.bash ]; then
. ~/.git-completion.bash
fi
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
它也会影响内置终端,例如vscode中的一个。
答案 8 :(得分:2)
简单地:
$ alias gush="git push -u origin HEAD"
答案 9 :(得分:1)
我使用有用的脚本创建了一个git扩展,包括这个:
usage: git line push
Push the current branch and set an upstream if needed.
答案 10 :(得分:1)
唯一完全诚实的答案是“不”。
我已阅读本文中的所有回复,以及其他提出相同问题的问题。
发布的每个答案仍然都要求您在第一次推送到新分支时传递特殊参数。
答案 11 :(得分:0)
如果由于某种原因,没有其他答案对您有用,那么您可以用此bash函数替换git push
,以在必要时自动使用正确的标志重新发送推送请求。
gitpush()
{
git push -v 2>&1 | # perform push command, pipe all output
tee /dev/tty | # keep output on screen and pipe it forward
(
cmd=$(sed -n "s/^.*\(git push --set-upstream origin .*\)$/\1/p");
[[ -n "${cmd// }" ]] && (echo "> $cmd"; eval $cmd);
) # if we get output that matches the command to perform, execute it
}
您将牺牲push输出的进度部分,但除此之外,一切都会按预期进行。
我个人将使用JT Jobe's answer。