Kaip padaryti, kad „git pull“ perrašytų vietinius failus?

Kaip priverstinai perrašyti vietines rinkmenas „ git pull ?

Scenarijus yra toks:

  • Komandos narys pakeičia svetainės, kurioje dirbame, šablonus
  • Jie prideda kai kuriuos atvaizdus į vaizdų katalogą (bet nepamirškite juos pridėti prie šaltinio kodo)
  • Jie siunčia atvaizdus paštu, vėliau, man
  • Aš pridedu vaizdus pagal kontrolinį šaltinio kodą ir įdėjau į „GitHub“ kartu su kitais pakeitimais.
  • Jie negali gauti naujinimų iš „GitHub“, nes „Git“ nenori perrašyti jų failų.

Tai yra klaida:

klaida: nepažymėtas darbo medžio failas „public / images / icon.gif“ bus perrašytas sujungiant

Kaip padaryti, kad „Git“ juos perrašytų? Šis asmuo yra dizaineris. Paprastai visus konfliktus išsprendžiu rankiniu būdu, todėl serveryje įdiegta naujausia versija, kurią jie tiesiog turi atnaujinti savo kompiuteryje.

5705
14 июля '09 в 17:58 2009-07-14 17:58 paprašė Jakubas Troszokas liepos 14 d., 17:58, 2009-07-14 17:58
@ 39 atsakymų
  • 1
  • 2

Svarbu: jei turite kokių nors vietinių pakeitimų, jie bus prarasti. Naudojant „ --hard variantą arba be „ --hard visi vietiniai įsipareigojimai, kurie nebuvo perduoti, bus prarasti. [*]

Jei turite failų, kurių nėra stebimi pagal „Git“ (pvz., Atsisiųstą vartotojo turinį), šie failai nebus paveikti.


Manau, kad tai yra teisingas būdas:

 git fetch --all 

Tada turite dvi parinktis:

 git reset --hard origin/master 

ARBA Jei esate kitoje šakoje:

 git reset --hard origin/<branch_name> 

Paaiškinimas:

git fetch atsisiunčia naujausius duomenis iš nuotolinio kompiuterio, nesistengdamas sujungti ar perkelti nieko.

Tada git reset atstato pagrindinį filialą į ką tik gavote. Pasirinkimas --hard pakeičia visus jūsų darbiniame medyje esančius failus pagal origin/master failus


Išlaikyti dabartinius vietinius įsipareigojimus

[*] : Verta pažymėti, kad galite išsaugoti dabartinius vietinius įsipareigojimus, sukurdami filialą iš master iš naujo:

 git checkout master git branch new-branch-to-save-current-commits git fetch --all git reset --hard origin/master 

Po to visi seni įsipareigojimai bus saugomi new-branch-to-save-current-commits .

Laukiami pakeitimai

Tačiau netikslinami pakeitimai (net palaipsniui) bus prarasti. Įsitikinkite, kad paslėpėte ir perduodate viską, ko reikia. Norėdami tai padaryti, galite paleisti:

 git stash 

Ir tada pakartotinai taikyti šiuos neprivalomus pakeitimus:

 git stash pop 
7980
17 янв. atsakymas pateikiamas RNA 17 sausio. 2012-01-17 03:02 '12 at 3:02 2012-01-17 03:02

Pabandykite atlikti šiuos veiksmus:

 git reset --hard HEAD git pull 
border=0

Jis turi daryti tai, ko norite.

798
09 мая '10 в 22:45 2010-05-09 22:45 atsakė Travis Reeder gegužės 10 d., 10 val. 10:45 PM 2010-05-09 22:45

DĖMESIO: „ git clean pašalina visus nepavykusius failus / katalogus ir negali būti atšaukti.


Kartais tiesiog clean -f nepadeda. Jei neturite jokių stebimų katalogų, reikia ir -d parinkties:

 # WARNING: this can't be undone! git reset --hard HEAD git clean -f -d git pull 

DĖMESIO: „ git clean pašalina visus nepavykusius failus / katalogus ir negali būti atšaukti.

Pabandykite -n naudoti -n (- --dry-run ). Tai parodys, kas bus pašalinta iš tikrųjų neištrinant nieko:

 git clean -n -f -d 

Išvesties pavyzdys:

 Would remove untracked-file-1.txt Would remove untracked-file-2.txt Would remove untracked/folder ... 
