Що таке "git remote add ..." та "master git push origin"?


288

Досить часто Git and Rails виглядає як магія ... як, наприклад, у першій главі підручника Rails 3 , мова йде про Git:

git remote add origin git@github.com:peter/first_app.git
git push origin master

і це майже говорить "це просто працює", не надто багато про те, що вони є, і почати говорити про розгалуження. Пошук у мережі показує, що git remote addпотрібно додати "коротке ім'я", наприклад origin, і це може бути будь-яке ім'я, що є псевдонімом URL-адреси. І originце звичайний шлях, куди вказує віддалений репо. (у http://git-scm.com/book/en/Git-Basics-Working-with-Remotes у розділі "Додавання віддалених сховищ")

То чому URL-адреса не git://git@github.com/peter/first_app.gitв іншому синтаксисі - який це синтаксис? Чому він повинен закінчуватися .git? Я намагався не використовувати .gitв кінці, і це також працює. Якщо ні .git, то що ще може бути? gitВ , git@github.comздається облікового запису користувача на сервері мерзотника?

Крім того, для чого потрібно так багатослівно використовувати git push origin master? Не можна за замовчуванням бути початком та головним? Я виявив, що перший раз origin masterце потрібно, але після невеликого редагування та фіксації, то git pushвсе, що йому потрібно (немає потреби origin master). Чи може хтось, хто знає, що відбувається, дати деякі деталі?

Іноді це відчуває багато магії без пояснень ... а іноді людина, яка її використовує, настільки впевнена, і коли її запитують, чому не може пояснити, і відповісти чимось на кшталт "так воно і є". Іноді дуже практичні та прагматичні. Непогано бути практичним, але, мабуть, не практичним, щоб не знати, що відбувається.

Відповіді:


344

gitце як UNIX. Користувач зручний, але прискіпливий до своїх друзів. Він настільки ж потужний і такий же зручний, як і конвеєр.

Це було сказано, щойно ви зрозумієте його парадигми та концепції, він має таку саму дзенкову чіткість, яку я очікував від інструментів командного рядка UNIX. Слід розглянути час, щоб прочитати один із багатьох хороших навчальних посібників із вмісту в Інтернеті. Книга Pro Git - це гарне місце для початку.

Щоб відповісти на ваше перше запитання.

  1. Що git remote add ...

    Як ви, напевно, знаєте, gitце розподілена система управління версіями. Більшість операцій проводиться локально. Для спілкування із зовнішнім світом gitвикористовують те, що називається remotes. Це сховища, крім того, на локальному диску, в які ви можете pushвнести зміни (щоб інші люди могли їх бачити) або pullз них (щоб ви могли отримати інші зміни). Команда git remote add origin git@github.com:peter/first_app.gitстворює новий пульт, який називається, originрозташований у git@github.com:peter/first_app.git. Як тільки ви це зробите, у своїх push командах ви можете натиснути, originа не вводити всю URL-адресу.

  2. Що git push origin master

    Це команда, яка говорить "натиснути коміти в локальну гілку, названу masterна віддалену назву origin". Як тільки це буде виконано, усі речі, які ви востаннє синхронізували з початком, будуть відправлені у віддалене сховище, і інші люди зможуть їх побачити там.

