Kako napraviti git povući prepisivanje lokalnih datoteka?

Kako nasilno prebrisati lokalne datoteke u git pull ?

Skripta je sljedeća:

  • Član tima mijenja predloške za web lokaciju na kojoj radimo
  • Dodaju neke slike u katalog slika (ali ih zaboravite dodati pod kontrolu izvornog koda)
  • Oni šalju slike poštom, kasnije, meni
  • Dodajem slike pod kontrolu izvornog koda i stavljam ih na GitHub zajedno s drugim promjenama.
  • Ne mogu primati ažuriranja od GitHuba jer Git ne želi prepisati svoje datoteke.

Ovo je pogreška koju dobivam:

pogreška: nezaštićena datoteka radnog stabla 'public / images / icon.gif' će biti prebrisana spajanjem

Kako natjerati Git da ih prepiše? Ova osoba je dizajner. Obično sve probleme rješavam ručno, tako da je na poslužitelju instalirana najnovija inačica, koju samo trebaju ažurirati na računalu.

5705
14 июля '09 в 17:58 2009-07-14 17:58 upitao Jakub Troszok 14. srpnja 2009. u 17:58 2009-07-14 17:58
@ 39 odgovora
  • 1
  • 2

Važno: ako imate bilo kakve lokalne promjene, izgubit će se. S opcijom --hard ili bez --hard sve lokalne --hard koje nisu poslane. [*]

Ako imate datoteke koje ne prati Git (na primjer, preuzete korisničke sadržaje), to neće utjecati na te datoteke.


Mislim da je ovo pravi put:

 git fetch --all 

Tada imate dvije mogućnosti:

 git reset --hard origin/master 

ILI ako ste u drugoj grani:

 git reset --hard origin/<branch_name> 

objašnjenje:

git fetch preuzima najnovije podatke s udaljenog računala, bez pokušaja spajanja ili premještanja.

Tada git reset resetira glavnu granu na ono što ste upravo primili. Opcija --hard mijenja sve datoteke u vašem radnom stablu u skladu s datotekama u origin/master računalu


Održavajte trenutne lokalne obveze

[*] : Važno je napomenuti da trenutne lokalne obveze možete spremiti stvaranjem ogranka od master za poništavanje:

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

Nakon toga, sve stare naredbe bit će pohranjene u new-branch-to-save-current-commits .

Promjene na čekanju

Međutim, nepopravljene promjene (čak i fazne) bit će izgubljene. Provjerite jeste li sakrili i proslijedili sve što vam je potrebno. Da biste to učinili, možete pokrenuti sljedeće:

 git stash 

Zatim ponovno primijenite ove nedodijeljene promjene:

 git stash pop 
7980
17 янв. odgovor je dan RNA 17 jan. 2012-01-17 03:02 '12 u 3:02 2012-01-17 03:02

Pokušajte sljedeće:

 git reset --hard HEAD git pull 
border=0

On mora učiniti ono što želite.

798
09 мая '10 в 22:45 2010-05-09 22:45 je odgovorio Travisu Reederu 09. svibnja u 10.45 sati 2010-05-09 22:45

PAŽNJA: git clean uklanja sve vaše datoteke / direktorije koji se ne mogu otkriti i ne mogu se poništiti.


Ponekad samo clean -f ne pomaže. Ako nemate praćenih direktorija, potrebna je i opcija -d:

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

PAŽNJA: git clean uklanja sve vaše datoteke / direktorije koji se ne mogu otkriti i ne mogu se poništiti.

Pokušajte -n koristiti -n ( --dry-run ). To će vam pokazati što će biti uklonjeno bez stvarnog brisanja:

 git clean -n -f -d 

Primjer izlaza:

 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 odgovor je dao David Avsajanishvili 19. ožujka '11 u 12:10 2011-03-19 12:10

Kao i Jež, mislim da su odgovori užasni. No, iako bi odgovor na jež mogao biti bolji, ne mislim da je elegantan koliko to može biti. Način na koji sam pronašao ovo je korištenje "uzorkovanja" i "spajanja" s određenom strategijom. Time bi se osiguralo da se lokalne promjene spremaju sve dok ne budu jedna od datoteka koje pokušavate prebrisati.

Prvo izvršite promjene.

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

Zatim uklonite promjene i ponovno ih napišite ako postoji sukob

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

"- X" je naziv opcije, a "njihovo" je vrijednost za tu opciju. Ako ste u sukobu, umjesto "svoje" promjene radije koristite "svoje" promjene.

347
11 апр. Odgovor koji je dao Richard Kersey 11. travnja 2012-04-11 23:13 '12 u 23:13 2012-04-11 23:13

