-
1. Вступ
- 1.1 Про систему контролю версій
- 1.2 Коротка історія Git
- 1.3 Основи Git
- 1.4 Git, зазвичай, тільки додає дані
- 1.5 Три стани
- 1.6 Командний рядок
- 1.7 Інсталяція Git
- 1.8 Початкове налаштування Git
- 1.9 Отримання допомоги
- 1.10 Підсумок
-
2. Основи Git
- 2.1 Створення Git-репозиторія
- 2.2 Запис змін до репозиторія
- 2.3 Перегляд історії комітів
- 2.4 Скасування речей
- 2.5 Взаємодія з віддаленими сховищами
- 2.6 Теґування
- 2.7 Псевдоніми Git
- 2.8 Підсумок
-
3. Галуження в git
- 3.1 Гілки у кількох словах
- 3.2 Основи галуження та зливання
- 3.3 Управління гілками
- 3.4 Процеси роботи з гілками
- 3.5 Віддалені гілки
- 3.6 Перебазовування
- 3.7 Підсумок
-
4. Git на сервері
- 4.1 Протоколи
- 4.2 Отримання Git на сервері
- 4.3 Генерація вашого публічного ключа SSH
- 4.4 Налаштування Серверу
- 4.5 Демон Git
- 4.6 Розумний HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Варіанти стороннього хостингу
- 4.10 Підсумок
-
5. Розподілений Git
-
6. GitHub
-
7. Інструменти Git
- 7.1 Вибір ревізій
- 7.2 Інтерактивне індексування
- 7.3 Ховання та чищення
- 7.4 Підписання праці
- 7.5 Пошук
- 7.6 Переписування історії
- 7.7 Усвідомлення скидання (reset)
- 7.8 Складне злиття
- 7.9 Rerere
- 7.10 Зневадження з Git
- 7.11 Підмодулі
- 7.12 Пакування
- 7.13 Заміна
- 7.14 Збереження посвідчення (credential)
- 7.15 Підсумок
-
8. Налаштування Git
-
9. Git and Other Systems
- 9.1 Git як клієнт
- 9.2 Міграція на Git
- 9.3 Підсумок
-
10. Git зсередини
- 10.1 Кухонні та парадні команди
- 10.2 Об’єкти Git
- 10.3 Посилання Git
- 10.4 Файли пакунки
- 10.5 Специфікація посилань (refspec)
- 10.6 Протоколи передачі
- 10.7 Супроводження та відновлення даних
- 10.8 Змінні середовища
- 10.9 Підсумок
-
A1. Додаток A: Git в інших середовищах
- A1.1 Графічні інтерфейси
- A1.2 Git у Visual Studio
- A1.3 Git в Eclipse
- A1.4 Git у Bash
- A1.5 Git у Zsh
- A1.6 Git у Powershell
- A1.7 Підсумок
-
A2. Додаток B: Вбудовування Git у ваші застосунки
- A2.1 Git з командного рядка
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
-
A3. Додаток C: Команди Git
- A3.1 Налаштування та конфігурація
- A3.2 Отримання та створення проектів
- A3.3 Базове збереження відбитків
- A3.4 Галуження та зливання
- A3.5 Поширення й оновлення проектів
- A3.6 Огляд та порівняння
- A3.7 Зневаджування
- A3.8 Латання (patching)
- A3.9 Електронна пошта
- A3.10 Зовнішні системи
- A3.11 Адміністрування
- A3.12 Кухонні команди
3.1 Галуження в git - Гілки у кількох словах
Майже кожна система контролю версій підтримує гілки (branches) в певній мірі. Галуження - це відмежування від основної лінії розробки для продовження своєї частини роботи та уникнення конфліктів з основною лінією. В багатьох системах контролю версій цей процес "дорогий", часом вимагає створювати копію коду, що може зайняти багато часу для великих проектів.
Дехто вважає гілки Git вбивчою особливістю, що вирізняє Git від інших систем. Що ж в них такого особливого? Гілки Git надзвичайно легкі, операції галуження майже миттєві, перехід між гілками зазвичай теж. На відміну від інших систем, Git заохочує схеми, де гілки часто створюються та зливаються, навіть кілька разів на день. Розуміння та вміння працювати з цією "фішкою" дає вам потужний та унікальний інструмент, що може кардинально змінити ваш процес розробки.
Гілки у кількох словах
Щоб дійсно зрозуміти як Git працює з гілками, нам треба повернутись назад та розібратись, як Git зберігає дані.
Як ви можете пам’ятати з Вступ, Git зберігає дані не як послідовність змін, а як послідовність знімків.
Коли ви фіксуєте зміни, Git зберігає об’єкт фіксації, що містить вказівник на знімок змісту, який ви додали. Цей об’єкт також містить ім’я та поштову адресу автора, набране вами повідомлення та вказівники на фіксацію або фіксації, що були прямо до цієї фіксації (батько чи батьки): нуль для першої фіксації, одна фіксація для нормальної фіксації, та декілька фіксацій для фіксацій, що вони є результатом злиття двох чи більше гілок.
Щоб це уявити, припустимо, що у вас є тека з трьома файлами, які ви додали та зафіксували. Додання файлів обчислює контрольну суму для кожного (SHA-1 хеш про котрий ми згадували в Вступ), зберігає версію файлу в сховищі Git (Git називає їх блобами), та додає їх контрольні суми до області додавання:
$ git add README test.rb LICENSE
$ git commit -m 'The initial commit of my project'
Коли ви створили фіксацію за допомогою git commit
, Git обчислив контрольну суму кожної теки (у цьому випадку, тільки кореневої теки) та зберігає ці об’єкти дерева в сховищі Git.
Потім Git створює об’єкт фіксації, що зберігає метадані та вказівник на корінь дерева проекту, щоб він міг відтворити цей знімок, коли потрібно.
Ваше Git сховище тепер зберігає п’ять об’єктів: по одному блобу зі змістом на кожен з трьох файлів, одне дерево, що перелічує зміст теки та вказує, які файли зберігаються у яких блобах, та одну фіксацію, що вказує на корінь дерева, та зберігає метадані фіксації.
Якщо ви зробите якісь зміни та зафіксуєте знову, наступна фіксація буде зберігати вказівник на попередню.
Гілка в Git це просто легкий вказівник, що може пересуватись, на одну з цих фіксацій.
Загальноприйнятим ім’ям першої гілки в Git є master
.
Коли ви почнете робити фіксації, вам надається гілка master
, що вказує на останню зроблену фіксацію.
Щоразу ви фіксуєте, вона переміщується вперед автоматично.
Зауваження
|
Гілка “master” у Git не має нічого особливого.
Вона нічим не відрізняється від інших.
Єдина причина, чому майже кожне сховище має таку гілку — команда |
Створення нової гілки
Що відбувається, якщо ви створюєте нову гілку?
Ну, це створює новий вказівник, щоб ви могли пересуватися.
Припустімо, ви створюєте нову гілку під назвою testing.
Ви це робите за допомогою команди git branch
:
$ git branch testing
Це створює новий вказівник на фіксацію, в якій ви зараз знаходитесь.
Звідки Git знає, на якій гілці ви зараз знаходитесь?
Він зберігає особливий вказівник під назвою HEAD
.
Завважте, що це геть інша концепція HEAD
, ніж в інших СКВ, з якими ви могли працювати, таких як Subversion чи CVS.
У Git це просто вказівник на локальну гілку, на якій ви знаходитесь.
В даному випадку, ви досі на гілці master
.
Команда git branch
тільки створює нову гілку — вона не переключає на цю гілку.
Ви легко можете це побачити за допомогою простої опції команди git log
, що може показати куди вказують вказівники гілок.
Ця опція називається --decorate
.
$ git log --oneline --decorate
f30ab (HEAD -> master, testing) add feature #32 - ability to add new formats to the central interface
34ac2 Fixed bug #1328 - stack overflow under certain conditions
98ca9 The initial commit of my project
Як бачите, гілки “master” та “testing” прямо поруч з фіксацією f30ab
.
Переключення гілок
Щоб переключитися на існуючу гілку, треба виконати команду git checkout
.
Переключімося на нову гілку testing
:
$ git checkout testing
Це пересуває HEAD
, щоб він вказував на гілку testing
.
Чому це важливо? Ну, давайте зробимо ще одну фіксацію:
$ vim test.rb
$ git commit -a -m 'Зробив зміни'
Це цікаво, бо тепер ваша гілка testing
пересунулась уперед, а ваша гілка master
досі вказує на фіксацію, що й у момент виконання git checkout
для переключення гілок.
Переключімося назад до гілки master
:
$ git checkout master
Ця команда зробила дві речі.
Вона пересунула вказівник HEAD назад на гілку master
, та повернула файли у вашій робочій теці до стану знімку, на який вказує master
.
Це також означає, що якщо ви зараз зробите нові зміни, вони будуть походити від ранішої версії проекту.
Вона, суттєво, перемотує працю, що ви зробили у гілці testing
, щоб ви могли працювати в іншому напрямку.
Зауваження
|
Переключення між гілками змінює файли у вашій робочій теці
Важливо зауважити, що коли ви переключаєте гілки в Git, файли у вашій робочій теці змінюються. Якщо ви переключаєтесь до старшої гілки, ваша робоча тека буде повернута до того стаку, який був на момент останнього фіксування у тій гілці. Якщо Git не може зробити це без проблем, він не дасть вам переключитися взагалі. |
Зробимо декілька змін та знову зафіксуємо:
$ vim test.rb
$ git commit -a -m 'Зробив інші зміни'
Тепер історія вашого проекту розбіглася (diverged
) (дивіться Історія, що розбіглася).
Ви створили гілку, дещо в ній зробили, переключились на головну гілку та зробили там щось інше.
Обидві зміни ізольовані в окремих гілках. Ви можете переключатись між цими гілками та злити їх, коли вони будуть готові.
І все це ви зробили за допомогою простих команд branch
, checkout
та commit
.
Ви також можете легко це побачити за допомогою команди git log
.
Якщо ви виконаєте git log --oneline --decorate --graph --all
, вона надрукує історію ваших фіксацій, покаже куди вказують ваші гілки та як розбіглася ваша історія.
$ git log --oneline --decorate --graph --all
* c2b9e (HEAD, master) Зробив інші зміни
| * 87ab2 (testing) Зробив зміни
|/
* f30ab add feature #32 - ability to add new formats to the
* 34ac2 fixed bug #1328 - stack overflow under certain conditions
* 98ca9 initial commit of my project
Оскільки гілка в Git — це насправді простий файл, що містить 50 символів контрольної суми SHA-1 коміту, на який вказує, гілки дешево створювати та знищувати. Створити гілку так же швидко, як записати 41 байт до файлу (40 символів та символ нового рядка).
Це вражаюча відмінність від того, як більшість інших СВК працюють з гілками — зазвичай це потребує копіювання усіх файлів проекту в другу теку. Це може зайняти декілька секунда, або навіть хвилин, в залежності від розміру проекту, у той час як у Git процес завжди миттєвий. Також, оскільки ми записуємо батьків кожної фіксації, пошук відповідної бази для злиття може бути зроблено автоматично та зазвичай дуже просто. Ці можливості допомагають заохотити розробників створювати та використовувати гілки часто.
Подивимось, чому і вам варто так робити.