Op mijn branch had ik wat bestanden in .gitignore
Op een andere branch zijn die bestanden niet.
Ik wil de verschillende vertakkingen samenvoegen met de mijne, en het kan me niet schelen of die bestanden niet langer worden genegeerd of niet.
Helaas krijg ik dit:
De volgende niet-getrackte werkboombestanden zouden worden overschreven door samenvoegen
Hoe zou ik mijn pull-commando kunnen wijzigen om die bestanden te overschrijven, zonder dat ik die bestanden zelf hoef te zoeken, verplaatsen of verwijderen?
Antwoord 1, autoriteit 100%
Het probleem is dat je de bestanden niet lokaal bijhoudt, maar identieke bestanden worden op afstand gevolgd, dus om te “trekken” zou je systeem gedwongen worden om de lokale bestanden te overschrijven die niet versiebeheerd zijn.
Probeer hardlopen
git add *
git stash
git pull
Hiermee worden alle bestanden bijgehouden, worden al uw lokale wijzigingen aan die bestanden verwijderd en worden de bestanden vervolgens van de server opgehaald.
Antwoord 2, autoriteit 26%
U kunt het commando proberen om de niet-getrackte bestanden van de lokale te wissen
Git 2.11 en nieuwere versies:
git clean -d -f .
Oudere versies van Git:
git clean -d -f ""
Waar -d
kan worden vervangen door het volgende:
-
-x
genegeerde bestanden worden ook verwijderd evenals bestanden die onbekend zijn bij Git. -
-d
verwijder niet-bijgehouden mappen naast niet-bijgehouden bestanden. -
-f
is vereist om het te forceren.
Hier is de link die kan wees ook behulpzaam.
Antwoord 3, autoriteit 24%
De enige commando’s die voor mij werkten waren:
(Let op: hiermee worden alle lokale bestanden verwijderd)
git fetch --all
git reset --hard origin/{{your branch name}}
Antwoord 4, autoriteit 8%
Hoe git merge
te gebruiken terwijl niet-getrackte bestanden worden overschreven
De bestanden van belang (FOI) die we gaan verwijderen:
- bestaan in de donortak,
- bestaan niet in de ontvangende tak,
- en de samenvoeging blokkeren omdat ze aanwezig en niet bijgehouden worden in je werkmap.
git checkout -f donor-branch # replace FOI with tracked `donor` versions
git checkout receiving-branch # FOI are not in `receiving`, so they disapppear
git merge donor-branch # now the merge works
Hoe git pull
te gebruiken terwijl niet-getrackte bestanden worden overschreven
De bestanden van belang (FOI) die we gaan verwijderen:
- bestaan in de upstream-repository,
- bestaan niet in de huidige tak,
- en de samenvoeging blokkeren omdat ze aanwezig en niet bijgehouden worden in je werkmap.
pull = fetch + merge
, dus we doen git fetch
gevolgd door de git checkout -f, git checkout, git merge
truc hierboven .
git fetch origin # fetch remote commits
git checkout -f origin/mybranch # replace FOI with tracked upstream versions
git checkout mybranch # FOI are not in mybranch, so they disapppear
git merge origin/mybranch # Now the merge works. We have pulled by fetching + merging.
Gedetailleerde uitleg
git merge -f
bestaat niet, maar git checkout -f
wel.
We zullen git checkout -f
+ git checkout
gebruiken om de bestanden van belang te verwijderen (zie hierboven), en dan kan het samenvoegen normaal doorgaan.
Stap 1. Deze stap vervangt met geweld niet-gevolgde FOI door getraceerde versies van de donortak (het controleert ook de donortak en werkt de rest van de werkmap bij).
git checkout -f donor-branch
Stap 2. Deze stap verwijdert de FOI omdat ze worden gevolgd in onze huidige (donor)tak en afwezig zijn in de receiving-branch
waarnaar we overschakelen.
git checkout receiving-branch
Stap 3. Nu de FOI afwezig is, zal het samenvoegen in de donor-branch geen niet-getrackte bestanden overschrijven, dus we krijgen geen fouten.
git merge donor-branch
Antwoord 5, autoriteit 4%
Alle niet-getrackte bestanden verwijderen:
git clean -d -fx .
Let op: hiermee worden IDE-bestanden en alle nuttige bestanden verwijderd zolang u de bestanden niet bijhoudt. Gebruik deze opdracht met zorg
Antwoord 6, autoriteit 2%
Als dit een eenmalige bewerking is, kunt u alle niet-getrackte bestanden uit de werkdirectory verwijderen voordat u de pull uitvoert. Lees Hoe verwijder je lokale (niet-getrackte) bestanden uit de huidige Git-werkboom? voor informatie over het verwijderen van alle niet-getrackte bestanden.
Zorg ervoor dat u niet per ongeluk het niet-getrackte bestand verwijdert dat u nog nodig heeft;)
Antwoord 7, autoriteit 2%
Je kunt dat commando proberen
git clean -df
BEWERKEN:
Houd er rekening mee dat hierdoor de niet-bijgehouden bestanden worden verwijderd die waardevol kunnen zijn.
met dank aan @zhekaus
Antwoord 8, autoriteit 2%
Update – een betere versie
Deze tool (https://github.com/mklepaczewski/git-clean- voor-samenvoegen) zal:
- niet-getrackte bestanden verwijderen die identiek zijn aan hun
git pull
equivalenten, - wijzigingen terugzetten naar gewijzigde bestanden waarvan de gewijzigde versie identiek is aan hun
git pull
equivalenten, - aangepaste/niet-getrackte bestanden rapporteren die verschillen van hun
git pull
-versie, - de tool heeft de optie
--pretend
die geen bestanden zal wijzigen.
Oude versie
Hoe verschilt dit antwoord van andere antwoorden?
De hier gepresenteerde methode verwijdert alleen bestanden die zouden worden overschreven door samenvoegen. Als je andere niet-getrackte (mogelijk genegeerde) bestanden in de map hebt, zal deze methode ze niet verwijderen.
De oplossing
Dit fragment extraheert alle niet-getrackte bestanden die zouden worden overschreven door git pull
en verwijdert ze.
git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"
en doe dan gewoon:
git pull
Dit is geen git porselein-commando, dus controleer altijd wat het zou doen met:
git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"
Uitleg – omdat oneliners eng zijn:
Hier is een overzicht van wat het doet:
git pull 2>&1
– leg de uitvoer vangit pull
vast en stuur het allemaal door naar stdout zodat we het gemakkelijk kunnen vastleggen metgrep
.grep -E '^\s
– de bedoeling is om de lijst met niet-getrackte bestanden vast te leggen die zouden worden overschreven doorgit pull
. De bestandsnamen hebben een aantal witruimte-tekens ervoor, dus we gebruiken het om ze te krijgen.cut -f2-
– verwijder witruimte vanaf het begin van elke regel vastgelegd in 2.xargs -I {} rm -rf "{}"
– gebruikxargs
om alle bestanden te herhalen, sla hun naam op in “{}” en belrm
voor elk van hen. We gebruiken-rf
om het verwijderen en verwijderen van niet-getrackte mappen te forceren.
Het zou geweldig zijn om stappen 1-3 te vervangen door porseleincommando, maar ik ken geen equivalent.
Antwoord 9
Noch clean/reset/hard checkout/rebase werkte voor mij.
Dus ik heb zojuist bestanden verwijderd waar Git over klaagde*
rm /path/to/files/that/git/complained/about
*Ik heb gecontroleerd of deze bestanden kunnen worden verwijderd door een gloednieuwe repo in een aparte map uit te checken (bestanden waren er niet)
Antwoord 10
Het probleem is wanneer we binnenkomende wijzigingen hebben die een niet-gevolgd bestand zullen samenvoegen, klaagt git. Deze commando’s hebben me geholpen:
git clean -dxf
git pull origin master
Antwoord 11
Als u overweegt de vlag -f
te gebruiken, kunt u deze eerst als een test uitvoeren. Alleen dat je van tevoren weet in wat voor interessante situatie je de volgende keer zult belanden ;-P
-n
--dry-run
Don’t actually remove anything, just show what would be done.
Antwoord 12
Naast het geaccepteerde antwoord kunt u natuurlijk de bestanden verwijderen als ze niet langer nodig zijn door het bestand op te geven:
git clean -f '/path/to/file/'
Vergeet niet om het eerst uit te voeren met de vlag -n als je wilt zien welke bestanden git clean zal verwijderen. Houd er rekening mee dat deze bestanden worden verwijderd. In mijn geval gaf ik er toch niet om, dus dat was een betere oplossing voor mij.
Antwoord 13
Een manier om dit te doen is door uw lokale wijzigingen op te slaan en uit de externe repo te halen. Op deze manier verliest u uw lokale bestanden niet omdat de bestanden naar de stash gaan.
git add -A
git stash
git pull
Je kunt je lokale opgeslagen bestanden controleren met dit commando – git stash list
Antwoord 14
Voor degenen die het niet weten, git negeert verschillen in hoofdletters/kleine letters in bestanden en mappen. Dit blijkt een nachtmerrie te zijn als je ze hernoemt naar exact dezelfde naam met een ander geval.
Ik kwam dit probleem tegen toen ik een map hernoemde van “Petstore” naar “petstore” (hoofdletters naar kleine letters). Ik had mijn .git/config-bestand bewerkt om te stoppen met het negeren van case, wijzigingen aangebracht, mijn commits geplet en mijn wijzigingen opgeslagen om naar een andere branch te gaan. Ik kon mijn stashed wijzigingen niet toepassen op deze andere branch.
De oplossing waarvan ik vond dat die werkte, was om mijn .git/config-bestand tijdelijk te bewerken om hoofdletters tijdelijk weer te negeren. Dit zorgde ervoor dat git stash apply
slaagde. Daarna veranderde ik negeerCase terug naar false
. Ik heb toen alles toegevoegd, behalve de nieuwe bestanden in de petstore-map waarvan git vreemd genoeg beweerde dat ze om welke reden dan ook waren verwijderd. Ik heb mijn wijzigingen doorgevoerd en vervolgens git reset --hard HEAD
uitgevoerd om die niet-getrackte nieuwe bestanden te verwijderen. Mijn commit verscheen precies zoals verwacht: de bestanden in de map werden hernoemd.
Ik hoop dat dit je helpt om dezelfde nachtmerrie te vermijden.
Antwoord 15
In mijn geval toen ik dit probleem had. Ik had een lokaal bestand dat ik op de afstandsbediening had hernoemd.
Toen ik probeerde git pull
te gebruiken, vertelde Git me dat de nieuwe bestandsnaam niet werd gevolgd — die stond op de afstandsbediening, hoewel hij nog niet bestond op lokaal.
Omdat er geen lokaal exemplaar van was, kon ik geen git pull
doen totdat ik git rm
deed op de oude bestandsnaam (die was eerst niet duidelijk vanwege mijn stomme idee om het te hernoemen).
Antwoord 16
Dit probleem kan te wijten zijn aan uw lokale wijzigingen.
je kunt het stash-bestand niet direct sturen, dus probeer git add .first
sudo git add *
sudo git stash
sudo git pull
en het is opgelost
Antwoord 17
Als je de bestanden hebt geschreven onder .gitignore, verwijder dan de bestanden en voer git pull opnieuw uit. Dat heeft me geholpen.
Antwoord 18
Ik heb hetzelfde probleem, telkens als ik master probeer samen te voegen in mijn lokale branch staat er
“De volgende niet-bijgehouden werkboombestanden zouden worden overschreven door M.xcworkspace/xcshareddata/swiftpm/Package.resolved samen te voegen”
Maar het volgen van een van de bovenstaande antwoorden werkte niet voor mij. Zoals wanneer ik git status
doe, is er geen niet-getrackt bestand, dus als ik git add .
doe, wordt er geen bestand gestaged, vandaar dat stashing het probleem niet oplost, noch de check-out forceert zoals hierboven beantwoord .
Ik kon het oplossen door de volgende commando’s uit te voeren zoals hierboven vermeld, maar nog belangrijker Ik moest de Xcode sluiten (het kan zijn dat zelfs na het uitvoeren van de opdracht clean het bestand aan het maken was dat het probleem veroorzaakte voor mij.)
git clean -dfxn
(om te controleren wat kan worden verwijderd)
git clean -d -fx .
(verwijder bovenstaande bestanden)