Elimina fișiere dintr-Git commit

Eu sunt, folosind Git si am comis câteva fișiere folosind

git commit -a

Mai târziu, am aflat că un fișier din greșeală fost adăugate a comis-o.

Cum pot elimina un fișier din ultima comis-o?

Comentarii la întrebare (4)
Soluția

Cred că alte răspunsuri sunt greșite, deoarece aceasta este o chestiune de mutarea din greșeală comisă fișierele înapoi la zona de așteptare de la comiterea precedentă, fără a anula modificările făcut pentru ei. Acest lucru poate fi făcut ca Paritosh Singh, a sugerat de:

git reset --soft HEAD^ 

sau

git reset --soft HEAD~1

Apoi reseta fișierele nedorite, în scopul de a le lăsa afară din comite:

git reset HEAD path/to/unwanted_file

Acum comis-o din nou, puteți chiar re-utiliza același comite mesaj:

git commit -c ORIG_HEAD  
Comentarii (28)

ATENȚIE! Dacă doriți doar pentru a elimina un fișier din comiterea precedentă, și keep pe disk, citi juzzlin's a răspunde doar de mai sus.

Dacă aceasta este ultima ta a comis-o și vrei să a șterge definitiv fișierul de la nivel local și depozitul de la distanță, puteți:

  1. eliminați fișierul git rm <fișier>
  2. comite cu amend flag: git a comis-o ... amend

A modifica pavilion spune git de a comite din nou, dar "merge" (nu în sensul de a fuziona două ramuri) acest comite cu ultimul a comis-o.

După cum se menționează în comentarii, folosind git rm aici este ca folosind " rm " comandă în sine!

Comentarii (5)

Răspunsuri existente sunt toate vorbesc despre eliminarea fișierelor nedorite de la ultimul a comis-o.

Dacă doriți să eliminați fișierele nedorite de la un vechi commit (chiar împins) și don't doriți să creați un nou comis-o, ceea ce nu este necesar, deoarece de acțiune:

Găsi comite că doriți ca fișierul să se conformeze.

git checkout  <path_to_file>

puteți face acest lucru de mai multe ori, dacă doriți să ștergeți mai multe fișiere.

git commit -am "remove unwanted files"

Găsi commit_id a comite pe care fișierele au fost adăugate în mod eronat, las's spun "35c23c2" aici

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

Această comandă deschide editorul în funcție de setările. Implicit este vim.

Muta ultimul commit, care ar trebui să fie "eliminați fișierele nedorite", la următoarea linie de incorecte comite("35c23c2" în cazul nostru), și setați comanda ca remediere:

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

Tu ar trebui să fie bine după salvarea fișierului.

Pentru a termina :

git push -f

Dacă ai obține, din păcate, conflictele, trebuie să le rezolve manual.

Comentarii (9)

Ca a acceptat răspunsul indică, puteți face acest lucru prin resetarea întregului comis-o. Dar aceasta este o destul de greu de dat abordare. O mai curat mod de a face acest lucru ar fi de a păstra comis-o, și pur și simplu eliminați fișierele modificate de la ea.

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

Anii git reset va lua dosarul, așa cum a fost anterior a comis-o și etapa în index. Fișierul în directorul de lucru este de neatins. Anii git commit apoi va comite și suc de fructe indicele în curent a comis-o.

Acest lucru, în esență, are versiunea de fișier care a fost anterior a comis-o și adaugă-l la curent comis-o. Acest lucru duce la nici o schimbare net, și astfel de fișier este eliminat eficient din comit.

Comentarii (8)

Dacă nu ați împins la schimbările de pe server puteti folosi

git reset --soft HEAD~1

Se va reseta toate modificările și a reveni la o comite spate

Dacă ați împins modificările apoi urmați pașii ca răspuns de către @CharlesB

Comentarii (8)

Eliminarea de fișiere folosind rm va șterge-o!

Te're întotdeauna adăugarea la o comite in git, mai degrabă decât eliminarea, astfel încât, în acest caz se întoarcă dosarul la starea în care era înainte de primul comite (acest lucru poate fi o șterge 'rm' acțiune dacă fișierul este nou) și apoi re-se angajeze și fișierul va merge.

Pentru a reveni la fișier într-o anumită stare anterioară:

    git checkout  <path_to_file>

sau pentru a reveni la starea de la distanță de CAP:

    git checkout origin/master <path_to_file>

apoi modifica comis-o și tu ar trebui să găsească dosarul a dispărut de pe listă (și nu vor fi șterse de pe disc!)

Comentarii (0)
git checkout HEAD~ path/to/file
git commit --amend
Comentarii (1)

Următoarele va unstage doar fișierul pe care ați intenționat, care este ceea ce OP cerut.

git reset HEAD^ /path/to/file

Te'll vedea ceva de genul următoarele...

Modificări pentru a fi angajat: (utilizați "git reset CAP <fișier>..." să unstage)

modificat: /path/to/file

Modificări nu au organizat pentru a comite: (utilizați "git add <fișier>..." pentru a actualiza ce va fi angajat) (utilizați "git checkout -- <fișier>..." să se debaraseze schimbări în directorul de lucru)

modificat: /path/to/file

  • "Schimbări să fi comis" este versiunea anterioară a fișierului înainte de a comite. Acest lucru va arata ca o stergere dacă fișierul nu a existat niciodată. Dacă faci această schimbare, va exista o revizuire care revine la dosar în ramură.
  • "Modificări nu au organizat pentru a comite" este schimbarea de care ai comis-o, și starea actuală a fișierului

