Почему мне все время нужно делать "--set-upstream"?

Я создаю новую ветку в 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? Как я могу сделать это поведение по умолчанию?

18 ответов


ярлык, который не зависит от запоминания синтаксиса для 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, release candidate 1:

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


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

git config --global push.default current

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

git push -u

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


можно просто

git checkout -b my-branch origin/whatever

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

посмотреть git help config.


вы можете установить вверх по течению проще двумя способами. Сначала при создании филиала:

git branch -u origin/my-branch

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

git push -u origin/my-branch

вы также можете ветвиться, проверить и установить вверх по течению в одной команде:

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

мое личное предпочтение-сделать это в двухэтапной команде:

git checkout -b my-branch
git push -u origin/my-branch

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

git config --глобальная ветвь.autosetupmerge всегда

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

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

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


Это мое самое общее использование для Черт.

$ 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.
...

кроме того, это весело, чтобы ввести ругательства в вашем терминале.


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

$ git push -u origin HEAD

git branch --set-upstream-to=origin/master<branch_name>

вы также можете явно сказать git pull, какую удаленную ветку тянуть (как указано в сообщении об ошибке):

git pull <remote-name> <remote-branch>

будьте осторожны с этим, однако: если вы находитесь на другой ветви и сделать явный тянуть, refspec вы тянуть будет объединен в ветви вы находитесь на!


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

$ git checkout --track origin/somebranch

Примечание: '- t 'является сокращенной версией опции' --track'.

Это устанавливает ту же самую ассоциацию сразу же.


Я использую этот псевдоним Git вместо копирования / вставки предложения от Git каждый раз:https://gist.github.com/ekilah/88a880c84a50b73bd306

источник скопирован ниже (добавьте это в свой ):

[alias]
  pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream"

вы можете настроить действительно хороший псевдоним, который может справиться с этим без чрезмерно подробного синтаксиса.

у меня есть следующий псевдоним в ~/.gitconfig:

po = "!git push -u origin \"$(git rev-parse --abbrev-ref HEAD)\""

после совершения на новой ветке, вы можете нажать новую ветку, просто набрав команду:

git po

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

in ~/.файл 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"

для тех, кто ищет псевдоним, который работает с git pull, это то, что я использую:

alias up="git branch | awk '/^\* / { print $2 }' | xargs -I {} git branch --set-upstream-to=origin/{} {}"

теперь, когда вы получаете:

$ git pull
There is no tracking information for the current branch.
...

просто запустите:

$ up
Branch my_branch set up to track remote branch my_branch from origin.
$ git pull

и вы хорошо идти


вы также можете сделать git push -u origin $(current_branch)


потому что git имеет классную способность толкать / тянуть разные ветви в разные репозитории "вверх по течению". Вы даже можете использовать отдельные репозитории для выталкивания и вытягивания одной и той же ветви. Это может создать распределенный многоуровневый поток, я вижу, что это полезно для проекта, такого как ядро Linux. Git был первоначально построен для использования в этом проекте.

как следствие, он не делает предположения о том, какое РЕПО ваша ветвь должна отслеживать.

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

Git, как правило, довольно низкий уровень, и это может быть неприятно. Тем не менее, есть GUIs, и должно быть легко писать вспомогательные скрипты, если вы все еще хотите использовать его из оболочки.


Я вроде как заново открыл legit из-за этой проблемы (только OS X). Теперь все, что я использую при ветвлении, - это эти две команды:

legit publish [<branch>] Публикует указанную ветвь на удаленном компьютере. (псевдоним: pub)

legit unpublish <branch> Удаляет указанную ветвь с пульта ДУ. (псевдоним: unp)

SublimeGit входит legit поддержка по умолчанию, что делает всю процедуру ветвления так же легко, как нажатие Ctrl-b.


мы используем phabricator и не нажимаем с помощью git. Мне пришлось создать псевдоним bash, который работает на Linux / mac

vim ~/.bash_aliases

new_branch() {
    git checkout -b ""
    git branch --set-upstream-to=origin/master ""
}

сохранить

source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull