Uklanjanje datoteka iz Git obvezivanja

Koristim Git i koristio sam neke datoteke

 git commit -a 

Kasnije sam otkrio da je datoteka pogrešno dodana u urezivanje.

Kako izbrisati datoteku iz zadnjeg urezivanja?

849
18 сент. Mojoy je postavljen 18. rujna. 2012-09-18 19:59 '12 u 19:59 2012-09-18 19:59
@ 19 odgovora

Mislim da su drugi odgovori ovdje netočni, jer se radi o premještanju pogrešno fiksiranih datoteka natrag u središnje područje iz prethodne fiksacije bez poništavanja promjena koje je napravila. To se može učiniti kako je predložio Paritosh Singh:

 git reset --soft HEAD^ 

ili

 git reset --soft HEAD~1 

Zatim resetirajte junk datoteke da bi ih ostavili izvan urezivanja:

 git reset HEAD path/to/unwanted_file 

Sada pokušajte ponovo, možete ponovno koristiti istu poruku urezivanja:

 git commit -c ORIG_HEAD 
1673
10 марта '13 в 13:56 2013-03-10 13:56 odgovor se daje juzzlin 10. ožujka u 13:56 2013-03-10 13:56

Pažnja ! Ako želite izbrisati datoteku iz prethodne objave i spremiti je na disk, pročitajte juzzlin odgovor malo više.

Ako je ovo vaša zadnja objava i želite potpuno ukloniti datoteku iz lokalnog i udaljenog spremišta , možete:

  • izbrišite datoteku git rm <file>
  • git commit --amend s promjenom zastavice: git commit --amend

Oznaka popravka govori git-u da ponovno popravi, ali da bi se "spojio" (ne u smislu spajanja dvaju grana) popravite ga zadnjim popravkom.

I reći to kao yo, rm naredba u git-u radi ono što i sama radi!

168
18 сент. odgovor od CharlesB 18. rujna. 2012-09-18 20:22 '12 u 20:22 2012-09-18 20:22

Postojeći odgovori sugeriraju uklanjanje neželjenih datoteka s posljednjeg .

Ako želite izbrisati nepotrebne datoteke iz starog urezivanja (čak i ako se pritisne) i ne želite stvoriti novu predaju, koja je neobavezna zbog akcije:

1.

Pronađite obvezu koju želite datoteku uskladiti.

 git checkout <commit_id> <path_to_file> 

To možete učiniti nekoliko puta ako želite izbrisati mnogo datoteka.

2.

 git commit -am "remove unwanted files" 

3.

Pronađite počinak commit_id kojim su datoteke pogrešno dodane , recimo, "35c23c2" ovdje

 git rebase 35c23c2~1 -i // notice: "~1" is necessary 

Ova naredba otvara uređivač u skladu s vašim postavkama. Zadana postavka je vim.

Premjestite posljednju predaju, koja bi trebala biti "brisanje nepotrebnih datoteka", u sljedeći redak pogrešnog urezivanja ("35c23c2" u našem slučaju) i postavite naredbu kao fixup :

 pick 35c23c2 the first commit fixup 0d78b28 remove unwanted files 

Nakon spremanja datoteke trebate biti dobro.

Za završetak:

 git push -f 

Ako nažalost dobijete sukobe, morate ih riješiti ručno.

75
27 янв. Odgovorio Brian Jan. 2015-01-27 18:24 '15 u 18:24 2015-01-27 18:24

Brisanje datoteke s rm će je izbrisati!

Uvijek dodajete urezivanje u git umjesto da ga brišete, tako da u ovom slučaju vraćate datoteku u stanje u kojem je bila prije prve objave (to može biti akcija brisanja "rm" ako je datoteka nova), a zatim ponovno izvršite i datoteka će ići ,

Da biste vratili datoteku u prethodno stanje:

  git checkout <commit_id> <path_to_file> 

ili ga vratiti u stanje na udaljenoj HEAD:

  git checkout origin/master <path_to_file> 

zatim promijenite urezivanje i ustanovite da je datoteka nestala s popisa (i nije izbrisana s vašeg diska!)

30
28 янв. Bob Flannigon je objavio 28. siječnja 2013-01-28 17:00 '13 u 17:00 2013-01-28 17:00

Ako niste kliknuli promjene na poslužitelju, možete koristiti

 git reset --soft HEAD~1 

Poništit će sve promjene i vratiti se na jedno urezivanje.

Ako ste kliknuli na promjene, slijedite korake u nastavku kao što je navedeno u @CharlesB