umjesto toga:

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

Savjetujem vam da učinite sljedeće:

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

Ne morate uzeti sve konzole i grane, ako se vratite na izvornu / glavnu granu na desnoj strani?

248
26 апр. Johanneke je objavio 26. travnja 2013-04-26 16:48 '13 u 16:48 2013-04-26 16:48

Čini se da je najbolje učiniti sljedeće:

 git clean 

Da biste uklonili sve neiskorištene datoteke i zatim nastavili s normalnim git pull ...

125
14 июля '09 в 18:16 2009-07-14 18:16 odgovor je dao Jakub Troszok 14. srpnja u 18:16 2009-07-14 18:16

Pažnja, to će trajno izbrisati vaše datoteke ako imate bilo koje / * unose direktorija u datoteci gitignore.

Neki odgovori izgledaju strašno. Strašno u smislu onoga što se dogodilo @Lauriju, nakon prijedloga Davida Avsadjanishvilija.

Umjesto (git> v1.7.6):

 git stash --include-untracked git pull 

Kasnije možete izbrisati predmemoriju povijesti.

Ručno, jedan po jedan:

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

Okrutno, odjednom:

 $ git stash clear 

Naravno, ako se želite vratiti na ono što ste sakrili:

 $ git stash list ... $ git stash apply stash@{5} 
102
12 февр. Odgovor daje Jež 12. veljače. 2012-02-12 02:00 '12 u 2:00 2012-02-12 02:00

Ova naredba može biti korisna za brisanje lokalnih izmjena:

 git checkout <your-branch> -f 

A zatim izvršite čišćenje (briše sirove datoteke s radnog stabla):

 git clean -f 

Ako želite izbrisati nepotrebne direktorije uz datoteke bez praćenja:

 git clean -fd 
88
05 авг. odgovor je dao Vishal 05 aug. 2010-08-05 21:06 '10 u 21:06 2010-08-05 21:06

Umjesto spajanja s git pull pokušajte sljedeće:

git fetch --all

slijedi:

git reset --hard origin/master .

81
22 нояб. Odgovor je dao Lloyd Moore 22. studenog. 2012-11-22 13:56 '12 u 13:56 2012-11-22 13:56

Jedina stvar koja mi je pomogla je:

 git reset --hard HEAD~5 

To će vam dati pet obveza, i onda

 git pull 

Otkrio sam da gledajući kako poništiti spajanje git-a .

54
06 мая '11 в 0:53 2011-05-06 00:53 odgovor je dao Chris BIllante 6. svibnja '11 u 0:53 2011-05-06 00:53

Problem sa svim tim rješenjima je da su ili previše složeni, ili još ozbiljniji problem je što brišu sve sirove datoteke s web poslužitelja, što ne želimo, jer su uvijek potrebne konfiguracijske datoteke koje su uvijek na poslužitelju. i ne u git repozitoriju.

Ovdje je najčišće rješenje koje koristimo:

51
06 нояб. odgovor Strahinje Kustudića 06. studenog 2012-11-06 02:32 '12 u 2:32 2012-11-06 02:32

Imam isti problem. Nitko mi nije dao ovo rješenje, ali to mi je pomoglo.

Odlučio sam ovo:

  1. Izbrišite sve datoteke. Ostavite samo .git direktorij.
  2. git reset --hard HEAD
  3. git pull
  4. git push

Sada radi.

38
13 янв. Odgovor je dao John John Pichler 13. siječnja 2011-01-13 02:58 '11 u 2:58 2011-01-13 02:58

Prije svega, pokušajte na standardni način:

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

Upozorenje : gore navedene naredbe mogu dovesti do gubitka podataka / datoteka, samo ako nisu fiksne! Ako niste sigurni, prvo izradite sigurnosnu kopiju cijele mape spremišta.

Zatim ga ponovno povucite.

Ako gore navedeno ne pomogne i ne trebate vaše datoteke ili direktorije bez zapisa (samo prvo napravite sigurnosnu kopiju, za svaki slučaj), pokušajte sljedeće jednostavne korake:

 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 

Ovo će ukloniti sve git datoteke (osim .git/ dir, gdje imate sve .git/ ) i izvući ih ponovo.


