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 <remote>, samen met alle vereiste commits en interne objecten. Zo wordt er een lokale branch gecreëerd in de doelrepository. Om te voorkomen dat je commits overschrijft, laat Git je niet pushen als dit resulteert in een non-fast-forward samenvoeging in de doelrepository.

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.

Git push gebruiken om wijzigingen te publiceren

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.