Ветвление в Git#

Ветвление в Git - это создание новых веток c целью отклонения от основной линии разработки.

Причины создания могут разными:

  • создание и тестирование нового функционала;

  • отладка имеющегося кода;

Работа в новой ветке не затрагивает функционирование основной ветки.

Когда выполняется коммит, то Git сохраняет его в виде объекта, который содержит указатель на снимок (snapshot) подготовленных данных. Этот объект так же содержит имя автора и email, сообщение и указатель на коммит или коммиты непосредственно предшествующие данному (его родителей).

asda

Ветка в Git — это простой перемещаемый указатель на один из таких коммитов. По умолчанию, имя основной ветки в Git —** master**. В процессе создания коммитов, ветка master будет всегда указывает на последний коммит, то есть указатель ветки master будет передвигаться на следующий коммит автоматически.

История коммитов

Создание новой ветки#

При создании новой ветки создается новый указатель на текущий коммит.

git branch testing
Создание новой ветки

Для ориентации в ветках Git указатель HEAD, который указывает на ветку.

Создание новой ветки

Переключение веток#

При создании новой ветки указатель HEAD не перемещается автоматически на новую ветку. Для переключения Git на вновь созданную ветку используется команда checkout:

git checkout testing

После выполнения этой команды HEAD переместится и будет указывать на testing.

Перемещение указателя HEAD

Note

С версии 2.23 появилась команда switch для переключения между ветками git switch testing

Создание коммита в новой ветке#

После внесения изменений и создания коммита в новой ветке указатель истории состояния сместится вперед. Это будет указатель ветки testing, с ним вместе сместится и HEAD.

echo "print('Create new branch')" > hello_git.py
git commit -m 'Update hello_git.py'
Коммит в новой ветке

Указатель master останется в том месте, где был сделан переход с ветки на ветку.

Note

Для просмотра истории коммитов другой ветки необходимо явно указать её имя: git log testing. для просмотра всей истории всех веток: git log –all

Переключение на старую ветку#

git checkout master

Переключение на старую ветку master приведет к перемещению указателя HEAD и возврату файлов каталога в рабочее состояние в состояние, на снимок которого указывает master.

Возврат в ветку master

Визуализация#

git log --oneline --decorate --graph --all

Практика:#

  1. Перевести указатель HEAD на ветку master

git checkout master
  1. Вывести указатели веток

git log --oneline --decorate
Возврат в ветку master
  1. Создать новую ветку testing

git branch testing
Возврат в ветку master
  1. Вывести указатели веток

git log --oneline --decorate
Возврат в ветку master

HEAD указывает на обе ветки. Обе ветки указывают на последний коммит

  1. Переключиться на ветку testing

git checkout testing
Возврат в ветку master
  1. Внести изменения в файл hello_git.py

print('Hello, Git!')
print('Indexing is important!')

for num in range(10):
        print(num,end=' ')

6.1 Запустить файл:

python hello_git.py
Commit
  1. Проиндексировать все имеющиеся файлы (add .) и сделать коммит:

git add .
git commit -m "Update hello_git py. Add for"
Commit
  1. Вывести указатели веток

git log --oneline --decorate
Commit

HEAD указывает на testing, а testing на новый коммит. Ветка master осталась на месте.

  1. Внести изменения в файл hello_git:

import os
print('Hello, Git!')
print('Indexing is important!')

for num in range(10):
        print(num,end=' ')

print(f'\nYour current directory: {os.getcwd()}')
  1. Запустить файл:

python hello_git.py
Commit
  1. Проиндексировать все имеющиеся файлы (add .) и сделать коммит.

Commit
  1. Вывести историю:

git log
Commit
  1. Вернуться в ветку master и вывести указатели веток:

git checkout master
git log --oneline --decorate --all
Commit
  1. Запустить скрипт hello-git.py:

python hello_git.py
Commit

Рабочий каталог вернулся в состояние, на которое указывал master до ветвления. По этой причине и работает старый код.

  1. Внести изменения в файл hello_git:

print('Hello, Git!')
print('Indexing is important!')

ind = 0
sum = 0

while ind <= 9:
        sum += ind
        print(sum)
        ind += 1
  1. Запустить скрипт hello-git.py:

python hello_git.py
Commit
  1. Проиндексировать все имеющиеся файлы (add .) и сделать коммит.

Commit
  1. Вывести указатели веток и визуализировать историю коммитов:

git log --oneline --decorate --all
git log --oneline --decorate --all --graph
Commit

Представленный вывод наглядно демонстрирует перемещение указателя HEAD и ветвление.

  1. Вернуться в ветку testing и продолжить эксперименты над проектом, внеся изменения в файл hello_git.py:

git checkout testing
import os
print('Hello, Git!')
print('Indexing is important!')

for num in range(10):
        print(num,end=' ')

print(f'\nYour current directory: {os.getcwd()}')

s = 'Version Control System'
print(f'{s} - length is {len(s)} characters')

Обратить внимание, что добавить пришлось только:

s = 'Version Control System'
print(f'{s} - length is {len(s)} characters')
  1. Запустить скрипт, убедиться, что все работает корректно, проиндексировать и выполнить коммит:

Commit
  1. Вывести указатели веток и визуализировать историю коммитов:

git log --oneline --decorate --all
git log --oneline --decorate --all --graph
Commit
git log - вывод истории по текущей ветке

git log --all - вывод истории по всем веткам