Питання Скидання чи повернення певного файлу до певної версії за допомогою Git?


Я внесли деякі зміни в файл, який кілька разів виконував як частину групи файлів, але тепер хоче скинути / повернути зміни на нього назад до попередньої версії.

Я зробив a git log разом з a git diff щоб знайти необхідний перегляд, але просто не знаю, як повернути файл у колишній штат у минулому.


3452
2017-10-18 23:34


походження


Після повернення, не забудьте --cached при перевірці git diff. посилання - Geoffrey Hale
Я знайшов ваше запитання, коли я поглинув мене. Але після того, як я прочитав рішення, я перевірив свій журнал і дізнався, що я зробив зміни в якості автономної передачі, тому я зробив перегляд гіт для цього зобов'язання, і все інше залишалося, як я цього хотів. Не рішення, це ще один спосіб зробити це іноді. - sudo97


Відповіді:


Припускаючи, що хеш виконується, ви хочете c5f567:

git checkout c5f567 -- file1/to/restore file2/to/restore

The виїзний квиток Сторінка людини дає більше інформації.

Якщо ви хочете повернутися до здійснення раніше c5f567, додавати ~1 (працює з будь-яким числом):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

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


4672
2017-10-18 23:39



Якщо ви зіпсували в "abbcdf" і хочете версію прямо перед "abbcdf", ви можете зробити git checkout "abbcdf~1" path/to/file. - shadowhand
@ shadowhand: Чи є спосіб повернути це, так що це версія відразу після? - aliteralmind
@ aliteralmind: Ні, на жаль, нотатки ярлика історії Gіt лише йдуть назад у історії. - Greg Hewgill
Якщо ви збираєтеся використовувати назву гілки для абсід (наприклад, develop) ти захочеш git checkout develop -- file/to/restore (зверніть увагу на подвійний тире) - Ohad Schneider
@ aliteralmind: Насправді, так, є спосіб зробити це: "git log --reverse -1 --ancestry-path yourgitrev..master", а потім використовувати відповідні параметри, щоб просто отримати git rev. --початковий шлях буде "малювати лінію" між двома зобов'язаннями, а -1 покаже вам лише одну версію, а - реверс гарантує, що перший випущений запис є найстарішим. - Chris Cogdon


Ви можете швидко переглянути внесені зміни до файлу за допомогою команди diff:

git diff <commit hash> <filename>

Потім, щоб повернути певний файл до цього завдання, скористайтеся командою скидання:

git reset <commit hash> <filename>

Вам може знадобитися використовувати --hard варіант, якщо у вас є місцеві модифікації.

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

git checkout <commit hash>
git checkout -b <new branch name>

Після цього ви зможете змінити його на свій основний маршрут, коли готові об'єднати ці зміни:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

508
2017-12-17 06:59



"Команда git checkout <commit hash>" повернула мені назад мою стару версію проекту саме те, на що я шукав. Завдяки Крісу. - vidur punj
'git reset <commithash> <filename>' не змінив мого конкретного файлу, який я хотів змінити. Чи існує спосіб перевірити версію файлу, зокрема, і не забрати весь проект? - Danny
Повернути файл git checkout <commit hash> <filename> працював для мене краще, ніж git reset - Motti Strom
не може використовувати git reset Щоб скинути один файл, ви отримаєте помилку fatal: Cannot do hard reset with paths - slier
Що сказав Слієр: Ви не можете git reset --hard <commit hash> <filename>. Це буде помилкою з fatal: Cannot do hard reset with paths. Що Motti Strom сказав: використання git checkout <commit hash> <filename> - Hawkeye Parker


Ви можете використовувати будь-яке посилання на корекцію git, включаючи SHA-1, якщо це найзручніше. Справа в тому, що команда виглядає так:

git checkout [commit-ref] -- [filename]


306
2018-04-07 21:48



