Перегляд видаленого файлу в Git


104

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

Відповіді:


144
git show HEAD^:path/to/file

Ви можете використовувати явний ідентифікатор фіксації або HEAD~nпереглядати старіші версії або якщо з моменту його видалення було більше одного комітету.


6
Зауважте, що path/to/fileце повний шлях від верху проекту (верхнього репозиторію).
Якуб Нарубський

1
У мене є fatal: Invalid object name 'HEAD^'.(я мушу зазначити, що у мене є лише "Початкова
комісія

1
Якщо видалення відбувається поетапно, але не здійснено, використовуйте HEAD замість HEAD ^ (оскільки він існував у HEAD). Наприклад, я вважав, що мені потрібен файл, тому я додав його і зобов’язався зберегти свою роботу, а потім пізніше видалив його, коли придумав інше рішення. Щоб побачити оригінальний файл, перш ніж знову зробити його, я зробив git show HEAD: path / to / file
Tony Wickham

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

50

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

git show $(git rev-list --max-count=1 --all -- foo)^:foo

У rev-listЗаклику виглядає для всіх редакцій , fooале тільки списки одного. Оскільки rev-listсписки у зворотному хронологічному порядку, то те, що в ньому перераховано, - це остання редакція, яка змінилася foo, яка була б командою, яку видалили foo. (Це ґрунтується на припущенні, що git не дозволяє змінювати видалений файл і все-таки залишатись видаленим.) Ви не можете просто скористатися версією, яка rev-listповертається як така, бо її fooвже немає. Ви повинні попросити той, який знаходиться безпосередньо перед ним, який містить останню версію файлу, отже, ^в git show.


2
Можливо, вам доведеться змінити останнє колонтитул на ./foo. А для тих, хто не використовує bash, дістаньте id з "git rev-list --max-count = 1 --all - foo", а потім зробіть "git show 5824127a8d99576632a04ac2b5c2344bcf751967: ./ foo" з id (524 .. є ід)
Dror

1
Гарна відповідь. Мені довелося використовувати ~ замість ^. Не знаю чому. І просто, щоб люди зрозуміли це, "foo" тут повинен бути повний шлях від кореня git.
pedorro

Ви можете написати, **/fooякщо ви не знаєте шлях (це буде працювати для команди rev-list, але не для команди show. Однак, виконуючи команду з команди rev-list, ви можете знайти шлях).
Nickolai

10

Оскільки ви не можете згадати точний шлях, замість цього ви можете отримати sha1 з журналу git, тоді ви можете просто видати

 git cat-file -p <sha1>

5
Від імені Самуеля Слунда : Одним із способів знайти суму sha1, яку слід використовувати вище, є: git whatchanged --no-abbrevце дає вихід, схожий на журнал git (або svn).
невгамовний шум
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.