border=0

"37.235.250.197 - 37.235.250.197"

Hoe maak je git pull overschrijven lokale bestanden?

Hoe kan ik met geweld lokale bestanden overschrijven in git pull ?

Het script is als volgt:

  • Teamlid wijzigt sjablonen voor de site waaraan we werken
  • Ze voegen enkele afbeeldingen toe aan de afbeeldingencatalogus (maar vergeten ze toe te voegen onder controle van de broncode)
  • Ze sturen afbeeldingen per post, later, naar mij
  • Ik voeg afbeeldingen toe onder beheer van de broncode en plaats deze samen met andere wijzigingen op GitHub.
  • Ze kunnen geen updates van GitHub ontvangen omdat Git hun bestanden niet wil overschrijven.

Dit is de fout die ik krijg:

error: niet-werkend boomstructuurbestand 'public / images / icon.gif' wordt overschreven door samen te voegen

Hoe maak je git ze overschrijven? Deze man is een ontwerper. Meestal lost ik alle conflicten handmatig op, dus de nieuwste versie is op de server geïnstalleerd, die ze alleen op hun computer moeten bijwerken.

5705
14 июля '09 в 17:58 2009-07-14 17:58 gevraagd door Jakub Troszok op 14 juli '09 om 17:58 2009-07-14 17:58
@ 39 antwoorden
  • 1
  • 2

Be>--hard optie of zonder de --hard alle lokale commits die niet zijn verzonden verloren gaan. [*]

Als u bestanden hebt die niet door Git worden bijgehouden (bijvoorbeeld gedownloade gebruikerscontent), worden deze bestanden niet beïnvloed.


Ik denk dat dit de juiste manier is:

 git fetch --all 

Dan heb je twee opties:

 git reset --hard origin/master 

OF Als u zich in een andere branche bevindt:

 git reset --hard origin/<branch_name> 

uitleg:

git fetch downloadt de nieuwste gegevens van een externe computer, zonder te proberen iets samen te voegen of te verplaatsen.

Vervolgens git reset Git opnieuw de hoofdtak naar wat u zojuist hebt ontvangen. De optie --hard wijzigt alle bestanden in uw werkboom op basis van de bestanden in origin/master


Huidige lokale commits behouden

[*] : Het is vermeldenswaard dat u huidige lokale commits kunt opslaan door een filiaal van master om te resetten:

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

Hierna worden alle oude commits opgeslagen in new-branch-to-save-current-commits .

In afwachting van wijzigingen

Niet-gecommitteerde wijzigingen (zelfs gefaseerd) gaan echter verloren. Zorg ervoor dat u alles wat u nodig hebt verbergt en doorgeeft. Hiertoe kunt u het volgende doen:

 git stash 

En vervolgens deze niet-gecommitteerde wijzigingen opnieuw toepassen:

 git stash pop 
7980
17 янв. het antwoord is RNA 17 jan. 2012-01-17 03:02 '12 om 3:02 2012-01-17 03:02

Probeer het volgende:

 git reset --hard HEAD git pull 

Hij moet doen wat je wilt.

798
09 мая '10 в 22:45 2010-05-09 22:45 heeft gereageerd op Travis Reeder 09 mei, '10 om 10:45 PM 2010-05-09 22:45

LET OP: git clean verwijdert al uw niet-traceerbare bestanden / mappen en kan niet ongedaan worden gemaakt.


Soms is alleen clean -f niet nuttig. Als u geen getraceerde mappen hebt, is de optie -d ook nodig:

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

LET OP: git clean verwijdert al uw niet-traceerbare bestanden / mappen en kan niet ongedaan worden gemaakt.

Probeer -n -n ( --dry-run ) te gebruiken. Dit laat zien wat er wordt verwijderd zonder daadwerkelijk iets te verwijderen:

 git clean -n -f -d 

Voorbeelduitvoer:

 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 het antwoord wordt gegeven door David Avsajanishvili 19 maart '11 om 12:10 2011-03-19 12:10

Net als de Egel vind ik de antwoorden vreselijk. Maar hoewel het antwoord van Hedgehog misschien beter is, vind ik het niet zo elegant als het kan zijn. De manier waarop ik dit heb gevonden is om "sampling" en "merging" te gebruiken met een specifieke strategie. Dit moet ervoor zorgen dat uw lokale wijzigingen worden opgeslagen totdat ze een van de bestanden zijn die u probeert te overschrijven.

Leg eerst de wijzigingen vast.

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

Haal de wijzigingen vervolgens op en herschrijf als er een conflict is.

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

"- X" is de naam van de optie en "theirs" is de waarde voor deze optie. U geeft de voorkeur aan "uw" wijzigingen in plaats van "uw" wijzigingen als er een conflict is.

