Pašalinkite failus iš „Git“

Aš naudoju git ir naudoju kai kuriuos failus

 git commit -a 

Vėliau sužinojau, kad failas buvo klaidingai pridėtas prie įsipareigojimo.

Kaip ištrinti failą iš paskutinio įvykio?

849
18 сент. Mojoy yra nustatytas rugsėjo 18 d. 2012-09-18 19:59 '12 at 19:59 pm 2012-09-18 19:59
@ 19 atsakymų

Manau, kad kiti čia pateikti atsakymai yra neteisingi, nes jis susijęs su klaidingai fiksuotų failų perkėlimu į tarpinę zoną iš ankstesnės fiksacijos, neatšaukiant jo atliktų pakeitimų. Tai galima padaryti, kaip pasiūlė Paritosh Singh:

 git reset --soft HEAD^ 

arba

 git reset --soft HEAD~1 

Tada iš naujo nustatykite nepageidaujamus failus, kad juos paliktų

 git reset HEAD path/to/unwanted_file 

Dabar pabandykite dar kartą, galite pakartotinai naudoti tą patį įvykio pranešimą:

 git commit -c ORIG_HEAD 
1673
10 марта '13 в 13:56 2013-03-10 13:56 atsakymas pateikiamas juzzlin kovo 10 d. 13:56 2013-03-10 13:56

Dėmesio ! Jei norite ištrinti failą iš ankstesnio įsipareigojimo ir įrašyti jį į diską, perskaitykite juzzlin atsakymą šiek tiek didesnis.

Jei tai jūsų paskutinis įsipareigojimas ir norite visiškai pašalinti failą iš vietinio ir nuotolinio saugyklos , galite:

  • ištrinti failą git rm <file>
  • įsipareigoti su pakeitimo vėliava: git commit --amend
border=0

Nustatymo vėliava pasakoja git dar kartą išspręsti, bet „sujungti“ (nesusijusi su dviem filialais) ją išsprendžia su paskutiniu pataisymu.

Ir sakydamas kaip „yo“, rm komanda git'e daro tai, ką pati rm !

168
18 сент. Charleso atsakymas 2012-09-18 20:22 '12 8:22 pm 2012-09-18 20:22

Esami atsakymai rodo, kad iš paskutinių failų pašalinti nepageidaujami failai.

Jei norite iš senų įvykių ištrinti nereikalingus failus (net jei paspausite) ir nenorite sukurti naujo įsipareigojimo, kuris nėra būtinas dėl veiksmo:

1.

Raskite norimą failą.

 git checkout <commit_id> <path_to_file> 

Tai galite padaryti kelis kartus, jei norite ištrinti daug failų.

2

 git commit -am "remove unwanted files" 

3

Raskite įvykdymą „įsipareigojimų_id“, pagal kurią failai buvo įrašyti klaidingai , pvz., „35c23c2“

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

Ši komanda atidaro redaktorių pagal jūsų nustatymus. Numatytasis yra vim.

Perkelkite paskutinį įvykį, kuris turėtų būti „ištrinti nereikalingus failus“, į kitą klaidingo įvykio eilutę (mūsų atveju - „35c23c2“) ir nustatyti komandą kaip fixup :

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

Išsaugoję failą, turėtumėte būti gerai.

Baigti:

 git push -f 

Jei, deja, gausite konfliktų, turite juos išspręsti rankiniu būdu.

75
27 янв. Atsakė Brian Jan 27 2015-01-27 18:24 '15, 18:24, 2015-01-27 18:24

Ištrinus failą su rm, jis bus ištrintas!

Jūs visada pridedate įsipareigojimą gituoti, o ne ištrinti, todėl šiuo atveju failą grąžinsite į būseną, kuri buvo prieš pirmąjį įvykį (tai gali būti „rm“ veiksmo ištrynimas, jei failas yra naujas), ir tada vėl įrašykite failą ir failas vėl .

Jei norite grąžinti failą į ankstesnę būseną:

  git checkout <commit_id> <path_to_file> 

arba grąžinkite jį į nuotolinio HEAD būseną:

  git checkout origin/master <path_to_file> 

tada pakeiskite įsipareigojimą ir turėtumėte pastebėti, kad failas išnyko iš sąrašo (ir nėra ištrintas iš jūsų disko!)

30
28 янв. Bobas Flannigonas paskelbė atsakymą sausio 28 d 2013-01-28 17:00 '13, 17:00, 2013-01-28 17:00

Jei nepaspaudėte pakeitimų serveryje, galite naudoti

 git reset --soft HEAD~1 

Jis atkurs visus pakeitimus ir grįš į vieną įvykį.

