Почему я должен все время делать "-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-upstream1 это сделать: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 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 имеет классную способность толкать / тянуть разные ветви в разные" восходящие " репозитории. Вы даже можете использовать отдельные репозитории для выталкивания и вытягивания одной и той же ветви. Это может создать распределенный, многоуровневый поток, я вижу, что это полезно для таких проектов, как ядро 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