347
11 апр. Antwoord gegeven door Richard Kersey 11 april 2012-04-11 23:13 '12 om 11:13 PM 2012-04-11 23:13

In plaats daarvan:

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

Ik zou u adviseren om het volgende te doen:

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

U hoeft niet alle consoles en takken te nemen, als u naar de reset gaat in de oorsprong / master van de tak aan de rechterkant?

248
26 апр. Johanneke gepost op 26 april 2013-04-26 16:48 '13 om 16:48 2013-04-26 16:48

Het lijkt erop dat dit het beste is om te doen:

 git clean 

Om alle ongebruikte bestanden te verwijderen en verder te gaan met normale git pull ...

125
14 июля '09 в 18:16 2009-07-14 18:16 het antwoord wordt gegeven door Jakub Troszok op 14 juli '09 om 18:16 uur 2009-07-14 18:16

Let op, dit zal uw bestanden permanent verwijderen als u / * directory-vermeldingen in uw gitignore-bestand hebt.

Sommige antwoorden lijken vreselijk. Verschrikkelijk wat betreft wat er met @Lauri gebeurde, naar aanleiding van de suggestie van David Avsadjanishvili.

Liever (git> v1.7.6):

 git stash --include-untracked git pull 

U kunt de geschiedeniscache later wissen.

Handmatig, één voor één:

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

Wreed, alles tegelijk:

 $ git stash clear 

Natuurlijk, als je terug wilt naar wat je verborgen hebt:

 $ git stash list ... $ git stash apply stash@{5} 
102
12 февр. Het antwoord wordt door Hedgehog gegeven op 12 februari. 2012-02-12 02:00 '12 om 2:00 2012-02-12 02:00

Mogelijk vindt u deze opdracht nuttig voor het verwijderen van lokale wijzigingen:

 git checkout <your-branch> -f 

En dan de opschoning (verwijdert de onbewerkte bestanden uit de werkboom):

 git clean -f 

Als u onnodige mappen naast bestanden zonder sporen wilt verwijderen:

 git clean -fd 
88
05 авг. het antwoord wordt gegeven door Vishal 05 aug. 2010-08-05 21:06 '10 om 21:06 2010-08-05 21:06

Probeer dit in plaats van samenvoegen met git pull :

git fetch --all

gevolgd door:

git reset --hard origin/master .

81
22 нояб. Het antwoord wordt gegeven door Lloyd Moore op 22 november. 2012-11-22 13:56 '12 om 13:56 uur 2012-11-22 13:56

Het enige dat werkte voor mij was:

 git reset --hard HEAD~5 

Dit geeft je vijf commits en dan

 git pull 

Ik vond dat door te kijken hoe git merge te annuleren .

54
06 мая '11 в 0:53 2011-05-06 00:53 het antwoord wordt gegeven door Chris BIllante mei 06 '11 om 0:53 2011-05-06 00:53

Het probleem met al deze oplossingen is dat ze te complex zijn, of een nog ernstiger probleem is dat ze alle onbewerkte bestanden van de webserver verwijderen, wat we niet willen omdat de configuratiebestanden die op de server staan ​​altijd nodig zijn en niet in de git-repository.

Hier is de schoonste oplossing die we gebruiken:

51
06 нояб. Antwoord gegeven door Strahinja Kustudic 06 november 2012-11-06 02:32 '12 om 2:32 2012-11-06 02:32

Ik heb hetzelfde probleem. Niemand gaf me die oplossing, maar het werkte voor mij.

Ik besloot dit:

  1. Verwijder alle bestanden. Laat alleen de .git map staan.
  2. git reset --hard HEAD
  3. git pull
  4. git push

Nu werkt het.

38
13 янв. Antwoord gegeven door John John Pichler op 13 januari 2011-01-13 02:58 '11 om 2:58 januari 2011-13-13 02:58

Probeer eerst de standaardmanier:

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

Waarschuwing : de bovenstaande opdrachten kunnen leiden tot verlies van gegevens / bestanden, alleen als ze niet zijn opgelost! Als u niet zeker bent, maakt u eerst een back-up van uw volledige repositorymap.

Trek het dan opnieuw.

Als het bovenstaande niet helpt en u uw niet-gevonden bestanden / mappen niet nodig hebt (maak gewoon eerst een back-up, voor het geval dat), probeer dan de volgende eenvoudige stappen:

 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 

Dit zal alle git-bestanden verwijderen (behalve .git/ dir, waar je alle commits hebt) en het opnieuw uitpakken.