Jei spustelėjote pakeitimus, atlikite toliau nurodytus veiksmus, kaip nurodyta @CharlesB

28
18 сент. Atsakymą pateikė „ Paritosh Singh“ 18 sep . 2012-09-18 21:28 '12 21:28 2012-09-18 21:28
 git checkout HEAD~ path/to/file git commit --amend 
27
23 авг. Denis Shchepetov atsakymas, pateiktas rugpjūčio 23 d 2013-08-23 22:01 '13, 10:01 pm 2013-08-23 22:01

Kaip rodo priimtas atsakymas, galite tai padaryti, atsisakę viso įsipareigojimo. Tačiau tai gana sudėtingas požiūris.
Švaresnis būdas tai padaryti yra išsaugoti įsipareigojimą ir tiesiog pašalinti iš jo pakeistus failus.

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

git reset “ failą paims taip pat, kaip ir ankstesniame įvykyje, ir generuoja jį indekse. Darbo aplanke esantis failas nepaliestas.
Tada git commit pataisymus ir spaudžia indeksą į dabartinį įsipareigojimą.

Ji iš esmės priima failo versiją, kuri buvo ankstesniame įvykyje, ir prideda ją prie dabartinio įsipareigojimo. Tai nepakeičia tinklo, todėl failas yra veiksmingai pašalintas iš įsipareigojimo.

25
25 февр. Patrickas atsakė vasario 25 d 2017-02-25 03:06 '17 at 3:06 2017-02-25 03:06

Toliau bus išjungtas tik tas failas, kurį norėjote, o tai yra reikalinga OP.

 git reset HEAD^ /path/to/file 

Pamatysite kažką panašaus ...

Pakeitimai, kuriuos reikia atlikti: (naudoti „git reset HEAD ...“, kad pašalintumėte)

modifikuotas: / kelias / į / failą

Pakeitimai nėra padaryti, jei norite: (naudokite „git add ...“, kad atnaujintumėte tai, kas bus padaryta) (naudokite „git checkout -...“, kad atmestumėte darbo katalogo pakeitimus)

modifikuotas: / kelias / į / failą

  • „Pakeitimai, kuriuos reikia atlikti“ - tai ankstesnė failo versija prieš įsipareigojant. Jei failas niekada nebus, jis atrodys ištrynus. Jei atliksite šį pakeitimą, pasirodys pataisymas, kuriuo bus grąžintas filialo failo pakeitimas.
  • „Pakeitimai nepateikiami, kad būtų įvykdyti įsipareigojimai“ - tai jūsų atliktas pakeitimas ir esama failo būsena

Šiuo metu jūs galite padaryti viską, ką norite faile, pvz., Iš naujo nustatyti kitą versiją.

Kai esate pasiruošę įsipareigoti:

 git commit --amend -a 

arba (jei turite kitų pakeitimų, kurių nenorite atlikti)

 git commit add /path/to/file git commit --amend 
24
07 дек. atsakymas duotas ThatsAMorais 07 dec. 2014-12-07 10:13 '14, 10:13 2014-12-07 10:13

Jei norite išsaugoti įsipareigojimą (galbūt jau praleidote tam tikrą laiką kuriant išsamų pranešimą apie įsipareigojimą ir nenorite to prarasti), ir norite ištrinti failą tik iš įsipareigojimo, bet ne iš saugyklos visiškai

 git checkout origin/<remote-branch> <filename> git commit --amend 
8
17 июня '13 в 23:07 2013-06-17 23:07 atsakymas pateikiamas mattexx birželio 17 d. 13: 23: 07-17 23:07
 git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file> git commit -m "removed unwanted file from git" 

paliksite vietinį failą. Jei taip pat nenorite, kad failas būtų vietinis, galite praleisti pasirinktį „cached“.

Jei visas darbas yra jūsų vietiniame skyriuje, turite išsaugoti failą vėlesniame dokumente ir, kaip manyti, kad tai būtų švari istorija, manau, kad paprastesnis būdas tai padaryti:

 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>^ 

ir jūs galite lengvai užbaigti perkėlimą nereikia įsiminti sudėtingesnių komandų arba pataisyti pranešimą arba įvesti tą patį numerį.

6
23 февр. Atsakymą pateikė Bryan Buckley vasario 23 d. 2016-02-23 09:22 '16 at 9:22 am 2016-02-23 09:22

Naudojant git GUI gali būti lengviau ištrinti failą iš ankstesnio įsipareigojimo.

Darant prielaidą, kad tai nėra bendras filialas, ir jūs neužmirštate perrašyti istorijos , tada vykdykite:

 git gui citool --amend 

