Vraag Reset of herstel een specifiek bestand naar een specifieke revisie met Git?


Ik heb enkele wijzigingen aangebracht in een bestand dat een aantal keer is vastgelegd als onderdeel van een groep bestanden, maar nu de wijzigingen erop terug / terugzet naar een eerdere versie.

Ik heb het gedaan git log samen met een git diff om de herziening te vinden die ik nodig heb, maar ik heb gewoon geen idee hoe het bestand in het verleden terug in zijn oude staat kan worden gebracht.


3443
2017-10-18 23:34


oorsprong


antwoorden:


Ervan uitgaande dat de hash van de commit die u wilt is c5f567:

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

De git uitchecken man pagina geeft meer informatie.

Als je eerder wilt teruggaan naar de commit c5f567, toevoegen ~1 (werkt met elk nummer):

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

Als een kanttekening, ik ben altijd ongemakkelijk geweest met dit commando omdat het gebruikt wordt voor zowel gewone dingen (veranderen tussen takken) en ongewone, destructieve dingen (het weglaten van wijzigingen in de werkmap).


4654
2017-10-18 23:39



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

git diff <commit hash> <filename>

Als u vervolgens een specifiek bestand naar die commit wilt terugzetten, gebruikt u de opdracht reset:

git reset <commit hash> <filename>

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

Een goede workflow voor het beheren van waypoints is het gebruik van tags om punten in uw tijdlijn schoon te markeren. Ik kan je laatste zin niet helemaal begrijpen, maar wat je misschien wilt is een vertakking van een vorig punt af te scheiden. Gebruik hiervoor de handige checkout-opdracht:

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

Je kunt dit dan opnieuw basen op je hoofdlijn wanneer je klaar bent om die wijzigingen samen te voegen:

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

508
2017-12-17 06:59



Je kunt elke verwijzing naar een git commit gebruiken, inclusief de SHA-1 als dat het handigst is. Het punt is dat de opdracht er als volgt uitziet:

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


305
2018-04-07 21:48



git checkout -- foo

Dat wordt gereset foo naar HEAD. Je kan ook:

git checkout HEAD^ foo

voor één herziening terug, etc.


243
2017-08-29 20:56



En om terug te keren naar de laatst toegewezen versie, die het meest vaak nodig is, kunt u deze eenvoudigere opdracht gebruiken.

git checkout HEAD file/to/restore

106
2018-01-14 06:15



Ik had zojuist hetzelfde probleem en dat vond ik dit antwoord gemakkelijkst te begrijpen (commit-ref is de SHA-waarde van de wijziging in het logboek waarnaar u wilt terugkeren):

git checkout [commit-ref] [filename]

Dit zet die oude versie in je werkmap en van daaruit kun je het vastleggen als je wilt.


100
2018-05-27 17:52



Als je weet hoeveel commits je nodig hebt om terug te gaan, kun je gebruiken:

git checkout master~5 image.png

Dit gaat ervan uit dat je op de master branch, en de versie die u wilt is 5 commits terug.


85
2018-04-07 14:03



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

Soms wil je gewoon teruggaan en elke verandering voorbij een bepaald punt vergeten omdat ze helemaal fout zijn.

Beginnen met:

$ git log

waarin je een lijst met recente commits en hun SHA1 hashes ziet.

Typ vervolgens:

$ git reset --hard SHA1_HASH

om de status te herstellen naar een bepaalde commit en alle nieuwere commits permanent uit de record te wissen.


75
2017-12-17 06:53



Dit werkte voor mij:

git checkout <commit hash> file

Voer vervolgens de wijziging uit:

git commit -a

59
2017-08-25 22:12



Je moet voorzichtig zijn als je 'rollback' zegt. Als je vroeger één versie van een bestand had in commit $ A, en vervolgens later twee wijzigingen aanbracht in twee afzonderlijke commits $ B en $ C (dus wat je ziet is de derde iteratie van het bestand), en als je zegt " Ik wil teruggaan naar de eerste ", meen je het echt?

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

$ git checkout $A file

en dan commit je het resultaat. De opdracht vraagt ​​"Ik wil het bestand uitchecken uit de staat die is vastgelegd door de commit $ A".

Aan de andere kant, wat je bedoelde was om van de verandering af te komen die de tweede iteratie (d.w.z. commit $ B) binnenhaalde, terwijl je vasthoudt wat commit $ C deed met het bestand, zou je $ B willen terugdraaien

$ git revert $B

Merk op dat degene die commit $ B heeft gemaakt misschien niet erg gedisciplineerd is geweest en mogelijk een totaal niet-gerelateerde wijziging in dezelfde commit heeft gedaan, en deze terugzetting kan betrekking hebben op andere bestanden dan het dossier je ziet aanstootgevende veranderingen, dus misschien wil je het resultaat zorgvuldig bekijken nadat je dit gedaan hebt.


53
2018-01-11 08:13



Vreemd genoeg werkt 'git checkout foo' niet als de werkkopie zich in een directory met de naam foo bevindt; echter, zowel 'git checkout HEAD foo' en 'git checkout ./foo' zullen:

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo

35
2017-08-29 21:26