Atkurti arba grąžinti konkretų failą į konkrečią peržiūrą naudodami „Git“?

Atlikau keletą pakeitimų faile, kuris buvo keletą kartų perkeliamas kaip failų grupės dalis, bet dabar noriu atkurti / grąžinti pakeitimus į ankstesnę versiją.

Radau git log kartu su „ git diff kad galėčiau rasti reikiamą parinktį, bet aš nežinau, kaip susigrąžinti failą anksčiau.

3786
19 окт. rinkinys Hates_ 19 okt. 2008-10-19 02:34 '08 at 2:34 nuo 2008-10-19 02:34
ответ 31 atsakymų
  • 1
  • 2

Darant prielaidą, kad c5f567 įsipareigojimas yra c5f567 :

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

Git checkout rankiniame puslapyje pateikiama daugiau informacijos.

Jei norite grįžti į įsipareigojimą c5f567 , pridėkite ~1 (veikia su bet kuriuo numeriu):

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

Kaip pastabą, aš visada buvau nepatogu šiai komandai, nes jis buvo naudojamas tiek paprastiems dalykams (perjungimui tarp šakų), tiek neįprastiems, žalingiems dalykams (išskyrus darbo katalogo pakeitimus).

5117
19 окт. atsakymas, kurį pateikė Greg Hewgill 19 spalis 2008-10-19 02:39 '08 at 2:39 2008-10-19 02:39

Galite greitai peržiūrėti failo pakeitimus naudodami „diff“ komandą:

 git diff <commit hash> <filename> 

Tada, norėdami grąžinti konkretų failą į šį fiksatorių, naudokite iš naujo komandą:

 git reset <commit hash> <filename> 

Jei turite vietinių pakeitimų, gali tekti naudoti --hard parinktį.

border=0

Geras dokumentų srautas, skirtas valdyti savo kelio taškus, yra naudoti žymes, kad taškai būtų laikomi švarūs. Negaliu suprasti jūsų paskutinio sakinio, bet jums gali prireikti šakos skirtumo nuo ankstesnio laiko. Norėdami tai padaryti, naudokite patogią kasos komandą:

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

Tada galite ją iš naujo įdiegti į pagrindinę liniją, kai būsite pasiruošę sujungti šiuos pakeitimus:

 git checkout <my branch> git rebase master git checkout master git merge <my branch> 
541
17 дек. Chris Lloyd atsakymas, pateiktas gruodžio 17 d. 2008-12-17 09:59 '08 at 9:59 2008-12-17 09:59

Galite naudoti bet kokią nuorodą, kad galėtumėte susieti, įskaitant SHA-1, jei tai patogiausia. Faktas yra tai, kad komanda atrodo taip:

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

319
08 апр. atsakymas pateikiamas foxxtrot 08 balandžio. 2009-04-08 00:48 '09 ne 0:48 2009-04-08 00:48
 git checkout -- foo 

Tai bus iš naujo nustatyti foo HEAD. Taip pat galite:

 git checkout HEAD^ foo 

už vieną peržiūrą ir tt

256
29 авг. Greg Hewgill atsakymas rugpjūčio 29 d 2008-08-29 23:56 '08 at 23:56 pm 2008-08-29 23:56

Ir norėdami grįžti prie paskutinės baigtos versijos, kuri dažniausiai reikalinga, galite naudoti šią paprastesnę komandą.

 git checkout HEAD file/to/restore 
114
14 янв. atsakymas pateikiamas CDR 14 jan. 2012-01-14 09:15 '12 at 9:15 2012-01-14 09:15

Aš dabar turėjau tą pačią problemą, ir manau, kad šis atsakymas yra lengviausiai suprantamas ( commit-ref yra SHA pakeitimo, kurį norite siųsti atgal, vertė):

 git checkout [commit-ref] [filename] 

Ši senoji versija įkeliama į jūsų darbo katalogą, ir iš ten galite ją pataisyti, jei norite.

102
27 мая '09 в 20:52 2009-05-27 20:52 atsakymas pateikiamas „ Bbrown “ gegužės 27 d. , 09:52 , 2009-05-27 20:52

Jei žinote, kiek įsipareigoja grąžinti, galite naudoti:

 git checkout master~5 image.png 

Manoma, kad esate master filiale ir norima versija yra 5.

88
07 апр. Atsakyti Ron DeVera Apr 07 2009-04-07 17:03 '09 at 17:03 2009-04-07 17:03

Manau, kad radau ... iš http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

Kartais tiesiog norite grįžti ir pamiršti apie visus pakeitimus tam tikru momentu, nes jie visi yra neteisingi.

Pradėkite nuo:

$ git log

kuris parodo neseniai įvykdytų įsipareigojimų sąrašą ir jų SHA1 maišą.

Tada įveskite:

$ git reset --hard SHA1_HASH

