Просмотр истории изменений файла с помощью управления версиями Git

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

Я дошел до:

git log -- [filename]

который показывает мне историю фиксации файла, но как мне получить доступ к содержимому каждого из изменений файла?

Я пытаюсь перейти от Microsoft Visual SourceSafe, и раньше это было просто щелкните → Показать историю.


person Richard    schedule 10.11.2008    source источник
comment
Ссылка выше (опубликованная Крисом) больше не действительна. Эта ссылка работает сегодня: git-scm.com/book/en/v2   -  person Cog    schedule 24.04.2019
comment
@chris: О какой ссылке вы говорите? В каком-то теперь удаленном комментарии?   -  person Peter Mortensen    schedule 06.07.2021


Ответы (24)


Для графического представления я бы использовал gitk:

gitk [filename]

Или следовать имени файла после переименований:

gitk --follow [filename]
person Claudio Acciaresi    schedule 24.08.2009
comment
Но у меня даже есть инструмент, который объединил вышесказанное с git blame, позволяя мне просматривать источник файла по мере его изменения во времени ... - person Egon Willighagen; 06.04.2010
comment
GitWeb - ответ на этот вопрос. - person Jonas Byström; 17.02.2011
comment
К сожалению, это не соответствует истории прошлых переименований файла. - person Dan Moulding; 31.03.2011
comment
Я также искал историю файлов, которые были ранее переименованы, и первым нашел эту ветку. Решение состоит в том, чтобы использовать git log --follow ‹filename›, как указал Фил здесь. - person Florian Gutmann; 26.04.2011
comment
Автор искал инструмент командной строки. Хотя gitk поставляется с GIT, это не приложение командной строки и не особо хороший графический интерфейс. - person mikemaccana; 18.07.2011
comment
Хороший совет. На моей машине (git v1.7.10) мне пришлось использовать gitk -- [filename]. - person n0nick; 31.07.2012
comment
Он искал инструмент командной строки? щелкните правой кнопкой мыши - ›показать историю, конечно, не подразумевает этого. - person hdgarrood; 13.05.2013
comment
Внимание! Пользователи Windows ... Путь к имени файла чувствителен к регистру. - person MattSlay; 23.09.2013
comment
@DanMoulding: gitk --follow [filename] показывает историю последних переименований файла. Однако он не показывает изменения содержимого файла перед переименованием. См. этот ответ. - person Matthias Braun; 20.02.2014
comment
если этот файл удален, и вы хотите узнать, кто его удалил, используйте git log -- [filename] - person hiway; 16.04.2014
comment
не ищу ничего, кроме git, это не должен быть принятый ответ - person Cosmin; 28.04.2015
comment
gitk не входит в базовый пакет git. Вам необходимо загрузить пакет tk, чтобы использовать gitk. @ VolkA ответ лучше, git log -p filename работает без каких-либо зависимостей. - person aaron-coding; 23.01.2016
comment
Вопрос был в том, чтобы просмотреть историю изменений файла с помощью управления версиями Git. Это именно то, что делает gitk. Он ищет изменения в истории коммитов git. Меня не волнует, является ли он частью базового пакета git, если он выполняет свою работу быстро и просто. - person Mike76; 09.08.2016
comment
@HenriquedeSousa: Потому что спрашивающий чувствовал, что этот ответ был наиболее полезным для него. - person Martin Bonner supports Monica; 24.08.2016
comment
gitk работает как шарм. это помогло мне проверить историю одного файла, именно то, что мне было нужно. - person sunlover3; 28.09.2016
comment
Есть ли способ сделать это с помощью gitGUI? - person Preshan Pradeepa; 16.07.2017
comment
голосование против из-за использования другого инструмента, лучше использовать стандартный cli из ответа stackoverflow.com/a/278242/1700569 - person coolxeo; 23.11.2017
comment
В принятом ответе следует учитывать, что не у всех в системе установлен gitk. Если бы я был в среде только с интерфейсом командной строки, не было бы доступного графического интерфейса. OP попросил использовать команду git. Использование gitweb, gitk или чего-то еще - это то же самое, что сказать, просто зайдите на GitHub и проверьте там историю. - person Martin; 24.01.2018
comment
Этот ответ не должен быть принятым imo. Я лично использую Gitx, а не Gitk, но мне тоже не нужен ответ, специфичный для Gitx. git log -p ответ ниже гораздо более применим к большинству пользователей. - person D G; 22.05.2018
comment
независимо от того, каким должен быть принятый ответ, +1 за содействие умопомрачительным действиям gitk - person frostini; 11.09.2018
comment
Что gitk? - person Jim Aho; 15.11.2018
comment
@JimAho инструмент визуализации git - person ncopiy; 02.04.2019
comment
почему этот ответ считается правильным, если он предлагает использовать стороннюю утилиту? правильный ответ остается ниже (@DanMoulding является автором) - person ncopiy; 02.04.2019
comment
Если вы пришли, как и я, из фона Windows и не знаете, что такое gitk, вы найдете его как часть Git for Windows. Запуск из приложения git-bash.exe (эмулятора командной строки Linux). Git for Windows, git bash и gitk потрясающие ... - person AlainD; 05.03.2021
comment
Это лучший ответ - person Dimitris Thomas; 03.06.2021

