如何配置git push以自动设置上游而不使用-u?


100

我想git push origin在第一次推送本地创建的分支时自动设置上游参考。

我了解git push -u,但是我不想考虑我-u之前是否使用过或设置上游参考。换句话说,我希望git pushgit push -u没有上游的分支的任何推送上自动产生效果。

这可能吗?如果需要别名或实用程序脚本,那很好。


2
您是否检查过是否可以在git-config(1)中使用push.defaultand branch.<name>.merge选项?

5
我已push.default设定current-就是这样,git push origin不用参考或上游就可以说。但这对自动设置上游没有帮助。
约翰

Answers:


61

您可以git config使用进行配置git config --global push.default current

文件:https//git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault


8
我已经设置好了-这就是我git push origin无需参考说明或上游就可以说的方式。但这对自动设置上游没有帮助。
约翰(John)

为我工作:+1:
Tim Strijdhorst,

是啊,作为@约翰说,这要记住,这样做是很重要的不是使当地分行追踪远程之一; 它只是创建与本地分支同名的远程分支。
waldyrious

如果您只需要这样做就足够了push,例如,他的分支中只有一位开发人员,他只编辑一份回购副本。
superarts.org

26

由于我认为使用git config不可能做到这一点,因此您可以在bash中执行以下操作:

[[ $(git config "branch.$(git rev-parse --abbrev-ref HEAD).merge") = '' ]] && git push -u || git push

如果当前分支具有远程跟踪分支,则调用,git push否则调用 git push -u


24
您现在可以做git config --global push.default current
安德烈·贝尔贡佐

2
@AndreaBergonzo这是对我唯一的好答案,您可以将其添加为答案吗?
pdem

6
@ AndreaBergonzo,@ pdem-请注意,push.default=current仅在远程存储库中创建一个与本地分支同名的分支,而不将本地分支设置为跟踪远程分支。我不确定为什么会这样,但是值得牢记。
waldyrious

22

注意:新的默认推送策略“ simple依赖于具有上游分支的分支这一事实意味着:
设置上游分支被视为自愿步骤,而不是隐藏的自动化步骤

当“ git push [$there]”没有说明要推送的内容时,到目前为止,我们已经使用了传统的“匹配”语义(只要您的所有分支都已发送到远程,只要那里已经有同名的分支)即可。

仅当将当前分支设置为与该远程分支集成时,我们才会使用simple将当前分支推送到具有相同名称的分支的语义。 用户偏好配置变量“ ”可以更改此设置。
push.default


因此,根据mechanicalfish答案构建,您可以定义一个别名,并使用正确的双引号(")转义(\"):

git config alias.pu "![[ $(git config \"branch.$(git rev-parse --abbrev-ref HEAD).merge\") = '' ]] && git push -u || git push"

git pu origin

Sc0ttyD 在注释中建议以下别名:

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'

1
感谢您展示如何设置别名。不过,我不清楚您的答案的第一部分是否与之相关。
约翰·约翰·约翰(John

2
@约翰,我的意思是:您将绕过应该是故意的步骤。您可以设置该别名,但是我想向其他读者阐明为什么-u存在此显式选项,以及为什么没有用于使该选项自动执行的配置(因此称为别名)。
VonC

2
我的.zshrc中有一个zsh别名列表。我修改了此答案以创建以下zsh别名:alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
Sc0ttyD

2
@ Sc0ttyD有趣,谢谢。我已将您的评论包括在答案中,以提高知名度。
VonC

17

我遇到了同样的问题。我找到了这个别名(.gitconfig)

[alias] track = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`"

用法:git track每个新分支一次(当前已签出)。然后像往常一样推:)


15

@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 $BRANCHNAMEgit push,这取决于是否branch.$BRANCHNAME.merge定义了上游(属性)。

在命令行上输入此别名将需要转义码,因此使用编辑器将其插入正确的文件($HOME/.gitconfig(全局),.git/config(本地)或/etc/gitconfig(系统))最简单。


3
这是最直接,最完整的答案。要打开默认编辑器而不寻找文件,您可以git config --global -e
Adam Tolley,2017年

5

简短答案

如果您实际上想露骨,并-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,并且上游分支与本地分支具有相同的名称。

因此,我在我的中使用了以下别名.gitconfig,这是Mark提供的出色答案的子集:

[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

4

我通过使用此简单的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

2

只是:

$ alias gush="git push -u origin HEAD"

2
问题标题:“如何配置git push以自动设置上游而不使用-u?” 描述:“我知道git push -u,但是...”。因此,这不能回答问题。
约翰(John

2
@John我更新了答案以建议一个简单的别名。
djanowski

2
@John现在回答这个问题了吗?
djanowski

1
@ ILI4SK4RIM谢谢,我的答案是最简单的答案,这很疯狂,但这是-1 __(ツ)_ /
¯– djanowski


1

如果您只想通过较少的键使用内置的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中的一个。


自动完成?git没有自动完成功能。您的外壳程序(bash?zsh?)装有一组自动完成规则。您能否提供有关正在使用的自动完成规则集以及从何处获取这些规则的信息?
vy32

哦,的确是谢谢。我已经使用自动完成设置完成了答案。
gazdagergo

不知道文件〜/ .git-completion.bash的内容,您的答案将无法执行。
vy32

1
好点子。我找到了我的来源git-completition.bash并添加到我的答案中。
gazdagergo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.