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

2672

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

Дошел до:

git log -- [filename]

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

Я пытаюсь сделать переход от MS SourceSafe, и это было просто right-clickshow history.

  • 40
    Приведенная выше ссылка больше не действительна. Эта ссылка работает сегодня: Git Community Book
Теги:
git-log

21 ответ

1982
Лучший ответ

Для этого я бы использовал:

gitk [filename]

или следовать имени файла прошлых переименований

gitk --follow [filename]
  • 27
    Но у меня даже есть инструмент, который сочетает в себе все вышеизложенное с «мерзавцем», позволяющим мне просматривать исходный файл по мере его изменения во времени ...
  • 2
    GitWeb является ответом на это.
Показать ещё 24 комментария
1951

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

git log -p filename

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

См

git help log

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

git show HEAD 

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

gitk

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

  • 6
    git show HEAD показывает все файлы, знаете ли вы, как отслеживать отдельный файл (как просил Ричард)?
  • 3
    вы используете: git show <revision> - имя файла, которое будет отображать различия для этой ревизии, если она существует.
Показать ещё 8 комментариев
1292

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

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

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

  • 0
    Я считаю , это немного странно , но вы не можете использовать -CC флаг с log --follow file или он не найдет ничего (GIT 1.7.0.4).
  • 14
    --stat также полезно. Вы можете использовать его вместе с -p.
Показать ещё 13 комментариев
146

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

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

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

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

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

  • 19
    Отличный текстовый инструмент, отличный ответ. Я испугался, когда увидел зависимости для установки gitk на моем безголовом сервере. Буду снова голосовать A +++
  • 0
    Вы также можете посмотреть определенные файлы с помощью tig, например, tig -- path/to/specific/file
102

git whatchanged -p filename также эквивалентно git log -p filename в этом случае.

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

  • 4
    +1, но filename не является обязательным в команде git blame filename .
  • 4
    «Новым пользователям рекомендуется использовать вместо этого git-log. (...) Команда сохраняется в основном по историческим причинам;»
94

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

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

Изображение 7475

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

Изображение 7476

  • 1
    Мне особенно нравится опция «Отслеживать переименованные файлы», которая позволяет вам видеть, был ли файл переименован или перемещен.
  • 0
    но если я не ошибаюсь (пожалуйста, дайте мне знать!), можно сравнить только две версии одновременно в графическом интерфейсе? Есть ли клиенты, которые имеют элегантный интерфейс для показа нескольких разных версий одновременно? Возможно, с уменьшенным изображением, как в Sublime Text? Это было бы действительно полезно, я думаю.
Показать ещё 6 комментариев
61

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

git blame filename

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

git gui blame filename
44

Сводка других ответов после прочтения их и игры немного:

Командой обычной команды будет

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

Но вы также можете использовать gitk (gui) или tig (text-ui), чтобы дать гораздо более понятные для человека способы взглянуть на него.

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.

  • 2
    Я думаю, что это отличный ответ. Может быть, вас тоже не голосуют, потому что вы отвечаете другими способами (ИМХО лучше), чтобы увидеть изменения, например, через gitk и tig в дополнение к git.
  • 0
    Просто чтобы добавить, чтобы ответить. Найдите путь (в git-пространстве, до которого до сих пор существует в хранилище). Затем используйте указанную выше команду "git log --follow --all -p <folder_path / file_path>". Может случиться так, что папка / файл была бы удалена за историю, поэтому найдите максимальный путь, который все еще существует, и попытайтесь извлечь его историю. работает !
Показать ещё 2 комментария
21

Добавьте этот псевдоним в свой .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. Наслаждайтесь.

  • 0
    После того, как я запустил этот ярлык LG, я сказал (и я цитирую) «Прекрасно!». Однако обратите внимание, что «\ n» после «--graph» является ошибкой.
  • 3
    Также можно использовать git lg -p filename - он возвращает красивую разность искомого файла.
17

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

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

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

  • 0
    на Centos Yum установить тиг
14

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

pip install git-playback
git playback [filename]

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

13

Или:

gitx -- <path/to/filename>

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

  • 1
    По какой-то причине мой gitx открывается пустым.
  • 0
    @IgorGanapolsky вы должны убедиться, что вы находитесь в корне вашего git-репозитория
9

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

gitk --all <filename>
8

Если вы используете графический интерфейс git (в Windows) в меню "Репозиторий", вы можете использовать "Визуализировать главную историю". Выделите фиксацию в верхней панели и файл в правом нижнем углу, и вы увидите разницу для этой фиксации в левом нижнем углу.

  • 0
    Как это отвечает на вопрос?
  • 2
    Что ж, OP не указывал командную строку, и, переходя от SourceSafe (который является GUI), казалось уместным указать, что вы можете делать почти то же самое, что вы можете делать в VSS в Git GUI на Windows.
7

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

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

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

  • 0
    Стоит отметить, что это только для Windows.
  • 3
    @EvanHahn не точный, через моно можно использовать GitExtension также и в Linux, мы используем его в Ubuntu и очень довольны этим. см. git-extensions-documentation.readthedocs.org/en/latest/…
4

SmartGit:

  • В меню разрешено отображать неизменяемые файлы: просмотр/просмотр неизмененных файлов
  • Щелкните правой кнопкой мыши файл и выберите "Журнал" или нажмите "Ctrl-L"
4

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

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

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

где upperLimit - это start_line_number, а lowerLimit - это конечный_файл_нумера файла.

4

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

  • 'Show Whole Project' не проверяется.

  • 'All Branches'.

  • 0
    TortoiseGit (и Eclipse Git также) почему-то пропускает ревизии выбранного файла, не рассчитывайте на это!
  • 0
    @ NoamManos, я не сталкивался с этой проблемой, поэтому я не могу проверить правильность вашего утверждения.
Показать ещё 1 комментарий
4

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

git diff --cached
  • 1
    Если вы хотите включить локальные (немаркированные) изменения, я часто запускаю git diff origin/master чтобы показать полную разницу между вашей локальной веткой и главной веткой (которую можно обновить удаленно с помощью git fetch )
  • 0
    -1, это разница, а не история изменений.
3

git diff -U <filename> дает вам единый diff.

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

2

Если вы используете eclipse с плагином git, у него есть отличное сравнение с историей. Щелкните правой кнопкой мыши файл и выберите "compare with" = > "history"

  • 0
    Однако это не позволит вам найти удаленный файл.
  • 0
    Сравнение двух версий файла отличается от просмотра истории изменений файла.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню