border=0

"95.27.42.156 - 95.27.42.156"

Reset of retourneer een specifiek bestand naar een specifieke revisie met Git?

Ik heb enkele wijzigingen aangebracht in een bestand dat meerdere keren is overgebracht als onderdeel van een groep bestanden, maar nu wil ik de wijzigingen terugzetten / terugzetten naar de vorige versie.

Ik heb git log met git diff gedaan om de optie te vinden die ik nodig had, maar ik weet gewoon niet hoe ik het bestand in het verleden terug moet krijgen.

3786
19 окт. stel Hates_ 19 oct in. 2008-10-19 02:34 '08 om 2:34 uur 2008-10-19 02:34
ответ 31 antwoorden
  • 1
  • 2

Ervan uitgaande dat de hash van de commit die je wilt c5f567 :

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

De git checkout handleiding geeft meer informatie.

Als je wilt terugkeren naar commit to c5f567 , voeg je ~1 (werkt met elk nummer):

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

Als een opmerking, ik was altijd ongemakkelijk met dit commando, omdat het zowel voor gewone dingen (schakelen tussen takken) als voor ongewone, destructieve dingen (met uitzondering van wijzigingen in de werkdirectory) werd gebruikt.

5117
19 окт. antwoord gegeven door Greg Hewgill 19 oktober 2008-10-19 02:39 '08 om 2:39 2008-10-19 02:39

U kunt snel de wijzigingen in een bestand bekijken met de opdracht diff:

 git diff <commit hash> <filename> 

Gebruik vervolgens de opdracht reset om een ​​specifiek bestand naar dit slot te retourneren:

 git reset <commit hash> <filename> 

Mogelijk moet u de optie --hard gebruiken als u lokale wijzigingen hebt.

Een goede documentenstroom om uw waypoints te beheren, is om tags te gebruiken om punten op uw tijdlijn schoon te houden. Ik kan je laatste zin niet begrijpen, maar wat je misschien nodig hebt, is de divergentie van de branch vanaf het vorige punt in de tijd. Gebruik hiervoor de handige uitcheckopdracht:

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

Dan kunt u het opnieuw installeren tegen uw hoofdregel wanneer u klaar bent om deze wijzigingen samen te voegen:

 git checkout <my branch> git rebase master git checkout master git merge <my branch> 
541
17 дек. Antwoord gegeven door Chris Lloyd op 17 dec. 2008-12-17 09:59 '08 om 9:59 2008-12-17 09:59

Je kunt elke link naar git commit gebruiken, inclusief SHA-1, als dat het handigst is. Het feit is dat het team er zo uitziet:

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

319
08 апр. het antwoord wordt gegeven foxxtrot 08 apr. 2009-04-08 00:48 '09 om 0:48 2009-04-08 00:48
 git checkout -- foo 

Dit is een reset- foo voor HEAD. Je kunt ook:

 git checkout HEAD^ foo 

voor één herziening, etc.

256
29 авг. antwoord gegeven door Greg Hewgill 29 aug. 2008-08-29 23:56 '08 om 23:56 uur op 08-08-2008 23:56 uur

En om terug te gaan naar de laatst voltooide versie, die meestal nodig is, kunt u dit eenvoudiger commando gebruiken.

 git checkout HEAD file/to/restore 
114
14 янв. het antwoord wordt CDR 14 jan gegeven. 2012-01-14 09:15 '12 om 9:15 2012-01-14 09:15

Ik had op dit moment hetzelfde probleem en ik vond dit antwoord het gemakkelijkst te begrijpen ( commit-ref is de waarde van de SHA-wijziging in het logboek dat je wilt terugsturen):

 git checkout [commit-ref] [filename] 

Dit plaatst deze oude versie in je werkdirectory en van daaruit kun je het herstellen als je wilt.

102
27 мая '09 в 20:52 2009-05-27 20:52 het antwoord wordt gegeven door bbrown op 27 mei '09 om 20:52 uur 2009-05-27 20:52

Als je weet hoeveel commits je moet retourneren, kun je het volgende gebruiken:

 git checkout master~5 image.png 

Er wordt aangenomen dat u zich in de hoofdtak bevindt en dat de gewenste versie 5 is.

88
07 апр. Antwoord Ron DeVera 07 apr 2009-04-07 17:03 '09 om 17:03 2009-04-07 17:03

Ik denk dat ik vond ... van http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

Soms wil je gewoon teruggaan en alle veranderingen voor een bepaald punt vergeten, omdat ze allemaal verkeerd zijn.

Begin met:

$ git log

die je een lijst met recente commits en hun SHA1-hash laat zien.

Voer vervolgens in:

$ git reset --hard SHA1_HASH