406
19 марта '11 в 12:10 2011-03-19 12:10 atsakymą davė David Avsajanishvili kovo 19 d. 11 val. 12:10 2011-03-19 12:10

Kaip ir Ežys, manau, kad atsakymai yra baisūs. Bet nors Hedgehog atsakymas gali būti geresnis, nemanau, kad jis yra toks pat elegantiškas, kaip jis gali būti. Tai, kaip aš tai nustatiau, yra naudoti „mėginių ėmimą“ ir „susijungimą“ su konkrečia strategija. Tai turėtų užtikrinti, kad vietiniai pakeitimai būtų išsaugoti, kol jie bus vienas iš failų, kuriuos bandote perrašyti.

Pirmiausia atlikite pakeitimus.

  git add * git commit -a -m "local file server commit message" 

Tada suraskite pakeitimus ir perrašykite, jei yra konfliktas.

  git fetch origin master git merge -s recursive -X theirs origin/master 

„- X“ yra pasirinkimo pavadinimas, o „jų“ yra šios parinkties vertė. Jei konfliktas yra, vietoj „jūsų“ pakeitimų norite naudoti „savo“ pakeitimus.

347
11 апр. Richard Kersey atsakymas balandžio 11 d 2012-04-11 23:13 '12 11:13 PM 2012-04-11 23:13

Vietoj to:

 git fetch --all git reset --hard origin/master 

Aš patarčiau atlikti šiuos veiksmus:

 git fetch origin master git reset --hard origin/master 

Nereikia imtis visų konsolių ir šakų, jei grįžtate į pradinį / pagrindinį filialą dešinėje?

248
26 апр. Johanneke paskelbė balandžio 26 dieną 2013-04-26 16:48 '13, 16:48, 2013-04-26 16:48

Atrodo, kad geriausia tai padaryti:

 git clean 

Jei norite pašalinti visus nepanaudotus failus ir tęsti įprastą „ git pull ...

125
14 июля '09 в 18:16 2009-07-14 18:16 atsakymą davė Jakubas Troszokas , liepos 14 d., 09:18 , 2009-07-14 18:16

Atkreipkite dėmesį, tai bus visam laikui ištrinti jūsų failai, jei jūsų gitignore faile bus įrašyti / * katalogo įrašai.

Kai kurie atsakymai atrodo baisūs. Pasitenkinimas tuo, kas atsitiko su @ Luri, po David Avsadjanishvili pasiūlymo.

Greičiau (git> v1.7.6):

 git stash --include-untracked git pull 

Vėliau galite išvalyti istorijos talpyklą.

Rankiniu būdu, po vieną:

 $ git stash list stash@{0}: WIP on <branch>: ... stash@{1}: WIP on <branch>: ... $ git stash drop stash@{0} $ git stash drop stash@{1} 

Žiaurus, visi vienu metu:

 $ git stash clear 

Žinoma, jei norite grįžti į tai, ką paslėpėte:

 $ git stash list ... $ git stash apply stash@{5} 
102
12 февр. Atsakymą davė Hedgehog vasario 12 d. 2012-02-12 02:00 '12 2:00 val. 2012-02-12 02:00

Šią komandą galite rasti vietiniams pakeitimams ištrinti:

 git checkout <your-branch> -f 

Tada atlikite valymą (pašalinami neapdoroti failai iš darbo medžio):

 git clean -f 

Jei norite be nereikalingų failų ištrinti nereikalingus katalogus:

 git clean -fd 
88
05 авг. atsakymą pateikė Vishal 05 rug. 2010-08-05 21:06 '10, 21:06, 2010-08-05 21:06

Užuot sujungę su „ git pull pabandykite:

git fetch --all

po to:

git reset --hard origin/master .

81
22 нояб. Atsakymą pateikė Lloyd Moore lapkričio 22 d. 2012-11-22 13:56 „12, 12:56 pm 2012-11-22 13:56

Vienintelis dalykas, kuris dirbo man:

 git reset --hard HEAD~5 

Tai suteiks jums penkis įsipareigojimus ir tada

 git pull 

Radau, kad žvelgdamas į tai, kaip atšaukti „git“ susijungimą .

54
06 мая '11 в 0:53 2011-05-06 00:53 atsakymą pateikė Chris BIllante gegužės 06 d. 11 d. 0:53 2011-05-06 00:53

