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?
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
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:
git rm <fișier>
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!
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 <commit_id> <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.
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.
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
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 <commit_id> <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!)
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
Î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
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 <branchName>
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ă.
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
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 <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 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.
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).
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/<remote-branch> <filename>
git commit --amend
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 `<your file>`
//finally make a new commit
git commit -m 'Your message'
Ceva care a lucrat pentru mine, dar încă mai cred că nu ar trebui să fie o soluție mai bună:
$ git revert <commit_id>
$ 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 <commit_id> to amend changes
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.
Sper că veți găsi util.
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)
De a crea o filială locală din origine/facilitate/target_branch - a numit facilitate/intermediere
Fuzionat mea de lucru, filiala locală facilitate/target_branch la facilitate/intermediere ramura
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.)
Nestaditizat fișierul care trebuie verificate anterior cu modificări inutile
Schimbat în amonte de ramură pentru facilitate/intermediere la de origine/facilitate/target_branch
Comis restul organizat modificările și împins în amonte meu de la distanță origine/facilitate/target_branch