Питання Переглянути історію змін файлу за версією Git


Як переглянути історію змін окремих файлів у Git, повні відомості про те, що змінилося?

Я маю до того, як:

git log -- [filename]

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

Я намагаюся перейти з MS SourceSafe, і це було простим right-click → show history.


2510
2017-11-10 15:42


походження


Наведене вище посилання більше недійсне. Це посилання працює сьогодні: Git Community Book - chris


Відповіді:


Для цього я б користуюсь:

gitk [filename]

або слідувати імені файлу минулого перейменування

gitk --follow [filename]

1951
2017-08-24 12:05



Але я досить навіть маю інструмент, який поєднував вищезгадані з "git guilty", що дозволяє переглядати джерело файлу, оскільки воно змінюється в часі ... - Egon Willighagen
На жаль, це не означає історію файлу минулого перейменування. - Dan Moulding
Я також шукав історію файлів, які раніше були перейменовані, і вперше знайшли цю тему. Рішенням є використання "git log --follow <filename>", як зазначив Філ тут. - Florian Gutmann
Автор шукав інструмент командного рядка. Хоча gitk поставляється з GIT, це не прикладна програма командного рядка, а особливо графічний інтерфейс. - mikemaccana
Чи шукав він інструмент командного рядка? "Клацніть правою кнопкою миші -> показати історію", звичайно, це не означає. - hdgarrood


Ви можете використовувати

git log -p filename

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

Побачити

git help log

для додаткових параметрів - це дійсно може зробити багато хороших речей :) Щоб отримати тільки різницю для конкретного зобов'язання ви можете

git show HEAD 

або будь-яку іншу версію за ідентифікатором. Або використовувати

gitk

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


1836
2017-11-10 15:56



git show HEAD показує всі файли, чи знаєте ви, як відстежувати окремий файл (як запитував Річард)? - Jonas Byström
ви використовуєте: git show <revision> - ім'я файлу, яке покаже відмінності для цієї версії, якщо така існує. - Marcos Oliveira
--стат також корисний. Ви можете використовувати його разом з -p. - Raffi Khatchadourian
Це чудово. gitk не поводиться добре, вказавши шляхи, які більше не існують. Я використав git log -p - шлях. - Paulo Casaretto
Плюс gitk, схоже, був побудований монстром богі. Це чудова відповідь і найкраще підходить до оригінального питання. - ghayes


git log --follow -p -- file

Це покаже цілий історія файлу (включаючи історію, що перевизначає назву та з різницею для кожної зміни).

Іншими словами, якщо файл називається bar був колись названий foo, потім git log -p bar (без --follow опція) відображатиме історію файлу лише до місця, де вона була перейменована - вона не відображатиме історію файлу, коли вона була відома як foo. Використовуючи git log --follow -p bar покаже всю історію файлу, включаючи будь-які зміни до файлу, коли він був відомий як foo. The -p Опція гарантує, що для кожної зміни включені розбіжності.


1187
2018-03-30 23:25



--стат також корисний. Ви можете використовувати його разом з -p. - Raffi Khatchadourian
Відповідь Дена - єдиний реальний! git log --follow -p file - zzeroo
Я згоден, що це реальна відповідь. (1.) --follow що ви бачите перейменування файлів (2.) -p що ви бачите, як файл змінюється (3.) це тільки командний рядок. - Trevor Boyd Smith
@ Бенджонн -- варіант говорить Git, що він досягла кінця варіантів і що все, що слідує -- слід розглядати як аргумент. Для git log це лише має значення, якщо у вас є ім'я шляху, яке починається з a тире. Скажімо, ви хочете знати історію файлу, що має невдале ім'я "--follow": git log --follow -p -- --follow - Dan Moulding
@ Бенон: Зазвичай, -- це корисно, тому що це може також охороняти будь-який revision імена, які відповідають введеному вами файлу, що насправді може бути страшним. Наприклад: якщо у вас і філія, і файл з іменем foo, git log -p foo покаже історію журналів git до foo, а не історія для файл  foo. Але @DanMoulding вірно, що з часів --follow команда приймає єдине ім'я файлу як аргумент, це менш необхідно, оскільки воно не може бути a revision. Я тільки що це дізнався. Можливо, ви мали право залишити його поза вашою відповіддю; Я не впевнений. - NHDaly


Якщо ви вважаєте за краще залишатися на основі тексту, можливо, ви захочете використати тиг.

Швидка установка:

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

Використовуйте його для перегляду історії в одному файлі: tig [filename]
Або перегляньте детальну історію репо: tig

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


147
2018-06-07 10:23



Відмінний текстовий інструмент, чудовий відповідь. Я вигукнув, коли побачив залежності для встановлення gitk на моєму безголові сервері. Буде оновлено знову A +++ - Tom McKenzie
Ви також можете переглянути певні файли за допомогою TIG, тобто tig -- path/to/specific/file - gloriphobia


git whatchanged -p filename також еквівалентно git log -p filename в цьому випадку.

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


102
2017-11-11 06:12



+1, але filename не є необов'язковим у команді git blame filename. - rockXrock
"Нові користувачі заохочуються використовувати instead git-log (...) команда зберігається в основному з історичних причин;" - ciastek


Користувачі SourceTree

Якщо ви використовуєте SourceTree для візуалізації свого сховища (це безкоштовно і непогано), ви можете клацнути правою кнопкою миші на файлі та вибрати Вибраний журнал

enter image description here

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

enter image description here


92
2017-07-30 18:55



Мені особливо подобається опція «Дотримуватися перейменованих файлів», яка дозволяє вам побачити, чи був файл перейменований чи переміщений. - Chris
але якщо я не помиляюся (будь ласка, дайте мені знати!), можна порівняти лише дві версії за один раз в гуї? Чи існують клієнти, які мають елегантний інтерфейс для різноманітних різноманітних варіантів відразу? Можливо, з видошукачем, як у Sublime Text? Це було б дуже корисно, я думаю. - Sam Lewallen
@SamLewallen Якщо я правильно розумію, то хочете порівняти три різних зобов'язання? Це звучить подібно до трьохзбудного злиття (шахта, ваша, база) - зазвичай ця стратегія використовується для вирішення конфліктів об'єднання, які не обов'язково порівнюють три довільні завдання. Існує безліч інструментів, які підтримують тристоронній злиття stackoverflow.com/questions/10998728/... але хитрість полягає в тому, що готує ці інструменти до конкретних змін gitready.com/intermediate/2009/02/27/... - Mark Fox
Дякую Марк Фокс, ось що я маю на увазі. Чи не знаєте ви про будь-які програми, які це зробить? - Sam Lewallen
Ти врятуєш моє життя. Ви можете використовувати gitk щоб знайти SHA1 хеш, а потім відкрити SourceTree ввести Log Selected.. на основі знайденого SHA1. - AechoLiu


Щоб показати, яка версія та автор останній модифікував кожен рядок файла:

git blame filename

або якщо ви хочете використовувати потужний GUI GUI:

git gui blame filename

57
2017-08-11 13:01