Възстановяване или връщане на конкретен файл към конкретна ревизия с помощта на Git?

Направих някои промени във файла, който беше прехвърлен няколко пъти като част от група файлове, но сега искам да възстановя / върна промените към него обратно към предишната версия.

Направих git log заедно с git diff да намеря опцията, която ми трябваше, но не знам как да си върна файла в миналото.

3786
19 окт. комплект Hates_ 19 окт. 2008-10-19 02:34 '08 в 2:34 am 2008-10-19 02:34
ответ 31 отговора
  • 1
  • 2

Ако приемем, че c5f567 който искате, е c5f567 :

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

Страницата с ръководството за проверка на git дава повече информация.

Ако искате да се върнете към ангажимент в c5f567 , добавете ~1 (работи с произволен брой):

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

Като бележка, аз винаги се чувствах неудобно с тази команда, защото се използваше както за обикновени неща (превключване между клонове), така и за необичайни, разрушителни неща (с изключение на промените в работната директория).

5117
19 окт. отговор, даден от Greg Hewgill 19 октомври 2008-10-19 02:39 '08 в 2:39 2008-10-19 02:39

Можете бързо да прегледате промените, направени във файл, като използвате командата diff:

 git diff <commit hash> <filename> 

След това, за да върнете конкретен файл към този фиксаж, използвайте командата за нулиране:

 git reset <commit hash> <filename> 

Може да се наложи да използвате опцията --hard , ако имате местни модификации.

border=0

Добър поток на документи за управление на вашите точки е да използвате етикети, за да поддържате точките на вашата времева линия чисти. Не мога да разбера последното ви изречение, но това, от което може да се нуждаете, е отклонението на клона от предишния момент. За да направите това, използвайте удобната команда за плащане:

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

След това можете да го преинсталирате в основната си линия, когато сте готови да обедините тези промени:

 git checkout <my branch> git rebase master git checkout master git merge <my branch> 
541
17 дек. Отговор, даден от Крис Лойд на 17 декември. 2008-12-17 09:59 '08 в 9:59 2008-12-17 09:59

Можете да използвате всяка връзка към git commit, включително SHA-1, ако това е най-удобно. Факт е, че екипът изглежда така:

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

319
08 апр. отговорът е даден foxxtrot 08 апр. 2009-04-08 00:48 '09 в 0:48 2009-04-08 00:48
 git checkout -- foo 

Това ще бъде нулиране foo за HEAD. Можете също така:

 git checkout HEAD^ foo 

за една ревизия и т.н.

256
29 авг. отговор, даден от Greg Hewgill 29 август 2008-08-29 23:56 '08 в 23:56 2008-08-29 23:56

И за да се върнем към последната завършена версия, която най-често е необходима, можете да използвате тази по-проста команда.

 git checkout HEAD file/to/restore 
114
14 янв. отговорът се дава на CDR 14 jan. 2012-01-14 09:15 '12 в 9:15 2012-01-14 09:15

Имах същия проблем точно сега и открих, че този отговор е най -лесен за разбиране ( commit-ref е стойността на промяната на SHA в дневника, който искате да изпратите обратно):

 git checkout [commit-ref] [filename] 

Това поставя тази стара версия във вашата работна директория и от там можете да я поправите, ако искате.

102
27 мая '09 в 20:52 2009-05-27 20:52 отговорът е даден от bbrown на 27 май'09 в 20:52 2009-05-27 20:52

Ако знаете колко трябва да се върнете, можете да използвате:

 git checkout master~5 image.png 

Предполага се, че сте в master клон, а желаната версия е 5.

88
07 апр. Отговорът е даден от Ron DeVera 07 Apr 2009-04-07 17:03 '09 в 17:03 2009-04-07 17:03

Мисля, че открих ... от http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

Понякога просто искате да се върнете назад и да забравите за всички промени за определена точка, защото всички те са погрешни.

Започнете с:

$ git log

който ви показва списък с последните коммити и техния SHA1 хеш.

След това въведете:

$ git reset --hard SHA1_HASH

да възстановите състоянието за даден ангажимент и да изтриете всички нови записи от записа завинаги.

78
17 дек. отговорът е даден jdee 17 dec. 2008-12-17 09:53 '08 в 9:53 2008-12-17 09:53

Работи за мен:

 git checkout <commit hash> file 

След това извършете промяната:

 git commit -a 
61
26 авг. отговорът е даден v2k 26 aug. 2011-08-26 01:12 '11 в 1:12 2011-08-26 01:12

