Vraćanje ili vraćanje određene datoteke na određenu reviziju pomoću programa Git?

Napravio sam neke promjene u datoteci koja je nekoliko puta prenesena kao dio grupe datoteka, ali sada želim vratiti / vratiti promjene na prethodnu verziju.

Napravio sam git log zajedno s git diff kako bih pronašao potrebnu opciju, ali ne znam kako da vratim datoteku u prošlosti.

3786
19 окт. set Hates_ 19. listopada 2008-10-19 02:34 '08 u 2:34 am 2008-10-19 02:34
ответ 31 odgovor
  • 1
  • 2

Pod pretpostavkom da haš c5f567 želite je c5f567 :

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

Git checkout priručnik daje više informacija.

Ako se želite vratiti na obvezu na c5f567 , dodajte ~1 (radi s bilo kojim brojem):

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

Kao napomenu, uvijek mi je bilo neugodno s ovom naredbom, jer se koristila i za obične stvari (prebacivanje između grana) i za neobične, destruktivne stvari (isključujući promjene u radnom imeniku).

5117
19 окт. odgovor od Heggill Greg 19 listopad 2008-10-19 02:39 '08 u 2:39 2008-10-19 02:39

Pomoću naredbe diff možete brzo pregledati izmjene u datoteci:

 git diff <commit hash> <filename> 

Zatim, da biste vratili određenu datoteku ovom popravljaču, upotrijebite naredbu resetiranja:

 git reset <commit hash> <filename> 

Možda ćete morati koristiti opciju --hard ako imate lokalne izmjene.

border=0

Dobar protok dokumenata za upravljanje putnim točkama je korištenje oznaka za čišćenje točaka na vremenskoj liniji. Ne mogu razumjeti vašu posljednju rečenicu, ali ono što vam je potrebno je divergencija grane od prethodne točke u vremenu. Da biste to učinili, upotrijebite prikladnu naredbu za naplatu:

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

Tada je možete ponovo instalirati na glavnu liniju kada ste spremni spojiti te promjene:

 git checkout <my branch> git rebase master git checkout master git merge <my branch> 
541
17 дек. Odgovor dao Chris Lloyd 17. prosinca. 2008-12-17 09:59 '08 u 9:59 2008-12-17 09:59

Možete koristiti bilo koju vezu za git obvezu, uključujući SHA-1, ako je to najprikladnije. Činjenica je da tim izgleda ovako:

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

319
08 апр. odgovor je dat foxxtrot 08 apr. 2009-04-08 00:48 '09 u 0:48 2009-04-08 00:48
 git checkout -- foo 

Ovo će biti resetiranje foo za HEAD. Također možete:

 git checkout HEAD^ foo 

za jednu reviziju, itd.

256
29 авг. odgovor dao Greg Hewgill 29. kolovoza 2008-08-29 23:56 '08 u 23:56 2008-08-29 23:56

A da biste se vratili na zadnju dovršenu verziju, koja je najčešće potrebna, možete koristiti ovu jednostavniju naredbu.

 git checkout HEAD file/to/restore 
114
14 янв. odgovor je dan CDR 14 jan. 2012-01-14 09:15 '12 u 9:15 2012-01-14 09:15

Imao sam isti problem upravo sada i našao sam taj odgovor najlakšim za razumijevanje ( commit-ref je vrijednost promjene SHA u zapisniku koji želite poslati natrag):

 git checkout [commit-ref] [filename] 

To stavlja staru verziju u vaš radni direktorij, a od tamo je možete popraviti ako želite.

102
27 мая '09 в 20:52 2009-05-27 20:52 odgovor je dala bbrown dana 27. svibnja u 20:52 2009-05-27 20:52

Ako znate koliko trebate vratiti, možete upotrijebiti:

 git checkout master~5 image.png 

Pretpostavlja se da ste u master grani, a željena verzija je 5.

88
07 апр. Odgovor je dao Ron DeVera 07 Apr 2009-04-07 17:03 '09 u 17:03 2009-04-07 17:03

Mislim da sam pronašao ... iz http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

Ponekad se samo želite vratiti i zaboraviti sve promjene za određenu točku, jer su sve u krivu.

Počnite s:

$ git log

koja prikazuje popis nedavnih izvršenja i njihov SHA1 hash.

Zatim unesite:

$ git reset --hard SHA1_HASH

za vraćanje stanja za dano urezivanje i brisanje svih novih unosa iz zapisa zauvijek.

