131

git push origin当我第一次推送本地创建的分支时,我想自动设置上游引用。

我知道git push -u,但我不想考虑我之前是否使用-u过或以其他方式设置上游参考。换句话说,我想git push自动对git push -u还没有上游的分支的任何推送产生影响。

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

4

12 回答 12

100

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

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

于 2018-11-15T15:32:17.793 回答
33

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

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

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

于 2013-09-26T02:15:13.507 回答
24

注意:新的默认推送策略“ 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

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'
于 2013-09-26T07:24:11.683 回答
21

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

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

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

于 2015-05-29T12:21:37.510 回答
18

@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 $BRANCHNAMEor git push,具体取决于是否branch.$BRANCHNAME.merge定义了它的上游(属性)。

在命令行输入此别名需要转义码,因此使用编辑器插入正确的文件($HOME/.gitconfig(global)、.git/config(local) 或/etc/gitconfig(system) )可能是最简单的

于 2016-04-14T22:02:08.377 回答
8

简短的回答

如果您确实喜欢明确并-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
于 2019-08-06T12:02:43.503 回答
7

我通过使用这个简单的 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
于 2017-03-17T14:51:28.427 回答
5

如果您只想通过不太可能的按键来使用内置的 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 中的终端等。

于 2020-03-26T11:51:22.973 回答
4

对此唯一完全诚实的答案是“你不能”。

我已经阅读了本文中的所有回复,以及其他提出相同问题的问题。

发布的每个答案仍然需要您在第一次推送到新分支时传递特殊参数。

于 2021-04-20T07:27:27.813 回答
3

简单地:

$ alias gush="git push -u origin HEAD"
于 2016-09-15T14:21:32.253 回答
1

如果无论出于何种原因,其他答案都不适合您,那么您可以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 的答案

于 2020-09-29T17:49:24.163 回答
1

我用有用的脚本做了一个 git 扩展,包括这个:

usage: git line push

Push the current branch and set an upstream if needed.

https://github.com/jvenezia/git-line

于 2017-05-03T14:14:12.500 回答