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

вопрос создан в Fri, Apr 28, 2017 12:00 AM

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

Я дошел до

git log -- [filename]

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

Я пытаюсь сделать переход с MS SourceSafe, который раньше был простым right-clickshow history.

    
2798
  1. Ссылка выше не действительна. Эта ссылка работает сегодня: Git Community Book
    2010-05-10 08: 58: 56Z
  2. Ссылка выше (опубликованная Крисом) больше не действительна. Эта ссылка работает сегодня: git-scm.com/book/en/v2
    2019-04-23 22: 10: 33Z
    22 ответа                              22                         

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

    gitk [filename]
    

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

    gitk --follow [filename]
    
        
    2182
    2016-09-21 08: 17: 58Z
    1. Но у меня даже есть инструмент, который совмещал вышеупомянутое с «git blame», позволяя мне просматривать источник файла, поскольку он изменяется во времени ...
      2010-04-06 15: 50: 03Z
    2. К сожалению, это не соответствует истории файла после переименования.
      2011-03-30 23: 17: 40Z
    3. Я также искал историю файлов, которые были ранее переименованы, и сначала нашел эту тему. Решением является использование "git log --follow < filename >" как указал Фил здесь .
      2011-04-26 09: 05: 38Z
    4. Автор искал инструмент командной строки. Хотя gitk поставляется с GIT, он не является ни приложением командной строки, ни особенно хорошим графическим интерфейсом.
      2011-07-18 15: 17: 40Z
    5. Он искал инструмент командной строки? «правый клик -> показать историю», конечно, не подразумевает этого.
      2013-05-13 14: 57: 28Z

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

    git log -p filename
    

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

    См

    git help log
    

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

    git show HEAD 
    

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

    gitk
    

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

        
    2035
    2014-10-03 16: 56: 19Z
    1. git show HEAD показывает все файлы, знаете ли вы, как отслеживать отдельный файл (как просил Ричард)?
      2011-02-17 17: 13: 41Z
    2. вы используете: git show < revision > - имя файла, который покажет различия для этой ревизии, вСлучай существует один.
      2012-02-09 21: 44: 19Z
    3. - статистика также полезна. Вы можете использовать его вместе с -p.
      2012-05-09 22: 29: 19Z
    4. Это здорово. Гитк не ведет себя хорошо при указании путей, которые больше не существуют. Я использовал git log -p - путь.
      2013-02-27 18: 05: 36Z
    5. Плюс гитк выглядит так, будто его создал монстр-буги. Это отличный ответ, который лучше всего подходит для оригинального вопроса.
      2013-07-21 19: 28: 08Z

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

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

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

        
    1360
    2019-01-28 10: 46: 50Z
    1. - статистика также полезна. Вы можете использовать его вместе с -p.
      2012-05-09 22: 29: 31Z
    2. Я согласен, что это РЕАЛЬНЫЙ ответ. (1.) --follow гарантирует, что вы видите переименования файлов (2.) -p гарантирует, что вы видите, как файл изменяется (3.) это только командная строка.
      2012-09-11 18: 54: 54Z
    3. @ NHDaly Я заметил, что был добавлен --, но я не знаю, почему это делает его лучше? Что это делает?
      2015-05-27 15: 10: 43Z
    4. @ Benjohn Опция -- сообщает Git, что он достиг конца опций и что все, что следует за --, должно рассматриваться как аргумент. Для git log это имеет значение, только если у вас есть путь, начинающийся с тире . Допустим, вы хотите узнать историю файла с неудачным именем "--follow": git log --follow -p -- --follow
      2015-05-28 16: 10: 23Z
    5. @ Benjohn: как правило, -- полезен, потому что он также может защищать от любых имен revision, которые соответствуют введенному вами имени файла, что на самом деле может быть страшным. Например: если у вас есть как ветвь, так и файл с именем foo, то git log -p foo будет отображать историю журнала git до foo, а не историю для файла foo. Но @DanMoulding 0505035050 это правильно Команда принимает только одно имя файла в качестве аргумента, это менее необходимо, поскольку это не может быть --follow. Я только что узнал об этом. Может быть, вы были правы, оставив это без ответа; Я не уверен.
      2015-05-30 06: 03: 11Z

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

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

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

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

    Аналогичен tig, но основан на тексте. Поддерживает цвета в терминале!

        
    158
    2013-06-11 22: 19: 16Z
    1. Отличный текстовый инструмент, отличный ответ. Я испугался, когда увидел зависимости для установки gitk на моем безголовом сервере. Снова проголосую A +++
      2012-10-24 05: 28: 09Z
    2. Вы также можете просматривать определенные файлы с помощью tig, т.е. gitk
      2017-10-27 12: 05: 50Z

    tig -- path/to/specific/file также эквивалентен git whatchanged -p filename в этом случае.

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

        
    109
    2014-05-12 20: 40: 08Z
    1. + 1, но git blame filename не является обязательным в команде filename.
      2013-03-08 09: 45: 01Z
    2. "Вместо этого новым пользователям рекомендуется использовать git-log. (...) Команда сохраняется в основном по историческим причинам;"
      2014-03-18 08: 03: 18Z

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

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

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

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

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

        
    96
    2013-07-30 18: 55: 48Z
    1. Мне особенно нравится опция «Отслеживать переименованные файлы», которая позволяет увидеть, был ли файл переименован или перемещен.
      2015-03-13 13: 07: 48Z
    2. но если я не ошибаюсь (пожалуйста, дайте мне знать!), в графическом интерфейсе можно сравнивать только две версии одновременно? Есть ли клиенты, которые имеют элегантный интерфейс для показа нескольких разных версий одновременно? Возможно, с уменьшенным изображением, как в Sublime Text? Я думаю, это было бы очень полезно.
      2015-06-30 06: 16: 11Z
    3. @ SamLewallen Если я правильно понимаю, вы хотите сравнить три разных коммита? Это похоже на трехстороннее слияние (мое, ваше, базовое) - обычно эта стратегия используется для разрешения конфликтов слияния, не обязательно сравнивающих три произвольных фиксации. Есть много инструментов, которые поддерживают трехстороннее слияние stackoverflow.com/questions/10998728/… но хитрость заключается в том, чтобы подать эти инструменты конкретным ревизиям gitready.com/intermediate/2009/02/27/…
      2015-06-30 18: 47: 51Z
    4. Спасибо Марк Фокс, вот что я имею в виду. Вам известно о каких-либо приложениях, которые будут это делать?
      2015-06-30 19: 02: 31Z
    5. @ MarnenLaibow-Koser Я не могу вспомнить, зачем мне нужен SHA в то время. Ахаха.
      2019-03-14 00: 30: 50Z

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

    git blame filename

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

    git blame filename
    
        
    62
    2013-10-23 18: 00: 00Z

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

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

    git gui blame filename
    

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

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

    В debian /ubuntu команда установки для этих замечательных инструментов выглядит так:

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

    И я сейчас использую:

    sudo apt-get install gitk tig
    

    чтобы я мог просто набрать

    alias gdf='gitk --follow --all -p'
    
    , чтобы получить целевую историю всего в подкаталоге gdf dir.     
    45
    2012-12-05 18: 38: 20Z
    1. Я думаю, что это отличный ответ. Возможно, вас также не голосуют, потому что вы отвечаете другими способами (ИМХО лучше), чтобы увидеть изменения, например, через gitk и tig в дополнение к git.
      2013-02-25 17: 11: 55Z
    2. Просто чтобы добавить к ответу. Найдите путь (в git-пространстве, до которого до сих пор существует в хранилище). Затем используйте указанную выше команду "git log --follow --all -p < folder_path /file_path >". Может случиться так, что папка /файл была бы удалена за историю, поэтому найдите максимальный путь, который все еще существует, и попытайтесь извлечь его историю. работает!
      2016-08-16 10: 04: 50Z
    3. dir предназначен для всех ветвей, остальное объясняется в ответе @ Dan
      2017-03-18 09: 44: 28Z
    4. О, чувак, после столь долгого времени поиска хорошего решения для отслеживания файла после переименования, наконец, я нашел его здесь. Работает как шарм! Спасибо!
      2019-03-08 14: 34: 16Z

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

    --all

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

    [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
    

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

        
    24
    2014-03-10 04: 04: 30Z
    1. После того, как я запустил этот ярлык lg, я сказал (и я цитирую) "Beautiful!". Однако обратите внимание, что «\n» после «--graph» является ошибкой.
      2013-07-22 14: 40: 02Z
    2. Также можно использовать
      > git lg
      > git lg -- filename
      
      - он возвращает красивую разность искомого файла.
      2015-03-27 12: 11: 56Z

    В последнее время я обнаружил git lg -p filename и нашел его очень полезным. В некоторых случаях мне бы хотелось, чтобы это делалось А или В, но в большинстве случаев это довольно аккуратно.

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

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

        
    20
    2017-07-29 01: 04: 45Z
    1. на сайте yum install tig
      2019-01-24 12: 24: 07Z

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

    tig <filename>

    Преимуществом этого является отображение результатов в командной строке (например,

    pip install git-playback
    git playback [filename]
    
    ), а также возможность пошагового выполнения каждого коммита с помощью клавиш со стрелками (например, git log -p).     
    15
    2013-12-26 09: 07: 06Z

    Или:

    gitk р>

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

        
    13
    2010-09-17 16: 50: 30Z
    1. По какой-то причине мой gitx открывается пустым.
      2011-09-04 16: 19: 45Z
    2. @ IgorGanapolsky вы должны убедиться, что вы находитесь в корне своего репозитория git
      2014-01-03 18: 17: 41Z

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

    gitx -- <path/to/filename>     
    9
    2012-08-07 13: 57: 47Z

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

    gitk --all <filename>
    
    , щелкните правой кнопкой мыши файл и выберите File tree.

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

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

        
    7
    2012-11-28 15: 58: 50Z
    1. Стоит отметить, что это только для Windows.
      2013-05-09 20: 39: 56Z
    2. @ EvanHahn не точный, через моно можно использовать GitExtension также в Linux, мы используем его в Ubuntu и очень довольны этим. см. git-extensions-documentation.readthedocs.org/en/latest/…
      2015-08-09 17: 42: 19Z

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

        
    7
    2012-12-05 18: 39: 49Z
    1. Как это отвечает на вопрос?
      2013-07-22 14: 42: 43Z
    2. Что ж, OP не указал командную строку, и, переходя от SourceSafe (который представляет собой GUI), показалось уместным указать, что вы можете сделать почти то же самое что вы можете сделать в VSS в графическом интерфейсе Git в Windows.
      2013-07-22 15: 34: 36Z

    SmartGit :

    1. В меню включите отображение неизмененных файлов: просмотр /отображение неизмененных файлов
    2. Щелкните правой кнопкой мыши файл и выберите «Журнал» или нажмите «Ctrl-L»
    5
    2016-06-01 10: 44: 13Z

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

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

    View

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

    Более подробную информацию можно найти на https://www.techpurohit.com/list- некоторые-полезно-GIT-команд р>     

    5
    2019-04-20 05: 18: 10Z

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

    git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>
    
        
    4
    2011-12-01 05: 24: 23Z
    1. Если вы хотите включить локальные (не ступенчатые) изменения, я часто запускаю
      git diff --cached
      
      , чтобы показать полную разницу между вашей локальной веткой и главной веткой (которую можно обновить с удаленного компьютера). через git diff origin/master)
      2013-07-21 19: 47: 57Z
    2. - 1, это разница, а не история изменений.
      2014-02-22 00: 04: 44Z

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

    • параметр "TortoiseGit --> Show Log" не отмечен.

    • опция "Show Whole Project" отмечена.

    4
    2015-12-02 09: 52: 25Z
    1. TortoiseGit (и Eclipse Git также) почему-то пропускает ревизии oЕсли выбранный файл, не рассчитывайте на него!
      2015-11-30 10: 54: 17Z
    2. @ NoamManos, я не сталкивался с этой проблемой, поэтому не могу проверить правильность вашего утверждения.
      2015-11-30 23: 20: 57Z
    3. Моя ошибка, это происходит только в Eclipse, но в TortoiseGit вы можете увидеть все ревизии файла, если снять отметку «показать все проекты» + проверить «все ветви» (в если файл был зафиксирован в другой ветви, перед тем как он был объединен с основной веткой). Я обновлю ваш ответ.
      2015-12-01 12: 06: 02Z

    All Branches даст вам унифицированный дифференциал.

    Он должен быть окрашен в красный и зеленый цвета. Если это не так, сначала выполните: git diff -U <filename>.

        
    3
    2013-09-06 09: 12: 42Z

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

        
    2
    2013-01-02 19: 35: 17Z
    1. Однако это не позволит вам найти удаленный файл.
      2013-09-27 13: 22: 42Z
    2. Сравнение двух версий файла отличается от просмотра истории изменений файла
      2015-05-07 10: 22: 38Z

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

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

        
    0
    2019-05-14 04: 08: 29Z
    FILE HISTORY
источник размещен Вот