Git-Chaos

2012-12-16 12:28

Ich hatte schon die Befürchtung, dass ich mich mit git in eine Situation gebracht hatte, die sich nur noch durch das erneute Auschecken und manuelles Abgleichen der Dateien ließ. Doch ich lag falsch.

Aber erst mal von Anfang an, was war passiert? Auf Github habe ich ein Repository geforkt, diesen Fork auf meinen Rechner geclont und munter drauf los entwickelt - im master Branch. Einige Commits später sah das Ergebnis so aus, dass ich es zurück pushen wollte. Aber die Zeit steht nicht still, das Original Repository hat in der Zwischenzeit weitere Commits bekommen, die ich natürlich bei mir integrieren wollte. Und da stand ich nun. Wie integriere ich beide Änderungen in mein Repository auf Github, ohne die Changes zu verlieren?

Letztlich habe ich die Situation wie folgt gemeistert:

  • Lokal einen neuen Branch erstellen und in diesen Wechseln.
  • Diesen Branch auf die letzte Version, welche einen Commit des Original-Repos darstellt, zurücksetzen (git checkout <revision>).
  • Das Original-Repo als Externes Repo hinzufügen, anschließend die aktuelle Version fetchen und mergen. Das Ziel ist in diesem Branch den gleichen Stand wie das Original-Repo zu haben. Kleiner Tipp: zum Merge git mergetool verwenden.
  • Nun kann ich meinen lokalen master auf meinen lokalen Branch mit dem aktuellen Stand des Original rebasen.

Nun hatte ich einen Stand, den ich für einen Push nutzen kann. Aber git weigerte sich diesen zu akzeptieren. Der Trick war nun dies mit -f zu erwzingen (Danke für den Hinweis, Pat).

Gelernt habe ich hieraus zweierlei:

  1. Ich weiss nun, wie ich mich aus einer solchen Situation "befreien" kann.
  2. All das wäre mit Feature Branches vermutlich nicht passiert! Git macht das Arbeiten damit sehr, sehr einfach. Nutzt sie, denn es macht euer Leben einfacher.

PS: Meine Command History für git sah ungefähr so aus (eventuell mal für irgendwen hilfreich):

 git branch original_nikola
 git checkout original_nikola
 git log
 git reset 62067c080295a9b865b14479ec76101431776545
 git remote add nikola_original https://github.com/ralsina/nikola.git
 git fetch nikola_original
 git merge
 git mergetool
 git commit
 git rebase original_nikola master
 git log
 git push -f origin

Tags: