Grundoperationen mit Git

Das Tagebuch

Warum kein Quellcode als Beispiel?

  • git operiert auf einer "Zeitleiste"
  • Um zu wissen, wo man sich bei der Bearbeitung von Quellcode auf der Zeitleiste befindet, muss man eine Vorstellung haben, was man programmiert - schlecht zu merken bei einem fiktiven Beispiel
  • Bei einem Tagebuch ist das klar - erst steht man auf, dann gibts Frühstück und ab in die Schule...

public class Fahrzeug
{
  String fahrzeugID;    

  /** Konstruktor für Objekte der       
  * Klasse Fahrzeug */
  public Fahrzeug(String id)
  {
      this.fahrzeugID = id;
  }
}
              
              

Tagebuch "Repository" anlegen


max@pc:~$ mkdir tagebuch
max@pc:~$ cd tagebuch/
max@pc:~$ git init
Leeres Git-Repository in /home/max/tagebuch/.git/ initialisiert        

git-Befehl:

git init

Von nun an überwacht git das Verzeichnis tagebuch auf Änderungen.

Status überprüfen

git-Befehl:

git status


max@pc:~/tagebuch$ git status
Auf Branch main

Noch keine Commits

nichts zu committen (erstellen/kopieren Sie Dateien 
und benutzen Sie "git add" zum Versionieren)
                

git speichert alle seine Infos in einem versteckten Verzeichnis .git im Arbeitsverzeichnis.


max@pc:~/tagebuch$ ls -la
insgesamt 84
drwxr-xr-x  3 max max  4096 13. Nov 19:43 .
drwxrwxrwt 29 max max  61440 13. Nov 19:43 ..
drwxr-xr-x  8 max max  4096 13. Nov 19:43 .git
                

Tagebuch schreiben...


max@pc:~/tagebuch$ nano aufstehen.txt
max@pc:~/tagebuch$ cat aufstehen.txt 
Ich habe gut geschlafen.
Um 6:20 bin ich aufgestanden.
            

Jetzt können wir beginnen unser Tagebuch zu schreiben: Lege mit einem Texteditor deiner Wahl (nicht Word oder Writer!) eine Datei aufstehen.txt an und halte fest, wie du geschlafen hast.


AA: Lege ein Verzeichnis tagebuch an und stelle es unter Versionskontrolle. Erzeuge die Datei aufstehen.txt und speichere sie.
Infos zum Nachlesen findest du im Wiki.

Wichtige git-Grundbegriffe und Abläufe

Wie kann man den aktuellen Zustand des Verzeichnisses "festhalten"?
Mit git kann man eine Abfolge von "gespeicherten" Zuständen des Repos erzeugen - ein solcher gespeicherter Zustand heißt Commit.

  • Das Arbeitsverzeichnis: Hier liegen die Dateien, mit denen man arbeitet. Das Verzeichnis wird von git "beobachtet". Die Dateien im Arbeitsverzeichnis können, müssen aber nicht versioniert werden.
  • Die Dateien, deren Änderungen man in den nächsten Snapshot übernehmen möchte, stellt man sich im Index zusammen.
  • Wenn man mit der Zusammenstellung im Index zufrieden ist, übernimmt man den Zustand aller versionierten Dateien in das Repository im Verzeichnis .git.
Editor/IDE
git add
git commit

Lokaler Workflow

Bearbeite den Abschnitt "Schritt für Schritt" und die Aufgaben auf der Wiki Seite zum ersten Repo.

https://info-bw.de/faecher:informatik:oberstufe:git:erstes_repo:start

Versionsgeschichte & Zeitmaschine

Versionsgeschichte anzeigen

git-Befehl

git log

Ausführliche Auskunft über die Commits, die zum aktuellen Stand geführt haben.

Commit Hash
(erste 7 Zeichen eindeutig)

Autor, Zeit

Referenzen

Eigene git Befehle - hübschere Geschichte


git log --graph --pretty=format:'%Cred%h%Creset \
        -%C(yellow)%d%Creset %s %Cgreen(%ci) %Creset' \
        --abbrev-commit
      

Eigene git Befehle - hübschere Geschichte


git log --graph --pretty=format:'%Cred%h%Creset \
        -%C(yellow)%d%Creset %s %Cgreen(%ci) %Creset' \
        --abbrev-commit
      

Umständlich → Man macht sich einen "Alias":


git config alias.lg "log --graph --pretty=format:'%Cred%h%Creset \
        -%C(yellow)%d%Creset %s %Cgreen(%ci) %Creset' \
        --abbrev-commit"
      

Zeitreise & lose Köpfe

Jetzt wollen wir in der Zeit zurückgehen, um einen als Commit abgelegten Zustand des Arbeitsverzeichnisss wieder herzustellen.

git-Befehl

git checkout f935d6

Zeitreise & lose Köpfe

Was ist HEAD?

  • Versionsgeschichte: (verzweigte) Abfolge von Commits
  • Commits basieren aufeinander
  • Commit-ID identifiziert Commit
  • Manche Commits haben "Namen":
    Branches, Tags → Referenzen auf Commits
  • HEAD → Besondere Referenz.
    Zeigt immer auf den Commit, der im Arbeitsverzeichniss gerade "ausgecheckt" ist.

Was ist detached HEAD?

  • Commit adc15c2 basiert auf f9353d6 (auf den HEAD zeigt).
  • Änderung im Arbeitsverzeichnis → was passiert mit "adc15c2 basiert auf f9353d6"?

Wo sortiert sich der ausgehend von 9353d6 veränderte Zustand des Arbeitsverzeichnisses in die Versionsgeschichte ein, wenn man einen neuen Commit erzeugt?

Lösung...

Man erstellt einen neuen Branch


Sie befinden sich im Zustand eines 'losgelösten HEAD'. Sie können sich
umschauen, experimentelle Änderungen vornehmen und diese committen, und
Sie können alle möglichen Commits, die Sie in diesem Zustand machen,
ohne Auswirkungen auf irgendeinen Branch verwerfen, indem Sie zu einem
anderen Branch wechseln.

Wenn Sie einen neuen Branch erstellen möchten, um Ihre erstellten Commits
zu behalten, können Sie das (jetzt oder später) durch Nutzung von
'switch' mit der Option -c tun.
            

Bearbeite die Wiki-Seite "Versionsgeschichte und Zeitmaschine"

https://info-bw.de/faecher:informatik:oberstufe:git:versionsgeschichte:start