Введение
Эта статья демонстрирует процесс ветвления и слияния в Git через пример рабочего процесса. Вы узнаете, как создавать ветки для новых задач, исправлять ошибки и разрешать конфликты слияния. Примеры подходят для любой операционной системы с установленным Git.
Пример рабочего процесса
Предположим, вы работаете над сайтом:
- Вы создаёте ветку для реализации новой функциональности (задача #53).
- Работаете в этой ветке.
- Обнаруживается критическая ошибка, требующая немедленного исправления.
- Вы переключаетесь на основную ветку, создаёте ветку для исправления, тестируете и сливаете её с основной веткой.
- Возвращаетесь к ветке с задачей #53 и продолжаете работу.
Основы ветвления
У вас есть проект с несколькими коммитами. Для работы над задачей #53 создайте ветку iss53:
git checkout -b iss53
Switched to a new branch "iss53" Это эквивалентно:
git branch iss53
git checkout iss53 Команда git checkout -b создаёт ветку и сразу переключает на неё. Внесите изменения и создайте коммит:
vim index.html
git commit -a -m 'Create new footer [issue 53]' Ветка iss53 обновляется, указывая на новый коммит, а HEAD следует за ней.
Исправление критической ошибки
Обнаружена уязвимость, требующая срочного исправления. Переключитесь на ветку master:
git checkout master
Switched to branch 'master' Примечание: Git не позволит переключиться, если есть незафиксированные изменения, конфликтующие с целевой веткой. Убедитесь, что все изменения закоммичены, или используйте git stash.
Создайте ветку для исправления:
git checkout -b hotfix
Switched to a new branch 'hotfix'
vim index.html
git commit -a -m 'Fix broken email address' После тестирования слейте ветку hotfix с master:
git checkout master
git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+) Слияние прошло в режиме fast-forward, так как коммит в hotfix является прямым потомком коммита в master. Указатель master просто перемещается вперёд.
Удалите ненужную ветку hotfix:
git branch -d hotfix
Deleted branch hotfix (3a0874c). Вернитесь к работе над задачей #53:
git checkout iss53
Switched to branch "iss53"
vim index.html
git commit -a -m 'Finish the new footer [issue 53]' Основы слияния
После завершения задачи #53 слейте ветку iss53 с master:
git checkout master
git merge iss53
Merge made by the 'recursive' strategy.
index.html | 1 +
1 file changed, 1 insertion(+) Это слияние использует recursive стратегию, так как master и iss53 разошлись в истории. Git создаёт коммит слияния, используя последние коммиты обеих веток и их общего родителя.
Удалите ветку iss53:
git branch -d iss53 Разрешение конфликтов слияния
Если в обеих ветках изменена одна и та же часть файла, возникает конфликт:
git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result. Проверьте статус:
git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a") Git добавляет маркеры конфликтов в файл index.html:
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html Разрешите конфликт, отредактировав файл, например:
<div id="footer">
please contact us at email.support@github.com
</div> Добавьте исправленный файл в индекс и завершите слияние:
git add index.html
git commit Сообщение коммита по умолчанию:
Merge branch 'iss53'
Conflicts:
index.html
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.
... Добавьте пояснения к коммиту, если нужно.
Для графического разрешения конфликтов используйте:
git mergetool Git предложит доступные инструменты (например, opendiff, meld). После разрешения конфликтов проверьте статус:
git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: index.html Завершите слияние:
git commit Заключение
Вы узнали, как использовать ветвление и слияние в Git для управления задачами и исправлениями. Вы научились создавать ветки, переключаться между ними, выполнять слияния (fast-forward и recursive) и разрешать конфликты. Эти навыки позволяют эффективно организовать рабочий процесс. В следующих статьях мы изучим git stash и другие продвинутые возможности Git.
Отзывы