Otkazati radne kopije jedne datoteke u git-u?

Nakon zadnjeg urezivanja, promijenio sam hrpu datoteka u radnoj kopiji, ali želim odbaciti promjene u jednoj od tih datoteka, kao u resetiranju, u istom stanju kao i zadnje urezivanje.

Međutim, želim samo poništiti promjene u radnoj kopiji samo jedne datoteke, ništa više s njom.

Kako to učiniti?

1386
28 марта '09 в 8:09 2009-03-28 08:09 hasen je postavljen 28. ožujka '09 u 8:09 2009-03-28 08:09
@ 14 odgovora

Možete koristiti

 git checkout -- file 

To možete učiniti bez -- (kao što predlaže nimrodm), ali ako naziv datoteke izgleda kao grana ili oznaka (ili drugi identifikator revizije), to može biti zbunjujuće, pa je bolje koristiti -- .

Također možete provjeriti određenu verziju datoteke:

 git checkout v1.2.3 -- file # tag v1.2.3 git checkout stable -- file # stable branch git checkout origin/master -- file # upstream master git checkout HEAD -- file # the version from the most recent commit git checkout HEAD^ -- file # the version before the most recent commit 
1917
28 марта '09 в 9:12 2009-03-28 09:12 je odgovorio Brianu Campbellu 28. ožujka u 9:12 2009-03-28 09:12
 git checkout <commit> <filename> 

Koristio sam ga danas jer sam shvatio da je moja ikona prebrisana s nekoliko obustava kada sam nadogradio na drupal 6.10, pa sam ga morao vratiti. Evo što sam učinio:

border=0
 git checkout 088ecd favicon.ico 
120
28 марта '09 в 13:25 2009-03-28 13:25 odgovor je dat neoneye 28. ožujka u 13:25 2009-03-28 13:25

Samo upotrijebite

 git checkout filename 

Ovo će zamijeniti naziv datoteke s najnovijom verzijom iz trenutne grane.

UPOZORENJE: vaše će promjene biti odbačene - sigurnosna kopija neće biti spremljena.

108
28 марта '09 в 8:55 2009-03-28 08:55 odgovor je dao nimrodm 28. ožujka u 8:55 2009-03-28 08:55

Ako je datoteka već instalirana (događa se kada napravite git add, itd. Nakon uređivanja datoteke), onemogućite izmjene.

upotreba

 git reset HEAD <file> 

tada

 git checkout <file> 

Ako još niste dostavili, samo upotrijebite

 git checkout <file> 
57
03 июля '12 в 8:46 2012-07-03 08:46 odgovor se daje thanikkal 3. srpnja '12 u 8:46 2012-07-03 08:46

Ako samo želite poništiti prethodne izmjene u urezivanju ove datoteke, možete pokušati sljedeće:

 git checkout branchname^ filename 

To će provjeriti datoteku na isti način kao i prije zadnjeg urezivanja. Ako se želite povući malo više, upotrijebite oznaku branchname~n .

15
28 марта '09 в 8:25 2009-03-28 08:25 odgovor od sykora 28. ožujka u 8:25 2009-03-28 08:25

Prošao sam kroz git bash:

