Автор: rizakrko
Коротко про зберігання даних Git’ом
Для чіткого розуміння механізму віток, необхідно зрозуміти, як Git зберігає дані.
Основна відмінність Git’a від будь-якої іншої СКВ - це підхід Git’a до роботи зі своїми даними. Більшість інших систем зберігають інформацію у вигляду списку змін у файлах. Ці системи представляють інформацію у вигляді набору файлів та змін, зроблених в кожному файлі, по часу. В Git’і використовується принципрово інший підхід: кожного разу, коли ви робите комміт,тобто зберігаєте стан свого проекту в Git’i, система запам’ятовує, як виглядає кожен файл в даний момент, і зберігає посилання на цей знамок. Якщо файл не був змінений, то система створює посилання на попередню версію цього файлу.
Коротко про вітки
Git репозиторій представляє собою каталог, який зберігає дерево файлів. Протягом роботи ви змінюєте файли, після чого зберігаєте їх у вигляді одного комміта. Створимо тестовий репозиторій(для цього потрібно налаштувати Git на вашій системі, детальніше).
$cd ~ //перехід в домашню директорію
$mkdir git_branching //створюємо папку, для репозиторію
$cd git_branching //переходимо в папку
$git init //ініціалізуємо пустий репозиторій
На даний момент репозиторій пустий, тому додамо в нього 2 файли.
$touch first_file.txt
$touch second_file.txt
Зробимо зміни в обох файлах,використовуючи будь-який доступний редактор. В даному випадку Vim.
Зафіксуємо зміни в комміт.
$git add first_file.txt second_file.txt
$git commit -m 'initial commit'
[master (корневой коммит) 02231c3] initial
2 files changed, 2 insertions(+)
create mode 100644 first_file.txt
create mode 100644 second_file.txt
На даний момент ваш Git репозиторій зберігає 4 об’єкти: блоб(blob) для вмісту кожного файлу, вміст каталогу у вигляді дерева зі вказівниками на блоби збережених файлів, сам комміт з вказівником на основне дерево, метадані комміту.
Якщо ви зробите зміни в робочій директорії та зафіксуєте їх в комміт, тоді наступний комміт збереже вказівник на комміт, який передував йому.
Вітка в Git - це вказівник на один з коммітів. Ім’я основної вітки за замовчуванням - master
Коли ви робите комміти, то отримуєте основну вітку, яка вказує на ваш останній комміт. Кожен комміт зсуває це вказівник вперед.
Вітка master є звичайною віткою. Вона є практично у кожному репозиторії лишень тому, шо вона автоматично створюється командою git init
, а більшість корисувачів не змінює її назви.
Створення нової вітки
Створюючи нову вітку, всього-навсього створюється новий вказівник для подальшої роботи. Якщо ви, наприклад, хочете створити нову вітку під назвою testing, тоді це можливо зробити за допомогою команди git branch
:
$git branch testing
В результаті створюється новий вказівник на поточний комміт.
Для того, щоб Git міг визначити, яка вітка є поточною, існує спеціальний вказівник HEAD. Слід зауважити, що при створенні нової вітки перемикання вказівника HEAD не відбувається. В цьому можна переконатись, виконавши команду git branch
не вказавши інших аргументів.
$git branch
* master
testing
Ця команда виводить список всіх локальних віток, символ “*” вказує на поточну. Також можна використовувати команду $ git log --oneline --decorate --all
, яка виводить історію коммітів і куди саме вказують вітки.
Перемикання віток
Для того, щоб переключитись на існуючу вітку, виконайте команду git checkout
. Переключимось на вітку testing
.
$git checkout testing
Цим самим ми перекинемо вказівник HEAD на вітку testing. Давайте створимо новий комміт.
$vim second_file.txt
$git commit -am'test change'
Переключимось назад на вітку master.
$git checkout master
При перемиканні вітки всі файли відновлюються до того стану, в якому були на момент створення коміту, на який вказує вітка. Іншими словами, вся робота, пророблена у вітці testing відкотилась до моменту її створення. Також, якщо через певні причини Git не може це зробити, то перемикання не відбудеться.
Зробимо ще одну зміну і зафіксуємо комміт.
$vim first_file.txt
$git commit -am'some more changes'
Тепер історія вашого проекту розділилась на дві вітки. Вони ізольовані одна від одної. Ви можене переключатись між ними, використовуючи команди branch
, checkout
, commit
, і за потреби злити їх в одну(про це в майбутніх постах).
Це все можна побачити за допомогою команди git log --oneline --decorate --graph --all
.
Те, чому є сенс використовувати вітки буде детальніше розглянуто в наступних постах.