Что именно делает «у»? «Git push -u мастер оригинала» против «git push оригинал мастера»

335

Я очевидно ужасен в использовании git, несмотря на все мои попытки понять это.

С kernel.org для git push:

-u

--set-вверх по течению

Для каждой ветки, которая обновлена ​​или успешно отправлена, добавьте ссылку вверх по течению (отслеживание), используемую git-pull (1) без аргументов и другими командами. Для получения дополнительной информации см. branch.<name>.mergeВ git-config (1).

Вот branch.<name>.mergeиз git config:

branch.<name>.merge

Определяет вместе с branch.<name>.remoteвосходящей ветвью для данной ветки. Он сообщает git fetch / git pull, какую ветку объединять, а также может влиять на git push (см. Push.default). Когда он находится в ветке <name>, он сообщает git fetch о том, что refspec по умолчанию помечен для объединения в FETCH_HEAD. Значение обрабатывается так же, как удаленная часть refspec, и должно совпадать с ref, который выбирается из remote, заданного параметром "branch.<name>.remote". Информация о слиянии используется git pull (который сначала вызывает git fetch) для поиска ветки по умолчанию для слияния. Без этой опции, git pull по умолчанию объединяет первую выборку refspec. Укажите несколько значений, чтобы получить слияние осьминога. Если вы хотите настроить git pull так, чтобы он сливался <name>с другой веткой в ​​локальном репозитории, вы можете указатьbranch.<name>.mergeв нужную ветку, и используйте специальные настройки. (период) для branch.<name>.remote.

Я успешно настроил удаленный репозиторий с помощью github и успешно отправил свой первый коммит в него:

git push -u origin master

Затем я невольно успешно отправил свой второй коммит в мой удаленный репозиторий, используя:

git commit -m '[...]'

Однако, неправильно думать , что я должен был бы снова нажать на originот master, я побежал:

# note: no -u
git push origin master

Что это сделало? Похоже, это никак не повлияло. Я "отменить" git push -u origin master?

ClosureCowboy
источник
45
I'm apparently terrible at using git, despite my best attempts to understand it.- У меня никогда не было, чтобы кто-то так хорошо меня восстанавливал
КГВР

Ответы:

336

Ключ "без аргументов git-pull". Когда вы делаете git pullиз ветки, не указывая исходный удаленный или ветвь, git смотрит на branch.<name>.mergeнастройку, чтобы знать, откуда взять. git push -uустанавливает эту информацию для ветви, которую вы нажимаете.

Чтобы увидеть разницу, давайте используем новую пустую ветку:

$ git checkout -b test

Сначала мы нажимаем без -u:

$ git push origin test
$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.test.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 "test"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Теперь, если мы добавим -u:

$ git push -u origin test
Branch test set up to track remote branch test from origin.
Everything up-to-date
$ git pull
Already up-to-date.

Обратите внимание, что информация об отслеживании была настроена таким образом, чтобы она git pullработала, как ожидается, без указания удаленного или филиала.

Обновление: Бонусные советы:

  • Как упоминает Марк в комментарии, в дополнение к git pullэтому параметру также влияет поведение по умолчанию git push. Если вы привыкли использовать -uдля захвата удаленную ветку, которую вы собираетесь отслеживать, я рекомендую установить значение вашей push.defaultконфигурации в upstream.
  • git push -u <remote> HEADпереместит текущую ветку в ветку с тем же именем <remote>(и также настроит отслеживание, чтобы вы могли сделать это git pushпосле этого).
dahlbyk
источник
4
git push <remote> <branch>делает вещи однозначными . Если вы отключите удаленное управление или ветку git, то вернетесь к настройкам конфигурации филиала, которые установлены для вас git push -u.
dahlbyk
2
@dahlbyk Я пошел дальше и отметил тебя как ответ, но этот комментарий несколько смущает меня. В своем ответе вы продемонстрировали, что git был сбит с толку git push origin test(чего нет -u). Вы тогда показали, что git push -u origin test устраняет двусмысленность. Есть ли опечатка, или я просто снова был плотным?
ClosureCowboy
1
Я думаю, что мы говорим мимо друг друга. :) Когда я говорю, git push <remote> <branch>это однозначно, я имею в виду то, что относительно git pushкоторого зависит от конфигурации филиала. Точно так же git pull <remote> <branch>однозначно и git pullполагается на конфигурацию ветви. Как только вы нажмете -u, оба git pushи git pullбудут работать, как ожидалось.
dahlbyk
10
@dahlbyk: Ваш ответ в порядке, но в приведенных выше комментариях вы повторяете распространенное заблуждение о том, что git push- если вы не настроите push.defaultсебя, git pushиспользуйте только конфигурацию восходящей ветви, чтобы решить, какую удаленную ветвь отправить , а не удаленную ветвь для обновления.
Марк Лонгэйр
1
Лучшая практика для git - git push origin masterэто то же самое для другой стороны IE. git pull origin master.. Так что если предположить изменение ветки, то вы можете git push origin branch_nameи то же на другую сторону IE. git pull origin branch_name
Арпит Вайшнав
87
git push -u origin master

… такой же как:

git push origin master ; git branch --set-upstream master origin/master

Сделай последнее утверждение, если забудешь -u!

Или вы могли бы заставить это:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Если вы позволите команде сделать это за вас, она выберет ваши ошибки, например, если вы набрали несуществующую ветку или нет git remote add; хотя это может быть то, что вы хотите. :)

sabgenton
источник
1
Кстати master, просто пример :)
Сабентон
Хорошо, второй бит теперь устарел в новых версиях для: git branch master -u origin/masterdetails @ stackoverflow.com/a/2286030/790359
sabgenton
2
Если вы забудете использовать эту -uопцию, введите git push -uсразу все будет в порядке.
zeekvfu
1
Более новые версии git указывают на то, что --setup-upstreamони будут устаревшими: The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
Билл Хоаг
--set-upstream устарел, теперь он работает:git branch --set-upstream-to=origin/master master
Alberto Perez
43

Проще говоря:

Технически -uфлаг добавляет ссылку отслеживания на вышестоящий сервер, на который вы нажимаете.

Здесь важно то, что это позволяет вам делать это git pullбез предоставления дополнительных аргументов. Например, когда вы делаете git push -u origin master, вы можете позже позвонить git pullи мерзавец будет знать , что вы на самом деле имел в виду git pull origin master.

В противном случае вам нужно будет ввести всю команду.

Adépòjù Olúwáségun
источник
1
Поэтому, если я установлю -uфлаг на orgin masterкаждое следующее нажатие, я буду ссылаться на него. И если я хочу изменить git pullповедение, которое я должен запустить git push -u origin some_other_branchи git pullтеперь будет ссылаться some_other_branch? Спасибо!
Тома Томов
1
мы можем также использовать «git push» вместо «git push origin master»?
Цегпракаш
Да, вы можете @cegprakash. Тем не менее, вы бы сначала сделалиgit push -u origin master
Adépòjù Olúwáségun
-11

Все необходимые команды git bash для загрузки и загрузки в Github:

git status 
git pull
git add filefullpath

git commit -m "comments for checkin file" 
git push origin branch/master
git remote -v 
git log -2 

Если вы хотите отредактировать файл, то:

edit filename.* 

Чтобы увидеть все ветви и их коммиты:

git show-branch
Камта Мишра
источник
4
Я думаю, что вы ответили за рамками вопроса.
Adépòjù Olúwáségun