78
17 дек. odgovor je dan jdee 17 dec. 2008-12-17 09:53 '08 u 9:53 2008-12-17 09:53

To mi je pomoglo:

 git checkout <commit hash> file 

Zatim izvršite promjenu:

 git commit -a 
61
26 авг. odgovor je dan v2k 26 aug. 2011-08-26 01:12 '11 u 1:12 2011-08-26 01:12

Morate biti oprezni kada kažete "rollback". Ako ste koristili jednu verziju datoteke u urezivanju $ A, onda ste napravili dvije izmjene u dvije odvojene naredbe $ B i $ C (tako da vidite, ovo je treća iteracija datoteke), a ako kažete "Želim se vratiti na prvu", vi to stvarno znači?

Ako se želite riješiti promjena u drugoj i trećoj iteraciji, vrlo je jednostavno:

 $ git checkout $A file 

i onda popravite rezultat. Naredba pita "Želim provjeriti datoteku iz stanja koje je napisao $ A urezivanje".

S druge strane, ono što ste imali na umu je da se riješite druge promjene iteracije (tj. Da napravite $ B), istodobno zadržavajući da ste popravili $ C datoteku u datoteci, želite vratiti $ B

 $ git revert $B 

Napomena: onaj tko izvrši $ B možda nije bio vrlo discipliniran i mogao bi napraviti potpuno nepovezane izmjene u istoj pohrani, a taj povrat može se odnositi na datoteke koje nisu vidljive, uvredljive promjene, tako da možete pažljivo provjeriti rezultat nakon toga.

54
11 янв. odgovor je dao gitster 11 jan. 2009-01-11 11:13 '09 u 11:13 2009-01-11 11:13

Zanimljivo je da 'git checkout foo' neće raditi ako je radna kopija u imeniku foo; međutim, primjerice "w20> checkout HEAD foo" i "git checkout./foo" bi:

 $ pwd /Users/aaron/Documents/work/foo $ git checkout foo D foo Already on "foo" $ git checkout ./foo $ git checkout HEAD foo 
36
30 авг. odgovor je dao Aaron Maenpaa 30. kolovoza . 2008-08-30 00:26 '08 u 0:26 am 2008-08-30 00:26

Ovdje rebase radi:

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

Pretpostavimo da imate

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

Prve dvije ekipe ... čine čarobnjak za ponovnu instalaciju git checkout-a

... provjerite granu promjena koje želite primijeniti na master granu. Naredba rebase uzima urezivanje iz <my branch> (koje se ne nalaze u master ) i rebase ih rebase na master zaglavlje. Drugim riječima, nadređeni element prvog urezivanja u <my branch> više nije prethodni popravljač u povijesti master , nego trenutni master zaglavlje. Dvije ekipe su iste kao:

 git rebase master <my branch> 

Možda bi bilo lakše zapamtiti ovu naredbu, jer su "osnovna" i "modificirana" grana eksplicitna.

, Krajnji rezultat:

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

Posljednje dvije ekipe ...

 git checkout master git merge <my branch> 

... izvršite brzo spajanje kako biste primijenili sve <my branch> promjene za master Bez ovog koraka, naredba rebase nije dodana glavnom master . Krajnji rezultat:

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

master i <my branch> obje reference B' . Osim toga, od ove točke možete sigurno ukloniti vezu <my branch> .

 git branch -d <my branch> 
32
24 февр. Odgovor daje cmcginty 24. veljače. 2009-02-24 12:43 '09 u 12:43 2009-02-24 12:43

git aliasi, awk i shell funkcije za spas!

 git prevision <N> <filename> 

gdje je <N> broj popravaka datoteke za vraćanje datoteke <filename> .
Na primjer, da biste provjerili trenutnu prethodnu reviziju jedne x/y/zc datoteke, pokrenite

 git prevision -1 x/y/zc 

Kako funkcionira git predviđanje?

Dodajte svoj gitconfig

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

Tim u osnovi

  • izvršava git log u navedenoj datoteci i
  • odabire odgovarajući ID urezivanja u povijesti datoteke i
  • izvodi git checkout identifikacijski broj za navedenu datoteku.

U suštini, sve što bi se moglo učiniti ručno u ovoj situaciji
zamotan u jedan lijep, djelotvoran git-alias - git-prevision

21
01 мая '15 в 4:46 2015-05-01 04:46 Odgovor daje TheCodeArtist 01. svibnja u 4:46 2015-05-01 04:46