Вы можете использовать

git log -p filename

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

Видеть

git help log

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

git show HEAD

или любая другая ревизия по идентификатору. Или используйте

gitk

для просмотра изменений визуально.

person VolkA    schedule 10.11.2008
comment
git show HEAD показывает все файлы, знаете ли вы, как отслеживать отдельный файл (как просил Ричард)? - person Jonas Byström; 17.02.2011
comment
вы используете: git show ‹revision› - имя файла, в котором будут отображаться различия для этой ревизии, если она существует. - person Marcos Oliveira; 10.02.2012
comment
--stat также полезен. Вы можете использовать его вместе с -p. - person Raffi Khatchadourian; 10.05.2012
comment
Отлично. gitk плохо себя ведет при указании путей, которые больше не существуют. Я использовал git log -p - path. - person Paulo Casaretto; 27.02.2013
comment
Плюс gitk выглядит так, будто его построил монстр буги-вуги. Это отличный ответ, который лучше всего подходит для исходного вопроса. - person ghayes; 21.07.2013
comment
добавление --follow также учитывает переименование файлов. - person Amir Ali Akbari; 25.10.2013
comment
На этот вопрос есть лучший ответ, в котором используется флаг --follow - person s g; 21.10.2016
comment
Мне нравится ответ @ghayes: p И +1 за этот ответ; Я считаю, что хороший терминал может отображать разницу гораздо четче, чем визуальный инструмент. - person sunny-mittal; 19.12.2017
comment
git log --follow -p file_path должен быть принят ответ - person M Holod; 17.05.2018
comment
-p = Generate patch = показать diff кроме описания фиксации - person Qback; 11.07.2018
comment
это хороший - person ΦXocę 웃 Пepeúpa ツ; 23.06.2021

git log --follow -p -- path-to-file

Это покажет всю историю файла (включая историю за пределами переименований и с различиями для каждого изменения).

Другими словами, если файл с именем bar когда-то был назван foo, то git log -p bar (без параметра --follow) будет отображать историю файла только до того момента, когда он был переименован - он не будет отображать историю файла, когда он был известен. как foo. Использование git log --follow -p bar покажет всю историю файла, включая любые изменения в файле, когда он был известен как foo. Параметр -p обеспечивает включение различий при каждом изменении.

