Workshop Git

Created by kicktemp / Niels Nübel / @niels_nuebel

Niels Nübel

  • Frontend & Backend Developer
  • aus Hamburg
  • Joomla seit 2009
  • erster Joomla!Day 2011 in Hamburg
  • seit Juni 2018 Kicktemp

Themen

  1. Warum Git?
  2. Grundlegende Konzepte

Warum Git?

  • April 2005
  • Linus Torvalds

Warum Git?

  • Arbeiten mit Branches
  • Flexibilität in den Workflows
  • Contribution
  • Nachvollziehbare Herkunft von Sourcecode
  • Performance
  • Robust gegen Fehler und Angriffe
  • Offline- und Multisite-Entwicklung
  • Administrierbarkeit
  • Starke Open-Source-Community
  • Erweiterbarkeit

Zentrale Versionsverwaltung

Dezentrale Versionsverwaltung

Repository Arten

  • Blessed
  • Shared
  • Workflow
  • Fork

Vorteile

  • Hohe Performance
  • Effiziente Arbeitsweisen
  • Offline-Fähigkeit
  • Flexibilität der Entwicklungsprozesse
  • Backup
  • Wartbarkeit

Das Repository

die Grundlage dezentralen Arbeitens

Das Repository ist im Kern ein effizienter Datenspeicher. Im Wesentlichen enthält es:

  • Inhalte von Dateien (Blobs)
  • Verzeichnisse (Trees)
  • Versionen (Commits)

Das Repository

hexadezimaler Hashwert


           1632acb65b01c6b621d6e1105205773931bb1a41.
    

Vorteile Hashwert

  • Hohe Performance
  • Redundanzfreie Speicherung
  • Dezentrale Versionsnummern
  • Effizienter Abgleich zwischen Repositorys
  • Integrität der Daten
  • Automatische Erkennung von Umbenennungen

Branching und Merging

  • Verzweigen (Branching)
  • Branches entstehen durch paralleles Arbeiten.
  • Zusammenzuführen (Merging)

ungeplante Verzweigung

Explizite Branches

Zusammenfassung

Git installieren

http://git-scm.com/download

Windows-User

Git-Bash


> git com< TAB>
> git commit

> git c< TAB>< TAB>
checkout    cherry  cherry-pick     citool
clean       clone   commit          config

> git commit --a< TAB>< TAB>
--all   --amend     --author=

Git einrichten


> git config --global user.name hmustermann
> git config --global user.email "hans@mustermann.de"
    

Lieblingstexteditor


> git config --global core.editor vim           # VI improved
> git config --global core.editor "atom --wait" # Atom editor
> git config --global core.editor notepad       # Windows notepad
    

Unser erstes Projekt


    mkdir gitprojekte
    cd gitprojekte
    mkdir erste-Schritte
    cd erste-Schritte
    touch bar.txt
    touch foo.txt

Ergebnis


gitprojekte
└── erste-schritte
    ├── bar.txt
    └── foo.txt

Unser erstes Repository


        git init
        Leeres Git-Repository in ~/gitprojekte/erste-schritte/.git/ initialisiert

.git unser Repository


gitprojekte
└── erste-schritte
    ├── .git
    ├── bar.txt
    └── foo.txt

Hier legt Git die Historie des Projektes ab.

Das erste Commit


        git add bar.txt foo.txt
        git commit --message "init"

add-Befehl bestimmt welche Dateien in das nächste Commit aufgenommen werden

Unsere Dateien

Das erste Commit


[master (Basis-Commit) 6cc5776] init
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 bar.txt
create mode 100644 foo.txt

Branch

Hashwert

Commit Message

Status


rm -f bar.txt
touch bar.html
vi foo.txt

Status abfragen


git status
Auf Branch master
Änderungen, die nicht zum Commit vorgemerkt sind:
  (benutzen Sie "git add/rm < Datei>...", um die Änderungen zum Commit vorzumerken)
  (benutzen Sie "git checkout -- < Datei>...", um die Änderungen im Arbeitsverzeichnis zu verwerfen)

    gelöscht:       bar.txt
    geändert:       foo.txt

Unversionierte Dateien:
  (benutzen Sie "git add < Datei>...", um die Änderungen zum Commit vorzumerken)

    bar.html

    keine Änderungen zum Commit vorgemerkt (benutzen Sie "git add" und/oder "git commit -a")