Трябва да бъдете внимателни, когато казвате "rollback". Ако сте използвали една версия на файла в commit $ A, тогава сте направили две промени в две отделни команди $ B и $ C (така ще видите, че това е третата итерация на файла) и ако кажете "Искам да се върна към първото", вие наистина означава това?

Ако искате да се отървете от промените както в втория, така и в третия интервал, това е много просто:

 $ git checkout $A file 

и след това фиксирате резултата. Командата пита "Искам да проверя файла от състоянието, написано от $ A фиксация".

От друга страна, това, което сте имали предвид, е да се отървете от втората итерационна промяна (т.е. да направите $ B), като същевременно поддържате, че сте фиксирали $ C файла във файла, бихте искали да върнете $ B

 $ git revert $B 

Забележка: този, който извърши $ B, може да не е бил много дисциплиниран и може да направи напълно несвързани промени в същия фиксиран запис, и това връщане може да се отнася до файлове, различни от виждания от вас файл. може да провери внимателно резултата след това.

54
11 янв. отговорът е даден от gitster 11 jan. 2009-01-11 11:13 '09 в 11:13 2009-01-11 11:13

Интересно е, че „git checkout foo“ няма да работи, ако работното копие е в директория с име foo; обаче, като например "w20> checkout HEAD foo" и "git checkout./foo" ще бъде:

 $ pwd /Users/aaron/Documents/work/foo $ git checkout foo D foo Already on "foo" $ git checkout ./foo $ git checkout HEAD foo 
36
30 авг. отговорът е даден от Aaron Maenpaa 30 август. 2008-08-30 00:26 '08 в 0:26 ч. 2008-08-30 00:26

Тук работи rebase :

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

Да предположим, че имате

 ---o----o----o----o master \---A----B <my branch> 

Първите два отбора ... правят git checkout git повторно инсталиране на съветника

... проверете клона на промените, които искате да приложите към master клон. Командата rebase приема команди от <my branch> (които не са намерени в master ) и ги rebase към master заглавка. С други думи, родителският елемент на първия коммит в <my branch> вече не е предишният фиксатор в историята на master , а текущия master заглавен ред. Два отбора са същите като:

 git rebase master <my branch> 

Може би ще бъде по-лесно да запомните тази команда, тъй като "базовите" и "модифициращите" клонове са изрични.

, Крайният резултат:

 ---o----o----o----o master \----A'----B' <my branch> 

Последните два отбора ...

 git checkout master git merge <my branch> 

... изпълнете бързо сливане, за да приложите всички <my branch> промени за master . Без тази стъпка, компилирането на ребаза не се добавя към master . Крайният резултат:

 ---o----o----o----o----A'----B' master, <my branch> 

master и <my branch> и двете препратки B' . Освен това от тази точка можете безопасно да премахнете връзката <my branch> .

 git branch -d <my branch> 
32
24 февр. Отговорът е даден от cmcginty 24 Feb. 2009-02-24 12:43 '09 в 12:43 2009-02-24 12:43

git псевдоними, awk и shell функции за спасение!

 git prevision <N> <filename> 

където <N> е броят на фиксираните файлове за отказ за файла <filename> .
Например, за да проверите незабавното предишно преразглеждане на единичен x/y/zc файл, изпълнете

 git prevision -1 x/y/zc 

Как действа прогнозата за git?

Добавете към вашата gitconfig

следното:
 [alias] prevision = "!f() { git checkout `git log --oneline $2 | awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f" 

Екип основно

  • изпълнява git log в указания файл и
  • избира съответния идентификатор на фиксация в историята на файла и
  • изпълнява git checkout идентификационен номер за посочения файл.

По същество всичко, което може да се направи ръчно в тази ситуация
увит в едно красиво, ефективно git-псевдоним - git-prevision

21
01 мая '15 в 4:46 2015-05-01 04:46 Отговорът е даден от TheCodeArtist 01 май '15 в 4:46 2015-05-01 04:46

Трябва да свържа EasyGit тук, който е обвивка, за да направи git по-достъпен за начинаещи, без да обърква опитни потребители. Едно от нещата, които тя прави, е да даде повече стойности за git revert . В този случай просто кажете:

eg revert foo/bar foo/baz

20
19 окт. отговорът е даден Аристотел Пагалцис 19 октомври. 2008-10-19 03:16 '08 в 3:16 am 2008-10-19 03:16