28
18 сент. Odgovor daje Paritosh Singh 18 sep . 2012-09-18 21:28 '12 u 21:28 2012-09-18 21:28
 git checkout HEAD~ path/to/file git commit --amend 
27
23 авг. Odgovor dao Denis Shchepetov 23. kolovoza 2013-08-23 22:01 '13 u 22:01 2013-08-23 22:01

Kao što je prihvaćeni odgovor prikazan, to možete učiniti ispuštanjem čitavog urezivanja. Ali to je prilično težak pristup.
Čistiji način da to učinite je da spremite predaju i jednostavno uklonite modificirane datoteke s nje.

 git reset HEAD^ -- path/to/file git commit --amend --no-edit 

git reset će uzeti datoteku na isti način kao u prethodnom urezivanju i generirati je u indeksu. Datoteka u radnom direktoriju nije dotaknuta.
Tada git commit popravlja i stisne indeks u trenutnu predaju.

U suštini prihvaća verziju datoteke koja je bila u prethodnom urezivanju i dodaje je trenutnoj predaji. To ne mijenja mrežu, pa se datoteka učinkovito uklanja iz urezivanja.

25
25 февр. Odgovor koji je dao Patrick 25. veljače 2017-02-25 03:06 '17 u 3:06 2017-02-25 03:06

Sljedeće će onemogućiti samo onu datoteku koju ste namjeravali, što je OP potreban.

 git reset HEAD^ /path/to/file 

Vidjet ćete nešto poput sljedećeg ...

Promjene koje trebate napraviti: (koristite "git reset HEAD ..." za deinstaliranje)

izmijenjeno: / put / u / datoteku

Izmjene nisu izvršene: (upotrijebite "git add ..." da biste ažurirali što će biti učinjeno) (koristite "git checkout -..." da biste odbacili promjene u radnom direktoriju)

izmijenjeno: / put / u / datoteku

  • "Promjene koje trebate napraviti" prethodna je verzija datoteke prije izvršenja. Izgledat će kao brisanje ako datoteka nikada nije postojala. Ako izvršite ovu promjenu, pojavit će se revizija koja će vratiti promjenu u datoteku u vašoj grani.
  • "Promjene nisu dostavljene za urezivanje" je promjena koju ste napravili i trenutno stanje datoteke

U ovom trenutku, možete raditi što god želite u datoteci, na primjer, vratiti na drugu verziju.

Kada ste spremni za objavljivanje:

 git commit --amend -a 

ili (ako imate druge promjene koje ne želite napraviti)

 git commit add /path/to/file git commit --amend 
24
07 дек. odgovor je dat ThatsAMorais 07 dec. 2014-12-07 10:13 '14 u 10:13 2014-12-07 10:13

Ako želite spremiti predaju (možda ste već proveli neko vrijeme kreirajući detaljnu poruku o urezivanju i ne želite je izgubiti), a želite izbrisati datoteku samo iz predavanja, ali ne iz spremišta u cijelosti

 git checkout origin/<remote-branch> <filename> git commit --amend 
8
17 июня '13 в 23:07 2013-06-17 23:07 odgovor je dat mattexx 17. lipnja '13 u 23:07 2013-06-17 23:07
 git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file> git commit -m "removed unwanted file from git" 

će vam ostaviti lokalnu datoteku. Ako ne želite da datoteka bude lokalna, možete preskočiti --cached opciju.

Ako je sav posao u vašoj lokalnoj podružnici, morate spremiti datoteku u kasnijoj objavi i, kao da želite imati čistu povijest, mislim da je lakši način da to učinite:

 git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file> git commit --squash <commit_id> git add <file_to_remove_from_commit_<commit_id>_which_added_file> git commit -m "brand new file!" git rebase --interactive <commit_id>^ 

i možete jednostavno završiti ponovno podizanje sustava bez zapamćivanja složenijih naredbi ili popravljanja poruke ili unosa istog broja.

6
23 февр. Odgovor je dao Bryan Buckley 23. veljače. 2016-02-23 09:22 '16 u 9:22 am 2016-02-23 09:22

Korištenje git GUI-ja može olakšati brisanje datoteke iz prethodnog urezivanja.

Pod pretpostavkom da ovo nije dijeljena grana i da vam ne smeta prepisati priču , a zatim izvršite:

 git gui citool --amend 

Možete poništiti datoteku koja je pogrešno riješena, a zatim kliknite "Commit".

2019

6
18 мая '15 в 22:50 2015-05-18 22:50 odgovor je dao JDiMatteo 18. svibnja '15. u 22:50 sati 2015-05-18 22:50

