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