В случай, че искате да върнете файла към предишния залог (и файлът, който искате да върнете, вече е фиксиран), можете да използвате

 git checkout HEAD^1 path/to/file 

или

 git checkout HEAD~1 path/to/file 

След това просто изпълнете стъпката и фиксирайте “новата” версия.

Въоръжени със знанието, че в случай на сливане, обвързването може да има двама родители, трябва да знаете, че HEAD ^ 1 е първият родител, а HEAD ~ 1 е вторият родител.

Или ще работи, ако в дървото има само един родител.

20
11 янв. Отговорът е даден от ModernIncantations 11 януари. 2014-01-11 03:29 '14 в 3:29 2014-01-11 03:29

Първо нулирайте главата за целевия файл

 git reset HEAD path_to_file 

Втората проверка на този файл

 git checkout -- path_to_file 
19
04 апр. отговорът е даден от Gulshan Maurya 04 апр. 2017-04-04 13:25 '17 в 13:25 часа 2017-04-04 13:25

Обърнете внимание, че git checkout ./foo и git checkout HEAD ./foo не git checkout HEAD ./foo точно едно и също нещо; например:

 $ echo A > foo $ git add foo $ git commit -m 'A' foo Created commit a1f085f: A 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 foo $ echo B >> foo $ git add foo $ echo C >> foo $ cat foo A B C $ git checkout ./foo $ cat foo A B $ git checkout HEAD ./foo $ cat foo A 

(Втората add обработва файла в индекса, но не се ангажира.)

git checkout ./foo означава връщане на пътя ./foo към индекса ; добавянето на HEAD инструктира Git да върне този път на индекса към неговата HEAD преди това.

19
31 авг. Отговорът е даден от Дамиен Дидерен на 31 август 2008-08-31 14:54 '08 в 14:54 ч. 2008-08-31 14:54

Тук има много предложения, повечето от тях в духа на git checkout $revision -- $file . Няколко неясни алтернативи:

 git show $revision:$file > $file 

Също така често го използвам само за временно виждане на конкретна версия:

 git show $revision:$file 

или

 git show $revision:$file | vim -R - 

( $file OBS: $file трябва да започва с префикса ./ ако това е относителна пътека за git show $revision:$file за работа)

И още по-странно

 git archive $revision $file | tar -x0 > $file 
14
08 янв. Отговор от Peter V. Mørch Jan 08 2016-01-08 01:19 '16 в 1:19 2016-01-08 01:19

За да преминете към предишната версия на файла commit, вземете след това номера на фиксацията, да речем, eb917a1

 git checkout eb917a1 YourFileName 

Ако просто трябва да се върнете към последната регистрирана версия.

 git reset HEAD YourFileName git checkout YourFileName 

Това ще ви отведе до последното записано състояние на файла.

11
25 февр. отговорът е даден shah1988 25 фев. 2014-02-25 17:01 '14 в 17:01 2014-02-25 17:01

За мен никакъв отговор не изглеждаше наистина ясен и затова бих искал да добавя моя, която изглежда супер проста.

Имам ангажимент abc1 , и след това направих няколко (или една модификация) file.txt файл.

Сега ми кажете, че съм объркал нещо във файла file.txt и искам да се върна към предишния abc1 .

1. git checkout file.txt : това ще премахне местните промени, ако не ви трябват.

2. git checkout abc1 file.txt : това ще доведе файла до желаната от вас версия

3. git commit -m "Restored file.txt to version abc1" : това ще доведе до реверсия.

  1. git push : това ще доведе до отдалечено хранилище

Между стъпки 2 и 3, разбира се, можете да направите git status да разберете какво става. Обикновено трябва да видите, че file.txt вече е добавен и затова няма нужда от git add .

10
23 марта '17 в 0:33 2017-03-23 00:33 отговорът е даден от kalmanIsAGameChanger на 23 март 2017 г. в 0:33 2017-03-23 ​​00:33

git checkout ref commitHash - filePath

например.

 git checkout HEAD~5 -- foo.bar or git checkout 048ee28 -- foo.bar 
10
26 сент. Отговорът е даден Amos Folarin 26 sep . 2013-09-26 20:04 '13 в 20:04 2013-09-26 20:04

Много от отговорите изискват от вас да използвате git reset ... <file> или git checkout ... <file> , но ще загубите всички промени в <file> които са направени след фиксацията, която искате да върнете.

