Versionsverwaltung

Versionsverwaltung (02-vcs)

VCS

V ersion C ontrol S ystem

Hier GIT

Warum VCS benutzen?

Beispiel

  • Bachelorarbeit-v0.1.docx

  • Bachelorarbeit-v0.9.docx

  • Bachelorarbeit-vFinal.docx

  • Bachelorarbeit-vFinal-2.docx

  • Bachelorarbeit-vFinal-FINAL.docx

Gute Gründe

  1. Zwischenstände Protokollieren

    • Wer - Wann - Was

  2. UnDo von Änderungen

  3. Gruppenarbeit vereinfacht (Synchronisierung)

    • inkl. Berechtigungen

  4. gleichzeitiges Arbeit an mehreren Entwicklungszweigen

    • durch schnellen Wechsel zwischen diesen Zweigen

Begriffe

Workcopy

Dateien, die ich momentan sehen und bearbeiten kann (Arbeitskopie)

Repository

Behälter für alle Dateien und deren Versionen, die das VCS kennt

checkout

Übertragen einer Version aus dem Repository in die Workcopy

commit

Übertragen einer Version von der Workcopy in das Repository

Branch

Parallel entwickelte Version

basic branching vcs svn

Zentral vs. Verteilt

central vs distributed 2

GIT

  • Verteiltes VCS

  • vom Linux Erfinder Linus Torwalds

  • seit 2005

  • a stupid content tracker

  • Buch: Pro Git - online

Zentral Dezentralisiert

Zentral → Server

Dezentral → kein Server?

Zentral Dezentralisiert

Zusätzlicher zentraler Server hat sich bewährt

blessed Repository

  • Zugriffskontrolle

  • Gemeinsamer Ursprung für neue Kopien

  • Backup

  • Basis für Zusatzfunktionen

    • Repo-Browser im Web

    • Konzept: Pull-Requests

    • Web-Editor für Inhalte

    • README.md Rendering

distributed

A Stupid Content Tracker

  • Repository

    • == effizienter Objektspeicher

    • für alle Inhalte werden Hash-Werte als Schlüssel berechnet (SHA, 160 bit)

    • Trennung von Dateiinhalt und Dateiname

    • Inhalte werden nur einmal gespeichert (keine Duplikate)

    • Git versioniert immer das ganze Projekt

  • HASH Beispiel: a544751ae3de9965c35b88958b0d219e29f7295d

A Stupid Content Tracker

  • Interne Datenstuktur von GIT

    • Blob (sha, packed binary)

    • Tree (sha, Liste von Dateien oder Sub-Trees: sha, Zugriffsrechte, Name)

    • Commit (sha, Liste von Parents: sha, Tree, Author, Datum, Message)

    • Tag (sha, commit-sha, Author, Message)

    • Reference (name, commit-sha)

      • z.B. Branch, HEAD, Tag

A Stupid Content Tracker

vorschau tree blob

A Stupid Content Tracker

vorschau commit tree blob

A Stupid Content Tracker

  • GIT Datenstruktur ist sehr einfach zu verstehen.

  • Alle GIT-Kommandos helfen nur, diese Daten zu manipulieren.

  • Um mit GIT zu arbeiten ist das Verständnis dieser Struktur PFLICHT.

GIT Kommandos

Git is fundamentally a content-addressable filesystem with a VCS user interface written on top of it

GIT Kommandos

  1. Plumbing

    • Low-level Aufgaben

    • Stabile API (Parameter, Output)

    • Designed für UNIX-artige Verkettung (pipes) und Skripte

    • z.B. git merge-base, git ls-tree, git cat-file

  2. Porcelain

    • High-Level Aufgaben

    • benutzerfreundliche API (Parameter, Output)

    • z.B. git merge, git status

Abbildung eines Dateisystems

  • tree-Objekt

    • eigener SHA-Schlüssel

    • Liste von Kind-Einträgen ([sub]-tree oder blob) mit jeweils:

      • Datei-Modus (UNIX Benutzerrechte, Executable-Flag)

      • Typ (blob | tree)

      • SHA-Schlüssel

      • Name

  • blob-Objekt

    • eigener SHA-Schlüssel

    • Inhalt

Abbildung eines Dateisystems

tree blob filesystem

VCS Features - Commit

  • commit-Objekt

    • eigener SHA-Schlüssel

    • SHA-Schlüssel der Vorgänger-Commits

    • SHA-Schlüssel des root-tree, der den Zustand des Projektes beschreibt

    • Commit-Nachricht

    • Author, Zeitstempel

  • SHA kann oft abgekürzt werden

$ git show 1c002dd4b536e7479fe34593e72e6c6c1819e53b
$ git show 1c002d

VCS Features - Commit

commit flow 1

VCS Features - Commit

commit flow 2

VCS Features - Commit

commit flow 3

VCS Features - Commit

commit flow 4

VCS Features - Commit

commit flow 5

VCS Features - Commit

commit flow 6

VCS Features - Commit

Doppelbedeutung commit

  1. das Objekt in der GIT Daten-Struktur

    • stellt den Zustand des gesamten Projektes (== Datei- und Ordner-Struktur) zu einem bestimmten Zeitpunkt dar

  2. der Befehl, einen Commit zu erstellen

    • auch als Verb: "Ich committe jetzt"

