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

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

Я дошел до:

git log -- [filename]

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

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

28 ответов

Решение

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

gitk [filename]

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

gitk --follow [filename]

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

git log -p filename

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

Увидеть

git help log

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

git show HEAD 

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

gitk

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

git log --follow -p -- file

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

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

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

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

  • apt-get: # apt-get install tig
  • Доморощенный (OS X): $ brew install tig

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

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

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

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

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

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

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

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

git blame filename

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

git gui blame filename

Резюме других ответов после их прочтения и небольшой игры:

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

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, команда install для этих замечательных инструментов выглядит так:

sudo apt-get install gitk tig

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

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

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

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

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

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

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

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

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

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

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

где upperLimit - начальный_линий_номер, а нижний_лимит - конечный_линий-номер файла.

В пользовательском интерфейсе Sourcetree (https://www.sourcetreeapp.com/) вы можете найти историю файла, выбрав опцию "Log Selected" в контекстном меню правой кнопки мыши:

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

Я написал Git-воспроизведения для этой цели

pip install git-playback
git playback [filename]

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

Или же:

gitx -- <path/to/filename>

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

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

gitk --all <filename>

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

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

git rev-list HEAD --oneline FileName


Например

git rev-list HEAD --oneline index.html

Выход

      7a2bb2f update_index_with_alias
6c03e56 update_changes
e867142 Revert "add_paragraph"

Если вы хотите просмотреть изменения, внесенные в файл

git log -p fileName

Посмотреть GIF-изображение

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

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

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

SmartGit:

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

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

git diff --cached

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

  • 'Show Whole Projectопция не проверена.

  • 'All Branchesопция отмечена.

Как вручную просмотреть историю изменений файла графически в

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

      git log --follow --oneline -- path/to/file.c

Пример запуска и вывода:

      eRCaGuy_hello_world$ git log --follow --oneline -- c/alsa_aplay__play_tone_sound_WIP.c
04b67fb (HEAD -> master) Update c/alsa_aplay__play_tone_sound_WIP.c
301122a wip: alsa_aplay__play_tone_sound.c: finish initial version of program
d4e8092 wip: add c/alsa_aplay__play_tone_sound.c

Теперь я могу просто посмотреть на последние изменения графически в meldвот так (извлекая хэши коммитов из приведенного выше вывода).

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

      # just the last change
git difftool 04b67fb~..04b67fb

# and the one before that
git difftool 301122a~..301122a

# ...and before that
git difftool d4e8092~..d4e8092

Если вам нужно указать имя файла, просто сделайте это с помощью:

      git difftool 04b67fb~..04b67fb -- path/to/file.c

git diff -U <filename> дать вам унифицированный дифференциал.

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

Вы можете использовать команду git log следующим образом:

      git log -L 992,+4:path-to-file

Объяснение : Здесь показан номер строки, в которой вы хотите просмотреть информацию о версии.+4указывает, сколько строк вы хотите видеть после указанной строки992. И, наконец, путь к файлу. Обычно он начинается с./src/..

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

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

git log --follow -p -- <file>

Я, наверное, о том, где был OP, когда это началось, ищу что-то простое, что позволило бы мне использовать git difftool с vimdiff для просмотра изменений файлов в моем репо, начиная с определенного коммита. Я был не очень доволен найденными ответами, поэтому я собрал этот скрипт git incremental reporter (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.

Другие вопросы по тегам