person Dan Moulding    schedule 30.03.2011
comment
Я нахожу это немного странным, но вы не можете использовать флаг -CC с log --follow file, иначе он ничего не найдет (git 1.7.0.4). - person Mikko Rantalainen; 09.02.2012
comment
--stat также полезен. Вы можете использовать его вместе с -p. - person Raffi Khatchadourian; 10.05.2012
comment
Я согласен, это НАСТОЯЩИЙ ответ. (1.) --follow гарантирует, что вы видите переименования файлов (2.) -p гарантирует, что вы видите, как файл изменяется (3.) это только командная строка. - person Trevor Boyd Smith; 11.09.2012
comment
Добавьте -- перед своим file, и это будет лучший ответ! - person NHDaly; 04.03.2014
comment
Вот это да. Меня устраивает. stackoverflow.com/a/1321962/3034747 и stackoverflow.com/a/5493663/3034747 - нет. Не знаю почему .. Я использую Ubuntu и GIT версии 2.0.2 - person Yana Agun Siswanto; 08.12.2014
comment
фатальный: неоднозначный аргумент 'my_file_name': неизвестная версия или путь не в рабочем дереве. - person Sarah Vessels; 09.03.2015
comment
@NHDaly Я заметил, что -- был добавлен, но я не знаю, почему это лучше всего? Что он делает? - person Benjohn; 27.05.2015
comment
@Benjohn Параметр -- сообщает Git, что он достиг конца параметров и что все, что следует за --, следует рассматривать как аргумент. Для git log это имеет значение, только если у вас есть имя пути, начинающееся с тире. Допустим, вы хотите узнать историю файла с неудачным именем - выполните: git log --follow -p -- --follow - person Dan Moulding; 28.05.2015
comment
@Benjohn: Обычно -- полезен, потому что он также может защитить от любых revision имен, совпадающих с введенным вами именем файла, что на самом деле может напугать. Например: если у вас есть и ветка, и файл с именем foo, git log -p foo будет отображать историю журнала git до foo, а не историю для файла foo. Но @DanMoulding прав в том, что, поскольку команда --follow принимает в качестве аргумента только одно имя файла, это менее необходимо, поскольку оно не может быть revision. Я только что узнал об этом. Может быть, вы были правы, когда не упомянули об этом в своем ответе; Я не уверен. - person NHDaly; 30.05.2015
comment
Это безумие, как далеко на длинной странице документации по git log нужно прочитать, прежде чем раздел Генерация патчей с -p. Этот ответ отлично объясняет --follow, было бы полезно объяснить и -p. - person dumbledad; 20.02.2016
comment
на самом деле @JohnLawrenceAspden поднял хороший момент (в своем ответе), чтобы также включить --all, чтобы увидеть историю файлов во всех ветвях. может быть полезно в некоторых случаях. - person cregox; 18.03.2017
comment
Будьте осторожны, чтобы не ввести неправильное имя файла (я забыл букву s в конце имени файла). В журнале git вы увидите сообщение skipping..., за которым следует серия тильд ~ (предположительно, по одной для каждой фиксации / я не знаю). - person The Red Pea; 21.12.2017
comment
Выкидывающая ошибка. fatal: unrecognized argument: --folow. Но команда git log -p <file/to/the/path> работала. - person Asim K T; 29.07.2018

Если вы предпочитаете использовать текстовый формат, вы можете использовать tig. .

Быстрая установка:

  • APT: # apt-get install tig
  • Homebrew (OS X): $ brew install tig

Используйте его для просмотра истории одного файла: tig [filename]

Или просмотрите подробную историю репозитория: tig

Он похож на gitk, но основан на тексте. Поддерживает цвета в терминале!

person Falken    schedule 07.06.2012
comment
Отличный текстовый инструмент, отличный ответ. Я испугался, когда увидел зависимости для установки gitk на мой безголовый сервер. Проголосовал бы снова A +++ - person Tom McKenzie; 24.10.2012
comment
Вы также можете просмотреть определенные файлы с помощью tig, т.е. tig -- path/to/specific/file - person gloriphobia; 27.10.2017

git whatchanged -p filename также эквивалентен _ 2_.

Вы также можете увидеть, когда определенная строка кода внутри файла была изменена с помощью _ 3_. Это распечатает короткий идентификатор фиксации, автора, метку времени и полную строку кода для каждой строки в файле. Это очень полезно после того, как вы обнаружили ошибку и хотите знать, когда она появилась (или кто виноват в ней).

person farktronix    schedule 11.11.2008
comment
Новым пользователям рекомендуется использовать вместо этого git-log. (...) Командование сохраняется прежде всего по историческим причинам; - person ciastek; 18.03.2014

Пользователи Sourcetree

Если вы используете Sourcetree для визуализации своего репозитория (это бесплатно и неплохо), вы можете щелкнуть файл правой кнопкой мыши и выбрать Выбранный журнал.

Введите описание изображения здесь

Отображение (ниже) намного удобнее, чем gitk и большинство других перечисленных опций. К сожалению (в настоящее время) нет простого способа запустить это представление из командной строки - интерфейс командной строки Sourcetree в настоящее время просто открывает репозитории.

Введите описание изображения здесь