Тепер про транспорт (тобто що git://) означає. Віддалений URL - сховище може бути багатьох типів ( file://, і https://т.д.). Git просто покладається на механізм аутентифікації, який надає транспорт, щоб дбати про дозволи та інше. Це означає, що для file://URL-адрес це будуть дозволи файлів UNIX тощо. git://Схема вимагає від git використовувати власний внутрішній транспортний протокол, який оптимізовано для надсилання наборів змін git навколо. Що стосується точної URL-адреси, це так, як це відбувається через те, як github налаштував свій gitсервер.

Тепер багатослівність. Команда, яку ви ввели, є загальною. Можна сказати git щось на кшталт "гілка, зателефована masterсюди, - це локальне дзеркало гілки, яка називається fooна віддаленому каналі bar" У git speak це означає, що master відстежує bar/foo . Коли ви вперше клонуєте, ви отримаєте гілку, яку називають masterта віддалену origin(звідки ви клонували), з місцевим майстром, встановленим для відстеження майстра за походженням. Як тільки це буде налаштовано, ви можете просто сказати, git pushі це буде робити. Більш довга команда доступна у випадку, коли вона потрібна (наприклад, вона git pushможе натиснути на офіційне публічне репо і git push review masterможе бути використана для переходу на окремий пульт, який ваша команда використовує для перегляду коду). Ви можете встановити свою філію як гілку відстеження за допомогою--set-upstreamваріант git branchкоманди.

Я відчував, що git (на відміну від більшості інших застосунків, які я використовував) краще розуміти зсередини. Як тільки ви зрозумієте, як зберігаються та підтримуються дані всередині сховища, команди та те, що вони роблять, стають кристально зрозумілими. Я згоден з вами, що серед багатьох gitкористувачів є деякий елітаризм, але я також виявив, що колись із користувачами UNIX, і варто було оратись повз них, щоб вивчити систему. Удачі!


8
Ви можете додати примітку до пункту про транспорти, пояснивши, що git@github.com:peter/first_app.gitце scp-style синтаксис для ssh URL-адрес у git. Ще один момент полягає в тому, що за замовчуванням конфігурація вище за течією masterне впливає на поведінку, git push якщо ви не push.defaultвстановили tracking(або upstreamв пізніших версіях) - я зробив публікацію в блозі про це джерело плутанини: longair.net/blog/2011 /
02/27

1
Невелика поправка до цього коментаря - без push.defaultконфігурації висхідної течії буде використано для пошуку віддаленого за замовчуванням під час використання git push, але це не вплине на відображення посилань.
Марк Лонгейр

1
Цікаво, чому "чорний ящик", як зазвичай, "чорний ящик" дуже легко засвоїти ... це як підхід зверху вниз, зверху - інтерфейс - що ви вводите і що отримуєте, дуже чітко визначений і, сподіваємось, простий також. Потрібно дбати лише про користувач - «Інтерфейс», і насправді не потрібно знати, що знаходиться всередині. Якщо користувач хоче знати більше, особливий спосіб реалізації, це добре знати, але зазвичай це необов’язково.
неополярність

3
Чорний халат проти навпаки. Git - це перше, з чим я стикався, що насправді було легше вчитися зсередини, а не з "інтерфейсу". Будь це правильний шлях чи ні, це дискусійне питання. Я просто кажу, що всередині є більш ефективним, коли мова йде про git.
Нуфал Ібрагім

9
"git - це як UNIX. Зручний для користувачів, але прискіпливий до друзів." Це настільки дивовижно, що я хочу його надрукувати на футболці.
proflux

41

Оновлення: зауважте, що прийнята в даний час відповідь продовжує поширене непорозуміння щодо поведінки git push, яке не було виправлено, незважаючи на коментар, який вказував на це.

Ваше резюме, що таке віддалені файли - як прізвисько для URL-адреси сховища - правильне.

То чому URL не git: //git@github.com/peter/first_app.git, але в іншому синтаксисі - що це за синтаксис? Чому він повинен закінчуватися .git? Я намагався не використовувати .git наприкінці, і він також працює. Якщо ні .git, що ще може бути? Схоже, git у початківця є обліковим записом користувача на сервері git?

Дві вказані вами URL-адреси вказують на те, що слід використовувати два різні транспортні протоколи. Початок з git://- для протоколу git, який зазвичай використовується лише для доступу лише до читання до сховищ. Інший, git@github.com:peter/first_app.git- це один із різних способів визначення доступу до сховища через SSH - це «синтаксис стилю scp», описаний у документації . Це ім'я користувача в синтаксисі стилю scp - gitце через те, що GitHub має справу з ідентифікацією користувачів - фактично це ім'я користувача ігнорується, а користувач ідентифікується на основі пари ключів SSH, яку вони використовували для автентифікації.

Що стосується багатослівності git push origin master, ви помітили, що після першого поштовху ви можете просто робити git push. Це через низку важких для запам'ятовування, але в цілому корисних за замовчуванням :)

  • Якщо не вказано пульт, використовується віддалений, налаштований для поточної гілки ( remote.master.urlу вашому випадку). Якщо це не встановлено, тоді originвикористовується.
  • Якщо не вказано "refspec" (наприклад master, master:my-experimentтощо), тоді git за замовчуванням натискає кожну локальну гілку, яка має те саме ім'я, як гілка на пульті дистанційного керування. Якщо ви просто маєте masterзагальну гілку між вашим сховищем та віддаленою схожою, це буде те саме, що підштовхувати masterдо віддаленого master.

Особисто, оскільки я, як правило, маю багато тематичних галузей (а часто і кілька віддалених), я завжди використовую форму:

git push origin master

... щоб уникнути випадкового натискання інших гілок.


У відповідь на ваші коментарі до однієї з інших відповідей, мені це здається так, ніби ви дуже ефективно дізнаєтесь про git "зверху вниз" - ви виявили, що за замовчуванням працюють, і ваше питання задається питанням, чому;) бути більш серйозним, git canвикористовувати по суті так само просто, як SVN, але трохи знати про віддалені та гілки означає, що ви можете використовувати його набагато гнучкіше, і це дійсно може змінити спосіб роботи на краще. Ваше зауваження щодо семестрового курсу змушує мене думати про те, що Скотт Чакон сказав в інтерв'ю з подкастом - студентів навчають про всі види основних інструментів в галузі інформатики та програмної інженерії, але дуже рідко контролюють версії. Розподілені системи контролю версій, такі як git та Mercurial, тепер настільки важливі та настільки гнучкі, що варто було б викладати на них курси, щоб дати людям хорошу основу.

