Відновлення файлу зі старого фіксу в git


188

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


Відповіді:


222
git checkout 'master@{7 days ago}' -- path/to/file.txt

Це не змінить HEAD, воно просто замінить локальний файл path/to/file.txt

Дивіться man git-rev-parse для можливих специфікацій редакції там (звичайно, простий хеш (як dd9bacb) буде добре)

Не забудьте здійснити зміну (після перегляду ...)


15
Нічого собі, @heneryville та sehe, я насправді думав, що "7 днів тому" - це мета для того, щоб ти зрозумів, що робити. ти!
AnneTheAgile

7
Частина 2 Бажаючи обрати певну комісію, наведений вище формат не працює. Замість того, щоб використовувати те , що Урс показане нижче, GIT оформлення замовлення commitShaNumber - шлях / к / file.txt в stackoverflow.com/questions/215718 / ...
AnneTheAgile

2
@AnneTheAgile в тому , що до цих пір точно такий же синтаксис, я тільки що сталося , щоб дати «складний» приклад , revision-specificationтак це те , що просили ОП :)
sehe

1
Якщо ваша комісія була використана для видалення файлу, який ви намагаєтеся відновити, просто скористайтеся shacommit~1(наприклад:), git checkout 0f4bbdcd~1 -- path/to/file.txtщоб отримати команду безпосередньо перед цим.
sdlins

90
  1. Перегляньте файл зі свого старого файлу через git checkout [Revision_Key] -- path/to/file.
  2. Додайте, введіть, натисніть, якщо потрібно.

3
git checkoutможе обробляти окремі файли (див. відповідь sehe), не потрібно копіювати та вставляти.
Корактор

1
Чи завжди ключі ревізії є SHA1 для комісії?
IslandCow

1
Вони є, але зазвичай перших від 6 до 8 символів SHA1 достатньо для ідентифікації перегляду.
Urs Reupke

2
@IslandCow немає, вони можуть бути sha1 , а й гілки, теги, або будь-яка інша річ , яка вказує на фіксацію, наприклад HEAD, ORIG_HEADабо будь-який з них в поєднанні з ^/ ~/ @-style нотації.
Алоїз Магдал

2
Ви вказуєте, що після цього слід "додати" файл. Але це неправильно. Файл не розміщується в області постановки. Це вже додано.
xApple

9

Мені потрібно було відновити останній файл, скоєний у git. Отже, щоб ще раз повторити та надати іншу точку зору, вам потрібно зробити це, виконавши наступні два кроки:

  1. git log -3
    Тут відображаються три останні коміти. Прочитайте коментарі та ім’я автора, щоб ви звузили, яку саме версію ви хочете. Запишіть той довгий ідентифікатор фіксації (тобто b6b94f2c19c456336d60b9409fb1e373036d3d71) для потрібної версії фіксації.

  2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 - myfile.java
    Передайте ідентифікатор фіксації І ім'я файлу, який ви хочете відновити. Переконайтеся, що у вас є пробіл до і після подвійного дефісу.

Є багато інших способів це зробити. Але цей простіший, який я можу запам'ятати. Сподіваюся, що це допомагає.

ПРИМІТКА. Якщо ви знаходитесь у своєму проектному шляху / папці, тоді не потрібно вводити повний шлях до файлу в команді оформлення замовлення.


Найкращий коментар коли-небудь. Оскільки той, який є прийнятим відповіддю, передбачає, що файл, який потрібно отримати, висувається вгору, проте ця команда отримує / відновлює файл, який існує лише локально.
ot0

1
Щойно спробував це в кореневій папці мого локального git repo. Мені ще потрібно було надати відносний шлях до файлу. Просто надання - [ім'я файлу] самостійно не спрацювало.
користувач2784627

@ ot0 Ні, це не передбачає. Вони точно таку ж відповідь.
матовий

4

У всіх відповідях згадується git checkout <tree-ish> -- <pathspec>. Станом на git v2.23.0 існує новий метод відновлення git, який повинен брати на себе частину того, що git checkoutвідповідав за. Дивіться основні моменти змін у блозі github .

Типовою поведінкою цієї команди є відновлення стану робочого дерева із вмістом, що надходить із sourceпараметра (який у вашому випадку буде хешем фіксації).

Якщо припустити, що команда хеш - abcdefце буде, команда виглядатиме так:

git restore --source=abcdef file_name

який (за замовчуванням) розміщує його в робочому дереві. Якщо ви хочете внести зміни безпосередньо в індекс, щоб вона могла бути здійснена відразу:

git restore --source=abcdef --worktree --staged file_name

або з короткими назвами опцій:

git restore -s=abcdef -W -S file_name
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.