person Mark Fox    schedule 30.07.2013
comment
Мне особенно нравится опция «Следить за переименованными файлами», которая позволяет увидеть, был ли файл переименован или перемещен. - person Chris; 13.03.2015
comment
но если я не ошибаюсь (пожалуйста, дайте мне знать!), в графическом интерфейсе можно одновременно сравнивать только две версии? Есть ли клиенты, у которых есть элегантный интерфейс для одновременной работы с несколькими разными версиями? Возможно, с уменьшенным изображением, как в Sublime Text? Думаю, это было бы действительно полезно. - person Sam Lewallen; 30.06.2015
comment
@SamLewallen Если я правильно понял, вы хотите сравнить три разных коммита? Это похоже на трехстороннее слияние (мое, ваше, базовое) - обычно эта стратегия используется для разрешения конфликтов слияния, не обязательно для сравнения трех произвольных коммитов. Существует множество инструментов, поддерживающих трехстороннее слияние stackoverflow.com/questions/10998728/, но трюк заключается в том, чтобы подавать этим инструментам определенные версии gitready.com/intermediate/2009/02/27/ - person Mark Fox; 30.06.2015
comment
Спасибо, Марк Фокс, вот что я имею в виду. Вы случайно не знаете о каких-либо приложениях, которые могут это сделать? - person Sam Lewallen; 30.06.2015
comment
Вы спасаете мне жизнь. Вы можете использовать gitk, чтобы найти SHA1 хэш, а затем открыть SourceTree, чтобы ввести Log Selected.. на основе найденного SHA1. - person AechoLiu; 25.01.2018
comment
Идеально. Я искал то же решение в сообществе сообщества ATLASSIAN Community. atlassian.com/t5/Sourcetree-questions/ - person 夜一林风; 22.03.2018
comment
@AechoLiu Зачем вам SHA, если у вас уже есть имя файла? (В любом случае, если вам нужен SHA, вы также можете найти его с помощью SourceTree.) - person Marnen Laibow-Koser; 14.03.2019
comment
@ MarnenLaibow-Koser Я не могу вспомнить, зачем мне тогда нужен SHA. Ахаха. - person AechoLiu; 14.03.2019

Чтобы показать, какая редакция и автор последний раз изменяли каждую строку файла:

git blame filename

или если вы хотите использовать мощный графический интерфейс пользователя:

git gui blame filename
person yllohy    schedule 11.08.2010
comment
Команды обвинения не отображают информацию об удаленном коде. Это показывает просмотр каждого коммита через gitk или tig. - person sterdun; 02.06.2021

Краткое изложение других ответов, прочитанных и немного поигравших:

Обычная команда командной строки будет

git log --follow --all -p dir/file.c

Но вы также можете использовать gitk (графический интерфейс) или tig (текстовый интерфейс), чтобы дать гораздо больше удобочитаемые способы взглянуть на это.

gitk --follow --all -p dir/file.c

tig --follow --all -p dir/file.c

В разделе Debian / Ubuntu, команда установки этих прекрасных инструментов соответствует ожиданиям:

sudo apt-get install gitk tig

И в настоящее время я использую:

alias gdf='gitk --follow --all -p'

так что я могу просто набрать gdf dir, чтобы получить точную историю всего в подкаталоге dir.

person John Lawrence Aspden    schedule 05.12.2012
comment
Думаю, это отличный ответ. Возможно, вас тоже не проголосуют, потому что вы отвечаете другими способами (имхо лучше), чтобы увидеть изменения, то есть через gitk и tig в дополнение к git. - person PopcornKing; 25.02.2013
comment
Просто чтобы добавить к ответу. Найдите путь (в пространстве git, до которого все еще существует в репозитории). Затем используйте указанную выше команду git log --follow --all -p ‹folder_path / file_path›. Может случиться так, что папка filde / была бы удалена из истории, поэтому найдите максимальный путь, который еще существует, и попытайтесь получить его историю. работает ! - person parasrish; 16.08.2016
comment
--all предназначен для всех веток, остальное объясняется в ответе @Dan - person cregox; 18.03.2017
comment
О, чувак, после того, как я так долго искал хорошее решение для отслеживания файлов, помимо переименований, наконец, я нашел его здесь. Работает как шарм! Спасибо! - person xZero; 08.03.2019

Добавьте этот псевдоним в свой .gitconfig:

[alias]
    lg = log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\n--abbrev-commit --date=relative

И используйте такую ​​команду:

> git lg
> git lg -- filename

Вывод будет выглядеть почти так же, как вывод gitk. Наслаждаться.

person Palesz    schedule 26.06.2013
comment
После того, как я запустил этот ярлык lg, я сказал (и цитирую) Красиво !. Однако обратите внимание, что \ n после --graph является ошибкой. - person jmbeck; 22.07.2013
comment
Также может использоваться git lg -p filename - возвращает красивую разницу найденного файла. - person Egel; 27.03.2015

Код Visual Studio можно использовать с GitLens. Это очень мощный инструмент.

