Почему я должен все время делать "-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? Как я могу сделать это поведение по умолчанию?
701   18  

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 для интеграции с текущей проверенной ветвью, что весьма маловероятно, что пользователь имел в виду. Вариант не рекомендуется; вместо этого используйте новый параметр --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.

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

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>

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

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

$ git checkout --track origin/somebranch

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

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

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

Источник скопирован ниже (добавьте это в свой файл ~/.gitconfig):

[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

В ~/.файл 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, как правило, довольно низкоуровневый, и это может расстраивать. Тем не менее, есть GUI, и это должно быть легко написать вспомогательные скрипты, если вы все еще хотите использовать его из оболочки.

Я вроде как заново открыл 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 "$1"
    git branch --set-upstream-to=origin/master "$1"
}

Сохранить

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

Comments

    Ничего не найдено.