Waarom git reset HEAD --hard mogelijk niet in sommige gevallen?

  1. Aangepaste regels in .gitattributes file

    De aanwezigheid van de regel eol eol=lf in .gitattributes kan ertoe leiden dat git enkele bestandswijzigingen wijzigt en in sommige tekstbestanden de eindes van de CRLF-regels naar LF converteert.

    Als dit het geval is, moet je deze CRLF / LF-wijzigingen vastleggen (door ze in git status ) of probeer: git config core.autcrlf false om ze tijdelijk te negeren.

  2. Bestandssysteem incompatibiliteit

    Wanneer u een bestandssysteem gebruikt dat geen toestandsattributen ondersteunt. U hebt bijvoorbeeld twee repositories, één voor Linux / Mac ( ext3 / hfs+ ) en de andere voor op FAT32 / NTFS gebaseerde bestandssystemen.

    Zoals je hebt gemerkt, zijn er twee verschillende soorten bestandssystemen, dus een die geen Unix-machtigingen ondersteunt, kan in principe geen machtigingen voor bestanden op een systeem opnieuw instellen die dergelijke machtigingen niet ondersteunen, dus hoe --hard je ook probeert, git detecteert altijd enkele "wijzigingen".

33
26 окт. het antwoord wordt kenorb 26 okt gegeven. 2012-10-26 12:17 '12 om 12:17 uur 2012-10-26 12:17

bonus:

Over pull / fetch / merge in eerdere antwoorden gesproken, ik wil graag een interessante en productieve truc delen:

git pull --rebase

Dit team is het meest nuttige team in mijn leven in Git, dat veel tijd heeft bespaard.

Voordat je je nieuwe commit naar de server stuurt, probeer je deze opdracht en synchroniseert het automatisch de laatste server changes (met fetch + merge) en zet je commit in het Git-logboek. U hoeft zich geen zorgen te maken over het handmatig extraheren / samenvoegen.

Zoek naar onderdelen in Wat maakt "git pull --rebase"? .

31
23 дек. Het antwoord wordt gegeven door Sazzad Hissain Khan op 23 december. 2015-12-23 18:41 '15 om 18:41 2015-12-23 18:41

Ik vat de andere antwoorden samen. Je kunt git pull uitvoeren zonder fouten:

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

Waarschuwing. Dit script is erg krachtig, dus je kunt je wijzigingen kwijtraken.

27
07 авг. het antwoord wordt gegeven door Robert Moon 07 aug. 2015-08-07 06:03 '15 om 6:03 2015-08-07 06:03

Ik had een soortgelijk probleem. Ik moest dit doen:

 git reset --hard HEAD git clean -f git pull 
27
14 янв. Antwoord wordt gegeven door Ryan Jan. 14 2011-01-14 18:18 '11 om 18:18 2011-01-14 18:18

Op basis van mijn eigen gelijkaardige ervaringen, is de oplossing aangeboden door Strahinja Kustudic hierboven veruit de beste. Zoals anderen hebben opgemerkt, zal het uitvoeren van een harde reset alle niet-geteste bestanden verwijderen, waaronder mogelijk veel dingen die u niet wilt verwijderen, zoals configuratiebestanden. Veiliger is dat u alleen de bestanden hoeft te verwijderen die moeten worden toegevoegd en bovendien wilt u waarschijnlijk ook controleren op lokaal gemodificeerde bestanden die moeten worden bijgewerkt.

Dat is waarom ik het Kustudic-script heb bijgewerkt om precies dat te doen. Ik heb ook een typfout gemaakt (ontbreekt in het origineel).

26
27 февр. Antwoord gegeven door Rolf Kaiser op 27 februari 2013-02-27 17:43 '13 om 17:43 2013-02-27 17:43

Ik geloof dat er twee mogelijke oorzaken van het conflict zijn die afzonderlijk moeten worden opgelost, en voor zover ik weet, heeft geen van de bovenstaande antwoorden betrekking op beide:

  • Lokale bestanden die niet worden gecontroleerd, moeten handmatig (veiliger) worden verwijderd of, zoals in andere antwoorden wordt gesuggereerd, om git clean -f -d

  • Lokale commits die zich niet in de remote branch bevinden, moeten ook worden verwijderd. IMO is de gemakkelijkste manier om dit te bereiken: git reset --hard origin/master (vervang de "master" door elke branch waar je aan werkt, en voer eerst de start van git fetch origin )

23
12 дек. Het antwoord wordt gegeven op 12 dec. 2011-12-12 22:54 '11 om 10:54 uur. 2011-12-12 22:54

Een eenvoudigere manier:

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

Dit zal je lokale git-bestand overschrijven.

20
05 мая '15 в 11:03 2015-05-05 11:03 het antwoord wordt gegeven maximus 69 05 mei '15 om 11:03 2015-05-05 11:03

Het lijkt erop dat de meeste van de antwoorden hier zijn gericht op de hoofdtak; Soms zijn er echter gevallen waarin ik op twee verschillende plaatsen aan dezelfde tak van functies werk, en ik wil dat een van hen in de andere wordt weerspiegeld, zonder veel hop door hoepels.