atkurti tam tikro įvykio būseną ir ištrinti visus naujus įrašus iš įrašo amžinai.

78
17 дек. atsakymas duotas 17 d. 2008-12-17 09:53 '08 at 9:53 2008-12-17 09:53

Jis dirbo man:

 git checkout <commit hash> file 

Tada atlikite pakeitimą:

 git commit -a 
61
26 авг. atsakymas suteiktas v2k 26 rug . 2011-08-26 01:12 '11 at 1:12 2011-08-26 01:12

Jūs turite būti atsargūs, kai sakote „atkurti“. Jei naudojote vieną failo versiją įsipareigojimo $ A, tada atlikote du pakeitimus dviem atskirais įsipareigojimais $ B ir $ C (taigi matote, tai yra trečiasis failo kartojimas), ir jei jūs sakote „Aš noriu grįžti į pirmąjį“, jūs iš tikrųjų tai reiškia?

Jei norite atsikratyti ir antrosios, ir trečiosios iteracijos pokyčių, tai labai paprasta:

 $ git checkout $A file 

ir tada nustatykite rezultatą. Komanda klausia: "Noriu patikrinti failą iš valstybės, parašytos $ A įsipareigojimo".

Kita vertus, tai, ką turėjote omenyje, yra atsikratyti antrojo iteracijos keitimo (t. Y. Padaryti $ B), išlaikydami, kad faile įrašėte $ C failą, norėtumėte grąžinti $ B

 $ git revert $B 

Pastaba: kiekvienas, kuris įsipareigoja $ B, gali būti ne itin drausmingas ir galėjo padaryti visiškai nesusijusius to paties įsipareigojimo pakeitimus, ir ši grąža gali būti susijusi su kitais failais, o ne į matomą failą, įžeidžiančiais pakeitimais, todėl jūs po to galite atidžiai patikrinti rezultatą.

54
11 янв. atsakymą pateikė gitster 11 jan. 2009-01-11 11:13 '09, 11:13, 2009-01-11 11:13

Įdomu tai, kad „git checkout foo“ neveiks, jei darbo kopija yra kataloge foo; tačiau, kaip "w20> checkout HEAD foo" ir "git checkout./foo" būtų:

 $ pwd /Users/aaron/Documents/work/foo $ git checkout foo D foo Already on "foo" $ git checkout ./foo $ git checkout HEAD foo 
36
30 авг. atsakymą pateikė Aaron Maenpaa 30 rug . 2008-08-30 00:26 '08 0:26 am. 2008-08-30 00:26

Čia atliekami rebase darbai:

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

Tarkime, jūs turite

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

Pirmosiose dviejose komandose ... atlikite git checkout git iš naujo įdiegti vedlį

... patikrinkite pakeitimų, kuriuos norite taikyti master filialui, šaką. Komandos rebase komanda prisiima įsipareigojimus iš <my branch> (kuris nėra rastas master ) ir rebase juos master antraštei. Kitaip tariant, pirmojo įvykio „ <my branch> “ pagrindinis elementas nebėra ankstesnis fiksatorius master istorijoje, bet dabartinė master antraštė. Dvi komandos yra tokios pat kaip:

 git rebase master <my branch> 

Galbūt tai būtų lengviau prisiminti, nes „bazės“ ir „keisti“ šakos yra aiškios.

. Galutinis rezultatas:

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

Paskutinės dvi komandos ...

 git checkout master git merge <my branch> 

... atlikite greitą sujungimą, kad galėtumėte taikyti visus <my branch> pakeitimus. Be šio žingsnio, kapitonas nepridės pakartotinio įsipareigojimo. Galutinis rezultatas:

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

master ir <my branch> abi nuorodos B' . Be to, nuo šio taško galite saugiai pašalinti nuorodą <my branch> .

 git branch -d <my branch> 
32
24 февр. Atsakymą pateikė cmcginty 24 vas. 2009-02-24 12:43 '09 at 12:43 2009-02-24 12:43

git pseudonimai, awk ir shell funkcijos išgelbėjimui!

 git prevision <N> <filename> 

kur <N> yra failo pataisymų, skirtų failui <filename> .
Pvz., Jei norite patikrinti, ar nėra ankstesnės vieno x/y/zc failo peržiūros, paleiskite

 git prevision -1 x/y/zc 

Kaip veikia git prognozavimas?

Pridėti prie savo gitconfig

taip:
 [alias] prevision = "!f() { git checkout `git log --oneline $2 | awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f" 

Pagrindinė komanda

  • atlieka git log nurodytame faile ir
  • atrenka atitinkamą įvykio ID failo istorijoje ir
  • atlieka nurodyto failo git checkout įsipareigojimo ID.

Iš esmės viskas, ką šioje situacijoje galima atlikti rankiniu būdu
suvynioti į vieną gražią, veiksmingą git-alias - git-prevision

