Push & Pull
Lerne, wie du mit git push und git pull deinen Code zwischen Computer und GitHub synchronisierst.
Push und Pull sind die Befehle, mit denen du deinen Code zwischen deinem Computer und GitHub hin- und herschickst. In diesem Kapitel lernst du beide Befehle gruendlich kennen - inklusive aller wichtigen Optionen und typischer Szenarien.
git push - Code hochladen
Der Grundbefehl
git push origin main
Das bedeutet: βSende meine Commits vom lokalen main-Branch zum Remote origin.β
Dein Computer GitHub
ββββββββββββ ββββββββββββ
β C1-C2-C3 β ββpushβββ β C1-C2-C3 β
β main β β main β
ββββββββββββ ββββββββββββ
Erster Push mit Tracking
git push -u origin main
Das -u (oder --set-upstream) verknuepft deinen lokalen Branch mit dem Remote-Branch. Danach reicht ein einfaches:
git push
Einen Feature-Branch pushen
# Feature-Branch erstellen und bearbeiten
git switch -c feature/dark-mode
# ... Commits machen ...
# Zum ersten Mal pushen
git push -u origin feature/dark-mode
Total 3 (delta 1), reused 0 (delta 0)
remote: Create a pull request for 'feature/dark-mode' on GitHub by visiting:
remote: https://github.com/dein-name/projekt/pull/new/feature/dark-mode
To https://github.com/dein-name/projekt.git
* [new branch] feature/dark-mode -> feature/dark-mode
Branch 'feature/dark-mode' set up to track remote branch 'feature/dark-mode' from 'origin'.
GitHub gibt dir sogar den Link fuer einen Pull Request!
Alle Branches pushen
git push --all origin
Tags pushen
# Einen einzelnen Tag
git push origin v1.0
# Alle Tags
git push origin --tags
git pull - Code herunterladen
Der Grundbefehl
git pull origin main
Das bedeutet: βHole die neuesten Commits vom Remote origin und merge sie in meinen lokalen main-Branch.β
GitHub Dein Computer
ββββββββββββ ββββββββββββ
β C1-C2-C3 β ββpullβββ β C1-C2-C3 β
β main β β main β
ββββββββββββ ββββββββββββ
Mit Tracking (Kurzform)
git pull
Funktioniert, wenn der Upstream gesetzt ist.
Was pull intern macht
git pull ist eine Kombination aus zwei Befehlen:
# Das passiert intern:
git fetch origin # Aenderungen herunterladen
git merge origin/main # In lokalen Branch mergen
Pull mit Rebase
Statt zu mergen kannst du auch rebasen:
git pull --rebase origin main
Das erzeugt eine linearere Historie ohne Merge-Commits. Mehr dazu im Kapitel ueber Rebase.
Der taegliche Push-Pull-Workflow
Alleine arbeiten
# Morgens: Starten
git pull # Falls du auf einem anderen Geraet gearbeitet hast
# Arbeiten
git add .
git commit -m "feat: Neues Feature"
# Feierabend: Pushen
git push
Im Team arbeiten
# 1. Neuesten Stand holen
git switch main
git pull
# 2. Feature-Branch erstellen
git switch -c feature/suche
# 3. Arbeiten und committen
git add search.html
git commit -m "feat: Suchfunktion hinzugefuegt"
# 4. Vor dem Push: main-Updates holen
git switch main
git pull
git switch feature/suche
git merge main # Aenderungen von main holen
# 5. Feature-Branch pushen
git push -u origin feature/suche
# 6. Pull Request auf GitHub erstellen
Haeufige Push-Probleme
Problem: βrejected - non-fast-forwardβ
git push
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'origin'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g. 'git pull')
Ursache: Jemand anders hat in der Zwischenzeit gepusht.
Loesung:
git pull # Neueste Aenderungen holen und mergen
# Eventuelle Konflikte loesen
git push # Erneut pushen
Problem: βno upstream branchβ
git push
fatal: The current branch feature/dark-mode has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin feature/dark-mode
Loesung:
git push -u origin feature/dark-mode
Problem: Push-Zugriff verweigert
remote: Permission to user/repo.git denied
fatal: unable to access 'https://github.com/user/repo.git/'
Moegliche Ursachen:
- Du hast keinen Schreibzugriff auf das Repository
- Deine Authentifizierung ist abgelaufen
- Du versuchst, auf ein fremdes Repo zu pushen (nutze stattdessen Fork + Pull Request)
Haeufige Pull-Probleme
Problem: Merge-Konflikte beim Pull
git pull
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
Loesung: Konflikte loesen wie bei einem normalen Merge:
# 1. Konflikte in der Datei loesen
# 2. Geloeste Dateien stagen
git add index.html
# 3. Merge-Commit erstellen
git commit -m "Merge: Remote-Aenderungen integriert"
# 4. Pushen
git push
Problem: Lokale Aenderungen wuerden ueberschrieben
git pull
error: Your local changes to the following files would be overwritten by merge:
index.html
Loesung:
# Option 1: Erst committen
git add .
git commit -m "wip: Zwischenstand sichern"
git pull
# Option 2: Stashen
git stash
git pull
git stash pop
Push und Pull fuer Remote-Branches
Remote-Branch loeschen
# Remote-Branch auf GitHub loeschen
git push origin --delete feature/alte-funktion
Alle Remote-Branches aufraumen
# Geloeschte Remote-Branches lokal entfernen
git fetch --prune
Remote-Branch lokal auschecken
# Erst Remote-Infos aktualisieren
git fetch
# Dann den Branch auschecken
git switch feature/anderer-branch
Pull-Strategien konfigurieren
Standard-Pull-Verhalten festlegen
# Merge (Standard)
git config --global pull.rebase false
# Rebase
git config --global pull.rebase true
# Nur Fast-Forward (sicherste Option)
git config --global pull.ff only
| Strategie | Beschreibung | Empfehlung |
|---|---|---|
merge | Erzeugt Merge-Commits | Standard, einfach |
rebase | Lineare Historie | Sauberere Historie |
ff only | Nur wenn kein Merge noetig | Am sichersten |
Uebungen
- Pushe ein lokales Repository zu GitHub
- Klone es in einen zweiten Ordner
- Mache Aenderungen im zweiten Ordner und pushe sie
- Pulle die Aenderungen im ersten Ordner
- Erzeuge absichtlich einen Push-Konflikt und loese ihn
Was kommt als Naechstes?
Im naechsten Kapitel lernst du, wie du dein GitHub-Profil professionell gestaltest. Ein gutes GitHub-Profil ist wie ein Online-Lebenslauf fuer Entwickler.
Zusammenfassung
git pushlaedt deinen Code auf GitHub hochgit pullholt Aenderungen von GitHub herunter und merged siegit push -usetzt die Tracking-Beziehung (einmalig noetig)- Bei Push-Konflikten: Erst
git pull, danngit push git pullist interngit fetch+git mergegit pull --rebaseerzeugt eine sauberere Historie- Pushe regelmaessig, damit dein Code gesichert ist
Pro-Tipp: Mache es dir zur Gewohnheit, jeden Arbeitstag mit git pull zu beginnen und mit git push zu beenden. So ist dein Code immer gesichert und du arbeitest immer mit dem neuesten Stand. Falls du an mehreren Geraeten arbeitest, verhindert das auch Konflikte.