Ветвление в Git#
Ветвление в Git - это создание новых веток c целью отклонения от основной линии разработки.
Причины создания могут разными:
создание и тестирование нового функционала;
отладка имеющегося кода;
Работа в новой ветке не затрагивает функционирование основной ветки.
Когда выполняется коммит, то Git сохраняет его в виде объекта, который содержит указатель на снимок (snapshot) подготовленных данных. Этот объект так же содержит имя автора и email, сообщение и указатель на коммит или коммиты непосредственно предшествующие данному (его родителей).
Ветка в Git — это простой перемещаемый указатель на один из таких коммитов. По умолчанию, имя основной ветки в Git —** master**. В процессе создания коммитов, ветка master будет всегда указывает на последний коммит, то есть указатель ветки master будет передвигаться на следующий коммит автоматически.
Создание новой ветки#
При создании новой ветки создается новый указатель на текущий коммит.
git branch testing
Для ориентации в ветках Git указатель HEAD, который указывает на ветку.
Переключение веток#
При создании новой ветки указатель HEAD не перемещается автоматически на новую ветку. Для переключения Git на вновь созданную ветку используется команда checkout:
git checkout testing
После выполнения этой команды HEAD переместится и будет указывать на testing.
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.
Визуализация#
git log --oneline --decorate --graph --all
Практика:#
Перевести указатель HEAD на ветку master
git checkout master
Вывести указатели веток
git log --oneline --decorate
Создать новую ветку testing
git branch testing
Вывести указатели веток
git log --oneline --decorate
HEAD указывает на обе ветки. Обе ветки указывают на последний коммит
Переключиться на ветку testing
git checkout testing
Внести изменения в файл hello_git.py
print('Hello, Git!')
print('Indexing is important!')
for num in range(10):
print(num,end=' ')
6.1 Запустить файл:
python hello_git.py
Проиндексировать все имеющиеся файлы (add .) и сделать коммит:
git add .
git commit -m "Update hello_git py. Add for"
Вывести указатели веток
git log --oneline --decorate
HEAD указывает на testing, а testing на новый коммит. Ветка master осталась на месте.
Внести изменения в файл 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()}')
Запустить файл:
python hello_git.py
Проиндексировать все имеющиеся файлы (add .) и сделать коммит.
Вывести историю:
git log
Вернуться в ветку master и вывести указатели веток:
git checkout master
git log --oneline --decorate --all
Запустить скрипт hello-git.py:
python hello_git.py
Рабочий каталог вернулся в состояние, на которое указывал master до ветвления. По этой причине и работает старый код.
Внести изменения в файл hello_git:
print('Hello, Git!')
print('Indexing is important!')
ind = 0
sum = 0
while ind <= 9:
sum += ind
print(sum)
ind += 1
Запустить скрипт hello-git.py:
python hello_git.py
Проиндексировать все имеющиеся файлы (add .) и сделать коммит.
Вывести указатели веток и визуализировать историю коммитов:
git log --oneline --decorate --all
git log --oneline --decorate --all --graph
Представленный вывод наглядно демонстрирует перемещение указателя HEAD и ветвление.
Вернуться в ветку 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')
Запустить скрипт, убедиться, что все работает корректно, проиндексировать и выполнить коммит:
Вывести указатели веток и визуализировать историю коммитов:
git log --oneline --decorate --all
git log --oneline --decorate --all --graph
git log - вывод истории по текущей ветке
git log --all - вывод истории по всем веткам