Просмотр истории изменений файла с помощью Git-версий
Как я могу просмотреть историю изменений отдельного файла в Git, полную информацию о том, что изменилось?
Я дошел до:
git log -- [filename]
который показывает мне историю коммитов файла, но как мне узнать содержание каждого файла?
Я пытаюсь сделать переход от MS SourceSafe, и это было простым right-click
→ show 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>
может быть то, что вы ищете.
Вы также можете попробовать это, в котором перечислены коммиты, которые изменили определенную часть файла (реализовано в 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
).
Если вы хотите просмотреть всю историю файла, в том числе и во всех других ветках, используйте:
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
С отличными Git Extensions вы переходите к точке в истории, где файл еще существовал (если он был удален, в противном случае просто перейдите к HEAD), переключитесь на File tree
щелкните правой кнопкой мыши на файле и выберите File history
,
По умолчанию он следует за файлом через переименования, а Blame
Вкладка позволяет увидеть название в данной ревизии.
У этого есть некоторые незначительные ошибки, такие как показ fatal: Not a valid object name
в View
при нажатии на ревизию удаления, но я могу жить с этим.:-)
- В меню включите отображение неизмененных файлов: Просмотр / Показать неизмененные файлы
- Щелкните правой кнопкой мыши файл и выберите "Журнал" или нажмите "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.