21
01 мая '15 в 4:46 2015-05-01 04:46 atsakymą pateikė TheCodeArtist 01 gegužės 15 d. 4:46 2015-05-01 04:46

Turiu prisijungti prie „ EasyGit“ , kuris yra pakuotė , kad „ Git“ būtų lengviau prieinama naujokams, nesuklaidinant patyrusių vartotojų. Vienas iš dalykų, kuriuos jis daro, suteikia daugiau git revert vertybių . Tokiu atveju tiesiog pasakykite:

eg revert foo/bar foo/baz

20
19 окт. atsakymas pateikiamas Aristotelio Pagaltzio 19 val. 2008-10-19 03:16 '08, 03:16, 2008-10-19 03:16

Jei norite grąžinti failą į ankstesnį įvykį (ir failas, kurį norite grąžinti, jau yra nustatytas), galite naudoti

 git checkout HEAD^1 path/to/file 

arba

 git checkout HEAD~1 path/to/file 

Tada tiesiog atlikite žingsnį ir nustatykite „naują“ versiją.

Ginkluotosios žinios, kad susijungimo atveju įsipareigojimas gali turėti du tėvus, turėtumėte žinoti, kad HEAD ^ 1 yra pirmasis tėvas, o HEAD ~ 1 - antrasis tėvas.

Arba jis veiks, jei medyje yra tik vienas iš tėvų.

20
11 янв. Atsakymą pateikė „ ModernIncantations“ sausio 11 d. 2014-01-11 03:29 '14 at 3:29 2014-01-11 03:29

Pirmasis tikslinės rinkmenos atstatymas

 git reset HEAD path_to_file 

Antrasis šio failo patikrinimas

 git checkout -- path_to_file 
19
04 апр. atsakymą pateikė Gulshan Maurya 04 balandžio. 2017-04-04 13:25 '17, 13:25 pm 2017-04-04 13:25

Atkreipkite dėmesį, kad „ git checkout ./foo ir „ git checkout HEAD ./foo nėra vienodi; pavyzdys:

 $ 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 

(Antrasis add apdoroja failą indekse, tačiau jis neįvykdomas.)

git checkout ./foo reiškia maršruto ./foo grąžinimą į indeksą ; pridedant HEAD nurodo Gitui grąžinti šį rodyklės kelią iki jo HEAD .

19
31 авг. Atsakymą pateikė Damien Diederen rugpjūčio 31 d 2008-08-31 14:54 '08, 14:54 val. 2008-08-31 14:54

Čia yra daug pasiūlymų, dauguma jų yra „ git checkout $revision -- $file dvasia. Keletas neaiškių alternatyvų:

 git show $revision:$file > $file 

Be to, dažnai naudoju tik laikinai, norėdami pamatyti konkrečią versiją:

 git show $revision:$file 

arba

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

