Belov Solutions

Основы ветвления и слияния в Git

Введение

Эта статья демонстрирует процесс ветвления и слияния в Git через пример рабочего процесса. Вы узнаете, как создавать ветки для новых задач, исправлять ошибки и разрешать конфликты слияния. Примеры подходят для любой операционной системы с установленным Git.

Пример рабочего процесса

Предположим, вы работаете над сайтом:

  1. Вы создаёте ветку для реализации новой функциональности (задача #53).
  2. Работаете в этой ветке.
  3. Обнаруживается критическая ошибка, требующая немедленного исправления.
  4. Вы переключаетесь на основную ветку, создаёте ветку для исправления, тестируете и сливаете её с основной веткой.
  5. Возвращаетесь к ветке с задачей #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.

Отзывы

Оставить отзыв

Ваша эл. почта не будет опубликована