Задля співпраці з будь-яким проектом Git, вам необхідно знати, як керувати віддаленими сховищами.
Віддалені сховища — це версії вашого проекту, що розташовані в Інтернеті, або десь у мережі.
Їх може бути декілька, кожне зазвичай або тільки для читання, або для читання та змін.
Співпраця з іншими вимагає керування цими віддаленими сховищами, надсилання (pushing
) та отримання (pulling
) даних до та з них, коли ви хочете зробити внесок.
Керування віддаленими сховищами потребує знань про додавання віддалених сховищ, видалення сховищ, що більше не потрібні, керування різноманітними віддаленими гілками та визначення слідкування за ними, і багато іншого.
У цій секції, ми пройдемо ці вміння керування віддаленими сховищами.
Note
|
Віддалені сховища можуть розташовуватися на вашій локальній машині.
Цілком можливо, що ви працюватимете з |
Щоб побачити, які віддалені сервера ви налаштували, ви можете виконати команду git remote
.
Вона виводить список коротких імен кожного віддаленого сховища, яке ви задали.
Якщо ви отримали своє сховище клонуванням, ви маєте побачити хоча б origin
— таке ім’я Git дає серверу, з якого ви зробили клон:
$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin
Ви також можете дати опцію -v
, яка покаже вам посилання, які Git зберігає та використовує при читанні та записі до цього сховища:
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
Якщо у вас більш ніж одне віддалене сховище, ця команда описує їх усі. Наприклад, сховище з декількома віддаленими сховищами для роботи з багатьма співробітниками може виглядати так.
$ cd grit
$ git remote -v
bakkdoor https://github.com/bakkdoor/grit (fetch)
bakkdoor https://github.com/bakkdoor/grit (push)
cho45 https://github.com/cho45/grit (fetch)
cho45 https://github.com/cho45/grit (push)
defunkt https://github.com/defunkt/grit (fetch)
defunkt https://github.com/defunkt/grit (push)
koke git://github.com/koke/grit.git (fetch)
koke git://github.com/koke/grit.git (push)
origin [email protected]:mojombo/grit.git (fetch)
origin [email protected]:mojombo/grit.git (push)
Це означає, що ми можемо отримувати (pull
) внески з будь-якого з цих користувачів доволі легко.
Ми також можемо мати дозвіл на надсилання змін до якихось з них, хоч ми й не можемо цього тут визначити.
Завважте, що ці сховища використовують різноманітні протоколи. Ми більше про це поговоримо в ch04-git-on-the-server.asc.
Ми згадували і навіть продемонстрували, як команда git clone
неявно додає віддалене сховище origin
.
Тут розкажемо як додати нове віддалене сховище явно.
Щоб додати нове віддалене Git сховище під заданим ім’ям, на яке ви можете легко посилатись, виконайте git remote add <ім’я> <посилання>
:
$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
pb https://github.com/paulboone/ticgit (fetch)
pb https://github.com/paulboone/ticgit (push)
Тепер ви можете використати рядок pb
в командному рядку замість повного посилання.
Наприклад, якщо ви хочете отримати (fetch
) усю інформацію, яке є в Пола, проте її нема у вашому сховищі, ви можете виконати git fetch pb
:
$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
* [new branch] master -> pb/master
* [new branch] ticgit -> pb/ticgit
Гілка master
Пола тепер доступна локально як pb/master
— ви можете злити її з однією з ваших гілок, або зробити з неї локальну гілку, якщо хочете оглянути її.
(Ми розповімо що таке гілки та як ними користуватися набагато докладніше в ch03-git-branching.asc.)
Як ви щойно побачили, щоб отримати дані з ваших віддалених проектів, ви можете виконати:
$ git fetch <remote>
Ця команда заходить на віддалений проект та забирає звідти усі дані, котрих у вас досі нема. Після цього, у вас будуть посилання на всі гілки з того сховища, які ви можете зливати або оглядати в будь-який час.
Якщо ви зробили клон сховища, команда автоматично додає це віддалене сховище під ім’ям `origin''.
Отже, `git fetch origin
отримує будь-яку нову працю, що її виклали на той сервер після того, як ви зробили його клон (або востаннє отримували зміни з нього).
Важливо зауважити, що команда git fetch
лише завантажує дані до вашого локального сховища — вона автоматично не зливає їх з вашою роботою, та не змінює вашу поточну працю.
Вам буде потрібно вручну її злити, коли ви будете готові.
Якщо ваша поточна гілка налаштована слідкувати за віддаленою гілкою (докладніше в наступній секції та ch03-git-branching.asc), ви можете виконати команду git pull
щоб автоматично отримати зміни та злити віддалену гілку до вашої поточної гілки.
Це може бути легшим та зручнішим методом для вас. Та команда git clone
автоматично налаштовує вашу локальну гілку master слідкувати за віддаленою гілкою master (хоча вона може називатись і по іншому) на віддаленому сервері, з якого ви зробили клон.
Виконання git pull
зазвичай дістає дані з серверу, з якого ви зробили клон, та намагається злити її з кодом, над яким ви зараз працюєте.
Коли ви довели свій проект до стану, коли хочете ним поділитись, вам треба надіслати (push
) ваші зміни нагору (upstream
).
Це робиться простою командою: git push <назва сховища> <назва гілки>
.
Якщо ви бажаєте викласти свою гілку master до вашого серверу origin
(клонування зазвичай налаштовує обидва імені для вас автоматично), ви можете виконати наступне для надсилання всіх зроблених комітів до сервера:
$ git push origin master
Ця команда спрацює тільки в разі, якщо ви зробили клон з серверу, до якого у вас є доступ на запис, та ніхто не оновлював його після цього. Якщо хтось інший зробив клон та надіслав щось назад перед вами, вашій спробі буде слушно відмовлено. Вам доведеться спершу отримати їхню працю й вбудувати її до вашої до того, як вам дозволять надіслати свої зміни. Докладніше про надсилання змін до віддалених серверів у ch03-git-branching.asc.
Якщо ви бажаєте більше дізнатись про окреме віддалене сховище, ви можете використати команду git remote show <назва сховища>
.
Якщо ви виконаєте цю команду з окремим ім’ям, наприклад origin
, ви отримаєте щось на кшталт:
$ git remote show origin
* remote origin
Fetch URL: https://github.com/schacon/ticgit
Push URL: https://github.com/schacon/ticgit
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
Вона виводить посилання для віддаленого сховища, а також інформацію про слідкування за гілками.
Команда ґречно розповідає вам, що якщо ви на гілці master та виконаєте команду git pull
, вона автоматично зіллє гілку master з віддаленою після того, як отримає всі дані з віддаленого сховища.
Також видано список усіх віддалених посилань, які були забрані.
Ви напевно зустрінете такий простий приклад.
Втім, коли ви почнете працювати з Git інтенсивніше, ви можете побачити набагато більше інформації від git remote show
:
$ git remote show origin
* remote origin
URL: https://github.com/my-org/complex-project
Fetch URL: https://github.com/my-org/complex-project
Push URL: https://github.com/my-org/complex-project
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
markdown-strip tracked
issue-43 new (next fetch will store in remotes/origin)
issue-45 new (next fetch will store in remotes/origin)
refs/remotes/origin/issue-11 stale (use 'git remote prune' to remove)
Local branches configured for 'git pull':
dev-branch merges with remote dev-branch
master merges with remote master
Local refs configured for 'git push':
dev-branch pushes to dev-branch (up to date)
markdown-strip pushes to markdown-strip (up to date)
master pushes to master (up to date)
Ця команда показує, до яких гілок автоматично надсилаються ваші зміни, коли ви виконуєте git push
, доки перебуваєте на певної гілці.
Вона також показує, яких віддалених гілок з серверу у вас нема, які віддалені гілки, що у вас є, були видалені з серверу, і декілька локальних гілок, що можуть автоматично зливатися з віддаленими гілками, за якими стежать, коли ви виконуєте git pull
.
Ви можете виконати git remote rename
, щоб перейменувати віддалене сховище.
Наприклад, щоб перейменувати pb
на paul
, ви можете зробити це за допомогою git remote rename
:
$ git remote rename pb paul
$ git remote
origin
paul
Варто зазначити, що це змінює і всі назви ваших віддалених гілок.
Що раніше мало назву pb/master
, тепер називається paul/master
.
Якщо ви з якоїсь причини бажаєте видалити віддалене сховище — ви перемістили сервер або більше не використовуєте якесь дзеркало, або можливо хтось припинив співпрацю — ви можете використати git remote remove
або git remote rm
:
$ git remote remove paul
$ git remote
origin
Once you delete the reference to a remote this way, all remote-tracking branches and configuration settings associated with that remote are also deleted.