faecher:informatik:oberstufe:git:versionsgeschichte:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:git:versionsgeschichte:start [24.09.2024 08:43] – [Was ist HEAD?] Frank Schiebelfaecher:informatik:oberstufe:git:versionsgeschichte:start [15.10.2024 07:53] (aktuell) – [Die Abfolge der Commits betrachten] Frank Schiebel
Zeile 6: Zeile 6:
  
 <code bash> <code bash>
-frank@pike:~/tagebuch$ git log  +max@pc:~/tagebuch$ git log 
- +commit d7aaac47e7e68c5dcbacb4f1b8fa5a1ba4377348 (HEAD -> main) 
-commit 022bdbc3574686f655aaadfefc04a79cf6b5a1a8 (HEAD -> main) +Author: Max Mustermann <max@example.org
-Author: Frank Schiebel <codeberg@ua25.de+Date:   Wed Oct 2 09:12:06 2024 +0200
-Date:   Mon Sep 23 17:32:56 2024 +0200+
  
     Mittagessen hinzugefügt     Mittagessen hinzugefügt
  
-commit a5c28ad5b5b39b1cb862743fd7cfec75d1269b02 +commit adc15c234c635a79a1cf90d10199ed6e42b47954 
-Author: Frank Schiebel <codeberg@ua25.de+Author: Max Mustermann <max@example.org
-Date:   Mon Sep 23 17:31:34 2024 +0200+Date:   Wed Oct 2 09:11:12 2024 +0200
  
     fruehstueck.txt geändert     fruehstueck.txt geändert
  
-commit 2c70b7517bcf0217c62b93336de038f166225c6a +commit f9353d6278296bd173d3760e3b95e743208650e7 
-Author: Frank Schiebel <codeberg@ua25.de+Author: Max Mustermann <max@example.org
-Date:   Sun Oct 29 20:32:50 2023 +0100+Date:   Wed Oct 2 08:58:45 2024 +0200
  
-    Fruestück+    Frühstück in Datei 'fruehstueck.txt' hinzugefügt
  
-commit 9ee8f8bfdd6c532fee7d693c9d4431e22f455f0d +commit 28ec5a71bc2bce75bbbbfe5f2d336fe49b3642fa 
-Author: Frank Schiebel <codeberg@ua25.de+Author: Max Mustermann <max@example.org
-Date:   Sun Oct 29 20:14:11 2023 +0100+Date:   Wed Oct 2 08:35:53 2024 +0200
  
-    Aufstehen!+    Erster Commit: aufstehen.txt angelegt
 </code>  </code> 
  
Zeile 37: Zeile 36:
   * Die Hashsumme des Commits (die ersten 7 Zeichen identifizieren einen Commit eindeutig)   * Die Hashsumme des Commits (die ersten 7 Zeichen identifizieren einen Commit eindeutig)
   * Der Autor   * Der Autor
-  * Das Datum, an dem der Snapshot erstellt wurde+  * Datum und Zeitzu der der Snapshot erstellt wurde
  
 Das ganz benötigt recht viel Platz, man kann die Ausgabe des Logs umfangreich anpassen, zum Beispiel so: Das ganz benötigt recht viel Platz, man kann die Ausgabe des Logs umfangreich anpassen, zum Beispiel so:
  
 <code bash> <code bash>