om de status voor een bepaalde commit te herstellen en alle nieuwe entries voor altijd uit de record te wissen.

78
17 дек. het antwoord is gegeven 17 dec. 2008-12-17 09:53 '08 om 9:53 2008-12-17 09:53

Het werkte voor mij:

 git checkout <commit hash> file 

Voer vervolgens de wijziging uit:

 git commit -a 
61
26 авг. het antwoord wordt gegeven v2k 26 aug. 2011-08-26 01:12 '11 om 1:12 2011-08-26 01:12

Je moet voorzichtig zijn als je 'rollback' zegt. Als je één versie van het bestand gebruikt in commit $ A, dan worden twee wijzigingen in twee afzonderlijke commits $ B en $ C gemaakt (dus je ziet, dit is de derde iteratie van het bestand), en als je zegt "Ik wil terug naar de eerste", meen het echt?

Als u de wijzigingen in zowel de tweede als derde iteraties wilt verwijderen, is het heel eenvoudig:

 $ git checkout $A file 

en dan maak je het resultaat vast. De opdracht vraagt ​​"Ik wil het bestand controleren vanuit de staat die is vastgelegd door de $ A-commit".

Aan de andere kant, wat je in gedachten had, was om van de tweede iteratieverandering af te komen (d.w.z. $ B te maken), terwijl je bewaart dat je het $ C-bestand in het bestand hebt gerepareerd, wil je $ B teruggeven

 $ git revert $B 

Merk op dat degene die commit $ B heeft gemaakt, misschien niet erg gedisciplineerd is geweest en compleet onverwante wijzigingen aan dezelfde commit kon maken, en deze return kan betrekking hebben op andere bestanden dan het bestand dat je ziet, en dus aanstootgevende veranderingen, kan het resultaat daarna zorgvuldig controleren.

54
11 янв. Het antwoord wordt gegeven door gitster 11 jan 2009-01-11 11:13 '09 om 11:13 2009-01-11 11:13

Interessant is dat 'git checkout foo' niet werkt als de werkkopie zich in een directory met de naam foo bevindt; echter, zoals "w20> checkout HEAD foo" en "git checkout./foo" zou zijn:

 $ pwd /Users/aaron/Documents/work/foo $ git checkout foo D foo Already on "foo" $ git checkout ./foo $ git checkout HEAD foo 
36
30 авг. het antwoord wordt gegeven door Aaron Maenpaa 30 aug. 2008-08-30 00:26 '08 om 0:26 uur 2008-08-30 00:26

Hier werkt rebase :

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

Stel dat je dat hebt gedaan

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

De eerste twee teams ... maken een git checkout en herinstalleren wizard

... controleer de tak met wijzigingen die u op de master wilt toepassen. De rebase opdracht neemt commits van <my branch> (die niet worden gevonden in de master ) en brengt ze rebase toe aan de hoofdkop. Met andere woorden, het bovenliggende element van de eerste commit in <my branch> niet >master , maar de huidige hoofdkoptekst. Twee teams zijn hetzelfde als:

 git rebase master <my branch> 

Het is misschien gemakkelijker om deze opdracht te onthouden, omdat de vertakkingen "basis" en "wijzigen" expliciet zijn.

. Het eindresultaat:

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

De laatste twee teams ...

 git checkout master git merge <my branch> 

... een snelle samenvoeging uitvoeren om alle <my branch> -wijzigingen op master . Zonder deze stap is er geen rebase-commit toegevoegd aan de master . Het eindresultaat:

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

master en <my branch> beide verwijzingen B' . Bovendien kunt u vanaf dit punt de koppeling <my branch> veilig verwijderen.

 git branch -d <my branch> 
32
24 февр. Het antwoord wordt gegeven door cmcginty 24 feb. 2009-02-24 12:43 '09 om 12:43 2009-02-24 12:43

git aliases, awk en shell-functies voor redding!

 git prevision <N> <filename> 

waarbij <N> het aantal bestandsfixes is voor rollback voor het bestand <filename> .
Als u bijvoorbeeld de onmiddellijke vorige revisie van een enkel x/y/zc bestand wilt controleren, voert u uit

 git prevision -1 x/y/zc 

Hoe werkt git-voorspelling?

Voeg toe aan je gitconfig

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

Team in principe

  • voert git log in het opgegeven bestand en
  • selecteert de bijbehorende commit-ID in de bestandsgeschiedenis en
  • voert git checkout commit identifier uit voor het opgegeven bestand.

In wezen alles wat handmatig in deze situatie kan worden gedaan
verpakt in een mooie, effectieve git-alias - git-prevision

21
01 мая '15 в 4:46 2015-05-01 04:46 Het antwoord wordt gegeven door TheCodeArtist 01 mei '15 op 4:46 2015-05-01 04:46