(OBS: $file turi prasidėti prefiksu ./ jei tai yra santykinis kelias, git show $revision:$file to work“

Ir dar labiau keista

 git archive $revision $file | tar -x0 > $file 
14
08 янв. Atsakymas Peter V. Mørch 08 sausis 2016-01-08 01:19 '16 at 1:19 2016-01-08 01:19

Norėdami pereiti prie ankstesnės įsipareigojimo failo versijos, gaukite įsipareigojimo numerį, tarkim, eb917a1

 git checkout eb917a1 YourFileName 

Jei tiesiog reikia grįžti į naujausią registruotą versiją.

 git reset HEAD YourFileName git checkout YourFileName 

Tai nuves jus į paskutinę įrašytą failo būseną.

11
25 февр. atsakymas pateikiamas shah1988 25 vasaris 2014-02-25 17:01 '14 at 17:01 2014-02-25 17:01

Man neatrodė, kad atsakymas buvo tikrai aiškus, todėl norėčiau pridėti mano, kuris atrodo labai paprastas.

Turiu įsipareigojimą abc1 , o po to aš padariau keletą (arba vieno pakeitimo) file.txt failo.

Dabar pasakyk man, kad aš kažką abc1 faile file.txt , ir aš noriu grįžti prie ankstesnio įsipareigojimo abc1 .

1. „ git checkout file.txt : pašalinsite vietinius pakeitimus, jei jų nereikia.

2. git checkout abc1 file.txt : tai leis failui pasiekti norimą versiją

3. git commit -m "Restored file.txt to version abc1" : tai sukels jūsų grįžimą.

  1. git push : tai atneš viską į nuotolinę saugyklą

Žinoma, nuo 2 iki 3 žingsnių galite suprasti, kas vyksta. Paprastai turėtumėte matyti, kad file.txt jau buvo pridėtas, todėl nereikia git add .

10
23 марта '17 в 0:33 2017-03-23 00:33 atsakymą pateikė kalmanIsAGameChanger , kovo 23 d. 17 d. 0:33 2017-03-23 ​​00:33

git checkout ref | įsipareigojimai - filePath

Pavyzdžiui.

 git checkout HEAD~5 -- foo.bar or git checkout 048ee28 -- foo.bar 
10
26 сент. Atsakymas pateikiamas Amos Folarin 26 sep . 2013-09-26 20:04 '13, 20:04, 2013-09-26 20:04

Daugelis čia pateiktų atsakymų reikalauja naudoti „ git reset ... <file> arba git checkout ... <file> , bet prarasite visus <file> kurie buvo padaryti po to, kai norite sugrįžti.

Jei norite atsisakyti pakeitimų iš vieno įsipareigojimo tik viename faile, kaip git revert , bet tik į vieną failą (arba, tarkim, susietų failų pogrupį), siūlau naudoti tiek „ git diff tiek „ git diff su <sha> = įsipareigojimo, kurį norite grąžinti, hash:

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

Iš esmės jis pirmiausia sukurs pleistrą, atitinkantį pakeitimus, kuriuos norite grąžinti, ir tada atšaukite pleistro taikymą, kad atmestumėte šiuos pakeitimus.

Žinoma, tai neveikia, jei atvirkštinės linijos buvo pakeistos bet kokiu įsipareigojimu tarp <sha1> ir HEAD (konflikto).

8
07 дек. atsakymas pateikiamas Vince 07 dec. 2016-12-07 17:43 '16 at 17:43 pm 2016-12-07 17:43

Naudokite „ git log kad gautumėte tam tikros versijos „hash“ klavišą, tada naudokite „ git checkout <hashkey>

Pastaba Nepamirškite įvesti maišos prieš paskutinį. Paskutinis maišas rodo dabartinę padėtį (HEAD) ir nieko nekeičia.

8
05 дек. atsakymas duotas mustafakyr 05 dec. 2011-12-05 23:09 '11, 23:09, 2011-12-05 23:09

Akivaizdu, kad kažkas turi parašyti aiškią knygą apie gitą ar gitą, kad jis būtų geriau paaiškintas dokumentuose. Susidūręs su ta pačia problema, aš manau, kad

 cd <working copy> git revert master 

panaikina paskutinį įvykį, kuris, atrodo, veikia.

Ianas

7
16 дек. Atsakymą pateikė Ian Davis gruodžio 16 d. 2011-12-16 06:03 '11, 6:03, 2011-12-16 06:03

Jei neseniai padarytuose įvykiuose darote neteisingą failą, vadovaukitės instrukcijomis:

  1. atviro kodo medį, pakeiskite šį įvykį

2019

 git revert <hash> 

Grąžina nurodytą įvykį. Atrodo, kad manote, kad „ git revert veikia tik paskutinį įvykį.

Tai nepadės išspręsti jūsų problemos, jei norite atšaukti tam tikro failo pakeitimą ir kad įsipareigojimas pasikeitė daugiau nei šis failas.

4
17 дек. Otto atsakė 17 d. 2008-12-17 21:56 '08 at 9:56 pm 2008-12-17 21:56

Štai mano kelias.

a) „Android“ studijoje atidarykite failą.

b) git → Rodyti istoriją, suraskite ankstesnį įsipareigojimą, į kurį noriu grįžti. Gauti įsipareigojimų_d (t. Y. Įpareigoti maišyti).

c) git checkout commit_id file_path

1
13 марта '17 в 11:10 2017-03-13 11:10 atsakymą pateikė Francis Bacon, kovo 13, 17, 11:10 2017-03-13 11:10

Jei naudojatės „Git Extensions“ ir norite grįžti į tėvą, kuris įsipareigoja už failą, galite pasirinkti įsipareigojimą, kuriame yra pakeitimai, kuriuos norite grąžinti, tada išsamiai pasirinkite skirtuką „Diff“, dešiniuoju pelės mygtuku spustelėkite failą, kurį norite grąžinti, tada iš naujo nustatykite failą į „ .... ", tada" A "(patronuojanti)

1
26 сент. Johnny atsakymas 2017-09-26 04:48 '17 ne 4:48 2017-09-26 04:48

Tai labai paprastas žingsnis. Ištraukite failą su norimu identifikavimo ID, čia dar vienas įsipareigojimo ID, tada tiesiog paleiskite git įsipareigojimo komandą ir baigsite.

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

Tai labai patogu. Jei norime padaryti bet kokį failą su bet kurio ankstesnio įsipareigojimo identifikatoriumi įsipareigojimo viršuje, mes galime lengvai tai padaryti.

1
24 янв. Abhishek Dwivedi atsakymas dėl sausio 24 d 2019-01-24 20:21 '19 , 8:21 pm 2019-01-24 20:21
  • 1
  • 2

Kiti klausimai apie „ žymes arba „ Užduoti klausimą“