Зачем мне все время делать `--set-upstream`? - PullRequest
1278 голосов
/ 22 мая 2011

Я создаю новую ветку в Git:

git branch my_branch

Нажмите на нее:

git push origin my_branch

Теперь скажите, что кто-то сделал некоторые изменения на сервере, и я хочу вытащить из origin/my_branch. Я делаю:

git pull

Но я получаю:

You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "my_branch"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Я узнал, что могу заставить его работать:

git branch --set-upstream my_branch origin/my_branch

Но зачем мне это делать для каждой создаваемой мной ветки? Разве не очевидно, что если я нажму my_branch в origin/my_branch, то я захочу потянуть origin/my_branch в my_branch? Как я могу сделать это поведение по умолчанию?

Ответы [ 20 ]

1392 голосов
/ 22 мая 2011

Ярлык, который не зависит от запоминания синтаксиса для git branch --set-upstream 1 , должен сделать:

git push -u origin my_branch

... при первом нажатии этой ветви,Или, чтобы перейти к текущей ветви к ветви с тем же именем (удобно для псевдонима):

git push -u origin HEAD

Вам нужно только один раз использовать -u, и это устанавливает связь между вашей веткойи тот, что на origin точно так же, как и git branch --set-upstream.

Лично я считаю, что было бы хорошо, если бы была явно настроена эта связь между вашей веткой и одной на удаленном.Жаль только, что правила отличаются для git push и git pull.


1 Это может звучать глупо, но я очень часто забываюуказать текущую ветку, предполагая, что это по умолчанию - это не так, и результаты являются наиболее запутанными:)

Обновление 2012-10-11 : Очевидно, я не единственный человек, которыйлегко ошибиться!Спасибо VonC за указание, что git 1.8.0 представляет более очевидный git branch --set-upstream-to, который можно использовать следующим образом, если вы находитесь на ветке my_branch:

git branch --set-upstream-to origin/my_branch

... или с короткой опцией:

git branch -u origin/my_branch

Это изменение и его обоснование описаны в примечаниях к выпуску для git 1.8.0, кандидат на выпуск 1 :

Было соблазнительно сказать git branch --set-upstream origin/master, но это говорит Git организовать локальную ветку origin/master для интеграции с проверенной веткой, что весьма маловероятно для того, что имел в виду пользователь.Опция устарела;используйте вместо этого новый --set-upstream-to (с коротким и сладким -u).

1169 голосов
/ 08 апреля 2014

Вы можете сделать это с меньшим набором текста. Во-первых, измените способ работы вашего пуша:

git config --global push.default current

Это выведет часть origin my_branch, таким образом, вы можете сделать:

git push -u

Который одновременно создаст удаленную ветку с тем же именем и отследит ее.

81 голосов
/ 18 марта 2012

Вы можете просто

git checkout -b my-branch origin/whatever

в первую очередь.Если вы установите branch.autosetupmerge или branch.autosetuprebase (мой любимый) на always (по умолчанию true), my-branch будет автоматически отслеживать origin/whatever.

См. git help config.

72 голосов
/ 17 марта 2015

Вы можете упростить upstream двумя способами. Сначала при создании ветки:

git branch -u origin/my-branch

или после создания ветки вы можете использовать эту команду.

git push -u origin my-branch

Вы также можете разветвляться, проверять и устанавливать upstream с помощью одной команды:

git checkout -b my-branch -t origin/my-branch

Лично я предпочитаю делать это в два этапа:

git checkout -b my-branch
git push -u origin my-branch
55 голосов
/ 15 ноября 2017

Это мое самое распространенное использование для The Fuck .

$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

$ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

Кроме того, забавно набирать ругательства на вашем терминале.

41 голосов
/ 28 апреля 2015

Вы можете использовать:

git config --global branch.autosetupmerge всегда

, которая будет связывать ветку upstream каждый раз, когда вы создаете или извлекаете новую ветку.

См. https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/

Это также работает с autosetuprebase, если вы следуете более ориентированному на перебазирование рабочему процессу, но не используете его, если не знаете, что делаете, поскольку по умолчанию ваше поведение по умолчанию вытягивается, что может привести к странным результатам.

35 голосов
/ 15 сентября 2016

Кстати, ярлык для перетаскивания текущей ветки на пульт с таким же именем:

$ git push -u origin HEAD
12 голосов
/ 30 июня 2015
git branch --set-upstream-to=origin/master<branch_name>
10 голосов
/ 12 июля 2018

Я лично использую следующие псевдонимы в bash

в файле ~ / .gitconfig

[alias]
    pushup = "!git push --set-upstream origin $(git symbolic-ref --short HEAD)"

и в файле ~ / .basehrc или ~ / .zshrc

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"
9 голосов
/ 08 декабря 2013

Для чего стоит, если вы пытаетесь отследить ветку, которая уже существует на удаленном компьютере (например, origin / somebranch), но еще не проверила ее локально, вы можете сделать:

$ git checkout --track origin/somebranch

Примечание: «-t» - сокращенная версия опции «--track».

Это создает ту же ассоциацию сразу же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...