Вітки в Git


Автор: rizakrko


Коротко про зберігання даних Git’ом

Для чіткого розуміння механізму віток, необхідно зрозуміти, як Git зберігає дані.

Основна відмінність Git’a від будь-якої іншої СКВ - це підхід Git’a до роботи зі своїми даними. Більшість інших систем зберігають інформацію у вигляду списку змін у файлах. Ці системи представляють інформацію у вигляді набору файлів та змін, зроблених в кожному файлі, по часу. Схематичне зображення роботи інших СКВ В Git’і використовується принципрово інший підхід: кожного разу, коли ви робите комміт,тобто зберігаєте стан свого проекту в Git’i, система запам’ятовує, як виглядає кожен файл в даний момент, і зберігає посилання на цей знамок. Якщо файл не був змінений, то система створює посилання на попередню версію цього файлу. Схематичне зображення роботи Git

Коротко про вітки

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 log

Перемикання віток

Для того, щоб переключитись на існуючу вітку, виконайте команду git checkout. Переключимось на вітку testing.

	$git checkout testing

HEAD вказує на вітку testing Цим самим ми перекинемо вказівник HEAD на вітку testing. Давайте створимо новий комміт.

	$vim second_file.txt
	$git commit -am'test change'

HEAD перемістився вперед, а master вказує той самий комміт Переключимось назад на вітку 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. Результат виконання команди git log


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


Share Comments
comments powered by Disqus