Op basis van de combinatie van de RNA- respons en de antwoord-torek op een vergelijkbare vraag , kwam ik met een uitstekende baan:

 git fetch git reset --hard @{u} 

Voer het uit vanuit de branch en het zal alleen je lokale branch resetten naar de upstream-versie.

Dit kan handig in de git ( git forcepull ) git forcepull :

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

Of in het .gitconfig bestand:

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

Veel plezier!

19
25 февр. antwoord gegeven door JacobEvelyn 25 febr 2014-02-25 20:19 '14 om 20:19 2014-02-25 20:19

Ik had hetzelfde probleem en om de een of andere reden zelfs git clean -f -d zou dat niet doen. Dat is waarom: om wat voor reden dan ook, als je bestand wordt genegeerd door Git (via het .gitignore-item, denk ik), maakt het zich nog steeds zorgen over het overschrijven en vervolgens verbreken, maar het net zal het niet verwijderen, tenzij je het toevoegt -x .

19
03 авг. Het antwoord wordt gegeven door Tierlieb 03 aug. 2011-08-03 12:23 '11 om 12:23 de minuut van 2011-08-03 12:23

Ik heb het zelf besloten:

18
03 дек. Het antwoord wordt gegeven door Simon B. 03 dec. 2010-12-03 18:00 '10 om 18:00 2010-12-03 18:00

Ik heb een vreemde situatie dat ik niet git clean hoefde te werken en ook niet heb git reset . Ik moet het conflicterende bestand uit de git index met behulp van het volgende script voor elk niet-gevonden bestand:

 git rm [file] 

Dan kan ik prima presteren.

17
19 сент. Antwoord gegeven door Chen Zhang 19 september 2011-09-19 17:18 '11 om 17:18. 2011-09-19 17:18

Ik ken een veel eenvoudigere en minder pijnlijke methode:

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

Het is!

16
05 сент. het antwoord is gegeven ddmytrenko 05 sep . 2015-09-05 21:23 '15 om 21:23 2015-09-05 21:23

Deze vier teams werken voor mij.

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

Om te controleren / uit te trekken na het uitvoeren van deze opdrachten

 git pull origin master 

Ik heb veel geprobeerd, maar heb uiteindelijk succes behaald in deze teams.

13
20 марта '14 в 7:24 2014-03-20 07:24 het antwoord wordt gegeven door vishesh chandra 20 maart, '14 om 7:24, 2014-03-20 07:24

Ondanks de oorspronkelijke vraag kunnen de beste antwoorden problemen veroorzaken voor mensen met een soortgelijk probleem, maar ze willen hun lokale bestanden niet kwijtraken. Zie bijvoorbeeld de opmerkingen van Al-Punk en crizCraig.

De volgende versie repareert uw lokale wijzigingen in de tijdtak ( tmp ), controleert de bronnentak (die, naar ik aanneem, master ), en voegt de updates samen. Je kunt dit doen met stash , maar ik vond het meestal gemakkelijker om alleen de branch / merge-aanpak te gebruiken.

 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 

waar we aannemen dat een andere repository origin master .

12
22 окт. Antwoord wordt gegeven door Snowcrash op 22 oktober. 2014-10-22 20:31 '14 om 20:31 2014-10-22 20:31

Gewoon doen

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

Op deze manier vermijdt u alle ongewenste bijwerkingen, zoals het verwijderen van bestanden of mappen die u wilt behouden, enz.

12
19 окт. antwoord gegeven door user2696128 19 oktober 2015-10-19 12:54 '15 om 12:54 2015-10-19 12:54

Zet de aanwijzer op nul en ga naar de origin/master , maar reset de werkboom niet:

 git reset origin/master 
11
15 февр. Het antwoord is gegeven door user811773 op 15 feb. 2013-02-15 16:41 '13 om 16:41 uur 2013-02-15 16:41

eisen:

  • Houd lokale wijzigingen bij, zodat niemand ze verliest.
  • Maak de lokale repository compatibel met de externe bronrepository.

oplossing:

  • Verberg lokale wijzigingen.
  • Krijg met schone bestanden en negeren .gitignore en harde reset naar oorsprong .

     git stash --include-untracked git fetch --all git clean -fdx git reset --hard origin/master 
9
02 сент. antwoord gegeven vezenkov 02 sep 2015-09-02 02:00 '15 om 2:00 2015-09-02 02:00

Ik las alle antwoorden, maar ik was op zoek naar één commando hiervoor. Dat is wat ik deed. Git-alias toegevoegd aan .gitconfig

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

Voer het commando uit

 git fp origin master 

is gelijk aan

 git fetch origin master git reset --hard origin/master 
9
08 июля '16 в 16:11 2016-07-08 16:11 Het antwoord wordt gegeven door Venkat Kotra 08 juli '16 om 16:11 2016-07-08 16:11
  • 1
  • 2