На мій погляд git, ця крива навчання абсолютно варта того - робота з безліччю тематичних галузей, їх легко злиття та натискання та перетягування між різними сховищами є фантастично корисними, коли ви впевнені в роботі системи. Просто прикро, що:

  • Первинну документацію на git настільки важко проаналізувати для новачків. (Хоча я б заперечував, що якщо ви Google майже щодо будь-якого питання про git, то сьогодні з’являються корисні матеріали підручника (або відповіді щодо переповнення стека :)).)
  • У гїті є кілька дивних способів поведінки, які зараз важко змінити, оскільки багато сценаріїв можуть покладатися на них, але люди заплутані.

Я вважаю, що книга про git - це чудовий ресурс і легко зрозумілий для новачків. Значно згладжує криву навчання. Крім того, я думаю, що спроба "відобразити" SVN та інші централізовані концепції на git зробить дорогу складнішою, а не більш гладкою. Повний скидання - це швидший і простіший спосіб, на мій досвід.
Нуфал Ібрагім

@Noufal Ibrahim: Я погоджуюся з усіма вашими пунктами. Я не намагався запропонувати "відображення" концепцій SVN на git, оскільки знаю жахливу плутанину, яка може викликати - хоча є кращі способи навчання git згори вниз.
Марк Лонгейр

9

Погляньте на синтаксис для додавання віддаленого репо.

git remote add origin <url_of_remote repository>

Приклад:

git remote add origin git@github.com:peter/first_app.git

Розберемо команду:

git remote Це використовується для управління вашими центральними серверами для розміщення ваших сховищ git.

Можливо, ви використовуєте Github для вашого центрального сховища. Я дам вам приклад і пояснити Git віддалених додати походження команди

Припустимо, я працюю з GitHub та BitBucket для центральних серверів для сховищ git і створив сховища на обох веб-сайтах для мого проекту першого додатка .

Тепер, якщо я хочу перенести свої зміни на обидва ці сервери git, мені потрібно буде сказати git, як дістатися до цих центральних сховищ. Тому мені доведеться додати ці,

Для GitHub

git remote add gh_origin https://github.com/user/first-app-git.git

І для BitBucket

git remote add bb_origin https://user@bitbucket.org/user/first-app-git.git

Я використав дві змінні (наскільки мені просто їх називати змінними) gh_origin (gh ДЛЯ GITHUB) та bb_origin (bb для BITBUCKET), щоб пояснити вам, що ми можемо називати походження все, що завгодно.

Тепер після деяких змін мені доведеться надіслати (змінити) всі ці зміни до центральних сховищ, щоб інші користувачі могли бачити ці зміни. Тому я дзвоню

Натискання на GitHub

git push gh_origin master

Натискання на BitBucket

git push bb_origin master

gh_origin має значення https://github.com/user/first-app-git.git, а bb_origin має значення https: //user@bitbucket.org/user/first-app-git.git

Ці дві змінні полегшують моє життя

як і коли мені потрібно надсилати зміни в коді, мені потрібно використовувати ці слова, а не запам'ятовувати або вводити URL для тих же.

Більшість випадків ви не бачите нічого, крім походження, оскільки більшість випадків ви матимете справу лише з одним центральним сховищем, наприклад, Github або BitBucket.


5
  1. .gitВ кінці імені сховища просто умовність. Як правило, на git серверах сховища зберігаються в каталогах з назвою project.git. Клієнт git та протокол шанують цю конвенцію, перевіряючи, project.gitколи projectвказано лише те , що.

  2. git://git@github.com/peter/first_app.gitне є дійсною URL-адресою git. git-сховища можуть бути ідентифіковані та доступні за допомогою різних схем URL-адрес, зазначених тут . git@github.com:peter/first_app.git є sshURL , згадані на цій сторінці.

  3. gitє гнучким. Це дозволяє відслідковувати локальну філію проти майже будь-якої гілки будь-якого сховища. Хоча masterвідстеження origin/master( локальна гілка за замовчуванням) (віддалене відділення за замовчуванням) є популярною ситуацією, воно не є універсальним. Багато разів ви можете не хотіти цього робити. Ось чому перший git pushтак багатослівний. Він повідомляє git, що робити з місцевою masterгілкою, коли ви робите a git pullчи a git push.

  4. За замовчуванням для git pushта git pullпрацює робота з пультом поточної гілки. Це кращий за замовчуванням, ніж майстер походження. Те, як це визначає git push, пояснюється тут .

git є досить елегантним і зрозумілим, але є крива навчання для проходження.


1
Як я коментував іншу відповідь, у конфігурації git за замовчуванням git pushне використовуються конфігураційні змінні, створені git branch/checkout --trackдля визначення того, до якого віддаленого відсилання потрібно натиснути. Ти маєш рацію, що ця функція git pull все ж використовує.
Марк Лонгейр

0

Git remote add origin:

Він централізує ваш вихідний код на інші проекти. Він розроблений на базі Linux, повний відкритий код і зробить ваш код корисним для інших користувачів git.

Натискає ваш код у сховище git, використовуючи віддалений URL-адрес git-концентратора.

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