2016-12-28 6 views
2

Предположим, что какой-то репозиторий в какой-то момент создал файл test.txt и передал его в репозиторий с некоторыми данными. Файл может отсутствовать в первоначальной фиксации репозитория.Git - показать файл diff между HEAD и начальной (первой) версией

Далее, многие комманды вносят изменения в этот файл. Теперь я хочу произвести вывод diff, который показывает разницу между начальной (первой) версией файла test.txt и текущей (HEAD). Как это сделать?

EDIT: Вопрос изменен, чтобы заметить, что файл может отсутствовать в первоначальной фиксации.

+0

Вы спрашиваете, как определить состояние 'test.txt' на его первоначальной фиксации на репо? – soundslikeodd

ответ

3

Во-первых, получите хэш для первой фиксации, которая содержит test.txt.

git log --oneline --diff-filter=A -- text.txt 

Than, diff that hash with HEAD. (Убедитесь, что у вас есть текущий HEAD вытащил первый.)

git diff [hash from previous command] text.txt 

Эти две команды могут быть объединены вместе

git diff `git log --oneline --diff-filter=A -- text.txt | awk '{print $1}'` HEAD text.txt 
+0

Спасибо за ваш ответ. Я забыл добавить в вопрос, что проверяемый файл не обязательно появляется в первоначальной фиксации. Виноват. Я редактировал вопрос. Мне нужно найти коммит, который сначала вводит файл, я полагаю. – vatsug

+0

@vatsug, вы использовали скрипт @ soundslikeodd? Это точно **, что вы просите. 'Diff-filter' ограничивает журнал только добавлением, и поскольку файл был добавлен только один раз, вы получаете хэш первой фиксации этого файла (всякий раз, когда это так). – PatrickSteele

+2

@PatrickSteele Извините. Не видел редактирования, содержащего удобный oneliner. Спасибо! Я принимаю этот ответ. – vatsug

0
git diff 27fa75e test.txt 

Где 27fa75e - хэш начальной версии. Этот хэш можно найти с помощью git log.

Если файл не существует в исходной фиксации, git сообщит вам, что это новый файл. Для того, чтобы найти первый коммита файл, который вы можете использовать git log:

git log test.txt 

Это даст вам журнал всех фиксаций с этим файлом, последний из которых будет, когда файл был первым совершил. Обратите внимание, что это не поможет, если файл был переименован, и если было бы гораздо труднее отследить исходную версию. This question обсуждает, как погрузиться в репозиторий и извлечь фиксации: вам нужно пройти через соответствующие коммиты и выполнить сравнения файлов, чтобы найти файлы, которые вы ищете.

+0

Спасибо за ваш ответ.Я забыл добавить в вопрос, что проверяемый файл не обязательно появляется в первоначальной фиксации. Виноват. Я редактировал вопрос. – vatsug

+0

Это немного неясно: если файл не существует в первоначальной фиксации, тогда разница между файлом-как-он-существует-в-начальном-фиксации и файлом-как-он-существует-в- HEAD - это просто совокупность файла в вашем текущем HEAD? Можете ли вы уточнить, что вы подразумеваете под «не существует»? –

+0

Я имею в виду, что хочу получить разницу между первой версией этого конкретного файла (первая фиксация, касающаяся файла) и HEAD. – vatsug

0

Я, кажется, нашел решение. Я использую git log --reverse, чтобы получить хэш из первой фиксации, которая затрагивает файл и сравните РУКОВОДИТЕЛЬ:

git diff `git log --pretty=format:"%h" --reverse test.txt | head -1` HEAD test.txt 
+0

Я хотел бы отметить, что оба предыдущих ответа включают варианты этого. Кроме того, если файл был переименован или перемещен, вы получите только первое сообщение с новым именем. –

+0

Как заставить его обрабатывать переименования и удаления? – vatsug

+0

«Removals» здесь не имеет смысла, но я добавил ссылку на мой ответ, посвященный гораздо более сложной проблеме перехода назад через коммиты. –

-1

На основании ответа soundslikeodd в. На самом деле не ответ.

Это сценарий, который я написал для себя, чтобы использовать, и почему бы не поделиться им здесь ... Он принимает любой файл под управлением git и git diff s, он делает самую раннюю версию файла. Я думаю, что это не будет работать надежно, если один и тот же файл был добавлен несколько раз (и удален между ними), и я не проверил его полностью. То, что я сделал, - это убедиться, что я могу использовать этот скрипт из любого места (я установил его как псевдоним).

#!/bin/bash 
#takes a file under git version control as the first argument. diffs with the files original version. 
cd $(dirname "$1") 
git diff $(git log --oneline --diff-filter=A -- $1 | awk '{print $1}') HEAD $1 

Причина, по которой я добавляю это в качестве ответа, заключается в том, что он не будет красиво отформатирован как комментарий. Скажите, пожалуйста, если этот ответ не оценен.