Почему мне все время нужно делать `--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>