Git pull zonder afrekenen?

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 pulluit te voeren om alles te krijgen van extern tot lokaal masterwerkruimte, schakel dan weer over naar een feature branch en voer een rebaseuit 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, Cen masterheeft (de reden voor deze vreemde branch-name-set zal zo duidelijk zijn). U bevindt zich op host devhosten u bevindt zich in een repo waar originde github-repo is. Je doet git fetch, dat alle objecten overbrengt en origin/D, origin/B, origin/Cen origin/master. Tot zover goed. Maar nu zeg je dat je wilt dat er iets gebeurt, op devhost, naar lokalebranches D, B, Cen/of master?

Ik heb deze voor de hand liggende (voor mij in ieder geval) vragen:

  1. Waaromwil je dat de tips van allevestigingen worden bijgewerkt?
  2. Wat als een branch (bijv. B) commits heeft die de externe (github) repo niet heeft? Moeten ze worden samengevoegd, opnieuw gebaseerd of …?
  3. Wat als je in een branch zit (bijv. C) en de werkmap en/of index zijn gewijzigd maar niet vastgelegd?
  4. 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 devhostniet 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 -pte 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.

Other episodes