Cum forțez git pull să suprascrie fișierele locale?

Cum forțez o suprascriere a fișierelor locale pe un git pull?

Scenariul este următorul:

  • Un membru al echipei modifică șabloanele pentru un site web la care lucrăm
  • Ei adaugă câteva imagini în directorul de imagini (dar uită să le adauge sub controlul sursei)
  • Îmi trimit imaginile prin poștă, mai târziu, la mine
  • Adaug imaginile sub controlul sursei și le împing în GitHub împreună cu alte modificări
  • Ei nu pot extrage actualizări din GitHub, deoarece Git nu vrea să-și suprascrie fișierele.

Aceasta este eroarea pe care o primesc:

eroare: fișierul arbore de lucru neurmărit „public/images/icon.gif” ar fi suprascris prin îmbinare

Cum forțez Git să le suprascrie? Persoana este un designer - de obicei, rezolv toate conflictele manual, astfel încât serverul are cea mai recentă versiune pe care trebuie doar să o actualizeze pe computer.


person Jakub Troszok    schedule 14.07.2009    source sursă
comment
oricine citește asta și crede că ar putea pierde fișiere, am fost în această poziție și am descoperit că tamponul Sublime Text m-a salvat - dacă lucrez la ceva, șterge totul accidental încercând să rezolv o problemă similară cu aceasta sau folosind un răspuns la această întrebare și ați avut fișierele deschise în Sublime (ceea ce există șanse mari), atunci fișierele vor fi în continuare acolo este Sublime, fie chiar acolo, fie în istoricul anulării   -  person Toni Leigh    schedule 20.01.2016
comment
practic, faceți o tragere de la dezvoltare numai după verificarea inițială -b. fă-ți treaba, apoi împinge înapoi.   -  person ldgorman    schedule 22.08.2018
comment
Răspuns scurt: ștergeți și re-creați ramura. 1. Ștergeți ramura: git branch <branch> -D 2. Resetați la un commit înainte de conflict: git reset <commit> --hard 3. Re-creați ramura: git branch <branch> 4. Setați urmărirea pe server: git --set-upstream-to=origin/<branch> <branch> 5. Pull: git pull`   -  person Nino Filiu    schedule 24.09.2018
comment
Pentru a schimba toate terminațiile CRLF în LF, (începeți curățarea) git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .   -  person Chloe    schedule 17.01.2019
comment
Este posibil să căutați în schimb această întrebare: în schimb stackoverflow.com/q/1628088/1148030 Resetați ramura depozitului local pentru a fi doar cum ar fi depozitul de la distanță HEAD De exemplu, dacă telecomanda a fost împinsă forțat și doriți să o trageți și să aruncați încarnarea anterioară a ramurii pe care o aveți. (Alte întrebări indică această întrebare ca fiind duplicatul lor, dar cred că ar trebui să indice această altă întrebare.)   -  person Peter Lamberg    schedule 31.03.2020
comment
Ștergeți manual toate fișierele și folderele din depozitul local. Apoi rulați git checkout <branch> && git add -A . && git reset --hard origin/<branch> && git pull. Consultați stackoverflow.com/a/65239330.   -  person Henke    schedule 08.01.2021
comment
Cu siguranță există un răspuns la asta pentru că am făcut-o din întâmplare. Acum au trecut multe săptămâni de muncă :(   -  person Ben Alan    schedule 10.01.2021


Răspunsuri (49)


⚠ Important: dacă aveți modificări locale, acestea se vor pierde. Cu sau fără opțiunea --hard, orice comitere locală care nu a fost împinsă se va pierde.[*]

Dacă aveți fișiere care nu sunt urmărite de Git (de exemplu, conținut de utilizator încărcat), aceste fișiere nu vor fi afectate.


Mai întâi, executați o preluare pentru a actualiza toate origin/<branch> referințe la cea mai recentă:

git fetch --all

Faceți o copie de rezervă a sucursalei dvs. actuale:

git branch backup-master

Apoi, aveți două opțiuni:

git reset --hard origin/master

SAU Dacă vă aflați într-o altă sucursală:

git reset --hard origin/<branch_name>

Explicaţie:

git fetch descarcă cea mai recentă versiune de la distanță fără a încerca să îmbine sau să rebazeze nimic.

Apoi git reset resetează ramura principală la ceea ce tocmai ați preluat. Opțiunea --hard modifică toate fișierele din arborele de lucru pentru a se potrivi cu fișierele din origin/master


Mențineți actualele comisioane locale

[*]: Este demn de remarcat faptul că este posibil să se mențină comiterile locale actuale prin crearea unei ramuri din master înainte de a reseta:

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

După aceasta, toate comiterile vechi vor fi păstrate în new-branch-to-save-current-commits.

Modificări neangajate

Cu toate acestea, modificările neangajate (chiar în etape) se vor pierde. Asigurați-vă că ați ascunde și comite tot ce aveți nevoie. Pentru asta puteți rula următoarele:

git stash

Și apoi pentru a reaplica aceste modificări neangajate:

git stash pop
person RNA    schedule 17.01.2012
comment
Ai grijă! Dacă aveți comiteri locale neîmpingete, aceasta le va elimina din sucursala dvs.! Această soluție păstrează intacte fișierele neurmărite, care nu se află în depozit, dar suprascrie orice altceva. - person Matthijs P; 17.05.2012
comment
Este o întrebare populară, așa că aș dori să clarific aici comentariul de sus. Tocmai am executat comenzi așa cum este descris în acest răspuns și nu a eliminat TOATE fișierele locale. Numai fișierele urmărite de la distanță au fost suprascrise și fiecare fișier local care a fost aici a fost lăsat neatins. - person Red; 22.11.2012
comment
Am pierdut toate comiterile locale care nu erau în arborele origin/master după o rebazare. E foarte posibil să te împuști în picior, aici. - person Cuadue; 23.11.2013
comment
Puteți face acest lucru și pentru o ramură de urmărire dacă aveți aceeași ramură la origine și la nivel local, trebuie doar să schimbați git reset --hard origin/master în git reset --hard origin/(branch) - person Joshua Kolden; 14.12.2013
comment
în cazul în care extrageți dintr-un depozit care are numele de ramură la distanță diferit de master, utilizați git reset --hard origin/branch-name - person Abbas Gadhia; 17.12.2013
comment
Acesta ar trebui să fie răspunsul acceptat. Funcționează bine pentru mine. Totuși, presupun că aici nu aveți comitere locale, ceea ce în cazul meu este bun, deoarece localul posedă doar o cheie de implementare. - person Ardee Aram; 07.04.2014
comment
Acest lucru nu va arunca și comisiile mele locale? Vreau să-mi păstrez comenzile și să suprascriu doar modificările neurmărite/necomitate. - person mcv; 02.05.2014
comment
Folosesc doar git fetch pentru a obține ramura din amonte și apoi resetați când trebuie să repar o grămadă de fișiere. Puteți obține ramura din amonte cu git branch -vv - person Natus Drew; 18.08.2014
comment
@mcv Pentru a vă păstra commit-urile locale doriți git reset --hard HEAD pe care apoi îl puteți urma cu git merge origin/master. - person joeytwiddle; 19.08.2014
comment
Având în vedere numărul de voturi pozitive la această întrebare și răspuns, cred că git ar trebui să încorporeze o comandă precum git pull -f - person Sophivorus; 26.08.2014
comment
Commit-urile care nu au fost împinge înainte de resetare completă pot fi recuperate folosind git reflog, care listează toate commit-urile, inclusiv cele fără bază. Până când vă curățați copia locală folosind git gc, totul este pierdut - person Koen.; 11.02.2015
comment
Aceasta va șterge fișierele pe care le-am .gitignore? - person user3817250; 01.04.2015
comment
@FelipeSchenone Există de fapt git pull -f, dar nu face ceea ce ne dorim cu toții să facă. - person sudo; 01.05.2015
comment
Pentru a fi corect, modificările necommise sunt pierdute, dar vechile comite-uri atârnă, așteaptă colectarea gunoiului. Le puteți vedea în continuare în git reflog și vă puteți muta HEAD înapoi cu git reset --hard HEAD@{1}. - person Florian Fida; 29.05.2015
comment
Doriți să subliniați aici că va elimina și orice modificări făcute în orice altă ramură care nu este urmărită de la distanță. L-am pierdut pe al meu, sper că ceilalți să fie atenți. - person Devesh Khandelwal; 27.06.2015
comment
Faceți o copie de rezervă a dosarului cu fișierele locale, inclusiv folderul .git din el. Acum nu poți „pierde” nimic dacă această remediere nu funcționează pentru tine; poți să faci o altă copie și să încerci altceva. Nu operați dintr-un singur folder și aveți încredere în git ca și cum ar fi un instrument de rezervă 100% fiabil. O greșeală de tipar, mai ales în ramuri, poate fi un coșmar. Vă sugerez o copie de rezervă de la vechile școli în folderele tar.gz și apoi să executați git din cea mai recentă copie. - person JosephK; 13.08.2015
comment
@Red Da, dacă doriți să eliminați tot ce nu este urmărit, chiar și ignorat, utilizați git clean -dxf după resetarea completă. - person IceGlow; 31.12.2015
comment
Am făcut asta și modificările mele locale NU au fost eliminate - ceea ce este regretabil pentru că am sperat că vor fi! Știe cineva cum să facă acest lucru, dar și să forțeze git să renunțe la orice modificare a localizării care nu există în ramura la distanță? În esență, vreau o corespondență EXACTĂ, 1-la-1, cu ramura de la distanță. - person Gershy; 04.01.2016
comment
Fapt puțin cunoscut - puteți de fapt să faceți o copie de rezervă a întregului depozit git cu tar -czf myrepodir.tar.gz myrepodir/. de modă veche. Dacă repo-ul dvs. se încurcă din cauza git ciudații, ștergeți-l și restabiliți-l din fișierul tar.gz pentru a reveni ACTUAL la locul în care erați înainte de a încerca acest experiment nefast. Doar asigurați-vă că aveți . după myrepodir/ sau .git și alte fișiere ascunse nu vor fi salvate! - person Buttle Butkus; 06.02.2016
comment
poate funcționa această tehnică pentru fișiere individuale? de exemplu -- index.php helpers.js ect. în loc de --all ? - person Steve C; 09.09.2016
comment
nu a funcționat pentru mine. am încercat această soluție, am încercat git clean -dfx. încercat git pull -f. au în continuare același mesaj de eroare. - person InsOp; 04.10.2016
comment
Rețineți că puteți prescurta numele sucursalei cu @{u}, care este mult mai scurt. - person Antimony; 06.06.2017
comment
@GershomMaes git clean -dfx după resetare completă, după cum s-a menționat mai sus de IceGlow? - person Franklin Yu; 23.03.2018
comment
nu este mai ușor să rm -rf /folder și să faci din nou git clone, dacă vrei să renunți la toate modificările locale? - person JonB; 04.10.2018
comment
Când utilizați git clean -dffx, asigurați-vă că îl rulați din directorul de nivel superior al proiectului git. Este o idee bună să rulați mai întâi git clean -ndffx pentru a lista fișierele înainte de a fi șterse, deoarece -x șterge fișierele care sunt .gitignored și nu sunt afișate de git status - person Josiah Yoder; 22.04.2019
comment
@JonB: nu este mai ușor să rm -rf /folder și să faci din nou git clone...? Un repo (nici prea) mare + lățime de bandă mică m-a adus aici. Mi-ar plăcea să clonez din nou, dar a fost destul de dureros prima dată, așa că sunt unul dintre cei care caută o soluție mai rapidă. - person Sz.; 11.07.2019
comment
a funcționat pentru mine când ramura sursă conținea actualizări precum redenumirea fișierelor din general în General. Pe Windows nu contează care este cazul, așa că această abordare m-a deblocat. - person Someone Somewhere; 08.08.2019
comment
Mecurial are hg update, dar nu există echivalent în git... - person Jack; 11.03.2020
comment
Ar fi mai consistent dacă ai putea face git pull --force și s-ar suprascrie doar filiala locală. Văzând că puteți face invers, suprascriind telecomanda cu git push --force - person Jonny; 12.03.2020
comment
Mi-am pierdut toate comiterile locale cu comenzile sugerate. - person Sylvain Rodrigue; 17.08.2020
comment
Rețineți că ramura principală este acum numită ramură principală în mod implicit, așa că fiți atenți la copy-pasters, deoarece aceste comenzi ar putea să nu mai funcționeze. - person Matt; 27.10.2020
comment
scuze. Prea complicat. Doar eliminați și clonați din nou... - person Niclas; 05.12.2020
comment
Dacă rulați git checkout -b backup-master, ar trebui să vă întoarceți la ramura dvs. (master în exemplu) înainte de a rula git reset. În caz contrar, puteți folosi git branch backup-master în schimb pentru a crea ramura de rezervă, dar rămâneți în master. - person Karim Sonbol; 11.12.2020
comment
După ce am făcut acest lucru, am un fatal: nu am putut găsi master ref la distanță când fac git pull origin master - person G M; 14.04.2021

Incearca asta:

git reset --hard HEAD
git pull

Ar trebui să facă ce vrei tu.

person Travis Reeder    schedule 09.05.2010
comment
Am făcut asta și unele fișiere locale care nu mai erau în repo au rămas pe disc. - person Piotr Owsiak; 08.04.2011
comment
Nu cred că acest lucru este corect. cele de mai sus vor efectua o îmbinare, nu o suprascriere, care a fost solicitată în întrebarea: Cum să forțez git să le suprascrie? Nu am răspunsul, îl caut momentan.. momentan trec la ramura cu care vreau să-l păstrez git checkout BranchWithCodeToKeep, apoi fac git branch -D BranchToOverwrite și apoi în final git checkout -b BranchToOverwrite. veți avea acum codul exact de la BranchWithCodeToKeep pe ramura BranchToOverwrite fără a fi nevoie să efectuați o îmbinare. - person felbus; 13.07.2011
comment
în loc să fuzionați folosind „git pull”, încercați git fetch --all urmat de „git reset --hard origin/master” - person Lloyd Moore; 21.02.2012
comment
Sugestia lui Lloyd Moore este corectă, dar aveți grijă că poate elimina comiterile locale nepuse din sucursala dvs. - person Matthijs P; 17.05.2012
comment
da, soluția @lloydmoore a funcționat pentru mine. Ar putea fi mai degrabă un răspuns decât doar un comentariu. - person Max Williams; 19.11.2012
comment
Aceasta va reseta modificările curente înapoi la ultima comitere de ramură extrasă. Apoi git pull îmbină modificările din ultima ramură. Acest lucru a făcut exact ceea ce mi-am dorit să facă.. Mulțumesc! - person Codeversed; 05.12.2014
comment
Va încurca asta telecomanda? - person user1767754; 30.09.2015
comment
Răspuns bun, dar vă rog să adăugați mai multe detalii, adică unii oameni ar putea să nu știe nimic despre resetare și să-și piardă fișierele... - person Mohammad Kermani; 17.01.2017
comment
@Travis R ai putea explica te rog scopul git rest --hard HEAD? - person Imanez; 06.03.2017
comment
git reset --hard HEAD nu resetează cu adevărat totul în unele cazuri - person Finesse; 06.03.2018
comment
La asta mă gândesc mai ales când mă gândesc la forțarea tragerii. Mai ales după ce am încercat câteva setări - person Mianala Loharano; 04.07.2018
comment
poti explica ce face codul tau te rog? (sunt doar 2 linii) - person Charlie Parker; 31.03.2021

AVERTISMENT: git clean șterge toate fișierele/directoarele neurmărite și nu poate fi anulat.


Uneori doar clean -f nu ajută. În cazul în care aveți DIRECTORIE neurmărite, este necesară și opțiunea -d:

# WARNING: this can't be undone!

git reset --hard HEAD
git clean -f -d
git pull

AVERTISMENT: git clean șterge toate fișierele/directoarele neurmărite și nu poate fi anulat.

Luați în considerare mai întâi să utilizați indicatorul -n (--dry-run). Acest lucru vă va arăta ce va fi șters fără a șterge nimic:

git clean -n -f -d

Exemplu de ieșire:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...
person David Avsajanishvili    schedule 19.03.2011
comment
Puteți da git clean un argument de cale pentru a fi mai specific și pentru a evita ștergerea fișierelor neurmărite care nu sunt conflictuale. - person joachim; 18.10.2011
comment
Cred că descrierea scenariului arată clar că nu vrea cu adevărat să arunce conținutul. Mai degrabă, ceea ce vrea este să oprească git baulking la suprascrierea fișierelor. @Lauri, nu ar fi trebuit să ți se întâmple asta. Din păcate, oamenii par să fi citit greșit esența descrierii scenariului - vezi sugestia mea. - person Hedgehog; 12.02.2012
comment
ÎN sfârșit. git clean -f -d este la îndemână când make clean nu reușește să curețe totul. - person earthmeLon; 23.06.2012
comment
Dacă doriți să sincronizați întregul director cu depozitul de la distanță, aceasta este calea de urmat. - person Johannes Ewald; 11.02.2013
comment
@crizCraig cu excepția cazului în care sunt adăugați în .gitignore - person Bleeding Fingers; 13.06.2013
comment
@BleedingFingers Apoi adăugați -x. Dar fișierele existente care sunt acoperite de .gitignore nu ar trebui să fie o problemă: presupunând că ceilalți contribuitori la acel repo folosesc același fișier .gitignore, un pull nu va primi niciun commit care adaugă fișiere conflictuale. - person ; 07.06.2015
comment
@earthmeLon, pentru asta s-ar putea să vrei git clean -dfx. -x ignoră .gitignore. De obicei, produsele dvs. de construcție vor fi în .gitignore. - person Paul Draper; 12.08.2015
comment
Poate fi bine să rulați mai întâi git clean -nfd, care arată doar ce ar fi eliminat înainte de a se termina efectiv, adică înainte de a avea probleme. :-) - person Velda; 16.08.2018

La fel ca Ariciul, cred că răspunsurile sunt teribile. Dar, deși răspunsul lui Hedgehog ar putea fi mai bun, nu cred că este atât de elegant pe cât ar putea fi. Modul în care am găsit să fac acest lucru este folosind fetch și merge cu o strategie definită. Ceea ce ar trebui să facă astfel încât modificările dvs. locale să fie păstrate atâta timp cât acestea nu sunt unul dintre fișierele cu care încercați să forțați o suprascriere.

Mai întâi faceți o comitere a modificărilor dvs

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

Apoi preluați modificările și suprascrieți dacă există un conflict

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

-X este un nume de opțiune și theirs este valoarea pentru acea opțiune. Alegi să folosești their modificări (cealaltă opțiune este ours modificări) dacă există un conflict.

person Richard Kersey    schedule 11.04.2012
comment
Acesta este cel mai bun răspuns pe care l-am văzut până acum. Nu l-am încercat, dar, spre deosebire de alte răspunsuri, aceasta nu încearcă să distrugă toate fișierele ne urmărite, ceea ce este foarte periculos din motive evidente. - person huyz; 07.05.2012
comment
Idem - asta a funcționat pentru mine când am făcut o fuziune foarte mare (solicitare de extragere GitHub) în care am vrut doar să accept totul pe lângă ceea ce aveam. Răspuns bun! În cazul meu, ultimele două comenzi au fost: 1) get fetch other-repo; 2) git merge -s recursive -X theirs other-repo/master - person quux00; 27.07.2012
comment
Acest lucru va suprascrie orice conflicte cu fișierele depozitelor și nu cu cele locale, corect? - person Nathan F.; 05.12.2014
comment
Cel mai bun raspuns. Cel mai înalt răspuns acceptat m-a lăsat în cazul meu pe cap detașat. Am revenit la filiala principală locală și am alergat git merge -X theirs origin/master - person petergus; 11.03.2016
comment
Am încercat asta - apoi adaugă/commit noile mele fișiere modificate, dar totuși a spus că ramura mea era în spatele telecomenzii când am încercat să împing. Timp pierdut masiv pentru că git pull nu solicită Overwrite local? da/n/toate. - person JosephK; 26.07.2016
comment
Stai... nu au git add * și git commit -a <more-options-here> același efect? De ce ai avea nevoie de amândouă? - person Marcel Stör; 25.04.2017
comment
@MarcelStör nu ai nevoie de amândouă, dar nici ei nu fac același lucru. git commit -a are acest efect numai asupra fișierelor care sunt deja urmărite; git add * va adăuga fișiere care nu sunt urmărite. Deci, dacă faceți git commit -a, nu va prinde fișiere noi, atunci s-ar putea să fie nevoie să faceți un git add după aceea, dar dacă faceți git add * nu veți avea nevoie de -a la commit. - person briantist; 04.04.2018
comment
Problema cu acest răspuns (excelent) este că adaugă toate fișierele locale, care uneori pot să nu fie ceea ce doriți. Poate doriți doar să adăugați fișierele specifice care au fost omise. Dar cel mai bun lucru este că îl face să facă ceea ce ar fi trebuit să facă -- să le adauge local. Probabil că nu veți avea nevoie de strategia lor -X, deoarece sunt aceeași imagine. De fapt, aș sugera să o renunți la început, doar pentru a afla dacă există anomalii și să-l adaugi dacă există, după ce verific că „al lor” este întotdeauna alegerea corectă. Dar atunci, sunt paranoic. - person Bob Kerns; 28.06.2018
comment
Am vrut doar ca nenorocitul de git să suprascrie totul și să tacă din gura asta. la urma urmei, doar îl folosesc între computerul meu de lucru și unele sisteme Raspberry Pi. Dorind o opțiune de suprascriere forțată, cel puțin pentru liderul de proiect - person clockw0rk; 05.06.2019
comment
După ce am încercat această comandă, primesc în continuare aceeași eroare, fișierele arbore de lucru neurmărite ar fi suprascrise prin îmbinare și o listă lungă, dar incompletă a fișierelor pe care nu o pot forța pur și simplu să o suprascrie. - person Patrick Parker; 02.10.2020
comment
hmmm... poate încercați git add . mai întâi - person Richard Kersey; 05.10.2020

In loc sa faci:

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

Aș sfătui să faceți următoarele:

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

Nu este nevoie să preluați toate telecomenzile și ramurile dacă aveți de gând să resetați la ramura de origine/master, nu?

person Johanneke    schedule 26.04.2013
comment
Răspunsul tău este exact ceea ce aveai nevoie pentru reprezentantul tău. Trebuie să întreb, aceasta elimină și toate fișierele neurmărite? - person Nicolas De Jay; 07.01.2014
comment
Da, majoritatea reprezentantului meu vine de aici :) Acest lucru va elimina și toate fișierele neurmărite. Ceva ce uitasem și mi-am amintit dureros acum doar 2 zile... - person Johanneke; 09.01.2014
comment
Vedeți comentariile la acest alt răspuns: stackoverflow.com/a/8888015/2151700 - person Johanneke; 09.01.2014
comment
Acest lucru nu a eliminat fișierele mele neurmărite; care este de fapt ceea ce mă așteptam. Există un motiv pentru unii oameni și nu pentru alții? - person arichards; 19.04.2016
comment
Fișierele neurmărite nu sunt afectate4 de git reset. Dacă doriți să fie eliminate și ele, faceți git add . mai întâi, înainte de git reset --hard - person Johanneke; 15.08.2017
comment
Acesta este exact ceea ce aveam nevoie: ceva care să suprascrie fișierele neurmărite care există în telecomandă și să lase totul intact. - person Ledazinha; 21.12.2017
comment
a funcționat destul de bine - person Wilson; 18.06.2021
comment
master nu mai este corect din punct de vedere politic, git preferă acum main. - person Rick Graves; 26.06.2021

Se pare că cel mai bun mod este să faci mai întâi:

git clean

Pentru a șterge toate fișierele neurmărite și apoi continuați cu git pull obișnuit...

person Jakub Troszok    schedule 14.07.2009
comment
Am încercat să folosesc git clean pentru a rezolva aceeași problemă, dar nu a rezolvat-o. git status spune că ramura dvs. și „origina/masterul” au divergent, # și au 2 și, respectiv, 9 comitere diferite fiecare. și git pull spune ceva similar cu ceea ce ai mai sus. - person slacy; 24.09.2009
comment
nu ar trebui să se schimbe la ramura principală și apoi să facă git clean pentru ca aceasta să funcționeze? Apoi se poate întoarce la orice ramură de dezvoltare din care lucra. - person suitedupgeek; 26.01.2010
comment
@slacy: Atunci trebuie să îmbinați cele două ramuri. - person Xiong Chiamiov; 05.02.2010
comment
git clean este un instrument destul de contondent și ar putea arunca o mulțime de lucruri pe care ați dori să le păstrați. Mai bine să eliminați sau să redenumiți fișierele de care se plânge git până când extragerea reușește. - person Neil Mayhew; 02.07.2010
comment
Nu cred că acest lucru funcționează în general. Nu există o modalitate de a face practic o telecomandă git clone printr-un git pull forțat? - person mathtick; 29.11.2010
comment
@mathick: git fetch origin && git reset --hard origin/master - person Arrowmaster; 23.02.2011
comment
Trebuia să adaug un -x la acel git clean pentru a-l face să funcționeze pentru mine, dintr-un motiv oarecare (-d nu ștergea un director .ideas dintr-un anumit motiv), dar asta mi-a rezolvat problema, cu siguranță. - person Owen Blacker; 19.12.2011
comment
evitați stopul cardiac brusc: utilizați mai întâi git clean -n - person doub1ejack; 30.07.2013
comment
Este git clean cel mai bun răspuns aici? Se pare că eliminarea fișierelor nu este neapărat ceea ce dorește OP. Ei au cerut „o suprascriere a fișierelor locale”, nu ștergerea. - person JohnAllen; 04.03.2014
comment
git clean în sine nu pare să ajute, soluția lui @Arrowmaster este mai aproape, dar una mai bună a lui Lloyd Moore este în următorul răspuns. - person Neil Monroe; 11.06.2015
comment
Nu faceți niciodată nimic „git” (sau chiar să aveți un folder .git) decât într-o copie a folderului de lucru real și evitați orice stres cardiac. Nu da git și sintaxa/metodele sale obtuze oportunitatea de a te distruge în primul rând. - person JosephK; 26.07.2016

Atenție, dacă faceți acest lucru ștergeți definitiv fișierele dacă aveți orice director/* intrări în fișierul dvs. gitignore.

Unele răspunsuri par a fi teribile. Teribil în sensul a ceea ce sa întâmplat cu @Lauri, urmând sugestia lui David Avsajanishvili.

Mai degrabă (git > v1.7.6):

git stash --include-untracked
git pull

Mai târziu, puteți curăța istoricul stocurilor.

Manual, unul câte unul:

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

$ git stash drop stash@{0}
$ git stash drop stash@{1}

Brutal, dintr-o dată:

$ git stash clear

Desigur, dacă vrei să te întorci la ceea ce ai ascuns:

$ git stash list
...
$ git stash apply stash@{5}
person Hedgehog    schedule 11.02.2012
comment
Nu presupui că nu a fost efectuat niciodată un commit? În cazul meu, am făcut mai multe commit-uri către sucursala mea locală, dar am vrut să resetam totul înapoi la sucursala la distanță - person Lee Francis; 20.03.2012
comment
Nu, nu cred. Stashing doar mută fișierele necommitate din drum. Cele de mai sus mută și fișiere pe care git nu le urmărește. Acest lucru previne derularea fișierelor care au fost adăugate la telecomandă, care nu au fost încă depuse pe mașina dvs. - dar pe care le-ați creat (!) - să fie trase în jos. Toate fără a distruge munca neangajată. Sper că are sens? - person Hedgehog; 21.03.2012
comment
Dacă nu aveți 1.7.6, puteți imita --include-untracked pur și simplu git add-ingând temporar întregul depozit, apoi ascunzându-l imediat. - person nategood; 02.05.2012
comment
Sunt de acord cu Hedgehog. Dacă dați răspunsurile populare aici, este mai mult ca probabil să descoperiți că ați ucis din neatenție o mulțime de lucruri pe care nu ați vrut cu adevărat să le pierdeți. - person Guardius; 01.02.2013
comment
Aveam și alte fișiere neurmărite - în afară de cel pe care merge/pull-ul dorea să îl suprascrie, așa că această soluție a funcționat cel mai bine. git stash apply a adus înapoi toate fișierele mele neurmărite, cu excepția (pe bună dreptate) a celor pe care fuziunea le-a creat deja: există deja, nu ați verificat. A funcționat perfect. - person BigBlueHat; 25.04.2013
comment
Aceasta poate fi cea mai ușoară modalitate de a folosi un repo neintenționat, la fel ca ceea ce s-a întâmplat cu @Lauri, dar mai rău pentru că credeți că protejați fișierele de ștergere. Dacă aveți o regulă .gitignore care conține un wildcard, sărută-i la revedere. Explicație. - person Walf; 30.11.2016
comment
Acesta este cel mai curat răspuns și ar trebui să fie cel acceptat. Pentru a salva ceva tastări, puteți folosi formularul scurt: git stash -u. - person ccpizza; 23.03.2017
comment
Linkul despre git stash --include-untracked distrugerea folderelor care sunt gitignorate este mort - haideți să găsim un înlocuitor. Între timp, comentariul @Waif despre cum poate acest răspuns să distrugă folderele gitignore ar trebui votat pozitiv și, de preferință, convertit într-un răspuns nou. Problema GitLab pe care le-ai conectat are detalii. Folosesc git stash foarte mult și am fost foarte surprins să aud că poate distruge fișiere. - person RichVel; 15.04.2019

S-ar putea să găsiți această comandă utilă pentru a arunca modificările locale:

git checkout <your-branch> -f

Și apoi faceți o curățare (elimină fișierele neurmărite din arborele de lucru):

git clean -f

Dacă doriți să eliminați directoarele neurmărite pe lângă fișierele neurmărite:

git clean -fd
person Vishal    schedule 05.08.2010
comment
Cred că descrierea scenariului arată clar că nu vrea cu adevărat să arunce conținutul. Mai degrabă, ceea ce vrea este să oprească git baulking la suprascrierea fișierelor. Vezi sugestia mea. - person Hedgehog; 12.02.2012
comment
Deși s-ar putea ca răspunsul să nu se potrivească exact cu descrierea, m-a salvat totuși de frustrarea de a se răsuci git cu întoarcerile de cărucior (eveniment cu autocrlf false). Când git reset --hard HEAD nu vă lasă fără fișiere modificate, aceste semnalizatoare -f sunt destul de utile. Mulțumesc mult. - person Kellindil; 16.01.2013

În loc să fuzionezi cu git pull, încearcă asta:

git fetch --all

urmată de:

git reset --hard origin/master.

person Lloyd Moore    schedule 22.11.2012

Singurul lucru care a funcționat pentru mine a fost:

git reset --hard HEAD~5

Acest lucru vă va duce înapoi cinci comite și apoi cu

git pull

Am descoperit că, căutând cum să anulez o îmbinare Git.

person Chris BIllante    schedule 05.05.2011
comment
Acesta a fost ceea ce a funcționat în cele din urmă pentru mine, deoarece mi-am împins forțat ramura în depozitul de origine și am continuat să primesc conflicte de îmbinare când încercam să o trag în depozitul meu de la distanță. - person jwfrench; 07.05.2014
comment
Bună, de fapt acesta este un truc pentru un work around, dar cu adevărat eficient. Deoarece unele conflicte pot apărea doar în câteva comiteri, atunci revenirea a 5 comiteri va asigura că nu există conflicte cu codul de la distanță. - person Hoang Le; 21.11.2014

Problema cu toate aceste soluții este că toate sunt fie prea complexe, fie, o problemă și mai mare, este că elimină toate fișierele neurmărite de pe serverul web, ceea ce nu dorim, deoarece sunt întotdeauna necesare fișiere de configurare care sunt activate. server și nu în depozitul Git.

Iată cea mai curată soluție pe care o folosim:

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • Prima comandă preia cele mai noi date.

  • A doua comandă verifică dacă există fișiere care sunt adăugate în depozit și șterge acele fișiere neurmărite din depozitul local care ar provoca conflicte.

  • A treia comandă verifică toate fișierele care au fost modificate local.

  • În cele din urmă facem o tragere pentru a actualiza la cea mai nouă versiune, dar de data aceasta fără conflicte, deoarece fișierele neurmărite care se află în depozit nu mai există și toate fișierele modificate local sunt deja la fel ca în depozit.

person Strahinja Kustudic    schedule 05.11.2012
comment
Utilizarea git merge origin/master ca ultimă linie (cum spuneți în nota dvs.) în loc de git pull va fi mai rapidă, deoarece ați tras deja în jos orice modificări din depozitul git. - person Josh; 06.05.2013
comment
Da, desigur, git merge origin/master va fi mai rapid și probabil chiar mai sigur. Deoarece dacă cineva a împins noi modificări în timpul eliminării fișierelor din acest script (ceea ce nu este probabil să se întâmple, dar posibil), întregul pull ar putea eșua. Singurul motiv pentru care am pus pull acolo este pentru că s-ar putea să nu lucreze cineva la ramura principală, ci o altă ramură și am vrut ca scenariul să fie universal. - person Strahinja Kustudic; 02.09.2013
comment
Dacă ați creat fișiere local, cum ar fi fișierele de opțiuni, puneți-le în .gitignore. - person Sebi; 21.11.2017

În primul rând, încercați modul standard:

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

Avertisment: comenzile de mai sus pot duce la pierderi de date/fișiere numai dacă nu le-ați comis! Dacă nu sunteți sigur, faceți mai întâi o copie de rezervă a întregului folder de depozit.

Apoi trageți din nou.

Dacă mai sus nu vă ajută și nu vă pasă de fișierele/directoarele neurmărite (faceți mai întâi copierea de rezervă pentru orice eventualitate), încercați următorii pași simpli:

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

Aceasta va ȘTERGE toate fișierele git (cu excepția .git/ dir, unde aveți toate commit-urile) și le va trage din nou.


De ce git reset HEAD --hard ar putea eșua în unele cazuri?

  1. Reguli personalizate în .gitattributes file

    Având regula eol=lf în .gitattributes ar putea determina git să modifice unele modificări ale fișierelor prin conversia terminațiilor de linie CRLF în LF în unele fișiere text.

    Dacă acesta este cazul, trebuie să comiteți aceste modificări CRLF/LF (prin revizuirea lor în git status) sau încercați: git config core.autcrlf false să le ignorați temporar.

  2. Incompatibilitatea sistemului de fișiere

    Când utilizați un sistem de fișiere care nu acceptă atribute de permisiune. De exemplu, aveți două depozite, unul pe Linux/Mac (ext3/hfs+) și altul pe sistemul de fișiere bazat pe FAT32/NTFS.

    După cum observați, există două tipuri diferite de sisteme de fișiere, așa că cel care nu acceptă permisiunile Unix, practic, nu poate reseta permisiunile de fișiere pe sistemul care nu acceptă acest tip de permisiuni, deci indiferent cât de --hard încercați, git detectează întotdeauna unele „modificări”.

person kenorb    schedule 26.10.2012

Am avut aceeasi problema. Nimeni nu mi-a dat această soluție, dar mi-a funcționat.

Am rezolvat-o prin:

  1. Ștergeți toate fișierele. Lăsați doar directorul .git.
  2. git reset --hard HEAD
  3. git pull
  4. git push

Acum functioneaza.

person John John Pichler    schedule 12.01.2011
comment
La fel şi eu. Uneori doar soluția foarte grea funcționează, se întâmplă adesea ca doar resetarea și curățarea să nu fie suficiente cumva... - person jdehaan; 15.12.2011

Primă:

Vorbind despre pull/fetch/merge în răspunsurile anterioare, aș dori să împărtășesc un truc interesant și productiv,

git pull --rebase

Această comandă de mai sus este cea mai utilă comandă din viața mea Git, care a economisit mult timp.

Înainte de a împinge noul dvs. commit pe server, încercați această comandă și va sincroniza automat cele mai recente modificări ale serverului (cu un fetch + merge) și vă va plasa commit-ul în partea de sus în jurnalul Git. Nu este nevoie să vă faceți griji cu privire la extragerea/imbinarea manuală.

Găsiți detalii în Ce face git pull --rebase?.

person Sazzad Hissain Khan    schedule 23.12.2015
comment
Pe scurt: git pull -r. - person kenorb; 15.10.2019
comment
În cazul meu, înainte de a face asta, a trebuit să 1) git add -A, 2) git commit -m 3) și în cele din urmă git pull rebase. Mulțumesc. - person Pathros; 03.02.2021

Am avut o problemă similară. A trebuit sa fac asta:

git reset --hard HEAD
git clean -f
git pull
person Ryan    schedule 14.01.2011
comment
utilizați git clean cu precauție - person nategood; 30.03.2012

Am rezumat alte răspunsuri. Puteți executa git pull fără erori:

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

Avertisment: acest script este foarte puternic, așa că ați putea pierde modificările.

person Robert Moon    schedule 07.08.2015
comment
Aceasta va suprascrie fișierele modificate (fișierele care au fost încărcate anterior) și va elimina fișierele neurmărite (fișierele care nu au fost niciodată înregistrate). Exact ceea ce cautam, multumesc! - person styfle; 03.03.2016
comment
Bănuiesc că a treia linie git reset --hard HEAD poate fi redundantă; pagina mea de manual locală (2.6.3) spune că reset în a doua linie git reset --hard origin/master este implicit HEAD în toate formele. - person arichards; 19.04.2016
comment
@arichards Cred că suspectul tău are dreptate, dar dacă a doua linie nu va funcționa (din orice motiv), a treia linie funcționează bine pentru a reseta. Această soluție nu trebuie optimizată. Tocmai am rezumat alte răspunsuri. Asta e tot. Multumesc pentru comentariu. :) - person Robert Moon; 20.04.2016
comment
Multumesc pentru rezumat. Acești pași sunt într-adevăr puternici :) - person Glorian; 10.12.2020

Pe baza propriilor mele experiențe similare, soluția oferită de Strahinja Kustudic mai sus este de departe cea mai bună. După cum au subliniat alții, simpla resetare hard va elimina toate fișierele neurmărite care ar putea include o mulțime de lucruri pe care nu doriți să le eliminați, cum ar fi fișierele de configurare. Ceea ce este mai sigur, este să eliminați numai fișierele care urmează să fie adăugate și, de altfel, probabil că ați dori, de asemenea, să verificați orice fișiere modificate local care urmează să fie actualizate.

În minte, am actualizat scriptul lui Kustudic pentru a face exact asta. Am remediat și o greșeală de tipar (lipsește un " în original).

#/bin/sh

# Fetch the newest code
git fetch

# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull
person Rolf Kaiser    schedule 27.02.2013
comment
Utilizarea git merge origin/master ca ultimă linie (cum spuneți în nota dvs.) în loc de git pull va fi mai rapidă, deoarece ați tras deja în jos orice modificări din depozitul git. - person Josh; 06.05.2013
comment
Este necesară verificarea fișierelor modificate, așa că funcționează de 100% din ori. Mi-am actualizat scriptul cu asta cu mult timp în urmă, dar am uitat să actualizez și aici. De asemenea, îl folosesc puțin diferit față de tine. Închid fișiere care au orice tip de modificare, nu doar M, așa că funcționează tot timpul. - person Strahinja Kustudic; 02.09.2013

Cred că există două posibile cauze de conflict, care trebuie rezolvate separat și, din câte îmi pot da seama, niciunul dintre răspunsurile de mai sus nu se referă la ambele:

  • Fișierele locale care nu sunt urmărite trebuie șterse, fie manual (mai sigur), fie așa cum se sugerează în alte răspunsuri, de git clean -f -d

  • Comiterile locale care nu sunt pe ramura la distanță trebuie, de asemenea, șterse. IMO, cea mai ușoară modalitate de a realiza acest lucru este cu: git reset --hard origin/master (înlocuiți „master” cu orice ramură la care lucrați și rulați mai întâi un git fetch origin)

person tiho    schedule 12.12.2011

Se pare că majoritatea răspunsurilor de aici sunt concentrate pe ramura master; cu toate acestea, există momente în care lucrez la aceeași ramură a caracteristicilor în două locuri diferite și vreau ca o rebază într-unul să se reflecte în celălalt, fără să sară mult prin cercuri.

Bazat pe o combinație de răspunsul ARN și răspunsul lui Torek la o întrebare similară, am venit cu asta care funcționează splendid:

git fetch
git reset --hard @{u}

Rulați acest lucru dintr-o sucursală și vă va reseta doar filiala locală la versiunea din amonte.

Acest lucru poate fi bine pus și într-un alias git (git forcepull):

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

Sau, în fișierul dvs. .gitconfig:

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

Bucurați-vă!

person JacobEvelyn    schedule 25.02.2014
comment
Acest răspuns este, de asemenea, frumos, deoarece funcționează indiferent de ramura în care vă aflați! - person leafmeal; 11.09.2018

Am avut aceeași problemă și din anumite motive, chiar și un git clean -f -d nu ar face-o. Iată de ce: Din anumite motive, dacă fișierul dvs. este ignorat de Git (prin o intrare .gitignore, presupun), încă se deranjează să-l suprascrie cu o pull ulterioară, dar o curățare nu îl va elimina, decât dacă adăugați -x.

person Tierlieb    schedule 03.08.2011

O modalitate mai ușoară ar fi:

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

Acest lucru va suprascrie fișierul local cu fișierul de pe git

person maximus 69    schedule 05.05.2015

Știu o metodă mult mai ușoară și mai puțin dureroasă:

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

Asta este!

person ddmytrenko    schedule 05.09.2015
comment
Am încercat să fac așa cum s-a sugerat în acest răspuns. NICIUN FIȘIERE nu au fost scoase din depozitul de la distanță. De fapt, nu este foarte surprinzător când te gândești la asta - până la urmă nu există nicio referire la origin/<branch_to_force_pull>. - person Henke; 10.12.2020

Tocmai am rezolvat asta prin:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

unde ultima comandă oferă o listă cu modificările locale. Continuați să modificați ramura „tmp” până când este acceptabilă și apoi fuzionați înapoi în master cu:

git checkout master && git merge tmp

Pentru data viitoare, probabil că puteți gestiona asta într-un mod mai curat, căutând „git stash branch”, deși stash este probabil să vă provoace probleme la primele încercări, așa că faceți mai întâi un experiment pe un proiect necritic...

person Simon B.    schedule 03.12.2010

Am o situație ciudată în care nici git clean sau git reset nu funcționează. Trebuie să elimin fișierul aflat în conflict din git index utilizând următorul script pe fiecare fișier neurmărit:

git rm [file]

Atunci reușesc să trag bine.

person Chen Zhang    schedule 19.09.2011

Utilizare:

git fetch --all

Apoi, dacă vă aflați în ramura master,

git reset --hard origin/master

altfel

git reset --hard origin/master<branch_name>
person SUJITKUMAR SINGH    schedule 15.08.2019
comment
Ultimul fragment ar trebui să fie origin/<branch_name> nu origin/master<branch_name>. - person Adrian; 13.11.2020

Doar fa-o

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

Astfel, evitați toate efectele secundare nedorite, cum ar fi ștergerea fișierelor sau directoarelor pe care doriți să le păstrați etc.

person user2696128    schedule 19.10.2015
comment
Grozav. Folosind mai întâi checkout -f în ramura din care am vrut să fuzionez, asta a scăpat de toate fișierele problematice neurmărite. Apoi mi-am putut verifica din nou destinația și, în cele din urmă, puteam fuziona fără probleme. - person Patrick Parker; 02.10.2020

În ciuda întrebării inițiale, răspunsurile de top pot cauza probleme persoanelor care au o problemă similară, dar nu doresc să-și piardă fișierele locale. De exemplu, vezi comentariile lui Al-Punk și crizCraig.

Următoarea versiune comite modificările dvs. locale într-o ramură temporară (tmp), verifică ramura originală (care presupun că este master) și îmbină actualizările. Ai putea face acest lucru cu stash, dar am descoperit că de obicei este mai ușor să folosești pur și simplu abordarea de ramificare / îmbinare.

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

unde presupunem că celălalt depozit este origin master.

person Snowcrash    schedule 22.10.2014

Resetați indexul și capul la origin/master, dar nu resetați arborele de lucru:

git reset origin/master
person Community    schedule 15.02.2013
comment
Personal mi s-a părut că acest lucru este cel mai util. Apoi vă păstrează arborele de lucru, astfel încât să îl puteți verifica din nou. Pentru problema mea, am avut aceleași fișiere șterse ca și adăugate, așa că a fost blocat. Ciudat, știu. - person King Friday; 05.01.2014

Aceste patru comenzi funcționează pentru mine.

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

Pentru a verifica/trage după executarea acestor comenzi

git pull origin master

Am încercat multe, dar în cele din urmă am avut succes cu aceste comenzi.

person Vishesh Chandra    schedule 20.03.2014
comment
git branch -D master șterge ramura. deci fii atent cu el. Prefer să folosesc git checkout origin/master -b ‹new branch name› care creează o nouă ramură cu un nou nume și ai nevoie de 3,4 linii. De asemenea, se recomandă să utilizați și git clean -f. - person Chand Priyankara; 05.04.2014

Cerințe:

  1. Urmăriți modificările locale, astfel încât nimeni de aici să nu le piardă vreodată.
  2. Faceți ca depozitul local să se potrivească cu depozitul de origine la distanță.

Soluţie:

  1. Ascundeți modificările locale.
  2. Preluare cu o curățare de fișiere și directoare ignorând .gitignore și hard reset la origine.

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard origin/master
    
person vezenkov    schedule 01.09.2015

Am citit toate răspunsurile, dar am căutat o singură comandă pentru a face acest lucru. Iată ce am făcut. S-a adăugat un alias git la .gitconfig

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

Rulați comanda ca

git fp origin master

echivalentă cu

git fetch origin master
git reset --hard origin/master
person Venkat Kotra    schedule 08.07.2016

Acest lucru a funcționat pentru mine foarte bine!

git fetch --all
git reset --hard origin/master
person Shoaib Khalil    schedule 05.02.2021
comment
Cum este aceasta diferită de unul sau mai multe dintre cele 58 de răspunsuri anterioare (nu o întrebare retorică)? De exemplu, 红日初升 răspunsul (postat chiar înainte de al tău) pare să fie foarte asemănător. - person Peter Mortensen; 24.06.2021
comment
@PeterMortensen Ei bine, răspunsul meu este doar să dau confirmarea acelei soluții speciale care a funcționat foarte bine pentru mine, așa cum am menționat mai sus, nu pentru a adăuga un alt răspuns. - person Shoaib Khalil; 26.06.2021

Aceasta este cea mai bună practică pentru anularea modificărilor:

  • git commit Acordați modificările în etape, astfel încât acestea să fie salvate în reflog (vezi mai jos)
  • git fetch Preluați cele mai recente modificări în amonte
  • git reset --hard origin/master Resetare completă la ramura principală de origine

reflog înregistrează ramurile și alte referințe actualizate în depozitul local. Sau, pur și simplu, reflogul este istoria modificărilor dvs..

Deci este întotdeauna o practică grozavă să te angajezi. Commit-urile sunt atașate la reflog, ceea ce vă asigură că veți avea întotdeauna o modalitate de a prelua codul șters.

person Jordan Georgiev    schedule 12.08.2016

Nu folosiți git reset --hard. Acest lucru le va șterge modificările care pot fi complet nedorite. In schimb:

git pull
git reset origin/master
git checkout <file1> <file2> ...

Desigur, puteți folosi git fetch în loc de git pull, deoarece în mod clar nu se va îmbina, dar dacă de obicei trageți, este logic să continuați să trageți aici.

Deci, ceea ce se întâmplă aici este că git pull îți actualizează originea/referința principală; git reset îți actualizează referința la sucursala locală pentru a fi identică cu originea/masterul, fără a actualiza niciun fișier, astfel încât starea ta de check-out rămâne neschimbată; apoi git checkout reduce fișierele la starea indexului de sucursală locală după cum este necesar. În cazurile în care exact același fișier a fost adăugat pe live și pe master upstream, indexul se potrivește deja cu fișierul după resetare, așa că în cazul obișnuit nu trebuie să faceți deloc git checkout.

Dacă ramura din amonte conține și comite-uri pe care doriți să le aplicați automat, puteți urma o variație subtilă a procesului:

git pull
git merge <commit before problem commit>
git reset <problem commit>
git checkout <file1> <file2> ...
git pull
person Jim Driscoll    schedule 28.11.2017

Poti incerca:

$ git fetch --all
$ git reset --hard origin/master 
$ git pull
person 红日初升    schedule 17.01.2021

Am folosit această comandă pentru a scăpa de fișierele locale care mă împiedică să fac un pull/merge. Dar fii atent! Mai întâi rulați git merge … pentru a vedea dacă există doar acele fișiere pe care doriți cu adevărat să le eliminați.

git merge origin/master 2>&1 >/dev/null | grep ^[[:space:]] | sed s/^[[:space:]]//g | xargs -L1 rm
  • git merge listează printre altele toate acele fișiere. Ele sunt predate de un spațiu alb.
  • 2>&1 >/dev/null redirecționează ieșirea de eroare la cea standard, astfel încât să fie preluată de grep.
  • grep ^[[:space:]] filtrează numai liniile cu nume de fișiere.
  • sed s/^[[:space:]]//g decupează spațiul alb de la început.
  • xargs -L1 rm apelează rm pe fiecare dintre acele fișiere, ștergându-le.

Manipulați cu grijă: indiferent de ieșirile git merge, rm va fi apelat pentru fiecare linie care începe cu un spațiu alb.

person Glutexo    schedule 07.10.2015

Încercam să folosesc ramura Material2 pe Angular2-Webpack-Starter și am avut o distracție. Acesta era singurul mod în care puteam descărca și folosi acea ramură.

git clone --depth 1 https://github.com/angularclass/angular2-webpack-starter.git

cd angular2-webpack-starter/

git checkout -b material2

Deschideți folderul proiectului și ștergeți toate fișierele și folderele care nu sunt ascunse. Lasă toate cele ascunse.

git add .

git commit -m "pokemon go"

git reset --hard

git pull origin material2

(Când apare editorul, apăsați „:wq”, apoi apăsați pe Enter)

Acum ești gata.

person Post Impatica    schedule 27.07.2016

Dacă doriți să resetați la ramura de urmărire la distanță într-un mod generic, utilizați:

git fetch
git reset --keep origin/$(git rev-parse --abbrev-ref HEAD)

Dacă doriți să resetați și modificările locale:

git fetch
git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)
person warch    schedule 25.05.2018
comment
Dacă folosiți frecvent acest lucru, adăugați o comandă rapidă bash alias gplf='git fetch && echo "HEAD was at $(git rev-parse --short HEAD)" && git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)' - person Paul Odeon; 13.11.2019
comment
Sclipitor. Mulțumiri! Oamenii nu iau în considerare scripturile automate atunci când răspund. Acest lucru este foarte elegant atunci când pur și simplu nu poți transmite numele sucursalei. - person Zeno Popovici; 24.09.2020

Pe Windows, faceți această singură comandă:

git fetch --all & git reset --hard origin/master
person Luca C.    schedule 10.04.2018
comment
De ce ar fi diferit de pe, de exemplu, Linux? Ce implementare/pachet special de git folosiți? Și/sau care mediu (de exemplu, MinGW)? - person Peter Mortensen; 27.04.2018
comment
Nu sunt sigur, doar sigur că funcționează în Windows. În Linux care este separatorul pentru a concatena două comenzi într-o singură linie? (nu conducta, pur si simplu concateneaza fara a trece iesirea) - person Luca C.; 29.04.2018

Puteți ignora acel fișier cu un fișier din folderul de bază al proiectului:

.gitignore

public/images/*

Apoi trageți modificările și apoi eliminați acea linie din fișierul dvs. gitignore.

person DanielG    schedule 09.11.2010

1: Resetați la o comitere anterioară

git reset --hard HEAD

2: Ștergeți fișierele neurmărite

git clean -f

3: Trageți commit-urile

git pull

Surse:

person abhijithvijayan    schedule 10.11.2018

În ciuda faptului că această întrebare are deja multe răspunsuri, întrebarea inițială este de a rezolva această întrebare

eroare: fișierul arbore de lucru neurmărit „public/images/icon.gif” ar fi suprascris prin îmbinare

Deoarece fișierele binare nu pot fi îmbinate, un răspuns simplu este

git checkout public/images/icon.gif

Cu asta, fișierul va recupera starea anterioară pe care o avea în această ramură.

De obicei fac git stash dacă nu vreau să-mi pierd modificările sau ceva de genul git checkout . dacă nu-mi pasă de fișierele modificate local. IMO mult mai simplu decât reset --hard, clean... și toate aceste lucruri mai potrivite pentru a părăsi ramura ca la distanță, inclusiv comiteri, fișiere neurmărite, mai degrabă decât rezolvarea unui fișier modificat local.

person guillem    schedule 24.07.2020

Odată ce faceți git pull, veți obține o listă de fișiere care nu se potrivesc. Dacă numărul de fișiere nu este foarte mare, atunci puteți verifica acele fișiere, această acțiune le va suprascrie.

git checkout -- ‹nume fișier›

De obicei o fac dacă, pentru verificare rapidă, modific fișierele locale de pe server (niciun motiv recomandat și probabil în spatele acestei probleme :D), verific fișierele modificate după ce găsesc soluția.

person Ashutosh Nigam    schedule 12.07.2020

Am făcut asta ca să funcționeze:

Pe computerul unde am creat noua ramură:

git push --all

Pe computerul pe care am vrut să arate noua ramură:

git fetch --all
person dadde    schedule 30.08.2019

Pasul 1. (opțional)
Din rădăcina depozitului local, salvați o copie de rezervă și golește folderul curent:

mkdir -p ../<branch>-bkp && mv --backup=t * ../<branch>-bkp

Pasul 2. Descărcați toate fișierele și folderele ramurii din depozitul de la distanță:

git checkout <branch> && git add -A . && git reset --hard origin/<branch> && git pull

unde ar trebui să înlocuiți <branch> cu numele ramurii pe care doriți să o suprascrieți.

Comentarii:

  • Poate preferați să faceți backup manual și să eliminați fișierele și folderele curente în loc de pasul 1.
    De fapt, vă recomand > făcând acest lucru cu un handler de fișiere în interfața grafică a sistemului dvs. de operare.
  • Dacă omiteți pasul 1, aveți grijă: veți pierde toată munca din depozitul local!
  • Important: dacă omiteți git pull în pasul 2,
    riști să nu obții cea mai recentă versiune de la depozitul de la distanță!
    Conform celei de-a doua referințe de mai jos, git reset --hard va
    reseta zona de pregătire și directorul de lucru pentru a se potrivi cu cea mai recentă comitere .
    Experiența mea contrazice această afirmație!
  • Dacă rulați git reset --hard origin/<branch_to_overwrite> fără să ștergeți mai întâi toate fișierele și folderele din depozitul local, aveți grijă că orice fișiere nedorite care se află încă prin preajmă se pot strecura în depozitul de la distanță la un git push ulterior, chiar dacă aceasta nu a fost intenția dvs.
    git add -A . suplimentar din pasul 2 previne acest lucru dacă alegeți să omiteți pasul 1.

Referințe:
https://gitforwindows.org/
https://www.atlassian.com/git/tutorials/undoing-changes/git-reset
https://www.atlassian.com/git/tutorials/rewriting-history/git-reflog

person Henke    schedule 10.12.2020

Deoarece am adesea nevoie de o modalitate rapidă de a reseta ramura curentă pe Windows prin promptul de comandă, iată o modalitate rapidă:

for /f "tokens=1* delims= " %a in ('git branch^|findstr /b "*"') do @git reset --hard origin/%b
person npocmaka    schedule 14.04.2020

Am încercat majoritatea a ceea ce am putut găsi aici, niciunul nu a funcționat în cazul meu.

Ceea ce a funcționat a fost git merge -X theirs

person Sxilderik    schedule 01.12.2020

Ați putea încerca git pull --force sau poate să vă ascundeți comitările folosind git stash și apoi rulând git pull.

person Ultan Kearns    schedule 22.08.2019
comment
Acest lucru nu funcționează. fatal: refusing to merge unrelated histories - person Wyck; 23.08.2019
comment
Nu: error: The following untracked working tree files would be overwritten by merge: - nu-mi pasă de acele fișiere. Dacă ar fi doar două sau trei, le-aș șterge. Dar sunt atât de multe. - person Martin; 20.08.2020
comment
Acest lucru a funcționat frumos pentru mine! Ce se întâmplă? - person EyesBear; 05.07.2021

Cred că poți forța și prin git push -f / git push --force

person bombom    schedule 19.10.2020
comment
întrebarea este despre tragerea, nu împingerea. - person Daemon Painter; 19.10.2020