Основные сведения об упрощении журнала Git

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

Упрощение истории Git может быть запутанным зверем. 99% времени вы даже не знаете, что он существует, но иногда он выскочит из темных углов Git и укусить вас. В этой статье мы рассмотрим, что такое упрощение журнала и как это может привести к путанице при просмотре журнала файлов.

Начнем с общего сценария:

  1. Вы отправляете изменения в файл, а затем объединяете изменение в main.
  2. Некоторые из ваших коллег также объединяют свои ветви с основными.
  3. Вы вернеесь через некоторое время и заметите, что изменения отсутствуют.
  4. Ищете виновника, вы посмотрите на журнал файлов и обратите внимание... Ваши изменения даже не указаны!?

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

Если вы не бежали в него раньше, вы можете стать разочарованным, интересно , где хека мои изменения пошли?

Упрощение журнала: по умолчанию

По умолчанию при выполнении команды журнала в файле автоматически git log file.txt упрощается журнал, возможно, скрытие некоторых фиксаций из выходных данных. Дополнительные сведения см. на странице "Человек журнала Git".

Что добавляет к путанице, заключается в том, что упрощение журнала не происходит, если вы просто запускаетеgit log, потому что вы просматриваете все изменения нет ничего, чтобы упростить.

Чтобы отключить упрощение журнала, необходимо использовать параметр --full-historyкомандной строки.

Пример упрощения журнала

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

Ветви Git

Как вы видите, мы собираемся:

  1. Создайте файл .
  2. Добавьте строку в этот файл в ветви (животные).
  3. Добавьте другую строку в этот файл в другой ветви (фрукты).
  4. Слияние животных-ветвей обратно в основную.
  5. Объедините ветвь обратно в основную и выберите всю копию файла из плодовой ветви.
  6. Проверьте журнал файла.

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 через командную строку, вы можете просто извлечь файл, для которого вы хотите просмотреть журнал в нашем обозревателе, и вы увидите следующий фильтр журнала, где можно указать простые или не простые представления журнала:

Фильтры Git

(c) Корпорация Майкрософт 2016 г. Все права защищены. Этот документ предоставляется как есть. Сведения и представления, выраженные в этом документе, включая URL-адрес и другие ссылки на веб-сайт Интернета, могут изменяться без уведомления. Вы берете на себя все риски, связанные с использованием сведений, приводящихся в данном документе.

Данный документ не предоставляет никаких юридических прав на какую-либо интеллектуальную собственность в любом из продуктов корпорации Майкрософт. Этот документ можно копировать и использовать только для внутренних справочных целей.