VCS Features - Stage | Index

git transport local

VCS Features - Stage | Index

staging flow 1

VCS Features - Stage | Index

staging flow 2

VCS Features - Stage | Index

staging flow 3

VCS Features - Stage | Index

staging flow 4

VCS Features - Stage | Index

staging flow 5

VCS Features - Stage | Index

staging flow 6

Befehle - add/rm

## Fügt alle neuen/geänderten vom aktuellen Ordner (rekusiv)
## zum Index hinzu
$ git add .
## Fügt die neue/geänderte Datei zum Index hinzu
$ git add folder-1/file.txt
## Löscht die Datei in der Workcopy und löscht diese Datei im Index
$ rm folder-1/file.txt
$ git rm folder-1/file.txt
## Löscht die Datei in der Workcopy und gleichzeitig im Index
$ git rm folder-1/file.txt
## Fügt alle neuen/geänderten/gelöschten Dateien zum Index hinzu
$ git add -u .

Befehle - status

git status

git status

HEAD, ORIG_HEAD

  • Zeiger auf Commits

    • HEAD

      • Referenz auf den Commit, mit dem der aktuelle Working-Tree / Workcopy assoziiert wird

    • ORIG_HEAD

      • Alter Wert von HEAD, der immer dann gesetzt wird, wenn HEAD verändert wird (z.B. git commit)

    • Nützlich bei allen Kommandos, die eine commit-ID als Input nehmen , z.B.

      • git log HEAD

      • git reset –hard HEAD

Specifying Revisions

  • Zeiger (auf Commits) dereferenzieren

    • (https://git-scm.com/docs/gitrevisions)

    • „Navigation“ von einem Commit ausgehend, auf Basis dessen Vorgängern

      • HEAD^ → erster Parent von HEAD (unter Windows: HEAD^^)

      • HEAD^1 → erster Parent von HEAD

      • HEAD~ → erster Parent von HEAD

      • HEAD~2 → zweiter Parent von HEAD

      • master~-→ erster Parent von master

      • HEAD^^ → Parent der zweiten Generation von HEAD (== HEAD^1^1)

Specifying Revisions

  • Zeiger (auf Commits) dereferenzieren

    • (https://git-scm.com/docs/gitrevisions)

    • „Navigation“ von einem Commit ausgehend, auf Basis dessen vorheriger Werte

      • HEAD@{2} → zweit-letzter Wert von HEAD

      • HEAD@{5.minutes.ago} → Wert von HEAD vor 5 Minuten

Änderungen verwerfen

## Änderungen im Stage-Bereich von foo.txt verwerfen
$ git reset HEAD foo.txt
## Alle Änderungen im Stage-Bereich verwerfen
## (Workcopy bleibt unverändert)
$ git reset HEAD
## Alle Änderungen im Stage-Bereich & Workcopy verwerfen
$ git reset --hard HEAD

Änderungen verwerfen

  • Der checkout-Befehl verwirft die Änderungen des Workspace und holt die Version aus dem aktuell gültigen Commit

## Änderungen einer Datei verwerfen
$ git checkout -- foo.txt
## Änderungen einer Datei verwerfen - anders
$ git checkout HEAD foo.txt

Änderungen verwerfen

  • Ein bereits erfolgter Commit kann Rückgängig gemacht werden

    • entweder: Commit entfernen & Änderungen behalten

    • oder: Commit entfernen & Änderungen zurücknehmen

## Änderung des Commits bleiben im Workspace, aber
## HEAD wird auf seinen Vorgänger gesetzt
$ git reset HEAD^
## Änderungen des Commits werden verworfen
$ git reset –-hard HEAD^
## Änderungen bleiben im Stage-Bereich und im Workspace
## lediglich HEAD wird auf seinen Vorgänger gesetzt
$ git reset –-soft HEAD^

Commits ansehen

  • Liste der Commits

    • Anzeige aller bisherigen Commits

      • git log

    • Schönere Anzeige

      • git log --graph --oneline

  • Einzelnen Commit

    • git show {commit-sha}

    • git cat-file -p {commit-sha}

Tipps

Editor für Commit-Nachrichten

  • Commit Messages ohne Vim

    • erspart Editor in der Konsole

    • bei git commit kann das -m nun weggelassen werden

Windows

$ git config --global core.editor 'C:\Program Files (x86)\Notepad++\notepad++.exe' -multiInst -notabbar -nosession -noPlugin

Mac

$ git config --global core.editor "code --wait"

Alias für Historie

  • Folgenden Befehl eingeben, um git hist verwenden zu können

$ git config --global alias.hist "log --pretty=format:'%C(yellow)[%ad]%C(reset) %C(green)[%h]%C(reset) | %C(red)%s %C(bold red){{%an}}%C(reset) %C(blue)%d%C(reset)' --graph --date=short"

Kommandozeile

  • dir → Auflisten aller Dateien in einem Verzeichnis

  • cd ordner1 → Wechsel in des Unterverzeichnis ordner1

  • cd .. → Wechsel in das nächsthöhere Verzeichnis

  • mkdir ordner2 → Erstellen eines neuen Unterverzeichnisses