После установки GitLens перейдите на вкладку GitLens, выберите FILE HISTORY, и вы сможете просмотреть его.

Введите здесь описание изображения

person foxiris    schedule 14.05.2019

Недавно я обнаружил tig и нашел его очень полезным. В некоторых случаях я бы хотел, чтобы он выполнял A или B, но в большинстве случаев это довольно аккуратно.

В вашем случае tig <filename> может быть тем, что вы ищете.

http://jonas.nitro.dk/tig/

person lang2    schedule 10.11.2015
comment
на centos yum установить tig - person zzapper; 24.01.2019

Я написал git -play именно для этой цели.

pip install git-playback
git playback [filename]

Это дает то преимущество, что результаты отображаются в командной строке (например, git log -p), а также позволяет вам проходить каждую фиксацию с помощью клавиш со стрелками (например, gitk).

person Jian    schedule 19.11.2012

Or:

gitx -- <path/to/filename>

если вы используете gitx

person George Anderson    schedule 17.09.2010
comment
По какой-то причине мой gitx открывается пустым. - person IgorGanapolsky; 04.09.2011
comment
@IgorGanapolsky, вы должны убедиться, что находитесь в корне вашего репозитория git - person zdsbs; 03.01.2014

Вы также можете попробовать это, в котором перечислены коммиты, которые изменили определенную часть файла (реализовано в Git 1.8.4).

Возвращенным результатом будет список коммитов, которые изменили эту конкретную часть. Команда:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

где upperLimit - это номер начальной строки, а lowerLimit - это номер конечной строки файла.

Более подробная информация находится на https://www.techpurohit.com/list-some-useful-git-commands.

person jitendrapurohit    schedule 13.08.2015
comment
Ссылка не работает - домен techpurohit.com больше не существует. - person Peter Mortensen; 14.06.2021

В пользовательском интерфейсе Sourcetree вы можете найти историю файла, выбрав опцию «Журнал выбранных» в контекстное меню, щелкнув правой кнопкой мыши:

Введите здесь описание изображения

Он покажет историю всех коммитов.

person savvyBrar    schedule 31.03.2020
comment
Откуда этот графический интерфейс? - person colidyre; 31.03.2020
comment
Пользовательский интерфейс Sourcetree. Спасибо - person savvyBrar; 06.04.2020
comment
что такое окна? - person Emobe; 10.06.2020
comment
@Emobe: Что ты имеешь в виду? Вы можете уточнить? (Похоже, что скриншот сделан в Microsoft Windows.) - person Peter Mortensen; 06.07.2021

Если вы хотите увидеть всю историю файла, включая во всех других ветках используйте:

gitk --all <filename>
person Adi Shavit    schedule 07.08.2012

Если вы используете графический интерфейс Git (в Windows):

В меню «Репозиторий» вы можете использовать «Визуализировать историю мастера». Выделите фиксацию в верхней панели и файл в правом нижнем углу, и вы увидите разницу для этой фиксации в нижнем левом углу.

person cori    schedule 10.11.2008
comment
Как это отвечает на вопрос? - person jmbeck; 22.07.2013
comment
Что ж, OP не указывал командную строку, и, переходя от SourceSafe (который является графическим интерфейсом), казалось уместным указать, что вы можете делать почти то же самое, что вы можете делать в VSS в графическом интерфейсе Git в Windows. - person cori; 22.07.2013

С помощью превосходного расширений Git вы переходите к тому моменту в истории, где файл все еще существовал ( если он был удален, в противном случае просто перейдите в HEAD), перейдите на вкладку File tree, щелкните файл правой кнопкой мыши и выберите File history.

По умолчанию он следует за файлом через переименования, а вкладка Blame позволяет увидеть имя данной ревизии.

В нем есть некоторые незначительные ошибки, например, отображение fatal: Not a valid object name на вкладке View при нажатии на ревизию для удаления, но я могу с этим смириться. :-)

person PhiLho    schedule 28.11.2012
comment
Стоит отметить, что это только для Windows. - person Evan Hahn; 10.05.2013
comment
@EvanHahn неточно, через моно можно использовать GitExtension также в Linux, мы используем его в ubuntu и вполне довольны этим. см. git-extensions-documentation.readthedocs.org/en/latest/ < / а> - person Shmil The Cat; 09.08.2015

SmartGit:

  1. В меню включить отображение неизмененных файлов: Просмотр / Показать неизмененные файлы
  2. Щелкните файл правой кнопкой мыши и выберите «Журнал» или нажмите «Ctrl-L».
