Ik ben gewend om git pull en andere commando’s uit te voeren vanuit een branch waar ik aan werk. Maar ik heb een ontwikkelserver opgezet waar meerdere mensen aan werken, dus ik wil niet van branch wisselen als ik dat doe. Als ik een bestaande branch op de dev-server wil updaten vanuit de github-repository die we allemaal gebruiken, wat zou dan de juiste manier zijn om dat te doen? Als ik het commando ‘git pull github branchname’ uitvoer, zal dat dan gewoon de branch in de huidige branch trekken?
Alle git-voorbeelden die ik kan vinden, lijken erop te wijzen dat je eerst ‘checkout branchname’ uitvoert en vervolgens de pull uitvoert. Dat probeer ik te vermijden. Zoals ik al zei, dit is een bestaande branch en ik wil gewoon updaten naar de nieuwste versie.
Antwoord 1, autoriteit 100%
Ik was op zoek naar hetzelfde en vond uiteindelijk het antwoord dat voor mij werkte in een ander stackoverflow-bericht: Git branches samenvoegen, bijwerken en ophalen zonder checkouts te gebruiken
Eigenlijk:
git fetch <remote> <srcBranch>:<destBranch>
Antwoord 2, autoriteit 43%
Ik had hetzelfde probleem met de noodzaak om de huidige functiewijzigingen vast te leggen of op te slaan, de master-branch uit te checken, de opdracht pull
uit te voeren om alles te krijgen van extern tot lokaal master
werkruimte, schakel dan weer over naar een feature branch en voer een rebase
uit om het up-to-date te maken met master.
Om dit allemaal voor elkaar te krijgen, houd ik de werkruimte op de feature branch en vermijd ik al het schakelen, ik doe dit:
git fetch origin master:master
git rebase master
En het doet het goed.
Antwoord 3
Als je wilt dat de lokalebranchtips opnieuw worden verwezen na git fetch
, heb je enkele aanvullende stappen nodig.
Concreet, stel dat de github-repo takken D
, B
, C
en master
heeft (de reden voor deze vreemde branch-name-set zal zo duidelijk zijn). U bevindt zich op host devhost
en u bevindt zich in een repo waar origin
de github-repo is. Je doet git fetch
, dat alle objecten overbrengt en origin/D
, origin/B
, origin/C
en origin/master
. Tot zover goed. Maar nu zeg je dat je wilt dat er iets gebeurt, op devhost
, naar lokalebranches D
, B
, C
en/of master
?
Ik heb deze voor de hand liggende (voor mij in ieder geval) vragen:
- Waaromwil je dat de tips van allevestigingen worden bijgewerkt?
- Wat als een branch (bijv.
B
) commits heeft die de externe (github) repo niet heeft? Moeten ze worden samengevoegd, opnieuw gebaseerd of …? - Wat als je in een branch zit (bijv.
C
) en de werkmap en/of index zijn gewijzigd maar niet vastgelegd? - Wat als er aan de externe repo nieuwe vertakkingen zijn toegevoegd (
A
) en/of vertakkingen zijn verwijderd (D
)?
Als het antwoord op (1) is “omdat devhost
niet echt voor ontwikkeling is, maar eerder een lokale spiegelserver is die eenvoudig een lokaal beschikbare kopie van de github-repo bewaart, zodat al onze daadwerkelijke ontwikkelaars kunnen er snel uit lezen in plaats van langzaam uit github te lezen, dan wil je een “spiegel” in plaats van een “normale” repo. Het zou geen werkmap moeten hebben, en misschien zou het ook geen pushes moeten accepteren, in welk geval de resterende vragen gewoon verdwijnen.
Als er een ander antwoord is, wordt (2-4) problematisch.
In ieder geval, hier is een manier om lokale refs te updaten op basis van remote refs (na bijvoorbeeld git fetch -p
te hebben uitgevoerd):
for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
local=${ref#refs/remotes/origin/}
... code here ...
done
Wat er in de ... code here ...
staat, hangt af van de antwoorden op vragen (2-4).
Antwoord 4
Gebruik
git fetch
in plaats daarvan. Het werkt de externe refs en objecten in uw repo bij, maar laat de lokale branches, HEAD en de werkboom met rust.