Яка різниця між цією відповіддю, яка має --, а прийнятий, який ні? - 2rs2ts
У git, '-' перед тим, як список файлів говорить git, що всі наступні аргументи слід інтерпретувати як імена файлів, а не як назви гілок або що-небудь ще. Іноді корисний знахідка. - foxxtrot
"-" - це не тільки конвенція git, але те, що ви знайдете у різних місцях у командній рядку * nix. rm -- -f (видаліть файл з ім'ям -f) здається канонічним прикладом. Детальніше тут - Hawkeye Parker
Просто додайте до того, що сказав @HawkeyeParker. rm команда використовує getopt (3) для аналізу аргументів. getopt це команда для аналізу аргументів команди. gnu.org/software/libc/manual/html_node/Getopt.html - Devy
@Honey Так, це те, що я маю на увазі, і, можливо, не є загальним зовсім. Я бачив цей приклад у різних місцях, може, просто зробити це sortof пам'ятним: rm -f, як відомо, є страшним / небезпечним. Але справа в тому, що в * nix ім'я файлу може починати з '-', і це буде плутати різні інтерпретатори командного рядка, які, коли вони бачать '-', сподіваюся, що наступний буде команда. Це може бути будь-який файл, що починається з "-"; наприклад, "myspecialFile". - Hawkeye Parker


git checkout -- foo

Це буде скинуто foo до голови Ви також можете:

git checkout HEAD^ foo

за одну версію назад і т. д.


244
2017-08-29 20:56



Я пропоную використовувати синтаксис git checkout -- foo щоб уникнути будь-яких помилок, якщо foo це щось особливе (наприклад, каталог або файл, який називається -f) З git, якщо ви не впевнені, завжди додавайте префікс для всіх файлів і каталогів за допомогою спеціального аргументу --. - Mikko Rantalainen
Додаткова примітка до коментарю Мікко: -- це не команда git, а спеціальна для git. Це баш, який вбудований для позначення кінця параметрів команд. Ви можете використовувати його з багатьма іншими командами bash. - matthaeus
@matthaeus це також не є ні специфічним для bash, ні функцією оболонки взагалі. Ця конвенція застосовується у багатьох різних командах (і підтримується getopt). - Greg Hewgill


І щоб повернутися до останньої вчиненої версії, яка найчастіше потрібна, ви можете скористатися цією простішою командою.

git checkout HEAD file/to/restore

106
2018-01-14 06:15



у чому різниця між цим (git checkout HEAD file / to / restore) і git reset - hard file / to / restore ??? - Motti Shneor
1) простіше запам'ятати більш загальним способом 2) не хвилюйтеся натиснути клавішу Enter, перш ніж вводити ім'я файлу - Roman Susi


Я мав ту ж саму проблему саме зараз, і я знайшов ця відповідь Найпростіше зрозуміти (commit-ref це значення SHA для зміни журналу, на який ви хочете повернутися):

git checkout [commit-ref] [filename]

Це ставить цю стару версію у ваш робочий каталог, і звідти ви можете зробити це, якщо хочете.


100
2018-05-27 17:52





Якщо ви знаєте, скільки зобов'язує вас повернутися, ви можете використовувати:

git checkout master~5 image.png

Це припускає, що ви знаходитесь на master гілка, і версія, яку ви хочете - 5, повертається назад.


85
2018-04-07 14:03





Я думаю, що знайшов це .... від http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

Іноді ви просто хочете повернутися і забути про всі зміни, що минули певним моментом, тому що вони все неправильні.

Починати з:

$ git log

який показує вам список нещодавніх команд, а також їх хеші SHA1.

Далі введіть:

$ git reset --hard SHA1_HASH

щоб відновити державу до певної фіксації та стерти всі нові рекорди з запису постійно.


75
2017-12-17 06:53



Гіт ніколи не знімає нічого. Ваші старі зобов'язання все ще існують, але якщо немає підказок відгалужень, що вказують на них, вони більше не доступні. git reflog все одно покаже їх, поки ви не очистите свій репозиторій за допомогою git-gc. - Bombe
@ Бомбе: Дякую за інформацію. Я перевірив стару версію файлу. Прочитавши ваш коментар, я зміг використати "gitref" для пошуку часткового хешу SHA1 і використовувати "checkout", щоб повернутися до останньої версії. Інші користувачі git можуть виявити цю інформацію корисною. - Winston C. Yang
можливо, слідує a git push --force - bshirley
Якщо у вас є незмінні зміни, ти втратиш їх, якщо зробити скидання git - серйозно - Boklucius
@Bombe - "Gіt ніколи не знімає нічого. Ваші старі зобов'язання все ще існують, але, якщо немає підказок, що вказує на них, вони більше не доступні". - але робить це, як це обрізають через певний час, тому "Git ніколи не знімає нічого" не відповідає дійсності. - Bulwersator


Це працювало для мене:

git checkout <commit hash> file

Потім внесіть зміни:

git commit -a

59
2017-08-25 22:12