git push
De opdracht git push
wordt gebruikt om lokale repositorycontent naar een externe repository te uploaden. Met pushing draag je commits over van je lokale repository naar een externe repo. Het is het tegenovergestelde van git fetch
, maar waar het ophalen van imports commits aan lokale branches maakt, maakt het pushen van exports commits aan externe branches. Externe branches worden geconfigureerd met de opdracht git remote
. Via pushing kun je wijzigingen overschrijven, maar pas op met pushen. Deze problemen worden hieronder beschreven.
Git push gebruiken
git push <remote> <branch>
Push de gespecificeerde branch naar
git push <remote> --force
Zelfde als bovenstaande opdracht, maar forceer de push zelfs als dit resulteert in een non-fast-forward samenvoeging. Gebruik de --force
markering niet, tenzij je absoluut zeker weet waar je mee bezig bent.
git push <remote> --all
Push al je lokale branches naar de gespecificeerde externe.
git push <remote> --tags
Tags worden niet automatisch gepusht als je een branch pusht of de optie --all
gebruikt. De markering --tags
verstuurt al je lokale tags naar de externe repository.
Git push discussie
git push
wordt het meest gebruikt om lokale wijzigingen aan een centrale repository te publiceren en uploaden. Nadat een lokale repository is aangepast wordt er een push uitgevoerd om de aanpassingen met externe teamleden te delen.
Bovenstaand diagram toont wat er gebeurt als je lokalemaster
verder is dan de centrale master
van de repository en je wijzigingen publiceert door git push origin master
uit te voeren. Je ziet dat git push
vrijwel hetzelfde is als het uitvoeren van git merge master
van binnen de externe repository.
Git push en synchroniseren
git push
is een van de vele componenten die gebruikt worden in het Git "synchronisatieproces". De synchronisatie-opdrachten gelden voor externe branches die geconfigureerd worden met de opdracht git remote
. git push
kan beschouwd worden als een 'upload'-opdracht en git fetch
en git pull
kunnen daarentegen beschouwd worden als 'download'-opdrachten. Als changesets verplaatst zijn via een download of upload kan er een git merge
worden uitgevoerd op de bestemming om de wijzigingen te integreren.
Pushing naar bare repository's
Een vaak gebruikte, moderne Git-procedure is om een extern gehoste --bare
repository dienst te laten doen als een centrale oorsprong-repository. De oorsprong-repository wordt vaak offsite gehost bij een vertrouwde 3e partij zoals Bitbucket. Aangezien pushen de structuur van de externe branch verstoort, is het het veiligst om te pushen naar repository's die gecreëerd zijn met de markering --bare
. Bare repos hebben geen werkende directory, dus wijzigt een push geen werkende directorycontent die wordt uitgevoerd. Voor meer informatie over het creëren van bare repository's lees je meer over git init
.
Geforceerd pushen
Git voorkomt dat je de geschiedenis van de centrale repository overschrijft door push-aanvragen te weigeren als deze resulteren in een non-fast-forward samenvoeging. Dus als de externe geschiedenis is afgeleid van jouw geschiedenis, moet je de externe branch pullen en samenvoegen met je lokale branch, en vervolgens weer proberen te pushen. Dit is vergelijkbaar met de manier waarop SVN je laat synchroniseren met de centrale repository via svn update
voordat je een changeset commit.
De markering --force
overschrijft dit gedrag en zorgt ervoor dat de branch van je externe repository overeenkomt met je lokale branch en eventuele wijzigingen upstream sinds je laatste pull worden verwijderd. De enige keer wanneer geforceerd moet pushen is wanneer je beseft dat de commits die je net hebt gedeeld niet kloppen en je ze hebt aangepast met een git commit --amend
of een interactieve rebase. Je moet echter absoluut zeker weten dat geen van je teamgenoten deze commits heeft gepulld voordat je de optie --force
gebruikt.
Voorbeelden
Standaard git push
Het volgende voorbeeld beschrijft een van de standaardmethoden voor het publiceren van lokale bijdrages aan de centrale repository. Allereerst zorgt het ervoor dat je lokale master up-to-date is door het exemplaar van de centrale repository op te halen en ook nog eens je wijzigingen te rebasen. De interactieve rebase is tevens een goede mogelijkheid om je commits op te schonen voordat je ze deelt. Vervolgens verstuurt de opdracht git push
alle commits op je lokale master naar de centrale repository.
git checkout master
git fetch origin master
git rebase -i origin/master
# Squash commits, fix up commit messages etc.
git push origin master
Aangezien we er al voor gezorgd hebben dat de lokale master up-to-date is, moet dit een fast-forward samenvoeging worden, en zal git push
niet klagen over de hierboven besproken non-fast-forward problemen.
Aangepaste geforceerde push
De opdracht git commit
accepteert een --amend
optie die de voorgaande commit bijwerkt. Een commit wordt vaak aangepast om het commitbericht bij te werken of nieuwe wijzigingen toe te voegen. Als een commit is aangepast, faalt een git push
omdat Git de aangepaste commit en de externe commit ziet als afgeleide content. De optie --force
moet gebruikt worden om een aangepaste commit te pushen.
# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin master
Het voorbeeld hierboven gaat er vanuit dat het uitgevoerd wordt op een bestaande repository met een commitgeschiedenis. git commit --amend
wordt gebruikt om de voorgaande commit bij te werken. De aangepaste commit wordt vervolgens geforceerd gepusht met de optie --force
.
Een externe branch of tag verwijderen
Soms moeten branches opgeschoond worden voor administratieve of organisatorische doeleinden. Om een branch helemaal te verwijderen moet deze lokaal en ook extern worden verwijderd.
git branch -D branch_name
git push origin :branch_name
Bovenstaande verwijdert de externe branch met de naam branch_name. Door een branchnaam voorafgegaan door een dubbele punt naar git push
in te voeren, wordt de externe branch verwijderd.