Visų šių sprendimų problema yra ta, kad jie yra pernelyg sudėtingi, arba dar rimtesnė problema yra ta, kad jie ištrina visus neapdorotus failus iš žiniatinklio serverio, kurio nenorime, nes visada reikalingi konfigūracijos failai, kurie visada yra serveryje ir ne git saugykloje.

Čia rasite švariausią sprendimą:

51
06 нояб. Strahinja Kustudic atsakymas 2012-11-06 02:32 '12 at 2:32 2012-11-06 02:32

Turiu tą pačią problemą. Niekas man nepateikė šio sprendimo, bet jis man buvo naudingas.

Aš nusprendžiau:

  1. Ištrinti visus failus. Palikite tik .git katalogą.
  2. git reset --hard HEAD
  3. git pull
  4. git push

Dabar jis veikia.

38
13 янв. Atsakymą pateikė John John Pichler sausio 13 d 2011-01-13 02:58 '11 at 2:58 2011-01-13 02:58

Visų pirma, išbandykite standartinį būdą:

 git reset HEAD --hard # To remove all not committed changes! git clean -fd # To remove all untracked (non-git) files and folders! 

Įspėjimas : pirmiau minėtos komandos gali prarasti duomenis / rinkmenas tik tuo atveju, jei jos nėra fiksuotos! Jei nesate tikri, pirmiausia įrašykite visą saugyklos aplanką.

Tada vėl ištraukite.

Jei aukščiau pateikta informacija nepadeda ir jums nereikia neišsiųstų failų / katalogų (pirmiausia atlikite atsarginę kopiją, tiesiog, jei reikia), pabandykite atlikti šiuos paprastus veiksmus:

 cd your_git_repo # where 'your_git_repo' is your git repository folder rm -rfv * # WARNING: only run inside your git repository! git pull # pull the sources again 

Tai pašalins visus git failus (išskyrus .git/ dir, kur turite visus įsipareigojimus) ir ištraukite jį iš naujo.


Kodėl git reset HEAD --hard kai kuriais atvejais gali neveikti?

  1. Vartotojo taisyklės .gitattributes file

    Taisyklės eol eol=lf buvimas .gitattributes gali sukelti git pakeisti kai kuriuos failo pakeitimus, kai kurių tekstinių failų CRLF linijų galus paverčiant LF.

    Jei taip, turite atlikti šiuos CRLF / LF pakeitimus (peržiūrėdami juos git status ) arba pabandykite: git config core.autcrlf false kad juos laikinai ignoruotumėte.

  2. Failų sistemos nesuderinamumas

    Kai naudojate failų sistemą, kuri nepalaiko leidimo atributų. Pvz., Turite dvi saugyklas: vieną Linux / Mac ( ext3 / hfs+ ) ir kitą - FAT32 / NTFS pagrindu veikiančias failų sistemas.

    Pastebėję, yra dvi skirtingos failų sistemų rūšys, todėl viena, kuri nepalaiko „Unix“ leidimų, iš esmės negali atkurti leidimų failams sistemoje, kuri nepalaiko tokių leidimų, todėl nesvarbu, kaip --hard bandyti, visada aptinka kai kuriuos „pakeitimus“.

33
26 окт. atsakymas pateikiamas kenorb 26 oct. 2012-10-26 12:17 '12 12:17 2012-10-26 12:17

Premija:

Kalbėdamas apie ankstesnius atsakymus į traukimo / atsiėmimo / sujungimą, norėčiau pasidalinti įdomiu ir produktyviu triuku:

git pull --rebase

Ši komanda yra naudingiausia komanda mano gyvenime Gite, kuris sutaupė daug laiko.

Prieš siųsdami naują įsipareigojimą serveriui, išbandykite šią komandą ir ji automatiškai sinchronizuos naujausius serverio pakeitimus (naudodama „Fetch + Merge“) ir padarykite savo įsipareigojimą „Git“ žurnalo viršuje. Nereikia nerimauti dėl rankinio ištraukimo / sujungimo.

Raskite dalis „ Kas daro“ „git pull“ --rebase? ,

31
23 дек. Atsakymą pateikė Sazzad Hissain Khan gruodžio 23 d. 2015-12-23 18:41 '15, 18:41, 2015-12-23 18:41

Apibendriniau kitus atsakymus. Galite atlikti git pull be klaidų:

 git fetch --all git reset --hard origin/master git reset --hard HEAD git clean -f -d git pull 

