Поделиться через


Понимание истории Git

Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019

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

Примечание.

Если вы не можете найти изменение в истории Git, в котором вы уверены, что сделали, узнайте больше о том, как работает упрощение истории в Git на Git потерял мои изменения: упрощение истории Git.

Основы истории коммитов

Начните с простого примера истории: репозиторий с 3 последовательными коммитами.

три коммита в строке

Commit A является родителем коммита B, а коммит B является родителем коммита C. Эта история очень похожа на CVCS. Стрелка, указывающая на коммит C, это ветка. Оно называется main, так как это имя по умолчанию для ветви mainline в репозитории Git. Ветви — это указатели на определенные коммиты, поэтому ветвление в Git такое легковесное и простое.

Ключевое различие в Git по сравнению с CVCS заключается в том, что у меня есть собственная полная копия репозитория. Мне нужно поддерживать локальный репозиторий в синхронизации с удаленным репозиторием, получив последние коммиты из удаленного репозитория. Для этого я вытащим основную ветвь со следующей командой:

git pull origin main

Копируются все коммиты из ветки main удаленного репозитория (по умолчанию называемой origin) в ветку main локального репозитория. Операция извлечения скопировала одну новую фиксацию, а ветвь main в локальном репозитории теперь указывает на эту новую фиксацию.

четвертая фиксация, D, добавлена в строку

Понимание истории ветки

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

git checkout -b cool-new-feature

Это сочетание двух команд: сначала git branch cool-new-feature для создания ветви, а затем git checkout cool-new-feature для начала работы в этой ветви.

Ветка cool-new-feature добавлена

Теперь две ветви указывают на один коммит. Я внесу несколько изменений в ветку cool-new-feature в двух новых коммитах, E и F.

добавлено два новых коммита

Мои коммиты доступны из ветки cool-new-feature, так как я сделал их в этой ветке. Я закончил со своей функцией и хочу объединить её в main. Для этого я буду использовать следующую команду:

git merge cool-feature main

после слияния

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

История в реальном мире

Ниже приведен пример истории Git, который более тесно похож на код в активной разработке в команде. Есть три человека, которые объединяют коммиты из своих веток в основную ветку примерно в одно и то же время.

журнал консоли графа Git

Теперь, когда вы понимаете, как ветви и слияния создают форму графа, это не должно быть слишком страшно!