Vraag Hoe forceer ik "git pull" om lokale bestanden te overschrijven?


Hoe dwing ik een overschrijving van lokale bestanden op een git pull?

Het scenario volgt:

  • Een teamlid past de sjablonen aan voor een website waaraan we werken
  • Ze voegen enkele afbeeldingen toe aan de afbeeldingenmap (maar vergeten ze toe te voegen onder bronbeheer)
  • Ze sturen de afbeeldingen per post, later naar mij
  • Ik voeg de afbeeldingen toe onder het bronbeheer en duw ze naar GitHub samen met andere wijzigingen
  • Ze kunnen geen updates ophalen van GitHub omdat Git hun bestanden niet wil overschrijven.

Dit is de fout die ik krijg:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

Hoe dwing ik Git om ze te overschrijven? De persoon is een ontwerper - meestal los ik alle conflicten met de hand op, dus de server heeft de meest recente versie die ze alleen op hun computer moeten bijwerken.


5198
2017-07-14 14:58


oorsprong


antwoorden:


Belangrijk: als u lokale wijzigingen heeft doorgevoerd, gaan deze verloren. Met of zonder --hard optie, alle lokale commits die niet zijn gepusht zullen verloren gaan.[*]

Als je bestanden hebt die dat zijn niet gevolgd door Git (bijvoorbeeld geüploade 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 op een andere tak bent:

git reset --hard origin/<branch_name>

Uitleg:

git fetch downloadt het laatste van de afstandsbediening zonder iets te proberen samen te voegen of te rebasen.

Dan de git reset stelt de hoofdtak opnieuw in op wat u zojuist hebt opgehaald. De --hard optie verandert alle bestanden in uw werkboom om overeen te komen met de bestanden in origin/master


Huidige lokale commits behouden

[*]: Het is vermeldenswaard dat het mogelijk is om de huidige lokale commits te behouden door een filiaal van te maken master voor het 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 bewaard new-branch-to-save-current-commits.

Niet-gecommitteerde wijzigingen

Ongecommitteerde wijzigingen zullen echter (zelfs geënsceneerd) verloren gaan. Zorg ervoor dat je alles opbergt en vastlegt wat je nodig hebt. Daarvoor kunt u het volgende uitvoeren:

git stash

En dan om deze niet-gecommitteerde wijzigingen opnieuw toe te passen:

git stash pop

7275
2018-01-17 00:02



Probeer dit:

git reset --hard HEAD
git pull

Het zou moeten doen wat je wilt.


761
2018-05-09 19:45



WAARSCHUWING: git clean verwijdert al uw niet-gevonden bestanden / mappen en kan niet ongedaan worden gemaakt.


Soms gewoon clean -f helpt niet. In het geval dat u niet-traceerde DIRECTORIES hebt, heeft -d optie ook nodig:

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

WAARSCHUWING: git clean verwijdert al uw niet-gevonden bestanden / mappen en kan niet ongedaan worden gemaakt.


381
2018-03-19 09:10



Net als Hedgehog vind ik de antwoorden vreselijk. Maar hoewel het antwoord van Hedgehog misschien beter is, vind ik het niet zo elegant als het zou kunnen zijn. De manier waarop ik dit heb gedaan is door gebruik te maken van "fetch" en "merge" met een gedefinieerde strategie. Welke het zou moeten maken zodat uw lokale veranderingen worden bewaard zolang ze niet een van de bestanden zijn waarmee u een overschrijving probeert te forceren.

Doe eerst een commit van je wijzigingen

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

Haal de wijzigingen vervolgens op en overschrijf als er een conflict is

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

"-X" is een optienaam en "theirs" is de waarde voor die optie. U kiest ervoor om 'hun' wijzigingen te gebruiken in plaats van 'uw' wijzigingen als er een conflict is.


334
2018-04-11 20:13



In plaats van te doen:

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

Ik zou adviseren om het volgende te doen:

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

Het is niet nodig om alle afstandsbedieningen en vertakkingen op te halen als je je wilt resetten naar de oorsprong / master branch, toch?


237
2018-04-26 13:48



Het lijkt erop dat de beste manier is om eerst te doen:

git clean

Om alle niet-gevonden bestanden te verwijderen en verder te gaan met het gebruikelijke git pull...


121
2017-07-14 15:16



Als u dit doet, worden uw bestanden permanent verwijderd als u map- / * -items in uw gitignore-bestand hebt.

Sommige antwoorden lijken vreselijk. Verschrikkelijk in de zin van wat er met @Lauri is gebeurd door de suggestie van David Avsajanishvili te volgen.

Integendeel (git> v1.7.6):

git stash --include-untracked
git pull

Later kunt u de geschiedenis van de stash opruimen.

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}

Brutaal, alles tegelijk:

$ git stash clear

Natuurlijk als je terug wilt gaan naar wat je hebt opgeslagen:

$ git stash list
...
$ git stash apply stash@{5}

97
2018-02-11 23:00



Misschien vindt u dit commando nuttig om lokale wijzigingen weg te gooien:

git checkout <your-branch> -f

En dan een opschoning (verwijdert niet-gevonden bestanden uit de werkboom):

git clean -f

Als u niet-traceerde mappen naast niet-geregistreerde bestanden wilt verwijderen:

git clean -fd

86
2017-08-05 18:06



In plaats van samenvoegen met git pull, probeer dit:

git fetch --all

gevolgd door:

git reset --hard origin/master.


72
2017-11-22 10:56