Galite atšaukti klaidingai nustatytą failą, tada spustelėkite „Įsipareigoti“.

2019

6
18 мая '15 в 22:50 2015-05-18 22:50 atsakymą pateikė JDiMatteo gegužės 18 d., „15, 10:50 pm 2015-05-18 22:50

Paleiskite šių komandų seką:

 //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 сент. Sergey Onishchenko atsakymas 10 rugsėjis 2015-09-10 14:51 '15 at 14:51 2015-09-10 14:51

Aš jums paaiškinsiu pavyzdį: leiskite A, B, C būti 3 iš eilės. Įsipareigojimas B yra failas, kuris neturėtų būti įvykdytas.

  • $ git log # imtis A commmit_id
  • $ git rebase -i „A_ID“
  • pokytis įsipareigoja „e“ vim perkelti
  • $ git rm nepageidaujamas_failas
  • $ git rebase tęsti
  • $ git push-force
3
17 авг. Moaz Rashad atsakymas 2017-08-17 12:52 '17 at 12:52 2017-08-17 12:52

Aš tik norėjau pridėti viršutinį atsakymą, nes turėjau atlikti papildomą komandą:

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

Hooray!

3
25 мая '16 в 18:24 2016-05-25 18:24 atsakymą pateikė andrepo gegužės 25, 16, 18:24 2016-05-25 18:24

Kažkas, kas man buvo naudinga, bet vis dar manau, kad turėtų būti geresnis sprendimas:

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

Tiesiog palikite pakeitimą, kurį norite atšaukti, kitame įvykyje, patikrinkite kitus.

 $ git commit --amend // or stash and rebase to <commit_id> to amend changes 
2
14 авг. atsakymas, kurį gavo saiyancoder 14 rug . 2014-08-14 08:34 '14 at 8:34 am 2014-08-14 08:34

Tiesą sakant, manau, kad greitesnis ir paprastesnis būdas yra naudoti interaktyvų git režimą.

 git rebase -i head~1 

(arba galvą ~ 4, kiek norite eiti)

tada naudokite „redaguoti“ vietoj „pasiimti“. Aš nesupratau, kaip galingas redagavimas.

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

Tikimės, kad jums patiks.

1
19 мая '16 в 23:58 2016-05-19 23:58 atsakymą pateikė Matt 19, 16, 23, 58, 2016-05-19 23:58

Buvo ta pati problema, kai turiu pakeitimų vietiniame skyriuje, kur norėjau grąžinti tik vieną failą. Kas dirbo man -

( funkcija / target_branch ), kur turiu visus mano pakeitimus, įskaitant tuos, kuriuos norėjau anuliuoti konkrečiam failui)

( kilmė / funkcija / target_branch ) yra nuotolinis filialas, kurį noriu pakeisti)

( funkcija / etapas yra mano laikinas tarpinis filialas, kuriame remsiu visus norimus pakeitimus, išskyrus šio failo pakeitimus)

  • Sukurkite vietinę filialą iš mano kilmės / funkcijos / target_branch - pavadino ją funkcija / pareiškimas

  • Mano vietos vietos / filialo susiejimas su filialu

  • Tikrinama funkcija / pareiškimas , tada git reset --soft ORIG_HEAD (dabar visi funkcijų / etapo pakeitimai bus organizuoti, bet ne nustatyti).

  • Pašalintas failas, kurį anksčiau patikrinau su nereikalingais pakeitimais

  • Pakeistas aukštesnio lygio filialas funkcijai / kilmei / funkcijai / target_branch

  • Pakeiskite likusius fazinius pakeitimus ir spustelėję prieš nuotolinį šaltinį / funkciją / target_branch

1
23 янв. atsakymą pateikė user1201303 23 jan. 2017-01-23 07:13 '17 at 7:13 2017-01-23 07:13

Jei dar nepaspaudėte įsipareigojimo, „GitHub Desktop“ lengvai išsprendžia šią problemą:

  • Pasirinkite saugyklą → Atšaukite paskutinį įvykį.
  • Panaikinkite klaidingai pridėtą failą. Jūsų ankstesnis įsipareigojimo pranešimas jau bus dialogo >
  • Paspauskite laikymo mygtuką!
1
14 марта '17 в 22:41 2017-03-14 22:41 atsakymą pateikė Ron kovo 14 d. 17 d. 22:41 2017-03-14 22:41

Jei jums nereikia šio failo, galite jį padaryti

 git rm file git commit --amend git push origin branch 
0
29 сент. atsakymas pateikiamas 29 sep . 2017-09-29 00:49 '17 ne 0:49 2017-09-29 00:49

Kiti klausimai apie tag žymes arba užduoti klausimą