Push-Konflikte: Wenn GitHub „ahead" ist 🚧
Du möchtest deine lokalen Commits auf GitHub pushen, aber Git verweigert das mit einer Fehlermeldung. Das passiert, wenn das Remote-Repository neuere Commits enthält, die du lokal noch nicht hast. Diese Situation ist völlig normal und gehört zum Git-Alltag – besonders wenn du an mehreren Geräten arbeitest oder mit anderen zusammenarbeitest.
Warum lehnt Git den Push ab?
Git hat eine wichtige Schutzfunktion: Es verhindert, dass du versehentlich Änderungen auf dem Server überschreibst, die du noch gar nicht gesehen hast. Wenn das Remote-Repository Commits enthält, die in deiner lokalen Historie fehlen, sagt Git sinngemäß:
„Stopp! Auf dem Server gibt es neuere Änderungen. Hol dir die erst, bevor du deine eigenen hochlädst."
Die typische Fehlermeldung sieht ungefähr so aus:
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'github.com:username/repo.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
Das folgende Diagramm zeigt, wie diese Situation entsteht:
flowchart TB
subgraph LOCAL["💻 Dein lokaler Stand"]
L1["Commit A"] --> L2["Commit B"] --> L3["Commit C\n- deine neue Arbeit"]
end
subgraph REMOTE["☁️ GitHub-Stand"]
R1["Commit A"] --> R2["Commit B"] --> R3["Commit X\n- andere Aenderung"]
end
L3 -.->|"Push verweigert!"| R3
Du bist bei Commit C, aber GitHub hat in der Zwischenzeit Commit X bekommen. Git weiß nicht, wie es diese beiden zusammenbringen soll, ohne dass du es ihm sagst.
Die Lösung: Erst Pull, dann Push
Der Standard-Workflow in dieser Situation ist einfach:
- Hole die Remote-Änderungen mit
git pull - Löse eventuelle Konflikte (falls dieselben Stellen geändert wurden)
- Pushe dann erneut deine kombinierten Änderungen
In PhpStorm durchführen
-
Pull durchführen
Gehe zu Git → Pull (oder drücke
Ctrl+Tbzw.Cmd+Tauf macOS). PhpStorm zeigt dir ein Dialogfenster, in dem du den Remote-Branch auswählen kannst – normalerweise ist das schon korrekt voreingestellt. -
Ergebnis prüfen
Nach dem Pull gibt es drei mögliche Szenarien:
- Alles automatisch zusammengeführt: Git konnte die Änderungen problemlos kombinieren. Du siehst eine Erfolgsmeldung und kannst direkt pushen.
- Merge-Commit erstellt: Wenn die Änderungen in unterschiedlichen Dateien oder an unterschiedlichen Stellen waren, erstellt Git automatisch einen „Merge-Commit", der beide Historien zusammenführt.
- Konflikte aufgetreten: Wenn dieselben Zeilen in derselben Datei geändert wurden, musst du manuell entscheiden, welche Version gilt (siehe unten).
-
Push erneut versuchen
Nach erfolgreichem Pull gehst du zu Git → Push (oder
Ctrl+Shift+Kbzw.Cmd+Shift+K). Jetzt sollte der Push funktionieren.
Was passiert beim Pull genau?
Hinter den Kulissen macht git pull eigentlich zwei Dinge:
flowchart LR
A["git pull"] --> B["git fetch\n- Aenderungen herunterladen"]
B --> C["git merge\n- Aenderungen integrieren"]
- Fetch: Lädt die neuen Commits vom Server herunter, ohne sie direkt in deinen Branch zu integrieren.
- Merge: Führt die heruntergeladenen Commits mit deinem lokalen Branch zusammen.
Nach einem erfolgreichen Pull sieht deine Historie so aus:
flowchart TB
A["Commit A"] --> B["Commit B"]
B --> C["Commit C\n- deine Arbeit"]
B --> X["Commit X\n- andere Aenderung"]
C --> M["Merge-Commit\n- beide zusammengefuehrt"]
X --> M
Wenn Konflikte auftreten
Falls du und die andere Änderung (oder du selbst vom anderen Computer) dieselben Codezeilen bearbeitet habt, kann Git nicht automatisch entscheiden, welche Version richtig ist. PhpStorm zeigt dir dann den Merge-Dialog:
-
Konflikt-Benachrichtigung
PhpStorm meldet, dass Konflikte aufgetreten sind und fragt, ob du sie lösen möchtest. Klicke auf Merge oder Resolve.
-
Drei-Spalten-Editor nutzen
Du siehst drei Spalten nebeneinander:
- Links: Deine lokale Version
- Rechts: Die Version von GitHub
- Mitte: Das Ergebnis, das du erstellen möchtest
Mit den Pfeiltasten (
>>und<<) oder durch direktes Bearbeiten in der Mitte kannst du entscheiden, welche Änderungen übernommen werden. -
Konflikt als gelöst markieren
Sobald du fertig bist, klickst du auf Apply. PhpStorm markiert den Konflikt als gelöst.
-
Merge-Commit abschließen
Nachdem alle Konflikte gelöst sind, fordert PhpStorm dich auf, den Merge-Commit abzuschließen. Bestätige dies, und dann kannst du pushen.
Alternative: Rebase statt Merge
Neben dem klassischen Merge gibt es noch eine andere Strategie namens Rebase. Dabei werden deine lokalen Commits so umgeschrieben, als hättest du sie nach den Remote-Änderungen gemacht. Das ergibt eine lineare Historie ohne Merge-Commits:
flowchart LR
A["Commit A"] --> B["Commit B"] --> X["Commit X\n- von GitHub"] --> C2["Commit C\n- deine Arbeit, neu aufgesetzt"]
Rebase in PhpStorm aktivieren
- Gehe zu Git → Pull
- Im Pull-Dialog aktiviere die Option Rebase (statt Merge)
- Führe den Pull durch
Oder du stellst es als Standard ein unter Settings → Version Control → Git → Update Method → Rebase.
Wann Rebase, wann Merge?
| Situation | Empfehlung |
|---|---|
| Du arbeitest allein oder an einem Feature-Branch | Rebase – für eine saubere, lineare Historie |
| Mehrere Personen arbeiten am selben Branch | Merge – sicherer, da keine Historie umgeschrieben wird |
| Du hast den Branch bereits gepusht und andere arbeiten damit | Merge – Rebase würde deren Arbeit durcheinanderbringen |
| Du bist unsicher | Merge – es ist die sichere Standardoption |
Tipps zur Vermeidung dieser Situation
Auch wenn die Lösung nicht schwer ist, kannst du dir das Leben leichter machen:
- Regelmäßig pullen: Bevor du anfängst zu arbeiten, ziehe dir erst die neuesten Änderungen. Das reduziert die Wahrscheinlichkeit von Konflikten.
- Häufig pushen: Je öfter du deine Änderungen hochlädst, desto kleiner sind die Unterschiede zwischen lokal und remote.
- Kommunikation im Team: Wenn mehrere Personen an denselben Dateien arbeiten, sprecht euch ab, wer wann welche Bereiche bearbeitet.
- Feature-Branches nutzen: Arbeite in separaten Branches statt direkt auf
main. So vermeidest du Konflikte mit anderen, bis du bewusst mergst.
Zusammenfassung
| Problem | Lösung |
|---|---|
| Push wird abgelehnt wegen neuerer Remote-Commits | git pull durchführen, dann erneut pushen |
| Pull führt zu Konflikten | Konflikte in PhpStorm mit dem Drei-Spalten-Editor lösen |
| Du möchtest eine lineare Historie | Rebase statt Merge beim Pull verwenden |
Der Ablauf ist also immer: Pull → (Konflikte lösen) → Push. Mit etwas Routine wird das schnell zur Gewohnheit, und du wirst sehen, dass diese Situationen viel weniger beängstigend sind, als sie anfangs wirken. 😊