Įspėjimas Šis scenarijus yra labai galingas, todėl galite prarasti savo pakeitimus.

27
07 авг. Robert Moon atsakymas, rugpjūčio 7 d 2015-08-07 06:03 '15 at 6:03 2015-08-07 06:03

Turėjau panašią problemą. Aš turėjau tai padaryti:

 git reset --hard HEAD git clean -f git pull 
27
14 янв. Atsakymą pateikė Ryan Jan 14 2011-01-14 18:18 '11, 18:18, 2011-01-14 18:18

Remdamasis šia patirtimi, pirmiau minėtas sprendimas Strahinja Kustudic yra geriausias. Kaip pažymėjo kiti, paprasčiausiai atliekant iš naujo nustatymą bus pašalinti visi neišbandyti failai, kuriuose gali būti daug dalykų, kurių nenorite ištrinti, pvz., Konfigūracijos failai. Tvirtiau, jums reikia ištrinti tik tuos failus, kuriuos reikia pridėti, ir, tikriausiai, jūs taip pat norite patikrinti, ar nėra vietinių modifikuotų failų, kuriuos reikia atnaujinti.

Štai kodėl atnaujinome Kustudic scenarijų, kad tai padarytume. Aš taip pat nustatiau klaidą (trūksta originalo).

26
27 февр. Rolfo Kaiserio atsakymas vasario 27 d 2013-02-27 17:43 '13, 17:43, 2013-02-27 17:43

Manau, kad yra dvi galimos konflikto priežastys, kurias reikia išspręsti atskirai, ir, kiek aš galiu pasakyti, nė vienas iš pirmiau minėtų atsakymų nėra susijęs su abiem:

  • Vietos failai, kurie nėra stebimi, turi būti pašalinti rankiniu būdu (saugiau) arba, kaip siūloma kituose atsakymuose, git clean -f -d

  • Taip pat reikia ištrinti vietinius įsipareigojimus, kurie nėra nuotolinio filialo. TJO yra paprasčiausias būdas tai pasiekti: git reset --hard origin/master (pakeiskite „master“ su bet kuriuo filialu, kuriame dirbate, ir pirmą kartą paleiskite „ git fetch origin )

23
12 дек. Atsakymas pateikiamas tiho 12.12 . 2011-12-12 22:54 '11, 10:54 val. 2011-12-12 22:54

Lengvesnis būdas:

 git checkout --theirs /path/to/file.extension git pull origin master 

Tai pakeis vietinį git failą.

20
05 мая '15 в 11:03 2015-05-05 11:03 atsakymas duotas maximus 69 05 gegužės 15 d. 11:03 2015-05-05 11:03

Atrodo, kad dauguma čia pateiktų atsakymų yra sutelkti į master filialą; tačiau kartais būna atvejų, kai aš dirbau toje pačioje funkcijų šakoje dviejose skirtingose ​​vietose, ir noriu, kad vienas iš jų atspindėtų vieną iš jų kitoje, be apynių per daug apynių.

Remiantis RNR atsako ir atsakymo į panašų klausimą deriniu, aš atėjau puikų darbą:

 git fetch git reset --hard @{u} 

Vykdykite jį iš filialo, o vietinis filialas bus atkurtas tik iki ankstesnės versijos.

Tai galima patogiai įdėti į git ( git forcepull ) git forcepull :

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

Arba .gitconfig faile:

 [alias] forcepull = "!git fetch ; git reset --hard @{u}" 

Mėgaukitės!

19
25 февр. atsakymą pateikė JacobEvelyn , vasario 25 d. 2014-02-25 20:19 '14, 20:19, 2014-02-25 20:19

Aš turėjau tą pačią problemą, ir dėl kažkokios priežasties netgi git clean -f -d to nedarytų. Štai kodėl: dėl tam tikrų priežasčių, jei „Git“ ignoruoja failą (naudodamas „.gitignore“ įrašą, manau), jis vis dar nerimauja dėl jo perrašymo ir atjungimo, tačiau tinklas neištrins, nebent pridėsite -x .

19
03 авг. Atsakyti Tierlieb 03 rug . 2011-08-03 12:23 '11, 12:23, 2011-08-03 12:23

Aš pats nusprendžiau:

18
03 дек. Simono B. atsakymas . 2010-12-03 18:00 '10 18:00 val. 2010-12-03 18:00

