Close

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 "" angegebene Remote-Repository, zusammen mit allen notwendigen Commits und internen Objekten. Dadurch wird im Ziel-Repository ein lokaler Branch erstellt. Damit keine Commits überschrieben werden, blockiert Git Push-Vorgänge, durch die ein Nicht-Fast-Forward-Merge im Ziel-Repository angestoßen werden würde.

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
Konsolenfenster
Zugehöriges Material

Git-Protokoll für Fortgeschrittene

Bitbucket-Logo
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.

Veröffentlichen von Änderungen mit "git push"

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.

Mitarbeiter arbeiten mit unzähligen Tools zusammen

Bitbucket-Blog

Abbildung: DevOps

DevOps-Lernpfad

Demo Den: Feature-Demos mit Atlassian-Experten

So funktioniert Bitbucket Cloud mit Atlassian Open DevOps

Melde dich für unseren DevOps-Newsletter an

Thank you for signing up