Zašto git reset HEAD --hard u nekim slučajevima možda neće raditi?

  1. Korisnička pravila u .gitattributes file

    Prisutnost pravila eol eol eol=lf u .gitattributes može uzrokovati da git promijeni neke promjene u datoteci, pretvarajući završetke CRLF linija u LF u nekim tekstualnim datotekama.

    Ako je tako, trebate uvesti te CRLF / LF promjene (tako da ih pogledate u git status ) ili pokušajte: git config core.autcrlf false da ih privremeno ignorirate.

  2. Nekompatibilnost datotečnog sustava

    Kada koristite datotečni sustav koji ne podržava atribute dopuštenja. Na primjer, imate dva spremišta, jedno za Linux / Mac ( ext3 / hfs+ ) i drugo za FAT32 / NTFS datotečne sustave.

    Kao što ste primijetili, postoje dva različita tipa datotečnih sustava, tako da onaj koji ne podržava Unix dozvole u osnovi ne može poništiti dozvole za datoteke na sustavu koji ne podržava takve dozvole, tako da bez obzira koliko se trudili, git uvijek otkriva neke "promjene".

33
26 окт. odgovor je dan kenorb 26 okt. 2012-10-26 12:17 '12 u 12:17 2012-10-26 12:17

bonus:

Govoreći o pull / fetch / merge u prethodnim odgovorima, želio bih podijeliti zanimljiv i produktivan trik:

git pull --rebase

Ovaj tim je najkorisniji tim u mom životu u Gitu, koji je uštedio mnogo vremena.

Prije nego što pošaljete novu predaju poslužitelju, isprobajte ovu naredbu i ona će automatski sinkronizirati najnovije promjene poslužitelja (s fetch + spajanjem) i staviti vašu predaju na vrh Git dnevnika. Ne morate brinuti o ručnom vađenju / spajanju.

Nađi dijelove u Što čini "git pull - oporaviti"? ,

31
23 дек. Odgovor je dao Sazzad Hissain Khan 23. prosinca. 2015-12-23 18:41 '15 u 18:41 2015-12-23 18:41

Sumirao sam ostale odgovore. Možete izvesti git pull bez grešaka:

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

Upozorenje. Ova skripta je vrlo moćna, tako da možete izgubiti promjene.

27
07 авг. odgovor je dao Robert Moon 07 aug. 2015-08-07 06:03 '15 u 6:03 2015-08-07 06:03

Imao sam sličan problem. Morao sam to učiniti:

 git reset --hard HEAD git clean -f git pull 
27
14 янв. Odgovor je dao Ryan Jan. 2011-01-14 18:18 '11 u 18:18 2011-01-14 18:18

Na temelju vlastitih iskustava ove vrste, rješenje koje je gore ponudio Strahinja Kustudić daleko je najbolje. Kao što su drugi primijetili, jednostavno izvršavanje hard resetiranja uklonit će sve netestirane datoteke, što može uključivati ​​mnoge stvari koje ne želite izbrisati, kao što su konfiguracijske datoteke. Sigurnije, samo trebate izbrisati datoteke koje je potrebno dodati i, što se toga tiče, vjerojatno želite provjeriti i za lokalno izmijenjene datoteke koje je potrebno ažurirati.

Zato sam ažurirao Kustudićevu skriptu da to učini upravo to. Također sam popravio pogrešku (nedostaje u izvorniku).

26
27 февр. Odgovor dao je Rolf Kaiser 27. veljače 2013-02-27 17:43 '13 u 17:43 2013-02-27 17:43

Vjerujem da postoje dva moguća uzroka sukoba koji se moraju riješiti odvojeno, a koliko mogu reći, niti jedan od gore navedenih odgovora se ne odnosi na:

  • Lokalne datoteke koje se ne nadziru moraju biti uklonjene ručno (sigurnije) ili, kao što je predloženo u drugim odgovorima, za git clean -f -d

  • Lokalne obveze koje nisu u udaljenoj grani također moraju biti izbrisane. IMO je najlakši način da se to postigne: git reset --hard origin/master (zamijenite "master" bilo kojoj grani na kojoj radite i prvo pokrenite git fetch origin )

23
12 дек. Odgovor je dat na 12. prosinca. 2011-12-12 22:54 '11 u 22:54 2011-12-12 22:54

Jednostavniji način:

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

To će nadjačati vašu lokalnu datoteku git.

20
05 мая '15 в 11:03 2015-05-05 11:03 odgovor je dat maximus 69 05 svibanj '15 u 11:03 2015-05-05 11:03

Čini se da je većina odgovora ovdje usredotočena na master granu; međutim, ponekad ima slučajeva kada radim na istoj grani funkcija na dva različita mjesta, i želim da jedan od njih odražava jedan od njih u drugom, bez puno hmelja kroz obruče.

Na temelju kombinacije odgovora RNA i odgovora torek na slično pitanje , došao sam do izvrsnog posla:

 git fetch git reset --hard @{u} 