Status


git diff foo.txt

diff --git a/foo.txt b/foo.txt
index e69de29..345e6ae 100644
--- a/foo.txt
+++ b/foo.txt
@@ -0,0 +1 @@
+Test

Mit Q kommt ihr wieder raus.

Paradox git add


        git add foo.txt bar.html bar.txt

Egal ob eine Datei bearbeitet, hinzugefügt oder gelöscht wurde, mit dem add- Befehl bestimmt man, dass die Änderung übernommen werden soll.

Status abfragen


git status
Auf Branch master
Zum Commit vorgemerkte Änderungen:
  (benutzen Sie "git reset HEAD < Datei>..." zum Entfernen aus der Staging-Area)

	neue Datei:     bar.html
	gelöscht:       bar.txt
	geändert:       foo.txt

Das zweite Commit


git commit --message "Einiges geändert."

[master a7f3ece] Einiges geändert.
 3 files changed, 2 insertions(+), 2 deletions(-)
 create mode 100644 bar.html
 delete mode 100644 bar.txt

Historie betrachten


git log

commit a7f3ece79d5f38a13f64355bb195f5c5861e3747 (HEAD -> master)
Author: Niels Nübel < niels@kicktemp.com>
Date:   Wed Mar 27 11:25:25 2019 +0100

    Einiges geändert.

commit 6cc5776005924cc841955333169831cb95af3d1f
Author: Niels Nübel < niels@kicktemp.com>
Date:   Wed Mar 27 11:20:20 2019 +0100

    init

Der log-Befehl zeigt die Historie des Projekts. Die Commits sind chronologisch absteigend sortiert.

Zusammenarbeit mit Git

  • eigenen Workspace
  • eigenes Repository
  • Repository

Repository klonen


cd ..
git clone erste-schritte erste-schritte-klon
Klone nach 'erste-schritte-klon' ...
Fertig.

clone-Befehl bestimmt welche Dateien in das nächste Commit aufgenommen werden

Quelle

Ziel

Verzeichnis


gitprojekte
├── erste-schritte-klon
│   ├── .git
│   ├── bar.html
│   └── foo.txt
└── erste-schritte
    ├── .git
    ├── bar.html
    └── foo.txt

Ändert die Datei erste-schritte/foo.txt.


cd /projekte/erste-schritte
vi foo.txt
git add foo.txt
git commit --message "Eine Änderung im Original."

History Kompakt

git log -oneline
fc59790 (HEAD -> master) Eine Änderung im Original.
a7f3ece Einiges geändert.
6cc5776 init

Ändert im nächsten Schritt die Datei erste-schritte-klon/bar.html im Klon-Repository


cd /projekte/erste-schritte-klon
vi bar.html
git add bar.html
git commit --message "Eine Änderung im Klon."

History im Klon

git log -oneline
9b29e5c (HEAD -> master) Eine Änderung im Klon.
a7f3ece (origin/master, origin/HEAD) Einiges geändert.
6cc5776 init

Wir haben jetzt in jedem Repo zwei gemeinsame Commits und jeweils ein neues Commit. Wir wollen jetzt das neue Commit aus dem Original in den Klon übertragen.

pull-Befehl

cd /projekte/erste-schritte-klon
git pull
remote: Objekte aufzählen: 5, Fertig.
remote: Zähle Objekte: 100% (5/5), Fertig.
remote: Komprimiere Objekte: 100% (2/2), Fertig.
remote: Gesamt 3 (Delta 0), Wiederverwendet 0 (Delta 0)
Entpacke Objekte: 100% (3/3), Fertig.
Von /Users/niels/Development/kicktemp/gitprojekte/erste-schritte
   a7f3ece..fc59790  master     -> origin/master
Merge made by the 'recursive' strategy.
 foo.txt | 1 +
1 file changed, 1 insertion(+)
git log --graph --oneline
*   5ab262c (HEAD -> master) Merge branch 'master' of /Users/niels/Development/kicktemp/gitprojekte/erste-schritte
|\
| * fc59790 (origin/master, origin/HEAD) Eine Änderung im Original.
* | 9b29e5c Eine Änderung im Klon.
|/
* a7f3ece Einiges geändert.
* 6cc5776 init

Fragen?

@Niels_Nuebel

Vielen Dank!

Photo Credits

Rayi Christian Wicaksono