Злиття віток в Git


Автор: 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

Спробуємо злити вітки 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 просто переміщає вказівник вперед.


В результаті злиття наш репозиторій має наступний вигляд: master i merge_test вказують на один комміт Після цього можна видалити вітку 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.

Про те, що це таке, а також як це вирішити буде в наступних постах.

Share Comments
comments powered by Disqus