Ik moet EasyGit hier aansluiten, wat een verpakking is om git toegankelijker te maken voor beginners zonder ervaren gebruikers in verwarring te brengen. Een van de dingen die het doet is meer git revert waarden geven . In dit geval zeg je gewoon:

eg revert foo/bar foo/baz

20
19 окт. het antwoord is gegeven door Aristotle Pagaltzis 19 oct. 2008-10-19 03:16 '08 om 3:16 uur 2008-10-19 03:16

In het geval dat u het bestand naar de vorige commit wilt retourneren (en het bestand dat u wilt retourneren al vastligt), kunt u gebruiken

 git checkout HEAD^1 path/to/file 

of

 git checkout HEAD~1 path/to/file 

Vervolledig vervolgens de stap en repareer de "nieuwe" versie.

Gewapend met de wetenschap dat in het geval van een fusie een commit twee ouders kan hebben, moet je weten dat HEAD ^ 1 de eerste ouder is en HEAD ~ 1 de tweede ouder.

Of het zal werken als er maar één ouder in de boom zit.

20
11 янв. Het antwoord wordt gegeven door ModernIncantations 11 januari. 2014-01-11 03:29 '14 om 3:29 2014-01-11 03:29

Eerste reset hoofd voor doelbestand

 git reset HEAD path_to_file 

De tweede controle van dit bestand

 git checkout -- path_to_file 
19
04 апр. het antwoord wordt gegeven door Gulshan Maurya 04 apr. 2017-04-04 13:25 17 om 13:25 uur 2017-04-04 13:25

Merk op dat git checkout ./foo en git checkout HEAD ./foo niet precies hetzelfde zijn; bijvoorbeeld:

 $ 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 

(De tweede add verwerkt het bestand in de index, maar het wordt niet voltooid.)

git checkout ./foo betekent het pad ./foo naar de index retourneren ; door een HEAD toe te voegen, geeft Git opdracht om dit HEAD eerder naar zijn HEAD te retourneren.

19
31 авг. antwoord gegeven door Damien Diederen 31 aug 2008-08-31 14:54 '08 om 14:54 uur 2008-08-31 14:54 uur

Er zijn veel suggesties, de meeste in de geest van git checkout $revision -- $file . Een paar obscure alternatieven:

 git show $revision:$file > $file 

En ook gebruik ik het vaak alleen om tijdelijk een specifieke versie te zien:

 git show $revision:$file 

of

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

(OBS: $file moet beginnen met het voorvoegsel ./ als dit een relatief pad is voor git show $revision:$file to work)

En des te vreemder

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

Als u naar de vorige versie van het commit-bestand wilt gaan, krijgt u het commit-nummer, bijvoorbeeld eb917a1

 git checkout eb917a1 YourFileName 

Als u alleen maar naar de nieuwste geregistreerde versie moet terugkeren.

 git reset HEAD YourFileName git checkout YourFileName 

Hiermee gaat u naar de laatste geregistreerde staat van het bestand.

11
25 февр. het antwoord is gegeven shah1988 25 feb. 2014-02-25 17:01 '14 om 17:01 2014-02-25 17:01

Voor mij leek geen antwoord heel duidelijk en daarom zou ik de mijne willen toevoegen, wat supereenvoudig lijkt.

Ik heb een commit abc1 , en daarna heb ik verschillende (of één wijziging) file.txt bestand gemaakt.

Vertel me nu dat ik iets heb verpest in het bestand file.txt , en ik wil teruggaan naar de vorige commit abc1 .

1. git checkout file.txt : hiermee worden de lokale wijzigingen verwijderd als je ze niet nodig hebt.

2. git checkout abc1 file.txt : dit zal uw bestand naar uw gewenste versie leiden

3. git commit -m "Restored file.txt to version abc1" : dit zal uw omkering veroorzaken.

  1. git push : dit zal alles naar een externe repository brengen

Tussen stap 2 en 3 kun je uiteraard de git status om te begrijpen wat er gaande is. Meestal zou je moeten zien dat file.txt al is toegevoegd, en daarom is git add niet nodig.

10
23 марта '17 в 0:33 2017-03-23 00:33 het antwoord wordt gegeven door KalmanIsAGameChanger op 23 maart '17 om 0:33 2017-03-23 ​​00:33

git checkout ref | commitHash - filePath

bijvoorbeeld.

 git checkout HEAD~5 -- foo.bar or git checkout 048ee28 -- foo.bar 
10
26 сент. Het antwoord is gegeven Amos Folarin 26 september . 2013-09-26 20:04 '13 om 20:04 2013-09-26 20:04

Veel van de antwoorden hier vereisen het gebruik van git reset ... <file> of git checkout ... <file> , maar je verliest alle wijzigingen in <file> die zijn aangebracht na de commit die je wilt retourneren.

