Git Einführung

von Steve Liedtke

Folien dieses Vortrags

slides.steveliedtke.de/git2

Was ist Git?

  • Versionsverwaltung von Dateien
  • Freie Software

Überblick über Versionsverwaltungsarten

Lokale Versionsverwaltung

  • Einfache Datenbank, die jede Änderung auf dem Rechner aufzeichnet
  • Vertreter: Revision Control System (RCS)

Zentrale Versionsverwaltung

  • Einzelner Server hält die Versionsverwaltung des Projektes
  • Nutzer holen sich neuesten Stand auf eigenen Rechner
  • Diese Art der Versionsverwaltung war lange Zeit Standard
  • Vertreter: Concurrent Versions System (CVS), Subversion (SVN)

Verteilte Versionsverwaltung

  • Sowohl Server als auch Nutzer besitzen die volle Versionsverwaltung
  • Komplette Spiegelung bei Checkout
  • Mehrere Server möglich
  • Vertreter: Bazaar, Mercurial und natürlich Git

Einstieg in die Git Welt

Installation

GUI-Tools

Erste Schritte

git config --global user.name "sliedtke"
git config --global user.email "steve@steveliedtke.de"

Git Einmaleins

Repositories

  • Local Repository
    • Versionsverwaltung befindet sich auf Entwicklungsrechner
    • Hier werden die eigenen Änderungen aufgenommen
  • Remote Repository
    • Versionsverwaltung befindet sich auf entfernten Server
    • Hier werden Änderungen aller Entwickler aufgenommen
    • Remote-Repositories können hierarchisch aufgebaut werden

Erfolg durch Hoster

  • Git startete erst im Jahr 2008 durch den Hoster Github durch
  • Verschiedene Hoster für Remote Repositories:
    • Github
    • Bitbucket
    • Perforce
    • u.v.m

Commit

  • Ein Commit ist eine Momentaufnahme (Snapshot) des Projektes
  • Ein Commit verweist auf seine Eltern (parent) Commits
  • 40 Zeichen SHA-1 Hash

Entwicklungszweige

Branches

  • Entwicklungszweig → Branch
  • Abspaltung eines Entwicklungspfades
  • Wird benutzt, um neue Features parallel zum Bugfixing umzusetzen
  • Wird benutzt, um Bugs zu beheben

Ich möchte ein neues Feature entwickeln ...

... und kann es später in meinen Hauptzweig einbringen

... oder es verwerfen!

HEAD

Der HEAD ist eine Referenz auf den aktuellen Branch

Entwicklungszweige

Tags

  • Tags sind Momentaufnahmen der Versionsverwaltung
  • Werden benutzt, um bestimmte Versionen/Meilensteine zu kennzeichnen

Der .git Ordner

  • Der .git Ordner enthält die Versionsverwaltung
  • Commit-Informationen (Zeit, Author, Kommentare)
  • Branch-Informationen
  • Informationen über Remote Repositories
  • etc.
  • Mehr Details? siehe the git directory

Die 3 Bereiche

  • Es gibt drei Bereiche für Dateien in einem Git Verzeichnis
    • Arbeitsbereich (Working directory)
    • Index (Staging Area)
    • Repository
  • Eine Datei hat damit folgende Status:
    • unmodified → Arbeitsbereich
    • staged → Index
    • committed → Repository

Die .gitignore Datei

  • Wird benötigt um generierte Dateien, Log-Dateien oder ähnliches zu ignorieren
  • Nutzung von Patterns möglich:
    • *.ini
    • **/target/unit-test-results

Git Befehle

init

git init
  • Initialisiert ein neues lokales Repository
  • Hierbei wird auch ein .git Ordner erzeugt
  • Hauptentwicklungszweig 'master' wird erstellt

add

git add README.txt
  • Gibt an, dass die Datei 'README.txt' versioniert werden sollen
  • Kopiert die Dateien aus dem Arbeitsverzeichnis in den Index (Staged area)
  • Damit ist die Datei noch nicht Teil des lokalen Repositories

status

git status
  • Zeigt den Status der Dateien im Git-Verzeichnis
    • Welche Dateien sind im Arbeitsbereich, aber nicht Teil des Index
    • Welche Dateien wurden zum Index hinzugefügt
    • Welche Dateien unterscheiden sich im Index und dem Arbeitsbereich

status -s

git status -s
  • Zeigt den Status vereinfacht an

commit

git commit -m 'initial project version'
  • Übergibt die Dateien aus dem Index mit einem Kommentar an das lokale Repo
git commit -am 'updated some files'
  • Übergibt die geänderten Dateien in den Index und anschließend an das lokale Repo
  • Wird gerne bei Aktualisierungen verwendet

branch

git branch
  • Listet alle Branches auf
