Зачем мне все время делать `--set-upstream`? - PullRequest
1278 голосов
/ 22 мая 2011

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

Ответы [ 20 ]

9 голосов
/ 20 марта 2012

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

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

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

8 голосов
/ 28 августа 2015

Я использую этот псевдоним 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"
7 голосов
/ 26 апреля 2017

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

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

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

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

git po
3 голосов
/ 29 июня 2019

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

git config --global push.default current

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

git config --local push.default current

Затемsimple

git push

должен работать без необходимости постоянно устанавливать upstream.

3 голосов
/ 02 мая 2018

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

И тебе пора

2 голосов
/ 25 ноября 2016

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

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

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

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

2 голосов
/ 27 октября 2017

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

0 голосов
/ 19 апреля 2019

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

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

Исходное сообщение

0 голосов
/ 26 апреля 2018

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...