Що саме робить "u"? "Master git push -u origin" vs "master git push origin"


334

Мені, мабуть, страшно користуватися git, незважаючи на мої найкращі спроби зрозуміти це.

З kernel.org для git push:

--set-upstream

Для кожної гілки, яка є оновленою або успішно висунутою, додайте посилання на течії (відстеження), використовувану без аргументів 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, і повинно відповідати посиланню, яке отримується з віддаленого даного "branch.<name>.remote". Інформація про злиття використовується git pull (яка спочатку викликає git fetch) для пошуку гілки за замовчуванням для злиття. Без цієї опції, git pull за замовчуванням для об'єднання першого рефлексу отриманого. Вкажіть кілька значень, щоб отримати злиття восьминога. Якщо ви хочете налаштувати 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?


44
I'm apparently terrible at using git, despite my best attempts to understand it.- Ніколи не було, щоб хтось так добре відтворював мене.
КГВР

Відповіді:


335

Ключ - "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після цього).

4
git push <remote> <branch>робить речі однозначними . Якщо ви вимкнете пульт дистанційного чи гілки, git повернеться до налаштувань конфігурації гілки, які встановлені для вас git push -u.
дальбик

2
@dahlbyk Я пішов уперед і позначив вас як відповідь, але цей коментар мене дещо бентежить. У своїй відповіді, ви показали , що мерзотник був збентежений після git push origin test(який не має -u). Потім ви показали, що git push -u origin test знімає неоднозначність. Чи є друкарська помилка чи я просто знову щільна?
Закриття Cowboy

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; хоча це може бути те, що ви хочете. :)


1
BTW master- лише приклад :)
сабгентон

Добре другий біт тепер амортизується в нових версіях для: git branch master -u origin/masterподробиці @ 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
Білл Хоґ

- setset upstream є застарілим, тепер він працює:git branch --set-upstream-to=origin/master master
Alberto Perez

43

Простіше кажучи:

Технічно -uпрапор додає посилання відстеження на верхній сервер, на який ви натискаєте.

Тут важливо те, що це дозволяє робити git pullбез подачі аргументів. Наприклад, як тільки ви зробите це git push -u origin master, ви зможете пізніше зателефонувати git pullі git дізнається, що ви насправді мали на увазі git pull origin master.

В іншому випадку вам доведеться набрати всю команду.


1
Тож якщо я встановлю -uпрапор, то orgin masterкожне наступне тягнення буде посилатися на нього. І якщо я хочу змінити git pullповедінку, я повинен бігти, git push -u origin some_other_branchі git pullтепер я посилаюся на це some_other_branch? Дякую!
Тома Томов

1
Чи можемо ми також використовувати "git push" замість "master git push origin"?
cegprakash

Так, ви можете @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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.