Як відрізнити один файл від довільної версії в Git?


324

Як я можу відрізняти файл, скажімо pom.xml, від ведучої гілки до довільної старішої версії в Git?

Відповіді:


347

Ви можете зробити:

git diff master~20:pom.xml pom.xml

... для порівняння вашого поточного pom.xmlз поточним з master20 версій тому через перший батьків. master~20Звичайно, ви можете замінити ім'я об'єкта (SHA1sum) комітету або будь-яким з багатьох інших способів визначення перегляду .

Зауважте, що це насправді порівняння старої pom.xmlверсії у вашому робочому дереві, а не версії, допущеної в master. Якщо ви цього хочете, ви можете зробити наступне:

git diff master~20:pom.xml master:pom.xml

12
Зауважте, що це працює не лише для файлів, але також працює, наприклад, для (під) каталогів git diff <revision>:foo/ HEAD:foo/.

2
Також зауважте, що у Windows вам потрібно використовувати прямі косої риски для каталогів, якщо ви використовуєте специфікатор редакції або git дасть вам помилку щодо файлу / каталогу, який не існує в цій редакції.
Ділан Нісслі

1
@DylanNissley або це не дасть вам помилок і не відрізнятиметься. Це я бачу. У будь-якому випадку, дякую за підказку щодо використання прямих косих кутів замість зворотних косих.
Гері С.

З вікнами файлами я знайшов його простіше в каталог змін , а потім викликати мерзотник майстра дифф ~ 20: ./ pom.xml ./pom.xml
Ллойда

Деяка версія git вимагає "-" між <revision> & <path>
Josh

140
git diff <revision> <path>

Наприклад:

git diff b0d14a4 foobar.txt

не працює для версії 1.7.11, якщо файл не знаходиться в поточному каталозі. Приклад: тест 'git diff f76d078 / Config' daje "помилка: Не вдалося отримати доступ до 'test / f76d078'"
simpleuser

1
@ User1663987 просто пройти повний шлях щодо кореня проекту: git diff <revision> root/path/file.

1
Тест / Config є відносно кореня (як в тесті є підкаталог кореня). але тоді ваш приклад root / path / file, здавалося б, включить корінь?
simpleuser

41

Якщо ви хочете побачити різницю між останньою фіксацією одного файлу, ви можете зробити:

git log -p -1 filename

Це дасть вам різницю файлу в git, не порівнює ваш локальний файл.


2
це нічого не повертає
Андрій Крістіян Продан

@AndreiCristianProdan Тоді у вас немає змін. Ви можете збільшувати -1крок за кроком, поки не отримаєте зміни.
кайзер

Це дуже приємно. Я створив функцію bash, яка може бути корисною: gitlog () { git log -${3:-p} -${2:-1} $1; } Використовується як: gitlog Rakefileабо gitlog Rakefile 5і gitlog Rakefile 10 s. Перший показує одну різницю; другий показує п'ять різниць; третій показує десять --no-patch.
auxbuss

18

Щоб побачити, що було змінено у файлі в останньому комітеті:

git diff HEAD~1 path/to/file.

Ви можете змінити число (~ 1) на n-ту комісію, з якою ви хочете відрізнятись.


Ця відповідь насправді є лише конкретним випадком цієї більш загальної відповіді , де HEAD~1вона замінена <revision>, що робить цю відповідь дублікатом.

1
це не працює! fatal: неоднозначний аргумент 'HEAD ~ 1': невідома редакція або шлях не в робочому дереві. Використовуйте "-", щоб відокремити шляхи від модифікацій
Андрій Крістіан Продан

Ця відповідь для мене проста і функціональна.
Дуглас Фрарі

6

Загальний синтаксис:

$git diff oldCommit..newCommit -- **FileName.xml > ~/diff.txt

для всіх файлів з назвою "FileName.xml" в будь-якій точці репо.

Помітьте пробіл між "-" та "**"

Відповідь на ваше запитання:

$git checkout master
$git diff oldCommit..HEAD -- **pom.xml 
or
$git diff oldCommit..HEAD -- relative/path/to/pom.xml 

як завжди з git, ви можете використовувати тег / sha1 / "HEAD ^" для ідентифікації комісії.

Тестований на git 1.9.1 на Ubuntu.


6

Якщо жодна фіксація не є вашою HEAD, тоді розширення дужок баша виявиться дійсно корисним, особливо якщо ваші імена файлів довгі, наведений вище приклад:

git diff master~20:pom.xml master:pom.xml

Став би

git diff {master~20,master}:pom.xml

Детальніше про розширення Brace з bash.


6

Для порівняння 5 комісій з поточним, як на master, так просто:

git diff master~5:pom.xml master:pom.xml

Також ви можете посилатися на введення хеш-номера, наприклад, якщо номер хешу є x110bd64, ви можете зробити щось подібне, щоб побачити різницю:

git diff x110bd64 pom.xml



2

Якщо ви добре використовуєте графічний інструмент (або навіть віддаєте перевагу), ви можете:

gitk pom.xml

Потім у gitk ви можете натиснути будь-яку фіксацію (щоб "вибрати" її) та клацніть правою кнопкою миші будь-яку іншу комісію, щоб у спливаючому меню вибрати "Diff this -> selected" або "Diff selected -> this", залежно від того, який порядок ви віддаєте перевагу.



0

Якщо вам потрібно розімкнути один файл у скрині, наприклад, ви можете це зробити

git diff stash@{0} -- path/to/file

-1

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

https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file>

Наприклад:

https://github.com/grails/grails-core/commit/02942c5b4d832b856fbc04c186f1d02416895a7e/grails-test-suite-uber/build.gradle

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

Це працює лише для конкретного комітету, але не для порівняння між будь-якими двома довільними версіями.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.