(use "git checkout -- <file>..." to discard changes in working directory)

  1. Status Git. [Dakle, vidjeli smo jednu datoteku izmijenjenu.]
  2. git checkout - index.html [Promijenio sam se u datoteci index.html:
  3. status git [ove promjene su sada izbrisane]

2019

10 апр. Odgovor daje Shivanandam Sirmarigari 10. travnja. 2018-04-10 17:54 '18 u 17:54 sati 2018-04-10 17:54

Uvijek sam zbunjen s ovim, pa evo primjera provjere podsjetnika; recimo da imamo bash skriptu za testiranje git :

 set -x rm -rf test mkdir test cd test git init git config user.name test git config user.email test@test.com echo 1 > a.txt echo 1 > b.txt git add * git commit -m "initial commit" echo 2 >> b.txt git add b.txt git commit -m "second commit" echo 3 >> b.txt 

U ovom trenutku promjena nije izvršena u predmemoriji, tako da git status :

 $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: b.txt no changes added to commit (use "git add" and/or "git commit -a") 

Ako od ovog trenutka napravimo git checkout , rezultat će biti sljedeći:

 $ git checkout HEAD -- b.txt $ git status On branch master nothing to commit, working directory clean 

Ako umjesto toga izvršimo git reset , rezultat je:

 $ git reset HEAD -- b.txt Unstaged changes after reset: M b.txt $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: b.txt no changes added to commit (use "git add" and/or "git commit -a") 

Dakle, u ovom slučaju - ako promjene nisu postavljene, git reset nije važan, a git checkout prepisuje promjene.


Sada recimo da je posljednja promjena iz gornjeg skripta isporučena / spremljena, tj. Napravili smo i git add b.txt na kraju.

U ovom slučaju, git status u ovom trenutku:

 $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: b.txt 

Ako od ovog trenutka napravimo git checkout , rezultat će biti sljedeći:

 $ git checkout HEAD -- b.txt $ git status On branch master nothing to commit, working directory clean 

Ako umjesto toga izvršimo git reset , rezultat je:

 $ git reset HEAD -- b.txt Unstaged changes after reset: M b.txt $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: b.txt no changes added to commit (use "git add" and/or "git commit -a") 

Dakle, u ovom slučaju - ako su promjene isporučene, git reset će u osnovi napraviti inkrementalne promjene na nespecificirane promjene, a git checkout potpunosti prepisati promjene.

7
09 февр. odgovor je dan sdaau 09. veljače. 2016-02-09 11:56 '16 u 11:56 2016-02-09 11:56

Vratim svoje datoteke s SHA-id, što radim git checkout <sha hash id> <file name>

5
22 мая '12 в 23:39 2012-05-22 23:39 Odgovor je dat Beto 22. svibnja '12 u 23:39 2012-05-22 23:39

Ovaj odgovor je za naredbu potrebnu za poništavanje lokalnih promjena koje su u nekoliko određenih datoteka u jednoj ili više mapa (ili direktorija). Taj odgovor, osobito, odgovara na pitanje gdje korisnik ima više od jedne datoteke, ali ne želi poništiti sve lokalne promjene:

ako imate jednu ili više datoteka, možete primijeniti istu naredbu ( git checkout -- file ) na svaku od tih datoteka, navodeći svaku od njihovih lokacija, odvojene razmacima, kao u:

 git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext 

zabilježite prostor iznad imena1 / name2 / fileOne.ext nameA / subFolder / fileTwo.ext

Za više datoteka u istoj mapi:

Ako trebate odbaciti promjene za sve datoteke u određenom direktoriju, upotrijebite git checkout na sljedeći način:

 git checkout -- name1/name2/* 

Gore navedena zvijezda provodi postupak brisanja svih datoteka na ovom mjestu pod nazivom ime / ime2.

Isto tako, sljedeće može poništiti promjene u svim datotekama za više mapa:

 git checkout -- name1/name2/* nameA/subFolder/* 

ponovno zabilježite razmak između imena1 / name2 / * nameA / subFolder / * u gornjem tekstu.

Napomena: ime1, ime2, nazivA, podfolder - svi ti primjeri naziva mapa upućuju na mapu ili paket u kojem se datoteke mogu nalaziti.

4
24 янв. Odgovor je dan Nirmal Jan 24 2017-01-24 00:26 '17 u 0:26 2017-01-24 00:26

Ako niste kliknuli ili na drugi način dijelili vašu poruku:

 git diff --stat HEAD^...HEAD | \ fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ -- git commit -a --amend 
2
30 апр. Odgovor je dao Jesse Glick 30. travnja 2014-04-30 22:45 '14 u 22:45 sati 2014-04-30 22:45

Za mene je samo ovaj radio

 git checkout -p filename 

2019

19 авг. odgovor je dat Ramesh Bhupathi 19. kolovoza. 2017-08-19 17:28 '17 u 17:28 2017-08-19 17:28

Ako je već predan, možete poništiti promjenu za datoteku i ponovno izvršiti, a zatim squash novu naredbu s posljednjim urezivanjem.

0
26 апр. odgovor Gine 26. travnja. 2017-04-26 22:17 '17 u 22:17 2017-04-26 22:17

Ne znam zašto, ali kad pokušam unijeti svoj kod, izgleda kao slika.

2019

31 дек. odgovor je dan Gene 31. prosinca. 2018-12-31 18:55 '19 u 18:55 sati 2018-12-31 18:55

Za poseban slučaj kada vi

  • koristite gerrit (ili drugi skup) za prikaz koda

  • već ste napravili vašu promjenu

  • već poslan na pregled

  • želite poništiti promjene samo u određenoj datoteci.

  • Ne želite resetirati i pozvati novu sesiju pregleda

Pronašao sam sljedeći slijed, koji bi bio najprikladniji:

  • Nabavite skup promjena za određenu git datoteku prikaži HEAD [targe_file_name]> putanja / file.patch

  • Odbacite izmjene određene datoteke git-R put / file.patch

  • Izvrši i pregledaj git dodaj -u git commit --amend git review

-1
24 окт. odgovor koji je dao Zhenhua 24. listopada 2017-10-24 04:18 '17 u 4:18 2017-10-24 04:18