2014-10-16 2 views
6

То, что я хочу что-то вроде -
git checkout FHEAD~ path/filenameЕсть ли сокращенная версия предыдущей версии файла в Git?

То, что я в настоящее время сделать, это найти предыдущую версию файла с помощью -
git log -1 --skip=1 path/filename

, а затем,
git checkout <previous-commit-hash> path/filename

+0

Что вы спрашиваете здесь? Псевдоним для проверки версии файла, записанного в родительском элементе 'HEAD'? Просьба уточнить. – Jubobs

+0

Кроме того, что такое 'FHEAD'? – Jubobs

+2

@Jubobs Вопрос кажется мне достаточно ясным: найдите предыдущую версию определенного файла, где «предыдущий» означает «способ, который был непосредственно перед последним фиксатором, который изменил этот файл» (и игнорирование других коммитов, которые не меняются этот файл). – hvd

ответ

0

тривиальный пример псевдоним для извлечения предыдущей версии файла.

Хитрость здесь формат вывода журнала с --format только вернуть коммита, окрошка

[alias] 
    prev = "!f(){ git checkout $(git log -1 --format="%H" --skip=1 -- ${GIT_PREFIX:-.}/$1) -- ${GIT_PREFIX:-.}/$1; git reset ${GIT_PREFIX:-}/$1; }; f" 

Использование git log -1 гарантирует, что git prev всегда возвращает непосредственный родительский файл. Выбор следующего родителя может быть более сложным.

Обратите внимание, что файл, однажды выписанный, сразу же добавляется в индекс. Он не сливается с вашей существующей копией и не предупреждает о перезаписывании локальных изменений. Я включил вызов git-reset, чтобы гарантировать, что файл проверки находится только в рабочем каталоге, а не в индексе.

Использование GIT_PREFIX позволяет вводить относительные пути, хотя только относительно недавние версии git поддерживают GIT_PREFIX.

редактировать ..

То же самое с помощью GIT Rev-лист .. очень мощная команда GIT, предназначенный для перемещения GIT родословной графики, когда сценариев и автоматизации ...

[alias] 
    prev = "!f(){ git checkout $(git rev-list --max-count=1 --skip=1 HEAD -- ${GIT_PREFIX:-.}/$1) -- ${GIT_PREFIX:-.}/$1; git reset ${GIT_PREFIX:-}/$1; }; f" 
+1

Или используйте 'rev-list' вместо' log' для скриптов! – knittl

+0

Конечно, почему бы и нет. 'git rev-list --max-count = 1 --skip = 1 HEAD - $ {GIT_PREFIX: -.}/$ 1' может заменить журнал git и получить тот же результат. – Dave

Смежные вопросы