Git push
Der Befehl git push
wird verwendet, um Inhalte aus einem lokalen Repository in ein Remote-Repository hochzuladen. Per Push überträgst du Commits aus deinem lokalen Repository in ein Remote-Repository. Der Befehl ist das Gegenstück zu git fetch: Ein Fetch importiert Commits in lokale Branches, ein Push exportiert Commits in Remote-Branches. Remote-Branches werden mithilfe des Befehls git remote konfiguriert. Beim Pushen besteht das Risiko, dass Änderungen überschrieben werden. Deshalb solltest du damit vorsichtig sein. Diese Probleme werden weiter unten behandelt.
"git push" – Verwendung
git push <remote> <branch>
Mit diesem Befehl pushst du den angegebenen Branch an das in "
git push <remote> --force
Dieser Befehl ist identisch mit dem oben beschriebenen, erzwingt den Push jedoch auch dann, wenn durch ihn ein Nicht-Fast-Forward-Merge angestoßen werden würde. Verwende das Flag --force
nur, wenn du dir absolut sicher bist.
Verschiebt alle lokalen Branches zum angegebenen Remote-Branch
git push <remote> --tags
Zugehöriges Material
Git-Protokoll für Fortgeschrittene
Lösung anzeigen
Git kennenlernen mit Bitbucket Cloud
Tags werden nicht automatisch eingeschlossen, wenn du einen Branch pushst oder die Option --all
verwendest. Das Flag --tags
sendet alle deine lokalen Tags an das Remote-Repository.
"git push" – Erläuterung
git push
wird üblicherweise verwendet, um lokale Änderungen in einem zentralen Repository zu veröffentlichen und hochzuladen. Nachdem Änderungen an einem lokalen Repository vorgenommen wurden, werden die Änderungen per Push für Remote-Teammitglieder freigegeben.
Das Schaubild oben verdeutlicht, was passiert, wenn dein lokaler main
aktueller ist als der main
des zentralen Repositorys und du Änderungen per git push origin main
veröffentlichst. Wie du siehst: git push
arbeitet im Grunde genommen genauso wie git merge main
im Remote-Repository.
"git push" und Synchronisierung
git push
ist nur eine von vielen Komponenten im Gesamtprozess der Git-"Synchronisierung". Die Synchronisierungsbefehle wirken sich auf Remote-Branches aus, die mit dem Befehl git remote konfiguriert werden. git push
kann als Befehl zum "Hochladen" betrachtet werden, git fetch und git pull dagegen als Befehle zum "Herunterladen". Nachdem die Changesets per Download oder Upload verschoben wurden, können die Änderungen am Ziel mit git merge integriert werden.
Pushen an Bare-Repositorys
Bei einem häufig genutzten, modernen Git-Verfahren fungiert ein remote gehostetes --bare
-Repository als zentrales Ursprungs-Repository. Dieses Ursprungs-Repository wird oft extern von einem vertrauenswürdigen Drittanbieter wie Bitbucket gehostet. Da beim Pushen die Remote-Branch-Struktur manipuliert wird, ist es am sichersten und gängigsten, auf Repositorys zu pushen, die mit dem Flag --bare
erstellt wurden. Bare-Repositorys haben kein Arbeitsverzeichnis, sodass ein Push keine in Bearbeitung befindlichen Arbeitsverzeichnisinhalte verändern kann. Weitere Informationen zum Erstellen von Bare-Repositorys findest du im Abschnitt zu git init.
Verschieben erzwingen
Git lehnt Push Requests ab, die einen Nicht-Fast-Forward-Merge anstoßen würden. Dadurch wird verhindert, dass der Verlauf des zentralen Repositorys überschrieben wird. Wenn der Verlauf des Remote-Repositorys also von deinem eigenen Verlauf abweicht, musst du den Remote-Branch pullen und mit deinem lokalen Branch zusammenführen. Anschließend kannst du den Push erneut versuchen. Dieser Prozess ähnelt der SVN-basierten Synchronisierung mit einem zentralen Repository über svn update
, vor dem Commit eines Changesets.
Das Flag --force
setzt dieses Verhalten außer Kraft und bewirkt, dass der Branch des Remote-Repositorys an deinen lokalen Branch angeglichen wird. Dabei werden sämtliche Upstream-Änderungen gelöscht, die seit dem letzten Pull vorgenommen wurden. Du solltest einen Push nur dann auf diese Weise erzwingen, wenn Commits, die du gerade veröffentlicht hast, fehlerhaft waren und du sie mit git commit --amend
oder einem interaktiven Rebase korrigiert hast. Selbst dann musst du jedoch vor der Verwendung der Option --force
unbedingt sicherstellen, dass keine deiner Teamkollegen die betreffenden Commits bereits gepullt haben.
Beispiele
Standard-Git-Push
Im folgenden Beispiel wird eine der Standardmethoden zum Veröffentlichen lokaler Beiträge im zentralen Repository beschrieben. Um sicherzustellen, dass dein lokaler Main aktuell ist, wird zunächst per Fetch eine Kopie des zentralen Repositorys abgerufen und per Rebase mit deinen Änderungen zusammengeführt. Darüber hinaus ist ein solcher interaktiver Rebase eine gute Gelegenheit, deine Commits vor der Veröffentlichung zu bereinigen. Im nächsten Schritt werden alle Commits aus deinem lokalen Main mit dem Befehl git push
an das zentrale Repository gesendet.
git checkout main
git fetch origin main
git rebase -i origin/main
# Squash commits, fix up commit messages etc.
git push origin main
Da wir bereits dafür gesorgt haben, dass der lokale Main auf dem neuesten Stand ist, sollte hierdurch ein Fast-Forward-Merge angestoßen werden, und git push
sollte keine der oben beschriebenen Nicht-Fast-Forward-Probleme melden.
Erzwingen von korrigierten Pushes
Beim Befehl git commit kannst du die Option --amend
nutzen, um den vorherigen Commit zu aktualisieren. Oft wird ein Commit auf diese Weise ergänzt, um die Commit-Nachricht zu aktualisieren oder neue Änderungen hinzuzufügen. Wenn ein Commit ergänzt wurde, schlägt git push
fehl, weil Git den ergänzten Commit und den Remote-Commit als unterschiedliche Inhalte betrachtet. Daher musst du zum Pushen ergänzter Commits die Option --force
verwenden.
# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin main
Im Beispiel oben gehen wir davon aus, dass die Ausführung für ein bestehendes Repository mit Commit-Verlauf erfolgt. Mit git commit --amend
wird der vorherige Commit aktualisiert. Das Pushen des ergänzten Commits wird dann mit der Option --force
erzwungen.
Löschen eines Remote-Branchs oder Tags
Manchmal müssen Branches aus buchhalterischen oder organisatorischen Gründen bereinigt werden. Um einen Branch vollständig zu löschen, muss er lokal und auch remote gelöscht werden.
git branch -D branch_name
git push origin :branch_name
Auf die oben gezeigte Weise wird der Remote-Branch mit dem Namen "branch_name" gelöscht. Durch Übergeben eines Branch-Namens mit einem vorangestellten Doppelpunkt an git push
wird der Remote-Branch gelöscht.
Diesen Artikel teilen
Nächstes Thema
Lesenswert
Füge diese Ressourcen deinen Lesezeichen hinzu, um mehr über DevOps-Teams und fortlaufende Updates zu DevOps bei Atlassian zu erfahren.