Pokrenite slijed sljedećih naredbi:

 //to remove the last commit, but preserve changes git reset --soft HEAD~1 //to remove unneded file from the staging area git reset HEAD `<your file>` //finally make a new commit git commit -m 'Your message' 
5
10 сент. odgovor je dao Sergey Onishchenko 10 sep . 2015-09-10 14:51 '15 u 14:51 2015-09-10 14:51

Objasnit ću vam primjer, neka A, B, C budu 3 uzastopne fiksacije. Commit B sadrži datoteku koja nije trebala biti predana.

  • $ git log # uzima A commmit_id
  • $ git rebase -i "A_ID"
  • promijenite obvezu u 'e' u vim rebase
  • $ git rm unfanted_file
  • $ git rebase se nastavlja
  • $ git push-force
3
17 авг. odgovor dao Moaz Rashad 17. kol. 2017-08-17 12:52 '17 u 12:52 2017-08-17 12:52

Samo sam htio dodati odgovor, jer sam morao izvršiti dodatnu naredbu:

 git reset --soft HEAD^ git checkout origin/master <filepath> 

Hura!

3
25 мая '16 в 18:24 2016-05-25 18:24 odgovor je dao andrepo 25. svibnja '16 u 18:24 2016-05-25 18:24

Nešto što mi je pomoglo, ali još uvijek mislim da bi trebalo biti bolje rješenje:

 $ git revert <commit_id> $ git reset HEAD~1 --hard 

Samo ostavite promjenu koju želite otkazati u drugom urezivanju, provjerite ostale.

 $ git commit --amend // or stash and rebase to <commit_id> to amend changes 
2
14 авг. odgovor dao saiyancoder 14 aug. 2014-08-14 08:34 '14 u 8:34 u 2014-08-14 08:34

Zapravo, mislim da je brži i jednostavniji način korištenja interaktivnog git moda.

 git rebase -i head~1 

(ili glava ~ 4, koliko daleko želite ići)

i zatim upotrijebite "uredi" umjesto "odaberi". Nisam razumio koliko je moćno uređivanje.

https://www.youtube.com/watch?v=2dQosJaLN18

Nadam se da ćete uživati.

1
19 мая '16 в 23:58 2016-05-19 23:58 odgovor je dao Matt May 19, '16 u 23:58 2016-05-19 23:58

Imao sam isti problem kada sam imao promjene u lokalnoj podružnici, gdje sam htio vratiti samo jednu datoteku. Što mi je pomoglo -

( značajka / target_branch ) gdje imam sve svoje promjene, uključujući one koje sam htio poništiti za određenu datoteku)

( podrijetlo / značajka / target_branch ) je udaljena grana koju želim izmijeniti)

( funkcija / faza je moja privremena posrednička grana u kojoj ću graditi na svim svojim željenim promjenama, osim izmjene ove datoteke)

  • Stvorite lokalnu granu iz mog podrijetla / osobine / target_branch - nazvao je funkciju / izjavu

  • Spajanje grane lokalne lokalne značajke / ciljne_grane s podružnicom

  • Funkcija / postavka je označena, a zatim git reset --soft ORIG_HEAD (sada će sve promjene iz funkcije / faze biti organizirane, ali ne i fiksne.)

  • Deinstalirana datoteka koju sam prethodno provjerio s nepotrebnim promjenama

  • Promijenjena grana za rad / izvor / značajku / target_branch

  • Ponovno izmijenili preostale fazne promjene i kliknuli uzvodno na moj udaljeni izvor / funkciju / target_branch

1
23 янв. odgovor daje korisnik1201303 23 sij. 2017-01-23 07:13 '17 u 7:13 2017-01-23 07:13

Ako još niste pritisnuli urezivanje, GitHub Desktop lako rješava ovaj problem:

  • Odaberite spremište → Poništi posljednje predavanje.
  • Poništite odabir datoteke koju ste pogrešno dodali. Vaša prethodna poruka urezivanja već će biti u dijaloškom okviru.
  • Pritisnite gumb za zadržavanje!
1
14 марта '17 в 22:41 2017-03-14 22:41 odgovor je dao Ron 14. ožujka 2006. u 22:41 2017-03-14 22:41

Ako više ne trebate ovu datoteku, možete je napraviti

 git rm file git commit --amend git push origin branch 
0
29 сент. odgovor je dan tven 29 sep . 2017-09-29 00:49 '17 u 0:49 2017-09-29 00:49

Ostala pitanja o oznakama ili postavi pitanje