Moram povezati EasyGit ovdje, što je omotač koji čini git dostupnijim za početnike, a da ne zbunjuje iskusne korisnike. Jedna od stvari koje čini je dajući više git revert vrijednosti . U ovom slučaju samo kažete:

eg revert foo/bar foo/baz

20
19 окт. odgovor je dat Aristotelu Pagaltzisu 19. listopada. 2008-10-19 03:16 '08 u 3:16 am 2008-10-19 03:16

U slučaju da želite vratiti datoteku na prethodnu pohranu (a datoteka koju želite vratiti), možete je koristiti

 git checkout HEAD^1 path/to/file 

ili

 git checkout HEAD~1 path/to/file 

Zatim jednostavno izvršite korak i popravite "novu" verziju.

Naoružani znanjem da u slučaju spajanja, urezivanje može imati dva roditelja, trebate znati da je GLAVA ^ 1 prvi roditelj, a GLAVA ~ 1 je drugi roditelj.

Ili će raditi ako postoji samo jedan roditelj u stablu.

20
11 янв. Odgovor je dao moderna svijest 11. siječnja. 2014-01-11 03:29 '14 u 3:29 2014-01-11 03:29

Prvo resetiranje glave za ciljnu datoteku

 git reset HEAD path_to_file 

Druga provjera ove datoteke

 git checkout -- path_to_file 
19
04 апр. odgovor je dao Gulshan Maurya 04 apr. 2017-04-04 13:25 '17 u 13:25 2017-04-04 13:25

Imajte na umu da git checkout ./foo i git checkout HEAD ./foo nisu sasvim ista stvar; primjer:

 $ 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 

(Drugi add obrađuje datoteku u indeksu, ali se ne preuzima.)

git checkout ./foo znači vraćanje puta ./foo u indeks ; dodajući HEAD upućuje Git da vrati ovu putanju indeksa na svoju HEAD prije toga.

19
31 авг. Odgovor je dao Damien Diederen 31. kolovoza 2008-08-31 14:54 '08 u 14:54 2008-08-31 14:54

Postoji mnogo prijedloga ovdje, većina njih u duhu git checkout $revision -- $file . Nekoliko nejasnih alternativa:

 git show $revision:$file > $file 

Također, često ga koristim samo za privremeno gledanje određene verzije:

 git show $revision:$file 

ili

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

(OBS: $file mora započeti s prefiksom ./ ako je to relativna putanja za git show $revision:$file za rad)

I još više čudno

 git archive $revision $file | tar -x0 > $file 
14
08 янв. Odgovor Petra V. Mørch siječnja 08 2016-01-08 01:19 '16 u 1:19 2016-01-08 01:19

Da biste prešli na prethodnu verziju datoteke urezivanja, uzmite broj urezivanja, recimo, eb917a1

 git checkout eb917a1 YourFileName 

Ako se samo trebate vratiti na najnoviju registriranu verziju.

 git reset HEAD YourFileName git checkout YourFileName 

To će vas odvesti do zadnjeg zabilježenog stanja datoteke.

11
25 февр. odgovor je dan shah1988 25. veljače. 2014-02-25 17:01 '14 u 17:01 2014-02-25 17:01

Za mene nijedan odgovor nije bio doista jasan i zato bih htio dodati svoj, koji se čini super jednostavan.

Imam abc1 , a nakon toga sam napravio nekoliko (ili jednu modifikaciju) file.txt datoteku.

Sada mi recite da sam nešto zabrljao u datoteku file.txt i želim se vratiti na prethodnu abc1 .

1. git checkout file.txt : to će ukloniti lokalne promjene ako ih ne trebate.

2. git checkout abc1 file.txt : to će dovesti vašu datoteku do željene verzije

3. git commit -m "Restored file.txt to version abc1" : to će uzrokovati vašu reverziju.

  1. git push : ovo će sve dovesti do udaljenog spremišta

Između koraka 2 i 3, naravno, možete napraviti git status da biste razumjeli što se događa. Obično biste trebali vidjeti da je file.txt već dodan, te stoga nema potrebe za git add .

10
23 марта '17 в 0:33 2017-03-23 00:33 odgovor je dao kalmanIsAGameChanger 23. ožujka 2006. u 0:33 2017-03-23 ​​00:33

git checkout ref commitHash - filePath

na primjer.

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

Mnogi odgovori ovdje zahtijevaju da koristite git reset ... <file> ili git checkout ... <file> , ali ćete izgubiti sve promjene u <file> koje su napravljene nakon urezivanja koje želite vratiti.