Ако искате да отхвърлите промените само от един ангажимент към само един файл, както би направил git revert , но само към един файл (или, да речем, подмножество на файловете за фиксиране), предлагам да използвате и git diff и git apply по този начин ( с <sha> = хеш на ангажимента, който искате да върнете):

 git diff <sha>^ <sha> path/to/file.ext | git apply -R 

По принцип той първо ще генерира кръпка, съответстваща на промените, които искате да върнете, и след това отмени прилагането на кръпка, за да отхвърли тези промени.

Разбира се, той не работи, ако обърнатите линии са променени от всяко <sha1> между <sha1> и HEAD (конфликт).

8
07 дек. отговорът е даден на Vince 07 декември. 2016-12-07 17:43 '16 в 17:43 ч. 2016-12-07 17:43

Използвайте git log да получите хеш-ключа за конкретна версия и след това използвайте git checkout <hashkey>

Забележка. Не забравяйте да въведете хеша преди последния. Последният хеш показва текущата позиция (HEAD) и не променя нищо.

8
05 дек. отговорът е даден mustafakyr 05 dec. 2011-12-05 23:09 '11 в 23:09 2011-12-05 23:09

Очевидно е, че някой трябва да напише ясна книга на git или git, за да го обясни по-добре в документацията. Изправен пред същия проблем, предполагам

 cd <working copy> git revert master 

обръща последното поемане, което изглежда се прави.

Yang

7
16 дек. Отговорът е даден от Иън Дейвис на 16 декември. 2011-12-16 06:03 '11 в 6:03 2011-12-16 06:03

Ако направите грешен файл в последните си ангажименти, следвайте инструкциите:

  1. дърво с отворен код, променете този ангажимент

2019

23 авг. отговор, даден от saber tabatabaee yazdi 23 авг. 2018-08-23 12:53 '18 в 12:53 2018-08-23 12:53

Можете да направите това в 4 стъпки:

  1. анулирате целия ангажимент с файла, който искате конкретно да отмените - това ще създаде ново поемане във вашата нишка
  2. soft reset, че commit - премахва фиксацията и премества промените в работното пространство
  3. ръчно изберете файлове, за да се върнете и да ги заключите
  4. пуснете всички други файлове във вашето работно пространство

Какво трябва да наберете във вашия терминал :

  1. git revert <commit_hash>
  2. git reset HEAD~1
  3. git add <file_i_want_to_revert> git commit -m 'reverting file'
  4. git checkout.

късмет

4
08 мая '18 в 13:26 2018-05-08 13:26 отговорът е даден от Нир М. 08 май '18 в 13:26 ч. 2018-05-08 13:26
 git revert <hash> 

Връща зададената команда. Изглежда, че мислите, че git revert само последното поемане.

Това няма да разреши проблема ви, ако искате да отмените промяната в конкретен файл и че корекцията е променила повече от този файл.

4
17 дек. Ото отговори на 17 декември. 2008-12-17 21:56 '08 в 21:56 ч. 2008-12-17 21:56

Тук е моят път.

а) В Android Studio отворете файла.

b) git → Покажи историята, намери предишния ангажимент, към който искам да се върна. Вземете commit_id (т.е. задействайте хеш).

в) git checkout commit_id file_path

1
13 марта '17 в 11:10 2017-03-13 11:10 Отговорът е даден от Франсис Бейкън 13 март '17 в 11:10 2017-03-13 11:10

Ако използвате Git Extensions и искате да се върнете към родителската ангажираност за файла, можете да изберете фиксацията, съдържаща промените, които искате да върнете, след това изберете раздела "Diff" в детайли, щракнете с десния бутон върху файла, който искате да върнете, и след това Reset the file to " .... ", след това" А "(родител)

1
26 сент. отговор, даден от johnny 26 септ. 2017-09-26 04:48 '17 в 4:48 2017-09-26 04:48

Това е много проста стъпка. Извличане на файла с идентификатора на комисията, който искаме, ето един код за поемане преди, след това просто стартирайте командата git commitmend и сте готови.

 # git checkout <previous commit_id> <file_name> # git commit --amend 

Това е много удобно. Ако искаме да изведем всеки файл с който и да е идентификатор на предишния коммит в горната част на фиксацията, лесно можем да го направим.

1
24 янв. Отговор, даден от Abhishek Dwivedi на 24 януари 2019-01-24 20:21 '19 в 20:21 ч. 2019-01-24 20:21
  • 1
  • 2

Други въпроси относно маркерите за или Задайте въпрос