git branch develop
  • Erstellt den Branch 'develop'
git branch -D feature-x
  • Löscht den Branch 'feature-x'

checkout

git checkout develop
  • Der Branch 'develop' wird aus dem lokalen Repository in den Arbeitsbereich überführt
  • Mit diesem Befehl ist das Wechseln zwischen lokalen Branches möglich

reset

git reset README.txt
  • Entfernt den Eintrag für README.txt aus dem Index
  • Mit 'git reset HEAD' können alle Änderungen seit dem letzten Commit aus dem Index genommen werden

rm

git rm README.txt --cached
  • Entfernt die Datei README.txt aus dem Index
  • Mit dem Zusatz --cached wird die Datei nur aus dem Index entfernt, nicht aus dem Arbeitsbereich
  • Mit dem Zusatz -f wird die Datei aus dem Index und dem Arbeitsbereich entfernt

diff

git diff
  • Zeigt auf welche Datei sich geändert hat, aber noch nicht gestaged (git add) wurde
git diff --cached
  • Zeigt Änderungen der gestagten Dateien

log

git log
  • Liefert eine Übersicht über die letzten Commits bis zu dem aktuellen Commit
git log master
  • Liefert eine Übersicht über die letzten Commits des Branches 'master'
git log develop ^master
  • Liefert eine Übersicht über die letzten Commits des Branches 'develop' ohne den Logs des Branches 'master'

merge

git merge feature-x
  • Führt die Änderungen des Branches 'feature-x' in den aktuellen Branch
  • Das Merging in Git ist sehr mächtig und bewältigt die meisten Merge-Konflikte selber

Merge-Konflikte manuell lösen

  • Konflikte müssen immer manuell aufgelöst werden, wenn die gleichen Zeilen geändert wurden
  • Empfehlung:
    • Nutze ein GUI-Tool für Merge-Konflikte
    • Besprecht Konflikte mit zuständigen Entwicklern

clone

git clone ssh://<user>@<url>:<port>/<path>/<Repo-Name>.git
  • Mit dem Ausführen des Befehls wird
    • ein Verzeichnis '<Repo-Name>' erstellt,
    • das .git Verzeichnis darin initialisiert,
    • die Daten des Repositories hinein kopiert,
    • und anschließend wird ein Checkout des Branches 'master' gemacht
  • Statt ssh können Remote Repositories auch git://, http:// oder https:// anbieten

Zugriff auf Remote-Repositories

  • Wenn mit einem Remote-Repository gearbeitet wird, ist in der Regel eine Authentifizierung notwendig:
    • Nutzername/Passwort
    • SSH-Keys
  • Für Github:
    • Settings → SSH-Keys
    • Settings → Personal access tokens

fetch

git fetch
  • Holt alle Informationen vom Remote Repository über Branches und Versionen

pull

git pull origin develop
  • Führt 'fetch' aus und anschließend ein automatisches 'merge' des Remote-Branches 'develop' in den aktuellen Branch
  • push

    git push
    • Gibt die lokalen Änderungen (Sammlung der lokalen Commits) des aktuellen Branches an den entsprechenden Branch des Remote Repository

    Weitere Befehle

    • git remote: Auflistung/Hinzufügen/Entfernen von Remote Repositories
    • git tag: Markiert den ausgewählten Commit
    • git revert: Entfernt einen Commit aus dem Repository
    • git rebase: Merged den angegebenen Branch in den Branch von dem er abgezweigt wurde
    • git stash: Legt nicht committete Änderungen beiseite, um einen sauberen Arbeitsbereich zu schaffen

    Git Workflows

    Zentralisierter Workflow

    • Bei diesem Workflow arbeiten alle Entwickler auf einem Branch
    • Dieser Workflow ist auch für SVN Nutzer bekannt (statt trunk nun auf master)

    Feature Branch Workflow

    • Aufbauend auf dem zentralisiertem Workflow können Feature Branches eingesetzt werden
    • Features werden in eigenen Branches umgesetzt und sorgen für einen ständig stabilen master Branch

    Gitflow Workflow

    • master und develop Branch
    • Feature-, Release- und Hotfix-Branches
    • Auch als Git Extension nutzbar
    • Cheatsheet

    Forking Workflow

    • Jeder Git-Nutzer hat sein eigenes Remote-Repo
    • Statt gegen das gleiche Remote-Repo zu arbeiten, werden die Repos geforked
    • Der Nutzer kann gegen sein eigenes Repo arbeiten und bei einem stabilen Stand ein Pull-Request an den Betreuer des offiziellen Repos stellen

    Don't be a git, use Git!

    Vielen Dank für eure Aufmerksamkeit!

    Weitere Git Tutorials

    Weitere nützliche Links