person Antonín Slejška    schedule 01.06.2016

Если вы используете TortoiseGit, вы сможете щелкнуть файл правой кнопкой мыши и выполнить TortoiseGit --> Show Log. В появившемся окне убедитесь, что:

  • Параметр «Show Whole Project» не отмечен.

  • Выбрана опция «All Branches».

person user3885927    schedule 12.08.2015
comment
TortoiseGit (а также Eclipse Git) как-то пропускает ревизии выбранного файла, не рассчитывайте на это! - person Noam Manos; 30.11.2015
comment
@NoamManos, я не сталкивался с этой проблемой, поэтому я не могу проверить правильность вашего утверждения. - person user3885927; 01.12.2015
comment
Моя ошибка, это происходит только в Eclipse, но в TortoiseGit вы можете увидеть все версии файла, если сняли флажок, показывать весь проект + проверка всех ветвей (в случае, если файл был зафиксирован в другой ветке, прежде чем он был объединен с основной веткой). Я обновлю твой ответ. - person Noam Manos; 01.12.2015

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

git diff --cached
person Malks    schedule 01.12.2011
comment
Если вы хотите включить локальные (неустановленные) изменения, я часто запускаю git diff origin/master, чтобы показать полные различия между вашей локальной веткой и главной ветвью (которая может быть обновлена ​​удаленно через git fetch) - person ghayes; 21.07.2013

git diff -U <filename> даст вам единую разницу.

Он должен быть окрашен в красный и зеленый цвета. Если это не так, запустите сначала git config color.ui auto.

person Lukasz Czerwinski    schedule 20.05.2013

Если вы используете Eclipse с подключаемым модулем Git, у него есть отличное представление для сравнения с историей. Щелкните файл правой кнопкой мыши и выберите Сравнить с → История.

person AhHatem    schedule 02.01.2013
comment
Однако это не позволит вам найти удаленный файл. - person avgvstvs; 27.09.2013
comment
Сравнение двух версий файла отличается от просмотра истории изменений файла. - person golimar; 07.05.2015

Я, наверное, о том, где был OP, когда это началось, ищу что-то простое, что позволило бы мне использовать git difftool с vimdiff для просмотра изменений файлов в моем репо, начиная с конкретный коммит. Я был не очень доволен найденными ответами, поэтому я скинул этот скрипт git inc remental rep orter (gitincrep) вместе, и он мне пригодился:

#!/usr/bin/env bash

STARTWITH="${1:-}"
shift 1

DFILES=( "$@" )

RunDiff()
{
        GIT1=$1
        GIT2=$2
        shift 2

        if [ "$(git diff $GIT1 $GIT2 "$@")" ]
        then
                git log ${GIT1}..${GIT2}
                git difftool --tool=vimdiff $GIT1 $GIT2 "$@"
        fi
}

OLDVERS=""
RUNDIFF=""

for NEWVERS in $(git log --format=format:%h  --reverse)
do
        if [ "$RUNDIFF" ]
        then
                RunDiff $OLDVERS $NEWVERS "${DFILES[@]}"
        elif [ "$OLDVERS" ]
        then
                if [ "$NEWVERS" = "${STARTWITH:=${NEWVERS}}" ]
                then
                        RUNDIFF=true
                        RunDiff $OLDVERS $NEWVERS "${DFILES[@]}"
                fi
        fi
        OLDVERS=$NEWVERS
done

Вызывается без аргументов, он будет начинаться с начала истории репо, в противном случае он начнется с любого сокращенного хеша фиксации, который вы предоставите, и перейдет к настоящему моменту - вы можете в любой момент выйти с помощью Ctrl-C. Любые аргументы после первого будут ограничивать отчеты о различиях, чтобы включать только файлы, перечисленные среди этих аргументов (что, я думаю, это то, что хотел OP, и я бы рекомендовал для всех, кроме крошечных проектов). Если вы проверяете изменения в определенных файлах и хотите начать сначала, вам нужно будет указать пустую строку для arg1. Если вы не являетесь пользователем vim, вы можете заменить vimdiff на свой любимый инструмент сравнения.

Поведение заключается в том, чтобы выводить комментарии фиксации при обнаружении соответствующих изменений и предлагать запуски vimdiff для каждого измененного файла (это поведение git difftool, но здесь оно работает).

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

person oracleif    schedule 27.03.2020