Als je de wijzigingen van slechts één commit naar één bestand wilt weggooien, zoals git revert zou doen, maar alleen naar een enkel bestand (of, zeg, een subset van de commit-bestanden), raad ik aan om zowel git diff als git apply zoals dit ( met <sha> = de hash van de commit die je wilt retourneren):

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

In principe zal het eerst een patch genereren die overeenkomt met de wijzigingen die u wilt retourneren en vervolgens de toepassing van de patch annuleren om deze wijzigingen te annuleren.

Het werkt natuurlijk niet als de omgekeerde regels werden gewijzigd door een commit tussen <sha1> en HEAD (conflict).

8
07 дек. Het antwoord is gegeven Vince 07 dec. 2016-12-07 17:43 '16 om 17:43 uur 2016-12-07 17:43

Gebruik git log om de hash-sleutel voor een specifieke versie te krijgen en gebruik git checkout <hashkey>

Let op. Vergeet niet om de hasj in te voeren vóór de laatste. De laatste hash geeft de huidige positie (HEAD) aan en verandert niets.

8
05 дек. het antwoord wordt gegeven mustafakyr 05 dec. 2011-12-05 23:09 '11 om 23:09 uur 2011-12-05 23:09 uur

Het is duidelijk dat iemand een duidelijk boek over git of git moet schrijven om het beter in de documentatie uit te leggen. Geconfronteerd met hetzelfde probleem, vermoedde ik dat

 cd <working copy> git revert master 

keert de laatste commissie die lijkt te doen om.

Yang

7
16 дек. Het antwoord wordt gegeven door Ian Davis op 16 december. 2011-12-16 06:03 '11 om 6:03 2011-12-16 06:03

Als u het verkeerde bestand in uw recente commits hebt gemaakt, volgt u de instructies:

  1. open source tree, verander deze commit

2019

23 авг. antwoord gegeven door saber tabatabaee yazdi 23 aug. 2018-08-23 12:53 '18 om 12:53 2018-08-23 12:53

U kunt dit in 4 stappen doen:

  1. annuleer de hele commit met het bestand dat u specifiek wilt annuleren - dit zal een nieuwe commit in uw thread creëren
  2. zachte reset die commit - verwijdert de commit en verplaatst de wijzigingen naar de werkruimte
  3. selecteer handmatig bestanden om ze terug te zetten en te vergrendelen
  4. laat alle andere bestanden in je werkruimte vallen

Wat u moet bellen in uw terminal :

  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.

veel succes

4
08 мая '18 в 13:26 2018-05-08 13:26 het antwoord wordt gegeven door Nir M. mei 08, '18 om 1:26 pm 2018-05-08 13:26
 git revert <hash> 

Retourneert de opgegeven commit. Je lijkt te denken dat git revert alleen invloed heeft op de laatste commit.

Dit zal uw probleem niet oplossen als u de wijziging in een specifiek bestand ongedaan wilt maken en die commit meer heeft veranderd dan dit bestand.

4
17 дек. Otto antwoordde 17 december 2008-12-17 21:56 '08 om 21:56 uur 2008-12-17 21:56 uur

Hier is mijn manier.

a) Open het bestand in Android Studio.

b) git → Geschiedenis weergeven, vind de vorige commit waarnaar ik wil terugkeren. Krijg commit_id (d.w.z. Commit-hash).

c) git checkout commit_id file_path

1
13 марта '17 в 11:10 2017-03-13 11:10 het antwoord wordt gegeven door Francis Bacon 13 maart '17 om 11:10 2017-03-13 11:10

Als u Git Extensions gebruikt en wilt terugkeren naar de bovenliggende commit voor het bestand, kunt u de commit selecteren die de wijzigingen bevat die u wilt retourneren. Selecteer vervolgens het tabblad "Diff" in detail, klik met de rechtermuisknop op het bestand dat u wilt retourneren en stel het bestand opnieuw in op " .... ", dan" A "(ouder)

1
26 сент. antwoord gegeven door johnny 26 sept. 2017-09-26 04:48 '17 om 4:48 2017-09-26 04:48

Dit is een heel eenvoudige stap. Pak het bestand uit met de commit-ID die we willen, hier is eerder één commit-ID, voer dan gewoon het commando git commitmend uit en je bent klaar.

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

Het is erg handig. Als we een bestand met een identifier van de vorige commit boven aan de commit willen uitvoeren, kunnen we dit eenvoudig doen.

1
24 янв. Antwoord gegeven door Abhishek Dwivedi op 24 januari 2019-01-24 20:21 19 om 20.21 uur 2019-01-24 20:21
  • 1
  • 2

Zie andere vragen over tags of Stel een vraag