Skip to main content

GIT Merge bei einem reverteten Merge

Habt ihr den Titel verstanden? Ja, das ist verwirrend. Hier die Erklärung:

Für ein Uni Projekt wurde von einem GIT Projekt (nennen wir es “A”) ein “Fork” (“B”) erstellt, auf dem alle Änderungen commitet werden. Da GIT dezentral ist, hat natürlich jeder Projektteilnehmer lokal ein GIT Repository (“C”). Die Commits von C werden ständig auf B gepusht und von B auf C gepullt.

Ab und zu möchte man nun die Änderungen aus A auch in B und C haben. Hierzu fügt man in C das Repository A als Remote hinzu (sofern noch nichts geschehen):

git remote add $remotename $remoteurl

Nun kann man einfach die Änderungen von A bei C pullen (natürlich sollte C vorher alle Commits von B haben) und dann auf B pushen:

git pull $remotename master
git push orgin master

Zwischen den beiden Befehlen kann es passieren, dass der Merge nicht automatisch durchgeführt werden kann, sondern es müssen ein paar Konflikte gelöst werden. Entweder macht man dies manuell oder benutzt beispielsweise:

git mergetool

Nachdem man dort die Konflikte beseitigt hat, fügt man diese Dateien per

git add $dateiname

zum Tracking hinzu. Am Ende committet man die Änderungen wie gewohnt per

git commit

Nun kann es aber passieren, dass in A beispielsweise der Code gerade kaputt ist, die Probleme nicht beseitigt bekommt und man lieber doch den Stand von B haben möchte. Hierzu verwendet man

git reset --hard origin/master

Nun kann es aber passieren, dass man die Commits von A in C gemergt und sofort auf B gepusht hat, aber erst danach feststellt, dass der Code in A kaputt war. Die sauberste Lösung hierbei ist es, den Merge Commit zu reverten. Dabei wird ein neuer Commit gemacht, bei dem alle Änderungen zurückgeändert werden:

git revert -m 1 $commit\_id

Natürlich muss man das dann noch auf B pushen.

Nach der langen Erklärung bin ich nun endlich bei meinem Problem angelangt: Zwischenzeitlich wurden die Fehler bei A gefixt, aber auch weitere Änderungen bei B und C durchgeführt. Wenn man nun wie oben von A pullt, dann gibt es Probleme beim Lösen der Konflikte. Dort werden dann Stellen als geändert markiert, die man selber gar nicht angefasst hat, sondern noch vom missglückten Merge bzw. dem Revert sind. Den Merge brechen wir erst einmal ab:

git merge --abort

Die Lösung des eben beschriebenen Problems ist eigentlich ziemlich simpel, wenn man sie erst einmal sieht: Man reverted einfach den Revert des Merges. Haha. ^^ Also per “git log” den Revert raussuchen und den Revert reverten:

git revert $commit\_id

Hier kann es passieren, dass die ersten Konflikte auftreten, die aber je nach eigenen Änderungen relativ einfach gefixt werden können (so vorgehen wie oben: git add und git commit). Dann kann man wie oben von A pullen. Dort sollten die Konflikte einfacher zu lösen sein. Danach natürlich noch zu B pushen.

Übrigens sollte man nach jedem Merge schauen, ob noch alles funktioniert, ehe man diesen pusht. ;)