Git Branch / Гілка
Робота з Git гілками
У Git branch
(гілка) є новою/окремою версією головного репозиторію.
Припустімо, у вас є великий проєкт, і вам потрібно оновити його дизайн.
Як це буде працювати без і з Git:
Без Git:
- Зробіть копії всіх відповідних файлів, щоб уникнути впливу на поточну версію
- Почніть працювати з дизайном і побачите, що код залежить від коду в інших файлах, який також потрібно змінити!
- Також створіть копії залежних файлів. Переконайтеся, що кожна залежність файлу посилається на правильну назву файлу
- АВАРІЙНА СИТУАЦІЯ! Десь ще в проєкті є непов’язана помилка, яку потрібно виправити якомога швидше!
- Збережіть усі свої файли, записавши назви копій, над якими ви працювали
- Попрацюйте над непов’язаною помилкою та оновіть код, щоб виправити її
- Поверніться до дизайну та закінчіть роботу там
- Скопіюйте код або переназвіть файли, щоб оновлений дизайн був у поточній версії
- (через 2 тижні ви розумієте, що непов’язану помилку не було виправлено в новій версії дизайну, оскільки ви скопіювали файли до виправлення)
Із Git:
- За допомогою нової гілки під назвою new-design редагуйте код безпосередньо, не впливаючи на основну гілку
- АВАРІЙНА СИТУАЦІЯ! Десь ще в проєкті є непов’язана помилка, яку потрібно виправити якомога швидше!
- Створіть нову гілку з основного проєкту під назвою small-error-fix
- Виправте непов’язану помилку та об’єднайте гілку виправлення малих помилок із основною гілкою.
- Ви повертаєтеся до гілки нового дизайну та закінчуєте роботу там
- Об’єднайте гілку нового дизайну з основною (отримайте сповіщення про невелике виправлення помилок, яке ви пропустили)
Гілки дозволяють вам працювати над різними частинами проєкту, не впливаючи на головну гілку.
Після завершення роботи гілку можна об’єднати з основним проєктом.
Ви навіть можете перемикатися між гілками та працювати над різними проєктами, не заважаючи один одному.
Розгалуження в Git дуже легке та швидке!
Нова гілка Git
Дозвольте додати деякі нові функції до нашої сторінки index.html
.
Ми працюємо в нашому локальному репозиторію, і ми не хочемо заважати або, можливо, руйнувати основний проєкт.
Тож ми створюємо новий branch
(нову гілку):
Приклад
git branch hello-world-images
Тепер ми створили нову branch
(гілку) під назвою "hello-world-images
".
Давайте підтвердимо, що ми створили нову branch
(гілку):
Приклад
git branch
hello-world-images
* master
Ми бачимо нову гілку з назвою "hello-world-images", але *
біля master
вказує, що ми зараз перебуваємо на branch
.
checkout
— це команда, яка використовується для перевірки branch
. Переміщення із поточної branch
, до тієї, що вказана в кінці команди:
Приклад
git checkout hello-world-images
Switched to branch 'hello-world-images'
Тепер ми перемістили наш поточний робочий простір із гілки master до нової branch
Відкрийте свій улюблений редактор і внесіть деякі зміни.
У цьому прикладі ми додали зображення (img_hello_world.jpg) до робочої теки та рядок коду у файлі index.html
:
Приклад
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
<link rel="stylesheet" href="bluestyle.css">
</head>
<body>
<h1>Hello world!</h1>
<div><img src="img_hello_world.jpg" alt="Hello World from Space"
style="width:100%;max-width:960px"></div>
<p>Це перший файл у моєму новому Git репозиторію.</p>
<p>Новий рядок у нашому файлі!</p>
</body>
</html>
Ми внесли зміни до файлу та додали новий файл у робочий каталог (той самий каталог, що й main
branch
).
Тепер перевірте поточний стан branch
:
Приклад
git status
On branch hello-world-images
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: index.html
Untracked files:
(use "git add <file>..." to include in what will be committed)
img_hello_world.jpg
no changes added to commit (use "git add" and/or "git commit -a")
Тож давайте розберемося, що тут відбувається:
- Є зміни в нашому index.html, але файл не підготовлений для
commit
(фіксації) img_hello_world.jpg
не єtracked
(не відстежується)
Отже, для цього нам потрібно додати обидва файли до проміжного середовища branch
:
Приклад
git add --all
Використання --all
замість окремих назв файлів призведе до Stage (проміжної стадії) всіх змінених (нових, змінених і видалених) файлів.
Перевірте status
(статус) branch
(гілки):
Приклад
git status
On branch hello-world-images
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: img_hello_world.jpg
modified: index.html
Ми задоволені нашим змінам. Тож ми передамо їх branch
:
Приклад
git commit -m "Added image to Hello World"
[hello-world-images 0312c55] Added image to Hello World
2 files changed, 1 insertion(+)
create mode 100644 img_hello_world.jpg
Тепер у нас є нова branch
, яка відрізняється від головної branch
.
Примітка: Використання параметра -b
у checkout
створить нову гілку та перемістить до неї, якщо вона не існує.
Перемикання між гілками
Тепер давайте подивимося, наскільки швидко й легко можна працювати з різними гілками, і наскільки добре це працює.
Зараз ми перебуваємо на гілці hello-world-images
. Ми додали зображення до цієї гілки, тому давайте перерахуємо файли в поточному каталозі:
Приклад
ls
README.md bluestyle.css img_hello_world.jpg index.html
Ми можемо побачити новий файл img_hello_world.jpg
, і якщо ми відкриємо файл html, то побачимо, що код було змінено. Все як має бути.
Тепер давайте подивимося, що станеться, коли ми змінимо гілку на master
Приклад
git checkout master
Switched to branch 'master'
Нове зображення не є частиною цієї гілки. Знову вивести список файлів у поточному каталозі:
Приклад
ls
README.md bluestyle.css index.html
img_hello_world.jpg
більше немає! І якщо ми відкриємо файл html, ми побачимо, що код повернуто до того, яким він був до зміни.
Бачите, як легко працювати з гілками? І як це дозволяє вам працювати над різними речами?
Відділення екстреної допомоги
Тепер уявіть, що ми ще не закінчили з hello-world-images, але нам потрібно виправити помилку на master.
Я не хочу стикатися безпосередньо з master і не хочу стикатися з hello-world-images, оскільки це ще не зроблено.
Тож ми створюємо нову гілку для вирішення надзвичайної ситуації:
Приклад
git checkout -b emergency-fix
Switched to a new branch 'emergency-fix'
Тепер ми створили нову гілку з master і перейшли на неї. Ми можемо безпечно виправити помилку, не заважаючи іншим гілкам.
Давайте виправимо нашу уявну помилку:
Приклад
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
<link rel="stylesheet" href="bluestyle.css">
</head>
<body>
<h1>Hello world!</h1>
<p>Це перший файл у моєму новому Git репозиторію.</p>
<p>Цей рядок тут, щоб показати, як працює злиття.</p>
</body>
</html>
Ми внесли зміни в цей файл, і нам потрібно перенести ці зміни до головної гілки.
Перевірте статус:
Приклад
git status
On branch emergency-fix
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
stage the file, and commit:
Приклад
git add index.html
git commit -m "updated index.html with emergency fix"
[emergency-fix dfa79db] updated index.html with emergency fix
1 file changed, 1 insertion(+), 1 deletion(-)
Тепер у нас є виправлення, готове для master, і нам потрібно об’єднати дві гілки.