Ako želite odbaciti promjene iz samo jednog urezivanja u samo jednu datoteku, kao što bi učinio git revert , ali samo u jednu datoteku (ili, recimo, podskup datoteka predavanja), predlažem da koristite git diff i git apply ovako sa <sha> = hashom urezivanja koje želite vratiti):

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

U načelu, on će najprije generirati zakrpu koja odgovara promjenama koje želite vratiti, a zatim poništiti primjenu zakrpe za odbacivanje tih promjena.

Naravno, to ne radi ako su obrnute linije izmijenjene bilo kojom ulogom između <sha1> i HEAD (konflikta).

8
07 дек. odgovor je dan Vince 07 prosinca. 2016-12-07 17:43 '16 u 17:43 2016-12-07 17:43

Upotrijebite git log da biste dobili hash-ključ za određenu verziju, a zatim upotrijebite git checkout <hashkey>

Napomena. Ne zaboravite unijeti hash prije posljednje. Posljednji hash označava trenutni položaj (HEAD) i ne mijenja ništa.

8
05 дек. odgovor je dat mustafakyr 05 dec. 2011-12-05 23:09 '11 u 23:09 2011-12-05 23:09

Očito, netko treba napisati jasnu knjigu o git-u ili git-u kako bi bolje objasnio u dokumentaciji. Suočen s istim problemom, pretpostavio sam

 cd <working copy> git revert master 

preokreće posljednju naredbu, što se čini.

Yang

7
16 дек. Odgovor je dao Ian Davis 16. prosinca. 2011-12-16 06:03 '11 u 6:03 2011-12-16 06:03

Ako u nedavnim unosima napravite pogrešnu datoteku, slijedite upute:

  1. stablo otvorenog koda, promijenite ovo urezivanje

2019

23 авг. odgovor dao saber tabatabaee yazdi 23 aug. 2018-08-23 12:53 '18 u 12:53 2018-08-23 12:53

To možete učiniti u 4 koraka:

  1. poništite cijelu naredbu s datotekom koju želite posebno otkazati - to će stvoriti novu predaju u vašoj niti
  2. soft reset da urezivanje - uklanja predaju i pomiče promjene u radni prostor
  3. ručno odaberite datoteke za povratak i zaključajte ih
  4. ispustite sve ostale datoteke u vaš radni prostor

Što trebate birati u svom terminalu :

  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.

sretno

4
08 мая '18 в 13:26 2018-05-08 13:26 odgovor je dao Nir M. 08. svibnja '18 u 13:26 sati 2018-05-08 13:26
 git revert <hash> 

Vraća zadanu naredbu. Čini se da misliš da git revert samo posljednji urez.

To neće riješiti vaš problem ako želite poništiti promjenu u određenoj datoteci i da je urezivanje promijenilo više od ove datoteke.

4
17 дек. Otto je odgovorio 17. prosinca. 2008-12-17 21:56 '08 u 21:56 2008-12-17 21:56

Ovo je moj način.

a) U programu Android Studio otvorite datoteku.

b) git → Prikaži povijest, pronađite prethodnu obvezu koju želim vratiti. Nabavite commit_id (tj. Odobrite hash).

c) git checkout commit_id file_path

1
13 марта '17 в 11:10 2017-03-13 11:10 odgovor je dao Francis Bacon 13. ožujka 2006. u 11:10 2017-03-13 11:10

Ako koristite Git Extensions i želite se vratiti na nadređenu obvezu za datoteku, možete odabrati predavanje koje sadrži promjene koje želite vratiti, a zatim detaljno odaberite karticu "Diff", desnom tipkom miša kliknite datoteku koju želite vratiti, a zatim Resetiraj datoteku na " .... ", a zatim" A "(nadređeni)

1
26 сент. odgovor dao johnny 26 ruj. 2017-09-26 04:48 '17 u 4:48 2017-09-26 04:48

Ovo je vrlo jednostavan korak. Izvucite datoteku s IDom urezivanja koji želimo, ovdje je jedan prije urezivanja, a zatim samo pokrenite naredbu git commitmend i gotovi ste.

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

To je vrlo zgodno. Ako želimo ispisati bilo koju datoteku s bilo kojim identifikatorom prethodnog urezivanja na vrhu urezivanja, lako ćemo to učiniti.

1
24 янв. Odgovor dao Abhishek Dwivedi 24. siječnja 2019-01-24 20:21 '19 u 20:21 sati 2019-01-24 20:21
  • 1
  • 2

Ostala pitanja o oznakama za ili postavljanju pitanja