Основные сведения об упрощении журнала Git
Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019
Упрощение истории Git может быть запутанным зверем. 99% времени вы даже не знаете, что он существует, но иногда он выскочит из темных углов Git и укусить вас. В этой статье мы рассмотрим, что такое упрощение журнала и как это может привести к путанице при просмотре журнала файлов.
Начнем с общего сценария:
- Вы отправляете изменения в файл, а затем объединяете изменение в main.
- Некоторые из ваших коллег также объединяют свои ветви с основными.
- Вы вернеесь через некоторое время и заметите, что изменения отсутствуют.
- Ищете виновника, вы посмотрите на журнал файлов и обратите внимание... Ваши изменения даже не указаны!?
Журнал фиксаций Git — это дерево. Иногда хронологическая история не совпадает с фактическим журналом дерева файлов. Эта ситуация чаще всего возникает, когда фиксация слияния отменить изменения обратно в исходное состояние файла. В этом случае представление журнала по умолчанию не будет отображать все изменения, так как технически файл не изменился. В этом сценарии Git понимает, что он может упростить журнал и "изменения", которые вы, скорее всего, ищете, удаляются из журнала.
Если вы не бежали в него раньше, вы можете стать разочарованным, интересно , где хека мои изменения пошли?
Упрощение журнала: по умолчанию
По умолчанию при выполнении команды журнала в файле автоматически git log file.txt
упрощается журнал, возможно, скрытие некоторых фиксаций из выходных данных. Дополнительные сведения см. на странице "Человек журнала Git".
Что добавляет к путанице, заключается в том, что упрощение журнала не происходит, если вы просто запускаетеgit log
, потому что вы просматриваете все изменения нет ничего, чтобы упростить.
Чтобы отключить упрощение журнала, необходимо использовать параметр --full-history
командной строки.
Пример упрощения журнала
Чтобы лучше понять, как работает упрощение, мы создадим собственный пример упрощения истории. Сначала рассмотрим схему журнала, которую мы создадим:
Как вы видите, мы собираемся:
- Создайте файл .
- Добавьте строку в этот файл в ветви (животные).
- Добавьте другую строку в этот файл в другой ветви (фрукты).
- Слияние животных-ветвей обратно в основную.
- Объедините ветвь обратно в основную и выберите всю копию файла из плодовой ветви.
- Проверьте журнал файла.
Git будет упростить историю для нас. Шаг 5 является ключевым здесь. Мы проигнорировали все изменения из ветви животных . Git заметит, что наш файл по сути не изменился между шагом 1 и шагом 5, и поэтому он будет отображать только две записи журнала.
Сначала мы создадим файл и добавим его в репозиторий:
> cd sample
> git init
> echo "some content" > test.txt
> git add test.txt
> git commit -m "Initial commit"
Теперь мы решили добавить текст "осли" в файл в ветви животных:
> git checkout -b animals
> echo "donkeys" >> test.txt
> git commit -am "We have added an animal"
Хотя мы экспериментируем, мы решили, может быть, мы хотим пойти с фруктами в нашем файле, поэтому мы создадим другую ветвь и добавим текст "бананы" в конце файла вместо этого:
> git checkout main -b fruit
> echo "bananas" >> test.txt
> git commit -am "We have added a fruit"
Чувствуя себя удовлетворенным нашими изменениями, мы решили объединить нашу ветвь животных обратно в основную:
> git checkout main
> git merge animals
Теперь рассмотрим журнал для нашего test.txt
файла:
> git log test.txt
commit 6b33d99b996c430a60c9552b79245d1aa8320339
Date: Mon Feb 15 10:45:33 2016 -0500
We have added an animal
commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
Date: Mon Feb 15 10:44:18 2016 -0500
Initial commit
До сих пор так хорошо, верно? В выходных данных журнала ничего не выглядит. Теперь предположим, что мы изменили свое мнение и решили объединить нашу плодовую ветвь:
>git merge fruit
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
Ух-о, конфликт слияния. После некоторого рассмотрения мы решили использовать весь test.txt
файл из нашей плодовой ветви. Как правило, вы будете использовать какой-то текстовый редактор или средство слияния, но мы просто создадим весь файл, так как это только две строки:
> echo "some content" > test.txt
> echo "bananas" >> test.txt
> git commit -am "Fixed merge conflict"
Теперь рассмотрим историю нашего test.txt
файла:
> git log test.txt
commit fdd4dfd816c4efebc5bdb240f49e934e299db581
Date: Mon Feb 15 10:51:06 2016 -0500
We have added a fruit
commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
Date: Mon Feb 15 10:44:18 2016 -0500
Initial commit
Конечно, мы не видим никаких изменений из первого эксперимента в журнале, а также не видим слияние! Они все еще там? Git полностью исключила изменения?
> git log --full-history test.txt
Как видно, хотя это упрощено журнал без флага full-history
, Git сохранил все наши изменения:
> commit 5d0bb77a24e265dc154654fb3b5be331b53bf977
Merge: 6b33d99 fdd4dfd
Date: Mon Feb 15 10:59:34 2016 -0500
Fixed merge conflict
commit fdd4dfd816c4efebc5bdb240f49e934e299db581
Date: Mon Feb 15 10:51:06 2016 -0500
We have added a fruit
commit 6b33d99b996c430a60c9552b79245d1aa8320339
Date: Mon Feb 15 10:45:33 2016 -0500
We have added an animal
commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
Date: Mon Feb 15 10:44:18 2016 -0500
Initial commit
Сводка по упрощению журнала Git
Дело в упрощении истории заключается в том, что большую часть времени вы никогда не заметите это. Но когда конфликт слияния идет не так, и вы хотите знать, что произошло, вы можете найти себя глядя на журнал Git и интересно, где ваши изменения пошли.
Теперь, вместо паники, вы знаете, что:
- Упрощение журнала для файлов включено по умолчанию
- Флаг
--full-history
даст вам более полный журнал файлов
Обновление: так как я написал эту статью, Azure DevOps Services представила ряд удивительных вариантов просмотра журнала в Интернете. Это означает, что если вы не хотите выполнять slogginging через командную строку, вы можете просто извлечь файл, для которого вы хотите просмотреть журнал в нашем обозревателе, и вы увидите следующий фильтр журнала, где можно указать простые или не простые представления журнала:
(c) Корпорация Майкрософт 2016 г. Все права защищены. Этот документ предоставляется как есть. Сведения и представления, выраженные в этом документе, включая URL-адрес и другие ссылки на веб-сайт Интернета, могут изменяться без уведомления. Вы берете на себя все риски, связанные с использованием сведений, приводящихся в данном документе.
Данный документ не предоставляет никаких юридических прав на какую-либо интеллектуальную собственность в любом из продуктов корпорации Майкрософт. Этот документ можно копировать и использовать только для внутренних справочных целей.