În acest moment, puteți face ce vă place la dosar, cum ar fi resetarea la o versiune diferită.

Când te're gata să se angajeze:

git commit --amend -a

sau (daca'am unele alte modificări pe care don't doresc să se angajeze, încă)

git commit add /path/to/file
git commit --amend
Comentarii (1)

Am să-ți explic cu un exemplu. Fie a, B, C 3 succesive se angajează. Comite B conține un fișier care nu ar trebui să au fost comise.

git log  # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git push --force-with-lease   
Comentarii (1)

Dacă ați adăugat accidental un fișier pentru a-ți comis-o, puteți face ceva de genul

git rm --cached path_to_file

Asigurați-vă că pentru a utiliza --cached în caz contrar, dosarul va fi, de asemenea, eliminate din proiectul dumneavoastră.

Comentarii (1)
git rm --cached 
git commit -m "removed unwanted file from git"

va las fișier local încă. Dacă tu nu't vreau fișierul la nivel local, fie, puteți sări peste --cached opțiune.

Dacă se lucrează la filiala locală, aveți nevoie pentru a păstra fișierul într-un târziu comite, și ca având o istorie curata, cred că un mod mai simplu de a face acest lucru ar putea fi:

git rm --cached 
git commit --squash 
git add 
git commit -m "brand new file!"
git rebase --interactive ^

și apoi puteți termina rebazare cu ușurință, fără a fi nevoie să vă amintiți mai multe comenzi complexe sau comite mesaj sau un tip la fel de mult.

Comentarii (1)

Folosind git GUI poate simplifica eliminarea unui fișier din prealabilă a comis-o.

Presupunând că acest lucru nu e't o sucursală în comun și nu't mintea rescrierea istoriei, apoi executați:

git gui citool --amend

Puteți debifați fișier care a fost din greșeală comisă și apoi faceți clic pe "Comit".

Fișierul este eliminat din comis-o, dar va fi o ținute pe disk. Deci, dacă ne-a verificat dosarul, după eronat adăugarea, se va arăta în untracked lista de fișiere (și dacă ne-a verificat dosarul, după eronat modificarea se va arăta în modificările nu au organizat pentru comiterea lista).

Comentarii (3)

Dacă vrei să-ți păstrezi comite (poate deja ai petrecut ceva timp a scris o analiză detaliată a comis mesaj și don't vreau să-l pierd), și doriți doar să eliminați fișierul de comis-o, dar nu de la depozit în întregime:

git checkout origin/ 
git commit --amend
Comentarii (0)

Am vrut doar să completeze răspunsul de sus ca am avut pentru a rula un plus de comandă:


git reset --soft HEAD^
git checkout origin/master 
Comentarii (1)

Face o secventa din următoarele comenzi:

//to remove the last commit, but preserve changes  
git reset --soft HEAD~1

//to remove unneded file from the staging area  
git reset HEAD `` 

//finally make a new commit  
git commit -m 'Your message'
Comentarii (3)

Ceva care a lucrat pentru mine, dar încă mai cred că nu ar trebui să fie o soluție mai bună:

$ git revert 
$ git reset HEAD~1 --hard

Lasă schimbarea pe care vrei să aruncați în alte comite, verificați alții

$ git commit --amend // or stash and rebase to  to amend changes
Comentarii (0)

git reset-moale CAPUL^ vânturile înapoi comis-o, și atunci când tastați git status, se spune ce să faci:

Changes to be committed:
  (use "git reset HEAD ..." to unstage)
Comentarii (0)

De fapt, cred că mai repede și mai ușor mod este de a utiliza git rebazare modul interactiv.

git rebase -i head~1  

(sau capul~4, indiferent cât de departe vrei să mergi)

și atunci, în loc de 'alege', folosit 'edita'. Nu am realizat cât de puternic 'edita' este.

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

Sper că veți găsi util.

Comentarii (1)

A avut aceeași problemă în cazul în care nu s-au schimbat într-o filială locală în cazul în care am vrut să revină doar un singur fișier. Ceea ce a funcționat pentru mine a fost -

(facilitate/target_branch mai jos este unde am toate modificările, inclusiv cei pe care voiam să anula pentru un anumit fișier)

(origine/facilitate/target_branch este o ramură de la distanță în cazul în care vreau să-mi forțez modificări)

(facilitate/intermediere mea de așteptare temporar sucursală în cazul în care nu vor fi presiuni din toate meu a vrut modificări, cu excepția schimba la un fișier)

  1. De a crea o filială locală din origine/facilitate/target_branch - a numit facilitate/intermediere

  2. Fuzionat mea de lucru, filiala locală facilitate/target_branch la facilitate/intermediere ramura

  3. Verificat facilitate/intermediere apoi git reset-moale ORIG_HEAD (Acum toate modificările de funcție/de intermediere' va fi pus în scenă, dar neangajate.)

  4. Nestaditizat fișierul care trebuie verificate anterior cu modificări inutile

  5. Schimbat în amonte de ramură pentru facilitate/intermediere la de origine/facilitate/target_branch

  6. Comis restul organizat modificările și împins în amonte meu de la distanță origine/facilitate/target_branch

Comentarii (0)

Dacă tu dont nevoie de dosar mai, ai putea face

git rm file
git commit --amend
git push origin branch
Comentarii (0)