Показать историю файла?

Возможный дубликат:
Просмотр истории изменений файла с помощью управления версиями Git

Иногда мне хочется просмотреть историю конкретного файла. Раньше я использовал P4V, и это было очень быстро и интуитивно понятно.

  1. Щелкните файл правой кнопкой мыши и выберите историю.
  2. Прокрутите даты и посмотрите, что именно изменилось в этом файле за эту дату. Простой.

Переход на git - теперь изнурительная задача.

  1. "git имя файла журнала"
  2. Посмотрите историю и выберите дату, скопируйте хеш
  3. "git diff hash"
  4. Прокрутите diff для того, что изменилось в интересующем меня файле.
  5. Нет, это не так, давайте попробуем другую дату - вернитесь к шагу 2, промойте и повторите.

Я искал SO и пробовал несколько из часто предлагаемых guis: github, gitk, gitg, git-gui.

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

Все данные находятся в репо, поэтому я не вижу причин, по которым этот простой общий вариант использования нельзя было бы более оптимизировать.

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

Спасибо за любые предложения.


person Chris    schedule 21.03.2012    source источник
comment
Не знаю, хотите ли вы этого, но помогает ли git diff --stat или git diff filename в вашем деле?   -  person uday    schedule 21.03.2012


Ответы (4)


Вы пробовали это:

gitk path/to/file
person Pierre Mage    schedule 21.03.2012
comment
Кажется, отображается последняя фиксация, коснувшаяся пути / к / файлу - person Chris; 21.03.2012
comment
Он должен показать вам интерфейс gitk для пути / к / файлу, включая коммиты и различия, а не только последний коммит. - person Pierre Mage; 21.03.2012
comment
Собственно, похоже, это именно то, что мне нужно - вся шкала времени ориентирована на путь / к / файлу. - person Chris; 21.03.2012
comment
У меня это не работает - я просто получаю пустой экран с текстом «Никаких коммитов не выбрано». - person Tola Odejayi; 08.07.2016
comment
В последней версии macOS gitk плохо масштабируется до высокого разрешения. Кроме того, это круто - person Chang Qian; 30.10.2018
comment
это настоящая спасательница ... большое спасибо @PierreMage - person Leonardo Contini; 22.06.2020

Вы можете использовать git log для отображения различий во время поиска:

git log -p -- path/to/file
person ralphtheninja    schedule 21.03.2012
comment
Мне это нравится - намного лучше. Единственное, что было бы лучше, - это графический интерфейс для более удобного представления различий ... - person Chris; 21.03.2012
comment
через некоторое время вам понравятся консольные различия, просто включите цвета - person the.malkolm; 21.03.2012
comment
Я согласен. git --config --global color.ui true - person ralphtheninja; 21.03.2012
comment
вы также можете передать разницу в текстовый редактор, такой как Sublime, для улучшения цветов, функциональности поиска и общего удобства работы: git log -p -- path/to/file | subl - person Rocco; 01.08.2016
comment
Чтобы сделать вывод более читабельным, вы можете обернуть длинные строки, набрав -S, а затем Return. Работает, если ваш git меньше использует пейджер Linux по умолчанию. (источник) - person tanius; 28.12.2016
comment
Включение цветов определенно полезно. Однако команда выглядит как git config --global color.ui true (без двойного тире перед конфигурацией). По крайней мере, это то, что сработало для меня, используя git версии 1.9.1 - person Norman Breau; 16.08.2017
comment
Это очень полезно! Почему -p упоминается в документе только косвенно ??? git-scm.com/docs/git-log - person Jerry101; 10.08.2019

git log -p будет генерировать патч (различие) для каждой выбранной фиксации. Для одного файла используйте git log --follow -p $file.

Если вы ищете конкретное изменение, используйте git bisect, чтобы найти изменение в представлениях журнала (n) по разделите количество коммитов пополам, пока не найдете, где изменилось то, что вы ищете.

Также подумайте о том, чтобы вернуться в историю, используя git blame, чтобы следить за изменениями в рассматриваемой строке, если вы знаете, что это такое. Эта команда показывает самую последнюю ревизию, которая повлияла на определенную строку. Возможно, вам придется вернуться на несколько версий назад, чтобы найти первое изменение, в которое что-то было внесено, если кто-то изменил это с течением времени, но это может дать вам хорошее начало.

Наконец, gitk как графический интерфейс сразу показывает мне патч для любой фиксации, на которую я нажимаю.

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

person Jeff Ferland    schedule 21.03.2012
comment
Хорошая информация, спасибо. Однако что касается графического интерфейса - здесь есть проблема, которую я описывал - да, он показывает разницу для фиксации / файла. Но не для всех различий в файле. Похоже, я застрял в командной строке! - person Chris; 21.03.2012
comment
@Chris щелкните другую ревизию в верхнем левом окне, и вы увидите соответствующую разницу в нижнем левом окне. Если вы говорите о чем-то другом, не могли бы вы уточнить? - person Jeff Ferland; 21.03.2012
comment
Это в сочетании с gitk path / to / file делает свое дело! - person Chris; 21.03.2012
comment
@Chris Перейдите в меню View -> Edit view..., и вы найдете очень мощные критерии фильтрации, которые дадут вам большую гибкость в сужении области поиска, помимо перечисления пути в командной строке (вы также можете здесь, и не нужно перезапускать экземпляры). - person Jeff Ferland; 21.03.2012

Для меня главный вопрос: что вы на самом деле пытаетесь выяснить? Вы пытаетесь узнать, когда в этот файл был внесен определенный набор изменений?

Вы можете использовать для этого git blame, он пометит каждую строку с помощью SHA1 и даты, когда она была изменена. git blame также может сказать вам, когда определенная строка была удалена или куда она была перемещена, если вам это интересно.

Если вы пытаетесь выяснить, когда была обнаружена определенная ошибка, git bisect - очень мощный инструмент. git bisect выполнит двоичный поиск по вашей истории. Вы можете использовать git bisect start, чтобы начать деление пополам, затем git bisect bad, чтобы отметить фиксацию, в которой присутствует ошибка, и git bisect good, чтобы отметить фиксацию, в которой нет ошибки. git проверит фиксацию между ними и спросит вас, хорошо это или плохо. Обычно ошибочную фиксацию можно найти за несколько шагов.

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

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

person LiKao    schedule 21.03.2012
comment
Думаю, вы правы, как опытный пользователь я просто привык чувствовать, что меняется в файле, щелкая по истории. Я знаю, что такие инструменты, как git blame, быстрее определяют, кто последним коснулся конкретной строки - (что-то, что было изнурительно найти по необходимости). Но для обычного просмотра истории файла - git немного утомительнее. - person Chris; 21.03.2012
comment
@Chris: Да, это во многом связано с дизайном git. На базовом уровне в git нет такого понятия, как история файлов. Об этом часто говорят, что git не управляет файлами, а управляет контентом. Для git все ваше рабочее дерево - это контент, а история - это история всего этого каталога. Это сильно отличается от других SCM, которые прикрепляют историю к отдельным файлам. - person LiKao; 21.03.2012
comment
Я понимаю, но старые привычки живы :) - person Chris; 21.03.2012