Interaktiver Rebase
Ziel
- In diesem Projekt lernen Sie den Umgang und die Möglichkeiten des interaktiven Rebase.
Hilfsmittel
- Versuchen Sie zuerst, die unten stehenden Aufgaben mit Hilfe der Folien und des Cheatsheets zu lösen
- Sollten Sie dabei Probleme haben, finden Sie bei jeder Aufgabe einen ausklappbaren Block, in dem der Lösungsweg beschrieben wird.
Vorbereitung
Suchen Sie im Gitlab das Projekt interactive-rebase
und klonen Sie es:
-
Suchen Sie im Gitlab links oben unter
Menu->Projects
nach dem Projektinteractive-rebase
. Wenn Sie das Projekt hier nicht direkt sehen, finden Sie es unterYour projects
. -
Kopieren Sie den Link unter
Clone with HTTPS
. -
Gehen Sie zurück ins Terminal in der VSCode Instanz.
-
Stellen Sie sicher, dass Sie sich in
/root/workspace
befinden. Verlassen Sie etwaige vorherige Repositories mitcd ..
(alternativ können Sie mitcd /root/workspace
direkt in das Verzeichnis wechseln). -
Klonen Sie das Projekt mit
git clone {URL}
.
Aufgabe 1
Ein Entwickler hat auf dem Branch feature-1
ein einfaches Hello-World Python-Script
geschrieben. Die Aufgabe ist es, diesen Feature-Branch in den main
-Branch zu integrieren.
Deshalb soll der Feature-Branch zunächst aufgeräumt werden. Dafür sollen alle Commits
in einen einzelnen 'gesquashed' werden.
-
Wechseln Sie auf den Branch
feature-1
. -
Schauen Sie sich die Historie an, um zu sehen, was getan wurde.
-
Nutzen Sie den interaktiven Rebase, sodass nur noch ein Commit mit genau einer sinnvollen Commit-Nachricht übrig bleibt.
-
Überprüfen Sie die Historie, um zu sehen, ob alles so ist, wie Sie es erwarten.
-
Mergen Sie
feature-1
in denmain
-Branch ohne fast-forward.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Teil:
- Wechseln Sie in den
interactive-rebase
Ordner. - Führen Sie zum Wechseln des Branches
git switch feature-1
aus, um in den bestehenden Branch zu wechseln.
- Wechseln Sie in den
- Teil:
- Schauen Sie sich den Dateibrowser an. Es gibt dort eine Datei
hello-world.py
. - Schauen Sie sich die Historie mit
git log --graph
an. - Schauen Sie sich einzelne Commits mit
git show HEAD
bzwgit show HEAD~1
undgit show HEAD~2
an.
- Schauen Sie sich den Dateibrowser an. Es gibt dort eine Datei
- Teil:
- Das Feature enthält insgesamt 3 Commits, die wir nun in einen Einzigen vereinen möchten.
Führen Sie deshalb
git rebase -i HEAD~3
aus. - Es erscheint eine Liste mit den Commits. Da wir nur noch einen Commit erhalten möchten, ändern wir die Liste zu:
So werden die letzten beiden Commits in den Ersten integriert.
pick cf3b080 Add file where the feature should be implemented squash b88e281 Adds hello-world functionality squash 1d6f112 Fit typo in hello-world output
- Sie erhalten nun eine Liste mit den kombinierten Commit-Nachrichten. Löschen Sie alle nicht auskommentierten Zeilen und geben Sie eine sinnvolle Nachricht ein.
- Speichern und schließen Sie die Commit-Nachricht.
- Das Feature enthält insgesamt 3 Commits, die wir nun in einen Einzigen vereinen möchten.
Führen Sie deshalb
- Teil:
- Überprüfen Sie die Historie um zu sehen, ob alles so ist, wie Sie es erwarten.
Führen Sie dazu
git log --graph
aus.
- Überprüfen Sie die Historie um zu sehen, ob alles so ist, wie Sie es erwarten.
Führen Sie dazu
- Teil:
- Führen Sie
git switch main
und danngit merge feature-1
aus.
- Führen Sie
Aufgabe 2
-
Nutzen Sie
git reflog
um ihren interaktiven Rebase rückgängig zu machen. Suchen Sie dazu im Reflog die Zeilerebase -i (start)
. Hier wurde der Rebase gestartet. Die Zeile darunter ist die Referenz zum Zustand davor. -
Führen Sie ein
git reset
aus um wieder auf diesen Zustand zu gelangen.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Teil:
- Führen Sie
git reflog
aus. - Suchen Sie die Zeile mit dem Inhalt
rebase -i (start)
. Hier wurde der Rebase gestartet. - Die Zeile darunter ist die Referenz zum Zustand davor. Merken Sie sich die angegebene Referenz (
HEAD@{??}
).
- Führen Sie
- Teil:
- Führen Sie
git reset --hard HEAD@{??}
aus. Ersetzen Sie dabei??
mit der Zahl aus dem Reflog. - Führen Sie
git log --graph
aus. Sie sind nun wieder auf dem Ausgangszustand.
- Führen Sie
Aufgabe 3
Falls noch Zeit übrig ist können Sie den feature-2
-Branch auschecken und
anschauen. Er enthält ein einfaches Kommandozeilentool.
-
Wechseln Sie auf den Branch
feature-2
. -
Erstellen Sie einen neuen Branch, sodass Sie nach einem Rebase einfach auf diesen Stand zurück springen können.
-
Schauen Sie sich die Historie an.
-
Versuchen Sie unterschiedliche Varianten von
rebase -i
aus.