Автор: rizakrko
В кінці попередньої статті про вітки ми завершили на тому, що історя репозиторію розділилась.
Цього разу ми розпочнемо розглядати різні способи злиття віток.
Для початку створимо ще одну вітку, merge_test
. Зробимо тестовий комміт, створивши новий файл, і добавивши в нього текст.
$git checkout -b merge_test
$vim new_file.txt
$git add new_file.txt
$git commit -am'test commit'
Ви могли зауважити, що відсутня команда $git branch merge_test
. Для того, щоб створити гілку, і відразу ж перекикнути вказiвник HEAD на неї, істує команда $git checkout -b <назва нової вітки>
.
На даний момент репозиторій має наступний вигляд:
Спробуємо злити вітки merge_test
і master
. Одна з команд, яка дозволяє це зробити - $git merge <назва вітки>
.
Важливо зауважити, що $git merge <назва вітки>
зливає вказану вітку до тої, на яку вказує вказівник HEAD.
$git checkout master
$git merge merge_test
Обновление 2c723a0..fbb85b1
Fast-forward
new_file.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 new_file.txt
В даному випадку Git використав механізм так званої “перемотки”, на що вказує повідомлення Fast-forward
. Якщо вітка, в яку відбувається злиття є прямим батьком вітки, яку зливають, то Git просто переміщає вказівник вперед.
В результаті злиття наш репозиторій має наступний вигляд:
Після цього можна видалити вітку merge_test
. Для цього використовується команда git branch -d <назва вітки>
.
$git branch -d merge_test
Якщо за певних причин ви хочете видалити вітку, не зливши зміни в основну вітку, то дана команда не дозволить вам цього зробити. Для цього потрібно явно підтвердити свої наміри, замінивши ключ -d
на -D
.
Перекинемо вказівник HEAD на вітку testing
, і створимо ще один комміт.
$git checkout testing
$vim first_file.txt
$git commit -am'commit in testing branch'
Зауважимо, що зміни, що були зроблені в вітці merge_test
не включені в вітку testing
. Є два варіанти, як злити ці зміни.
Або злити вітку master
в вітку testing
, або при завершенні роботи над віткою testing
злити її в master
.
Допустимо, що ми завершили роботу над віткою testing
. Злиємо її у вітку master
.
$git checkout master
$git merge testing
Merge made by the 'recursive' strategy.
first_file.txt | 1 +
1 file changed, 1 insertion(+)
Цього разу повідомлення відрізняється. Комміт, на який вказує вітка testing
не є прямим нащадком комміту, на який вказує віткаmaster
. В такому випадку Git шукає найкращого спільного предка, на основі якого буде відбуватись злиття. На відміну від інших СКВ, це відбувається автоматично, тому корисувачу немає необхідності про це піклуватись. Як результат цього злиття створюється новий комміт, який називається коммітом злиття. На даний момент наш репозиторій має наступний вигляд:
Тепер можна видалити вітку testing
.
$git branch -d testing
Конфлікти при злитті віток
На жаль, не все так чудаво при злитті віток. Навіть якщо ви все виконали вірно, залишаєть висока ймовірність конфліктів. Зазвичай вони мають наступний вигляд:
$ git merge new_cool_feature
Auto-merging meaning_of_life
CONFLICT (content): Merge conflict in meaning_of_life
Automatic merge failed; fix conflicts and then commit the result.
Про те, що це таке, а також як це вирішити буде в наступних постах.