Ik heb een CENTRALE kale repository met drie ontwikkelaarsrepository’s die er normaal naartoe trekken en pushen.
Ik heb ook twee andere repositories die uit de CENTRALE kale repo halen: de ene is de live-server en de andere is een test/stage-server, die elk uit zijn eigen respectievelijke vertakking trekken.
Het scenario is dit: ik heb een post-update
hook-script op de CENTRAL-repo die automatisch toegang heeft tot de test- en live-repo’s en op elk een pull-opdracht uitvoert. Dit werkt zowel test- als liveservers bij, allemaal afhankelijk van welke branch nieuwe commits heeft. Dit werkt allemaal prima.
Het probleem is dit: in een noodgeval kunnen bestanden direct op de server worden bijgewerkt (via ftp of wat dan ook) en het CENTRAL post-update script zal dan mislukken omdat er samenvoeg-/overschrijfconflicten zullen optreden. Er is geen manier om dit scenario te vermijden, en het is onvermijdelijk.
Wat ik zou willen dat er gebeurt, is dit: ik wil dat de pull van de live- en testsites altijdwordt overschreven/samengevoegd bij pull. Altijd.Deze repo’s zijn alleen pull-only, omdat ze niet voor ontwikkeling zijn.
In al mijn onderzoek kan ik geen goede oplossing vinden om een pull altijdeen overschrijving van de lokale bestanden te forceren. Is dit überhaupt mogelijk? Als dat zo is, zou het een geweldig ontwikkelingsscenario zijn.
Antwoord 1, autoriteit 100%
De ideale manier om dit te doen is om pull
helemaal niet te gebruiken, maar in plaats daarvan fetch
en reset
:
git fetch origin master
git reset --hard FETCH_HEAD
git clean -df
(Wijzigen van master
in de branch die je wilt volgen.)
pull
is ontworpen om wijzigingen op de een of andere manier samen te voegen, terwijl reset
is ontworpen om uw lokale kopie eenvoudigweg te laten overeenkomen met een specifieke vastlegging.
Misschien wilt u iets andere opties overwegen om clean
, afhankelijk van de behoeften van uw systeem.
Antwoord 2, autoriteit 4%
Je zou dit kunnen proberen:
git reset --hard HEAD
git pull
(from Hoe dwing ik “git pull” om lokaal te overschrijven bestanden?)
Een ander idee zou zijn om de hele git te verwijderen en een nieuwe kloon te maken.
Antwoord 3
Ik weet niet zeker hoe ik het in één commando moet doen, maar je zou zoiets kunnen doen als:
git reset --hard
git pull
of zelfs
git stash
git pull
Antwoord 4
git reset --hard HEAD
git fetch --all
git reset --hard origin/your_branch
Antwoord 5
Om een kopie van de branch te halen en force overwrite van lokale bestandenvan de oorsprong te gebruiken:
git reset --hard origin/current_branch
Al het huidige werk gaat verloren en het zal dan hetzelfde zijn als de oorspronkelijke vertakking
Antwoord 6
Je kunt de haak verwisselen om alles schoon te vegen.
# Danger! Wipes local data!
# Remove all local changes to tracked files
git reset --hard HEAD
# Remove all untracked files and directories
git clean -dfx
git pull ...
Antwoord 7
Als je de lokale wijzigingen nog niet hebt doorgevoerd sinds de laatste pull/kloon, kun je het volgende gebruiken:
git checkout *
git pull
checkout
zal uw lokale wijzigingen wissen met de laatste lokale vastlegging, en
pull
zal het sincroniseren naar de externe repository