Turiu keistą situaciją, kad nei git clean nei git reset darbas. Turiu pašalinti prieštaringą failą iš „ git index naudodamas kiekvieną scenarijų kiekvienam nepažymėtam failui:

 git rm [file] 

Tada aš galiu traukti tik puikiai.

17
19 сент. Chen Zhang atsakymas, pateiktas rugsėjo 19 d 2011-09-19 17:18 '11, 17:18, 2011-09-19 17:18

Žinau daug paprastesnį ir mažiau skausmingą metodą:

 $ git branch -m [branch_to_force_pull] tmp $ git fetch $ git checkout [branch_to_force_pull] $ git branch -D tmp 

Tai yra!

16
05 сент. atsakymas pateikiamas ddmytrenko 05 sep . 2015-09-05 21:23 '15, 21:23, 2015-09-05 21:23

Šios keturios komandos dirba man.

 git reset --hard HEAD git checkout origin/master git branch -D master git checkout -b master 

Jei norite patikrinti / ištraukti atlikus šias komandas

 git pull origin master 

Aš daug bandžiau, bet pagaliau pasiekiau sėkmę šiose komandose.

13
20 марта '14 в 7:24 2014-03-20 07:24 atsakymą pateikė vishesh chandra kovo 20, 14, 7:24 2014-03-20 07:24

Nepaisant pradinio klausimo, aukščiausieji atsakymai gali sukelti problemų žmonėms, turintiems panašią problemą, tačiau nenori prarasti vietinių failų. Pavyzdžiui, žr. Al-Punk ir crizCraig pastabas.

Kitoje versijoje nustatomi vietiniai pokyčiai laiko šakoje ( tmp ), tikrinama šaltinio filialas (kuris, manau, yra master ) ir sujungia naujinimus. Jūs galite tai padaryti su stash , bet aš manau, kad paprastai lengviau tiesiog naudoti filialo / sujungimo metodą.

 git checkout -b tmp git add *; git commit -am "my temporary files" git checkout master git fetch origin master git merge -s recursive -X theirs origin master 

kur mes manome, kad kita saugykla yra origin master .

12
22 окт. Atsakymą pateikė Snowcrash spalio 22 d. 2014-10-22 20:31 '14, 20:31, 2014-10-22 20:31

Tiesiog atlikite tai

 git fetch origin branchname git checkout -f origin/branchname // This will overwrite ONLY new included files git checkout branchname git merge origin/branchname 

Taip išvengsite bet kokių nepageidaujamų šalutinių poveikių, pvz., Failų ar katalogų, kuriuos norite išsaugoti, trynimas ir kt.

12
19 окт. atsakymas, kurį pateikė user2696128 Oct 19 2015-10-19 12:54 '15, 12:54, 2015-10-19 12:54

Nustatykite rodyklę ir nukreipkite ją į pradžią origin/master , bet nenustatykite darbo medžio:

 git reset origin/master 
11
15 февр. Atsakymą pateikė vartotojo 811773 vasario 15 d. 2013-02-15 16:41 '13, 4:41 val. 2013-02-15 16:41

Reikalavimai:

  • Stebėkite vietinius pokyčius, todėl niekas jų nepraranda.
  • Padarykite vietinę saugyklą suderinamą su nuotolinio šaltinio saugykla.

Sprendimas:

  • Slėpti vietinius pakeitimus.
  • Gaukite su švariais failais ir ignoruoti .gitignore ir sunkiai iš naujo nustatyti kilmę .

     git stash --include-untracked git fetch --all git clean -fdx git reset --hard origin/master 
9
02 сент. atsakymas duotas vezenkov 02 Sep 2015-09-02 02:00 '15 , 2:00 2015-09-02 02:00

Aš perskaičiau visus atsakymus, bet ieškojau vienos komandos. Štai ką aš padariau. Pridėta git alias .gitconfig

 [alias] fp = "!f(){ git fetch ${1} ${2}  git reset --hard ${1}/${2};};f" 

Paleiskite komandą

 git fp origin master 

yra lygiavertis

 git fetch origin master git reset --hard origin/master 
9
08 июля '16 в 16:11 2016-07-08 16:11 Atsakymą pateikė Venkat Kotra liepos 8 d. 16, 16:11 2016-07-08 16:11
  • 1
  • 2