2010-06-11 8 views
8

Nach der Arbeit für mehrere Wochen mit einem halben Dutzend verschiedener Branchen und verschmilzt zu reinigen, sowohl auf meinem Laptop und Arbeit und meinem Desktop zu Hause, meine Geschichte ein bisschen verworren geworden. Zum Beispiel habe ich gerade einen Fetch gemacht, dann Master mit Ursprung/Master zusammengeführt. Nun, wenn ich git show-Filialen tun, sieht die Ausgabe wie folgt aus:wie git rebase verwenden, um eine wechselhafte Geschichte

 
! [login] Changed domain name. 
! [master] Merge remote branch 'origin/master' 
    ! [migrate-1.9] Migrating to 1.9.1 on Heroku 
    ! [rebase-master] Merge remote branch 'origin/master' 
---- 
- - [master] Merge remote branch 'origin/master' 
+ + [master^2] A bit of re-arranging and cleanup. 
- - [master^2^] Merge branch 'rpx-login' 
+ + [master^2^^2] Commented out some debug logging. 
+ + [master^2^^2^] Monkey-patched Rack::Request#ip 
+ + [master^2^^2~2] dump each request to log 
.... 

Ich möchte dies mit einem git rebase aufzuräumen. Ich habe zu diesem Zweck einen neuen Zweig, rebase-master, erstellt und in diesem Zweig versucht git rebase < common-ancestor >. Allerdings muss ich viele Konflikte lösen, und das Endergebnis auf dem Zweig rebase-master stimmt nicht mehr mit der entsprechenden Version auf master überein, die bereits getestet wurde und funktioniert!

Ich dachte, ich eine Lösung für dieses irgendwo gesehen, aber kann es nicht mehr finden. Weiß jemand, wie man das macht? Oder werden diese verschachtelten Ref-Namen verschwinden, wenn ich anfange, nicht benötigte Zweige zu löschen, mit denen ich bereits verschmolzen bin?

Ich bin der einzige Entwickler an diesem Projekt, so gibt es sonst niemand, der betroffen sein werden.

+9

;-) Philosophische Anmerkung: Geschichte wird verschachtelt. Das ist Tatsache des Lebens. Komm darüber hinweg. –

Antwort

5

Der normale Prozess, für repos, wo Sie einen Zweig schieben zwingen können (die Remote-Geschichte durch einen neuen von einer Fütterungsmaterial erstellt lokal ersetzt), ist zu tun:

git rebase --interactive 

Aber noch einmal, das ist nur Gültig, wenn Sie als einziger aus Ihren Repos ziehen, und selbst dann müssen Sie einige Ihrer lokalen Zweige neu initialisieren, um die neuen Remote-Tracking-Einträge neu zu schreiben.

Von rebase Sitzung können Sie trimming Git commits and squash history, um die Art von Geschichte, die Sie brauchen.

+0

Siehe auch http://stackoverflow.com/questions/2719579/howto-add-a-changed-file-to-an-older-not-last-commit-in-git/2719631#2719631 – VonC

+0

umm ... es ist Vieles ist gültig, ohne von der Fernbedienung zu ziehen. Sie können einfach -I (oder im Grunde so gut wie alles) lokalen Zweig, Remote-Zweig, commit. – xenoterracide

10

Der beste Weg, um eine wechselhafte Geschichte aufzuräumen ist die Geschichte linear zu halten. Sie tun dies, indem Sie jede Art von Zusammenführung außer Schnellvorlauf vermeiden.

Der Arbeitsablauf läuft so.

$ git checkout -b foobranch 
<do stuff> 
$ git commit 
<do stuff> 
$ git commit 
... 

Wenn es Zeit ist, den Zweig in den Master zu integrieren, füge ihn nicht zusammen. Richten Sie stattdessen diesen Zweig gegen den Master neu. Das wird den Ast nicht mehr wie einen Ast aussehen lassen, sondern einfach mehr Wachstum an der Spitze des Baumes. Sie lösen Zusammenführungskonflikte während der Rebase auf.

$ git fetch origin 
$ git rebase origin/master 

Jetzt den Zweig in Master zusammenführen. Dies wird eine Schnellvorlauf-Zusammenführung sein.

$ git checkout master 
$ git merge foobranch 

Und jetzt schieben Sie die Arbeit upstream.

$ git push