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

Ответ 1

Ярлык, который не зависит от запоминания синтаксиса для 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).

Ответ 2

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

git config --global push.default current

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

git push -u

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

Ответ 3

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

git checkout -b my-branch origin/whatever

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

См. git help config.

Ответ 4

Вы можете настроить 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

Ответ 5

Это мое самое распространенное использование для 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.
...

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

Ответ 6

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

git config - global branch.autosetupmerge always

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

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

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

Ответ 7

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

$ git push -u origin HEAD

Ответ 8

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

в файле ~/.gitconfig

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

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

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"

Ответ 9

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

Ответ 10

Если ниже не работает:

git config --global push.default current

Вам также следует обновить локальную конфигурацию вашего проекта, так как возможно ваш проект имеет локальные конфигурации git:

git config --local push.default current

Ответ 11

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

$ git checkout --track origin/somebranch

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

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

Ответ 12

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

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

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

Ответ 13

Я использую этот псевдоним 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"

Ответ 14

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

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

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

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

git po

Ответ 15

Для тех, кто ищет псевдоним, который работает с 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

И тебе хорошо идти

Ответ 16

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

Как следствие, в нем не делается предположений о том, какой репо должен отслеживать ваш филиал.

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

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

Ответ 17

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

Ответ 18

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

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

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

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

Ответ 19

Мы используем фабрикатор и не пытаемся использовать 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

Ответ 20

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

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'

Оригинальный пост

Ответ 21

Это не было сказано конкретно, но близко ко всему вышесказанному. Чтобы установить мой восходящий поток на мой git, я использую:

git push --set-upstream origin <branch_name>