Pokrenite ga iz grane i vratit ćete samo vašu lokalnu granu na verziju uzvodno.

To se može prikladno smjestiti u git ( git forcepull ) git forcepull :

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

Ili u datoteci .gitconfig :

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

Uživajte!

19
25 февр. odgovor je dao JacobEvelyn 25. veljače. 2014-02-25 20:19 '14 u 20:19 2014-02-25 20:19

Imao sam isti problem, i iz nekog razloga ni git clean -f -d to ne bi učinio. Zbog toga: Iz nekog razloga, ako Git zanemari vašu datoteku (putem ulaza .gitignore, pretpostavljam), još uvijek brine da će je prebrisati i zatim je prekinuti, ali mreža je neće izbrisati, osim ako ne dodate -x .

19
03 авг. Odgovori Tierlieb 03 aug. 2011-08-03 12:23 '11 u 12:23 2011-08-03 12:23

Sama sam odlučila:

18
03 дек. odgovor dao Simon B. 03. 2010-12-03 18:00 '10 u 18:00 2010-12-03 18:00

Imam čudnu situaciju da ni git clean ne git clean niti git reset posao. Moram ukloniti konfliktnu datoteku iz git index pomoću sljedeće skripte za svaku datoteku bez zapisa:

 git rm [file] 

Onda mogu dobro izvući.

17
19 сент. Odgovor dao Chen Zhang 19. rujna 2011-09-19 17:18 '11 u 17:18 2011-09-19 17:18

Znam mnogo jednostavniju i manje bolnu metodu:

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

To je!

16
05 сент. odgovor se daje ddmytrenko 05 sep . 2015-09-05 21:23 '15 u 21:23 2015-09-05 21:23

Ova četiri tima rade za mene.

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

Za provjeru / povlačenje nakon izvršavanja ovih naredbi

 git pull origin master 

Mnogo sam pokušao, ali sam konačno postigao uspjeh u tim timovima.

13
20 марта '14 в 7:24 2014-03-20 07:24 odgovor daje vishesh chandra 20. ožujka '14. u 7:24 2014-03-20 07:24

Unatoč izvornom pitanju, najviši odgovori mogu uzrokovati probleme ljudima koji imaju sličan problem, ali ne žele izgubiti svoje lokalne datoteke. Primjerice, pogledajte komentare Al-Punka i crizCraiga.

Sljedeća verzija popravlja vaše lokalne promjene u vremenskoj grani ( tmp ), provjerava izvornu granu (koja je, pretpostavljam, master ) i spaja ažuriranja. To možete učiniti pomoću stash , ali otkrio sam da je obično lakše koristiti samo pristup grananja / spajanja.

 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 

gdje pretpostavljamo da je još jedno spremište origin master .

12
22 окт. Odgovor je dao Snowcrash 22. listopada. 2014-10-22 20:31 '14 u 20:31 2014-10-22 20:31

Samo učini to

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

Na taj način izbjegavate sve neželjene nuspojave, kao što su brisanje datoteka ili direktorija koje želite zadržati, itd.

12
19 окт. odgovor dao user2696128 19. listopada 2015-10-19 12:54 '15 u 12:54 2015-10-19 12:54

Vraćanje pokazivača i glave na origin/master , ali ne i resetiranje radnog stabla:

 git reset origin/master 
11
15 февр. Odgovor daje korisnik 811773 15. veljače. 2013-02-15 16:41 '13 u 16:41 2013-02-15 16:41

zahtjevi:

  • Pratite lokalne promjene, tako da ih nitko ne izgubi.
  • Omogućite kompatibilnost lokalnog spremišta s udaljenim izvornim spremištem.

rješenje:

  • Sakrij lokalne promjene.
  • Nabavite čiste datoteke i ignoriranje .gitignore i hard reset na izvor .

     git stash --include-untracked git fetch --all git clean -fdx git reset --hard origin/master 
9
02 сент. odgovor dat vezenkov 02 ruj 2015-09-02 02:00 '15 u 2:00 2015-09-02 02:00

Pročitao sam sve odgovore, ali sam tražio jednu naredbu za to. To sam i učinio. Dodan je git alias za .gitconfig

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

Pokrenite naredbu

 git fp origin master 

je jednako

 git fetch origin master git reset --hard origin/master 
9
08 июля '16 в 16:11 2016-07-08 16:11 Odgovor daje Venkat Kotra 08. srpnja 2011. u 16:11 2016-07-08 16:11
  • 1
  • 2

Ostala pitanja o tagovima ili pitanje