git checkout $(git log -1 --pretty='%h' -- <path>)^ -- <path>
Разбивка
Использование git log
для поиска последней фиксации, влияющей на нужный файл
$(git log -1 --pretty='%h' -- <path>)
- Запускает команду
git log
, используя форматирование --pretty
, которое просто показывает хэш.
- Использует разделитель
--
для явного указания файла, а не ссылки фиксации.
- Далее следует путь и имя файла, который мы хотим получить.
- Все это завернуто в
$()
, чтобы мы могли встроить его в другую команду git, как переменную.
- Это вернет фиксацию, в которой данный файл был удален.
Конечно, это можно использовать отдельно без $()
, если вы просто хотите знать, когда этот файл был удален - изменение или удаление красивого форматирования даст вам больше информации о коммите, который он находит.
Использование git checkout
для получения файла в том виде, в котором он был в данной фиксации
git checkout <ref>^ -- <path>
- Запускает
git checkout
, используя коммит и указывая путь.
- Когда указан путь, git просто воссоздает состояние этого пути по предоставленной ссылке.
- Добавляя морковь
^
к ссылке, мы фактически указываем на непосредственного предка.
- Нам нужен непосредственный предок, потому что фиксация, которую мы получаем из журнала, не будет иметь файла, поскольку это фиксация, в которой файл был удален.
Соберите все это вместе, и вы извлекаете файл в том состоянии, в котором он был в коммите непосредственно перед тем, как этот файл был удален. Если вы запустите это на файле, который не был удален, он просто отменит любое изменение, которое было последним сделано в этом файле.
Псевдоним
git config --global alias.unrm '!COMMIT=$(git log -1 --pretty='%h' -- "$1"); git checkout $COMMIT^ -- "$1"'
Я создал из этого псевдоним под названием unrm
, как в un-remove. Если вы запустите приведенную выше команду, с этого момента вам просто нужно запустить..
git unrm <path>
Редактировать: я добавил отзыв к команде.
git config --global alias.unrm '!COMMIT=$(git log -1 --pretty='%h' -- "$1"); git checkout $COMMIT^ -- "$1"; echo "File: $1, was restored from commit $COMMIT"; git show -s $COMMIT'
Теперь он информирует вас о том, что он сделал, и показывает коммит, из которого он восстановил файл.
person
eddiemoya
schedule
06.04.2013