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+T bzw. Cmd+T auf 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+K bzw. 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. 😊