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


117

Коли я запускаю "git pull", я часто хочу знати, що змінилося між останньою версією файлу та новою. Скажіть, я хочу знати, що хтось інший вчинив у певному файлі.

Як це робиться?

Я припускаю, що це "git diff" з деякими параметрами для віддачі x проти фіксації y, але я не можу отримати синтаксис. Я також вважаю, що "журнал git" трохи заплутався, і я не знаю, де взяти ідентифікатор фіксації моєї останньої версії файлу проти нової.


1
Ви можете знайти графічний інструмент gitk більше на свій смак.
crazyscot

stackoverflow.com/questions/61002/… може бути схожим на цей
VonC

Відповіді:


158

Існують всілякі чудові способи встановлення комітетів - детальніше див. Розділ із уточненням редакціїman git-rev-parse . У цьому випадку ви, мабуть, хочете:

git diff HEAD@{1}

В @{1}означає «попереднє положення реф я вказав», так що має значення те , що ви вже перевірили раніше - як раз перед тяжінням. Ви можете HEADзастосувати там кінець, якщо у вас також є якісь зміни у вашому робочому дереві, і ви не хочете бачити відмінності для них.

Я не впевнений, що ви запитуєте з "ідентифікатором фіксації моєї останньої версії файлу" - команда "ID" (хеш SHA1) - це 40-символьний шістнадцятковий символ у верхній частині кожного запису у висновку журналу git. Це хеш для всієї комісії, а не для заданого файлу. Насправді вам ніколи більше не потрібно - якщо ви хочете розмежувати лише один файл на протязі потягу, зробіть

git diff HEAD@{1} filename

Це загальна річ - якщо ви хочете знати про стан файлу в заданій комісії, ви вказуєте команду та файл, а не ідентифікатор / хеш, специфічний для файлу.


Пов’язаний попередній пост VonC говорить по суті те саме, що і це, але пояснення дещо інше, тому я покину це. (Він також використовується @{1}як скорочення HEAD@{1})
Cascabel

правда, але мені теж подобається пояснення. +1
VonC

Це саме те, що я шукав. Дякую за пояснення.
lucapette

+1 за те, що я гугла. Було б дивовижно, якби це було обрано як відповідь і натрапило на вершину ... :)
longda

@longda Якщо ви сортуєте за голосами (що я вважав за замовчуванням), це вже повинно бути вгорі.
Каскабель

57

Мені подобається використовувати:

git diff HEAD^

Або якщо я хочу лише відрізняти певний файл:

git diff HEAD^ -- /foo/bar/baz.txt

5
-1: HEAD^це батьківське зобов'язання, а не виконання ранішеpull
CharlesB

1
Якщо команда HEADзлиття HEAD^є першою батьківською коміткою, так що так, вона може бути скоєною перед pull. Щоб отримати іншого з батьків (для двостороннього злиття), використовуйте HEAD^2. Але тоді, вище відповідь не справді відповідає на питання в першу чергу, тому залишаючи -1 ;-)
Майкл Уайлд

Дякуємо за роз’яснення. Не читав питання дуже уважно, оскільки я гуглю за чимось іншим, і це посилання з'явилося високо на сторінці результатів. Я думав, що я задзвонюся, оскільки я є новим користувачем і не маю карми (якщо це так називається на SO). Моя вина =)
кадизм

3
@MichaelWild це може бути не те, про що питав запитувач, але це було те, що я шукав, коли знайшов це. Це було корисно для мене. Оголошення.
Джон Дворак

Це те, що робить TortoiseGit "Різниця з попередньою версією". І це те, що я шукав.
Фаб'єн Хаддаді

15

Якщо ви робите пряму, git pullто ви будете або "швидкою вперед", або об'єднаєте невідому кількість комітетів із віддаленого сховища. Однак це відбувається як одна дія, тому остання фіксація, яку ви опинилися безпосередньо перед витягненням, буде останньою записом у рефлогу, і до неї можна отримати доступ як HEAD@{1}. Це означає, що ви можете:

git diff HEAD@{1}

Однак, я настійно рекомендую, якщо це щось, ви виявляєте, що робите багато, тоді вам слід подумати просто зробити git fetchта вивчити дістану гілку, перш ніж вручну об'єднатись або перезапустити її. Наприклад, якщо ви є господарем і збираєтеся тягнути за походженням / майстром:

git fetch

git log HEAD..origin/master

 # looks good, lets merge

git merge origin/master

Гарне використання git log замість git diffтут (навіть якщо синтаксис трохи невідповідний між '..' для git logта '...' для git diff;) +1 Див. Stackoverflow.com/questions/53569/… та stackoverflow.com/questions / 850607 /…
VonC

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