-frank@pike:~/tagebuch$ git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %Creset' --abbrev-commit +max@pc:~/tagebuch$ git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %Creset' --abbrev-commit 
-022bdbc - (HEAD -> main) Mittagessen hinzugefügt (vor 2 Stunden)  +d7aaac4 - (HEAD -> main) Mittagessen hinzugefügt (2024-10-02 09:12:06 +0200)  
-a5c28ad - fruehstueck.txt geändert (vor 2 Stunden)  +adc15c2 - fruehstueck.txt geändert (2024-10-02 09:11:12 +0200)  
-2c70b75 Fruestück (vor 11 Monaten)  +f9353d6 Frühstück in Datei 'fruehstueck.txt' hinzugefügt (2024-10-02 08:58:45 +0200)  
-9ee8f8b Aufstehen! (vor 11 Monaten+28ec5a7 Erster Commit: aufstehen.txt angelegt (2024-10-02 08:35:53 +0200)
 </code> </code>
  
-Das sieht zwar nett aus iist aber ein wenig schwer zu merkengit ermöglicht es darum, für solche individuellen Befehle soganennte **Aliase** anzulegenauf folgende Weise kann man einen eigenen "git-Befehl" anlegen, der die Versionsgeschichte hübsch ausgibt.+Das sieht zwar nett aus, es ist aber ein wenig schwer, sich all die Optionen zu merkengit ermöglicht es darum, für solche individuellen Befehle sogenannte **Aliase** anzulegen -- auf die folgende Weise kann man einen eigenen "git-Befehl" anlegen, der die Versionsgeschichte hübsch ausgibt.
  
 <code bash> <code bash>
-frank@pike:~/tagebuch$ git config alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %Creset' --abbrev-commit" +max@pc:~/tagebuch$ git config alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %Creset' --abbrev-commit" 
-frank@pike:~/tagebuch$ git lg +max@pc:~/tagebuch$ git lg 
-022bdbc - (HEAD -> main) Mittagessen hinzugefügt (vor 2 Stunden)  +d7aaac4 - (HEAD -> main) Mittagessen hinzugefügt (vor 6 Minuten)  
-a5c28ad - fruehstueck.txt geändert (vor 2 Stunden)  +adc15c2 - fruehstueck.txt geändert (vor 7 Minuten)  
-2c70b75 Fruestück (vor 11 Monaten)  +f9353d6 Frühstück in Datei 'fruehstueck.txt' hinzugefügt (vor 19 Minuten)  
-9ee8f8b Aufstehen! (vor 11 Monaten)+28ec5a7 Erster Commit: aufstehen.txt angelegt (vor 42 Minuten
 </code> </code>
  
-===== Änderungen zwischen Commits ansehen =====+ 
 + 
 +---- 
 +{{:aufgabe.png?nolink  |}} 
 +=== (A1) ==
 + 
 +  * Was hat sich zwischen der Ausgabe des ersten log-Befehls und der, mit dem angelegten Alias verändert? 
 +  * Mit ''git log %%--%%help'' kann man sich die Hilfe zu ''git log'' anzeigen lassen, das funktioniert auch mit anderen git-Befehlen. Kannst du die Platzhalter für die Ausgabe mit ''%%-%%-pretty=format:'' in der Hilfe finden?
  
 ===== Zeitmaschine ===== ===== Zeitmaschine =====
Zeile 67: Zeile 73:
  
 <callout type="warning" title="Wichtig"> <callout type="warning" title="Wichtig">
-Zunächst ist es sehr empfehlenswert, dass man sich nur dann zu einem älteren Stand der Dateien zurückkehrt, wenn das Arbeitsverzeichnis **keine nicht committeten Änderungen** beinhaltet. ("Sauberes Arbeitsverzeichnis")+Zunächst ist es sehr empfehlenswert, dass man nur dann zu einem älteren Stand der Dateien zurückkehrt, wenn das Arbeitsverzeichnis **keine nicht committeten Änderungen** beinhaltet. ("Sauberes Arbeitsverzeichnis")
 </callout> </callout>
  
-Wir befinden uns aktuell also in einem sauberen Arbeitsverzeichnis, ''git status'' zeigt also keine unbearbeitetn Änderungen:+Wir befinden uns aktuell also in einem sauberen Arbeitsverzeichnis, ''git status'' zeigt also keine unbearbeiteten Änderungen:
  
 <code bash> <code bash>
-frank@pike:~/tagebuch$ git status+max@pc:~/tagebuch$ git status
 Auf Branch main Auf Branch main
 nichts zu committen, Arbeitsverzeichnis unverändert nichts zu committen, Arbeitsverzeichnis unverändert
 </code> </code>
 +
 Jetzt können wir mit unserem neuen Alias ''git lg'' die Versionsgeschichte ansehen: Jetzt können wir mit unserem neuen Alias ''git lg'' die Versionsgeschichte ansehen:
  
 <code bash> <code bash>
-frank@pike:~/tagebuch$ git lg +max@pc:~/tagebuch$ git lg 
-022bdbc - (HEAD -> main) Mittagessen hinzugefügt (vor 16 Stunden)  +d7aaac4 - (HEAD -> main) Mittagessen hinzugefügt (vor 6 Minuten)  
-a5c28ad - fruehstueck.txt geändert (vor 16 Stunden)  +adc15c2 - fruehstueck.txt geändert (vor 7 Minuten)  
-2c70b75 Fruestück (vor 11 Monaten)  +f9353d6 Frühstück in Datei 'fruehstueck.txt' hinzugefügt (vor 19 Minuten)  
-9ee8f8b Aufstehen! (vor 11 Monaten+28ec5a7 Erster Commit: aufstehen.txt angelegt (vor 42 Minuten
 </code> </code>
  
-Man kann den Zustand des Arbeitsverzeichnisses aus den Commits wieder herstellen. Es ist also möglich, das Arbeitsverzeichnis in genau den Zustand zurückzuversetzen, in dem es beim Commit ''2c70b75 Fruestück'' vor 11 Monaten war -- oder eben zu jedem anderen Zeitpunkt, an dem ich zuvor den Zustand des Arbeitsverzeichnisses als Snapshot commitet habe. Der Befehl dazu ist ''git checkout <Commit-Hash>'':+Man kann den Zustand des Arbeitsverzeichnisses aus den Commits wieder herstellen. Es ist also möglich, das Arbeitsverzeichnis in genau den Zustand zurückzuversetzen, in dem es beim Commit ''f9353d6 Frühstück in Datei 'fruehstueck.txt' hinzugefügt'' vor 19 Minuten war -- oder eben zu jedem anderen Zeitpunkt, an dem ich zuvor den Zustand des Arbeitsverzeichnisses als Snapshot commitet habe. Der Befehl dazu ist ''git checkout <Commit-Hash>'':
  
 <code bash> <code bash>
-frank@pike:~/tagebuch$ git checkout 2c70b75 +max@pc:~/tagebuch$ git checkout f9353d6  
-Hinweis: Wechsle zu '2c70b75'.+Hinweis: Wechsle zu 'f9353d6'.
  
 Sie befinden sich im Zustand eines 'losgelösten HEAD'. Sie können sich Sie befinden sich im Zustand eines 'losgelösten HEAD'. Sie können sich
Zeile 111: Zeile 118:
 'advice.detachedHead' auf 'false' setzen. 'advice.detachedHead' auf 'false' setzen.
  
-HEAD ist jetzt bei 2c70b75 Fruestück+HEAD ist jetzt bei f9353d6 Frühstück in Datei 'fruehstueck.txt' hinzugefügt
 </code> </code>
  
 Was ist denn jetzt passiert? Was bedeutet diese komische Meldung? Was ist ein ''lösgelöster HEAD''((Auf Englisch ''detached HEAD''))? Was ist denn jetzt passiert? Was bedeutet diese komische Meldung? Was ist ein ''lösgelöster HEAD''((Auf Englisch ''detached HEAD''))?
  
-**(1)** Zunächst einmal befinden sich die Dateien im Verzeichnis jetzt in dem Zustand, in dem sie waren, als der Commit ''2c70b75'' erstellt wurde. Überprüfe das! +**(1)** Zunächst einmal befinden sich die Dateien im Verzeichnis jetzt in dem Zustand, in dem sie waren, als der Commit ''f9353d6'' erstellt wurde. Überprüfe das! 
 ++++ Lösung | ++++ Lösung |
 Man erkennt, dass die Datei mitagessen.txt noch nicht vorhanden war, und auch der Inhalt der anderen Dateien entspricht dem Stand zu dem Zeitpunkt als der Commit gemacht wurde. Man erkennt, dass die Datei mitagessen.txt noch nicht vorhanden war, und auch der Inhalt der anderen Dateien entspricht dem Stand zu dem Zeitpunkt als der Commit gemacht wurde.
 <code bash> <code bash>
-frank@pike:~/tagebuch$ ls+max@pc:~/tagebuch$ ls
 aufstehen.txt  fruehstueck.txt  mittagessen.txt aufstehen.txt  fruehstueck.txt  mittagessen.txt
-frank@pike:~/tagebuch$ git checkout 2c70b75 +max@pc:~/tagebuch$ git checkout f9353d6 
-Hinweis: Wechsle zu '2c70b75'.+Hinweis: Wechsle zu 'f9353d6'.
 [... Meldunden zum losgelösten HEAD ausgelassen ...] [... Meldunden zum losgelösten HEAD ausgelassen ...]
-HEAD ist jetzt bei 2c70b75 Fruestück+HEAD ist jetzt bei f9353d6 Frühstück in Datei 'fruehstueck.txt' hinzugefügt
 frank@pike:~/tagebuch$ ls frank@pike:~/tagebuch$ ls
 aufstehen.txt  fruehstueck.txt aufstehen.txt  fruehstueck.txt
Zeile 134: Zeile 141:
 ++++ Lösung | ++++ Lösung |
 <code> <code>
-frank@pike:~/tagebuch$ git lg +max@pc:~/tagebuch$ git lg 
-2c70b75 - (HEAD) Fruestück (vor 11 Monaten)  +f9353d6 - (HEAD) Frühstück in Datei 'fruehstueck.txt' hinzugefügt (vor 11 Stunden)  
-9ee8f8b Aufstehen! (vor 11 Monaten+28ec5a7 Erster Commit: aufstehen.txt angelegt (vor 11 Stunden)
 </code> </code>
  
-Es fällt auf, dass die Commits die neuer sind als ''2c70b75'' irgendwie "verschwunden sind"??!!+Es fällt auf, dass die Commits die neuer sind als ''f9353d6'' irgendwie "verschwunden sind"??!!
 ++++ ++++
  
-Git zeigt mit ''git log'' standardmäßg die Versionsgeschichte an, die zu dem Commit geführt hatm den man im Arbeitsverzeichnis gerade angezeigt bekommt. Um git zu veranlassen, die **gesamte** Versionsgeschichte anzuzeigen, muss man dem Befehl ''git log'' die Option ''%%--all%%'' mitgeben.+Git zeigt mit ''git log'' standardmäßg die Versionsgeschichte an, die zu dem Commit geführt hat den man im Arbeitsverzeichnis gerade angezeigt bekommt. Um git zu veranlassen, die **gesamte** Versionsgeschichte anzuzeigen, muss man dem Befehl ''git log'' die Option ''%%--all%%'' mitgeben.
  
 <code bash> <code bash>
-frank@pike:~/tagebuch$ git lg --all +max@pc:~/tagebuch$ git lg --all 
-022bdbc - (main) Mittagessen hinzugefügt (vor 16 Stunden)  +d7aaac4 - (main) Mittagessen hinzugefügt (vor 10 Stunden)  
-a5c28ad - fruehstueck.txt geändert (vor 16 Stunden)  +adc15c2 - fruehstueck.txt geändert (vor 10 Stunden)  
-2c70b75 - (HEAD) Fruestück (vor 11 Monaten)  +f9353d6 - (HEAD) Frühstück in Datei 'fruehstueck.txt' hinzugefügt (vor 11 Stunden)  
-9ee8f8b Aufstehen! (vor 11 Monaten+28ec5a7 Erster Commit: aufstehen.txt angelegt (vor 11 Stunden
 </code> </code>
  
 ==== Was ist HEAD? ==== ==== Was ist HEAD? ====
  
-Man muss sich die Versionsgeschichte als (verzweigte) Abfolge von Commits vorstellen, die jeweils durch ihre Commit-ID identifiziert werden. Manche Commit-IDs bekommen Namen: **Diese benannten Commits sind "Branches" und  "Tags".* Man spricht von "Referenzen auf Commits".+Man muss sich die Versionsgeschichte als (verzweigte) Abfolge von Commits vorstellen, die jeweils durch ihre Commit-ID identifiziert werden. Manche Commit-IDs bekommen **Namen**: **Diese benannten Commits sind "Branches" und  "Tags".** Man spricht von "Referenzen auf Commits".
  
 {{ :faecher:informatik:oberstufe:git:versionsgeschichte:head.png?30|}} {{ :faecher:informatik:oberstufe:git:versionsgeschichte:head.png?30|}}
-Eine besondere Referenz ist ''HEAD''. HEAD springt in gewisser Weise in der Versiongeschichte herum, und zeigt immer auf denjenigen Commit, der im Arbeitsverzeichniss gerade "ausgecheckt" ist. +Eine besondere Referenz ist ''HEAD''. HEAD springt in gewisser Weise in der Versionsgeschichte herum, und zeigt immer auf denjenigen Commit, der im Arbeitsverzeichniss gerade "ausgecheckt" ist. 
  
 Der Zustand in unserem Beispiel ist "in bunt" folgender: Der Zustand in unserem Beispiel ist "in bunt" folgender:
  
-{{ :faecher:informatik:oberstufe:git:versionsgeschichte:commits.drawio.png?3 |}}+{{ :faecher:informatik:oberstufe:git:versionsgeschichte:commits.drawio.png|}}
  
-Es gibt insgesamt also 4 Commits, das Arbeitsverzeichnis ist im Zustand von Commit ''2c70b75'' darum zeigt ''HEAD'' auf diesem Commit. Außerdem gibt es den Branch ''main'', das ist eine benannte Referenz auf den neuesten Commit mit der ID ''022bdbc''+Es gibt insgesamt also 4 Commits, das Arbeitsverzeichnis ist im Zustand von Commit ''f9353d6'' darum zeigt ''HEAD'' auf diesem Commit. Außerdem gibt es den Branch ''main'', das ist eine benannte Referenz auf den neuesten Commit mit der ID ''d7aaac4''
  
-Um die Situation des "Lösgelösten HEAD" zu verstehen, muss man sich nun klar machen, dass der Commit ''a5c28ad'' auf dem Commit ''2c70b75'' (auf den derzeit HEAD zeigt) basiert. Wenn man im derzeitigen Zustand des Arbeitsverzeichnisses etwas ändert, bekomme man ein Problem, da diese Beziehung ''a5c28ad'' basiert auf ''2c70b75'' nicht mehr eindeutig interpretierbar ist: Wo sortiert sich das ausgehend von  ''2c70b75'' veränderte Arbeitsverzeichnis in die Versionsgeschichte ein? +Um die Situation des "Lösgelösten HEAD" zu verstehen, muss man sich nun klar machen, dass der Commit ''adc15c2'' auf dem Commit ''f9353d6'' (auf den derzeit HEAD zeigt) basiert. Wenn man im derzeitigen Zustand des Arbeitsverzeichnisses etwas ändert, bekommt man ein Problem, da diese Beziehung ''adc15c2'' basiert auf ''f9353d6'' nicht mehr eindeutig interpretierbar ist: Wo sortiert sich der ausgehend von ''f9353d6'' veränderte Zustand des Arbeitsverzeichnisses in die Versionsgeschichte ein wenn man einen neuen Commit erzeugt
  
-Diese Situation wird als "detached HEAD" oder losgelöster HEAD bezeichnet. Man kann sich umsehen und Dinge ändern, wenn man anschließend jedoch wieder in der Versiongeschichte "springt" gehen diese Änderungen verloren. +Diese Situation wird als "detached HEAD" oder losgelöster HEAD bezeichnet. Man kann sich umsehen und Dinge ändern, wenn man anschließend jedoch wieder in der Versiongeschichte "springt" gehen diese Änderungen verloren oder landen in einem Commit der "losgelöst" ist, also nicht in einem Branch innerhalb der Versionsgeschichte enthalten ist - und das sollte man vermeiden, da man solche Commits später nur schwer wiederfinden kann.
  
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A2) ===
  
 +  * Wechsle mit dem Befehl ''git checkout <Commit-ID>'' zu unterschiedlichen Versionen deines Tagebuchs und schau dich um, ohne etwas zu ändern. Lasse dir jeweils die vollständige Versionsgeschichte anzeigen und beobachte, wie der HEAD in der Versionsgeschichte springt.
 +  * Wechsle zur Commit ID des neuesten Commits. Wechsle dann zum Branch ''main'' indem du ''main'' auscheckst. Verhält sich git in beiden Fällen gleich?
 +  * Gehe in der Zeit zurück zu einem älteren Commit. Verändere eine Datei. Versuche wieder in der Zeit zu springen. Was passiert? 
 +  * Mit der Option ''-f'' kann man git zwingen, einen Checkout zu machen, bei dem Änderungen verloren gehen. Springe von deinem geänderten Zeitpunkt unter Datenverlust zurück zu ''main'' und dann wieder zu dem Commit den du zuvor geändert hattest. Überprüfe, dass deine Änderungen tatsächlich verloren gegangen sind.
 +  * Wir wissen ja, dass man sich Änderungen am einfachsten merkt, wenn man einen Commit erstellt. Ändere erneut eine Datei und erstelle einen neuen Commit, springe dann zurück zu ''main''. Was passiert jetzt? Warum ist das ungünstig? 
    
- +++++ Demonstration der Aufgabenstellung | 
 +<html> 
 +<iframe title="Git Zeitmaschine - Demo zur Aufgabe" src="https://tube.schule.social/videos/embed/331c768e-c7fa-45ff-abf3-d0d564976f5f" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups allow-forms" width="560" height="315" frameborder="0"></iframe> 
 +</html> 
 + 
 +https://tube.schule.social/w/7j4D8jKaiHZTDKAMGfmv1c 
 + 
 +++++ 
 + 
 +Mit dem letzten Befehl ''git branch blaubeerfruehstueck f98e6d1'' im Video wurde ein neuer Branch angelegt. In der Ausgabe von ''git log %%--all%%'' kann man das erkennen - es gibt im Zeitverlauf jetzt eine **Verzweigung**. 
 + 
 +{{ :faecher:informatik:oberstufe:git:versionsgeschichte:2024-10-07_19-24.png |}}
  • faecher/informatik/oberstufe/git/versionsgeschichte/start.1727167408.txt.gz
  • Zuletzt geändert: 24.09.2024 08:43
  • von Frank Schiebel