git push origin
当我第一次推送本地创建的分支时,我想自动设置上游引用。
我知道git push -u
,但我不想考虑我之前是否使用-u
过或以其他方式设置上游参考。换句话说,我想git push
自动对git push -u
还没有上游的分支的任何推送产生影响。
这可能吗?如果它需要别名或实用程序脚本,那很好。
git push origin
当我第一次推送本地创建的分支时,我想自动设置上游引用。
我知道git push -u
,但我不想考虑我之前是否使用-u
过或以其他方式设置上游参考。换句话说,我想git push
自动对git push -u
还没有上游的分支的任何推送产生影响。
这可能吗?如果它需要别名或实用程序脚本,那很好。
git config
您可以使用配置它git config --global push.default current
。
文档:https ://git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault
由于我认为使用 git config 不可能做到这一点,因此您可以在 bash 中执行以下操作:
[[ $(git config "branch.$(git rev-parse --abbrev-ref HEAD).merge") = '' ]] && git push -u || git push
如果当前分支有远程跟踪分支,则调用,git push
否则调用 git push -u
注意:新的默认推送策略“ simple
”依赖于具有上游的分支这一事实意味着:
设置上游分支被视为自愿步骤,而不是隐藏的自动步骤
当 "
git push [$there]
" 没有说要推送什么时,到目前为止,我们一直使用传统的“匹配”语义(只要那里已经有同名的分支,你所有的分支都被发送到远程)。我们将使用
simple
将当前分支推送到同名分支的“”语义,仅当当前分支设置为与该远程分支集成时。
有一个用户偏好配置变量“push.default
”来改变它。
因此,根据mechanicfish的答案构建,您可以定义一个别名,右双引号("
)转义(\"
):
git config alias.pu "![[ $(git config \"branch.$(git rev-parse --abbrev-ref HEAD).merge\") = '' ]] && git push -u || git push"
git pu origin
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'
我有同样的问题。我找到了这个别名(.gitconfig)
[alias]
track = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`"
用法:git track
每个新分支一次(当前已签出)。然后像往常一样推:)
@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
or git push
,具体取决于是否branch.$BRANCHNAME.merge
定义了它的上游(属性)。
在命令行输入此别名需要转义码,因此使用编辑器插入正确的文件($HOME/.gitconfig
(global)、.git/config
(local) 或/etc/gitconfig
(system) )可能是最简单的
简短的回答
如果您确实喜欢明确并-u
在必要时使用该选项,但不想输入整个:
git push -u origin foo
然后您可以使用以下别名:
[alias]
push-u = !git push -u origin $(git symbolic-ref --short HEAD)
只需键入:
git push-u
长答案
通常,当我们刚刚创建了一个新的本地分支并提交,并且我们希望将其推送到上游时,需要-u
(简写为)。--set-upstream
远程仓库还没有新的分支,所以我们需要在推送提交之前告诉 git 创建并跟踪远程分支。这仅对分支上的第一次推送是必需的。这是一个典型的场景:
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
,并且上游分支与您的本地分支具有相同的名称。
因此,我在 my 中使用了以下别名,这是Mark 提供.gitconfig
的出色答案的子集:
[alias]
push-u = !git push -u origin $(git symbolic-ref --short HEAD)
现在,我们可以执行以下操作,这仍然是明确的,但不太容易出错:
git checkout -b foo # Create local branch
git commit -m "Foo" # Create local commit
git push-u # Create and track remote branch, and push commit
git commit -m "Bar" # Create local commit
git push # Push commit
我通过使用这个简单的 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
如果您只想通过不太可能的按键来使用内置的 git 功能,只需键入:
$ git push -u o
tab H
tab
自动完成会给你
$ git push -u origin HEAD
要在 OSX 上启用自动编译,请设置一个包含此内容~/.git-completition.bash
的文件,并将以下行添加到您的文件中并重新启动终端:~/.bash_profile
# git branch autocomplete
if [ -f ~/.git-completion.bash ]; then
. ~/.git-completion.bash
fi
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
它也会影响内置终端,例如 vscode 中的终端等。
对此唯一完全诚实的答案是“你不能”。
我已经阅读了本文中的所有回复,以及其他提出相同问题的问题。
发布的每个答案仍然需要您在第一次推送到新分支时传递特殊参数。
简单地:
$ alias gush="git push -u origin HEAD"
如果无论出于何种原因,其他答案都不适合您,那么您可以git push
使用此 bash 函数替换,以便在必要时自动重新发送带有正确标志的推送请求。
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
}
您将牺牲推送输出的进度部分,但除此之外,一切都按预期工作。
就个人而言,我将使用JT Jobe 的答案。
我用有用的脚本做了一个 git 扩展,包括这个:
usage: git line push
Push the current branch and set an upstream if needed.