Колись у моєму проекті був файл, який я зараз хотів би отримати.
Проблема полягає в тому, що я не маю уявлення про те, коли я його видалив і яким шляхом він був.
Як я можу знайти елементи цього файлу, коли він існував?
Колись у моєму проекті був файл, який я зараз хотів би отримати.
Проблема полягає в тому, що я не маю уявлення про те, коли я його видалив і яким шляхом він був.
Як я можу знайти елементи цього файлу, коли він існував?
Відповіді:
Якщо ви не знаєте точний шлях, який ви можете використовувати
git log --all --full-history -- "**/thefile.*"
Якщо ви знаєте шлях, до якого був файл, ви можете зробити це:
git log --all --full-history -- <path-to-file>
Тут має відображатися список комітетів у всіх гілках, які торкнулися цього файлу. Потім ви можете знайти потрібну версію файлу та відобразити її за допомогою ...
git show <SHA> -- <path-to-file>
Або відновити його у робочій копії за допомогою:
git checkout <SHA>^ -- <path-to-file>
Зверніть увагу на символ caret ( ^
), який отримує замовлення до ідентифікованого, оскільки в момент <SHA>
фіксації файл видаляється, нам потрібно переглянути попередню комісію, щоб отримати вміст видаленого файлу
git log -- <path>
не матиме результатів, коли ви знаходитесь на гілці, у якій файл ніколи не існував. Ви завжди повинні використовувати git log --all -- <path>
, щоб переконатися, що ви не пропустите зміни, які відбулися на інших гілках. Команда git log -- <path>
може бути дуже небезпечною, якщо у вас є кілька гілок і, як правило, забувають шляхи та гілки (як я), а також небезпечно, якщо ви працюєте з іншими розробниками.
--all
(дякую Філіпу ) свою git log
відповідь, щоб люди не пропускали змін та файлів на інших гілках. Це б врятувало забудькуючих людей, як я, багато горя.
git checkout <SHA>^ -- <path-to-file>
(зверніть увагу на символ ^), тому що в момент <SHA> фіксації файл видаляється, нам потрібно переглянути попередню
Отримайте список видалених файлів і скопіюйте повний шлях до видаленого файлу
git log --diff-filter=D --summary | grep delete
Виконайте наступну команду, щоб знайти ідентифікатор фіксації цього коміту та скопіюйте ідентифікатор фіксації
git log --all -- FILEPATH
Показати різницю видаленого файлу
git show COMMIT_ID -- FILE_PATH
Пам'ятайте, ви можете записати вихід у файл, використовуючи >
подібні
git show COMMIT_ID -- FILE_PATH > deleted.diff
unknown revision or path not in the working tree
.
git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }
і тепер ви можете просто зробити:git-grep-latest some_text
linux pipes
.. вам це сподобається.
Не вдалося відредагувати прийняту відповідь, тому додавши її тут як відповідь,
щоб відновити файл у git, скористайтеся наступним (зверніть увагу на знак '^' відразу після SHA)
git checkout <SHA>^ -- /path/to/file
<SHA>~1
має працювати так само, не потребуючи обгортання лапок.
Припустимо, ви хочете відновити названий файл MyFile
, але не знаєте його шляху (або його розширення, з цього питання):
Prelim .: Уникайте плутанини, переходячи до кореня git
Нетривіальний проект може мати декілька каталогів з однаковими або однаковими назвами.
> cd <project-root>
Знайдіть повний шлях
git log --diff-filter = D - підсумок | grep видалити | grep MyFile
delete mode 100644 full/path/to/MyFile.js
full/path/to/MyFile.js
це шлях та файл, який ви шукаєте.
Визначте всі коміти, які вплинули на цей файл
git log --oneline - наступний - повний / шлях / до / MyFile.js
bd8374c Some helpful commit message
ba8d20e Another prior commit message affecting that file
cfea812 The first message for a commit in which that file appeared.
Оформити файл
Якщо ви вибрали перше перелічене фіксацію (останнє хронологічно, тут bd8374c), файл не буде знайдено, оскільки він був видалений у цій комісії.
> git checkout bd8374c -- full/path/to/MyFile.js
`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`
Просто виберіть попереднє (додайте каре) зобов'язання:
> git checkout bd8374c^ -- full/path/to/MyFile.js
git log --diff-filter=D --summary | find "delete" | find "MyFile"
І step3, зверніть увагу на лапки навколо хеша:git checkout "bd8374c^" -- full/path/to/MyFile.js
@Amber дала правильну відповідь! Ще одне доповнення, якщо ви не знаєте точний шлях до файлу, ви можете використовувати символи! Це працювало для мене.
git log --all -- **/thefile.*
Нижче проста команда, де користувач або git може передати видалене ім’я файлу з кореневого каталогу сховища та отримати історію:
git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all --
Якщо хтось, може вдосконалити команду, будь ласка.
Спробуйте скористатись одним із глядачів, наприклад gitk
таким, щоб ви могли переглядати історію, щоб знайти половину запам’ятованого файлу. (використовувати gitk --all
за потреби для всіх відділень)
--all
варіант є критичним як для вашої відповіді, так і для прийнятої відповіді.
Підсумок:
Ви шукаєте повний шлях до файлу в історії видалених файлів git log --diff-filter=D --summary | grep filename
Ви відновите свій файл з комісії перед його видаленням
restore () {
filepath="$@"
last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
echo "Restoring file from commit before $last_commit"
git checkout $last_commit^ -- $filepath
}
restore my/file_path
Ось моє рішення:
git log --all --full-history --oneline -- <RELATIVE_FILE_PATH>
git checkout <COMMIT_SHA>^ -- <RELATIVE_FILE_PATH>