Professor Dr. Michael Mächtel
git
Grundlagen
Git Grundlagen
git Grundlagen
1. git allgemein 2. GitHub
3. git im BSYS Labor 4. git remotes
Professor Dr. Michael Mächtel
git Grundlagen
1. git allgemein 2. GitHub
3. git im BSYS Labor 4. git remotes
3
Git Grundlagen
git
Verteiltes Versionsverwaltungs- system
Open Source Extrem populär
komplex & kompliziert, aber mächtig
Git /ɡɪt/, noun a stupid or unpleasant man
— Oxford Dictonaries
Professor Dr. Michael Mächtel
Bedienung
5
Original: im Terminal
Nicht optimal, aber: komplette Macht von Git Wird in dieser Präsentation benutzt
Und „überall im Internet“!
GitHub for Windows
Sehr einfach, hübsch und beschränkt SourceTree (Download)
Wesentlich mehr Funktionen, komplizierter zu bedienen Empfehlung: erstmal im Terminal!
Git Grundlagen
Versionsverwaltung
VCS: Version Control System
Protokolliert Veränderungen an Dateien, mit … Autor
Kurzbeschreibung Zeitstempel Ermöglicht …
Wiederherstellung alter Zwischenstände Paralleles Arbeiten mehrerer Entwickler Analysen der Codebase
„Alternativen“: Mercurial, SVN, CVS, Perforce …
Professor Dr. Michael Mächtel
Commit
7
Abbildung des ganzen Projekts zu einem Zeitpunkt Ein Commit speichert:
Alle Dateien (komprimiert: Delta vom Vorgänger) Seinen Vorgänger
Textnachricht, Autor, Zeit, … Identifiziert durch Hash (hier: C1, C2, …)
f1f5d1b
2a9ca86 576a5d0
Verzeichnis leer
•README.md
•src/
•hello.rs
•test.rs
•README.md
•src/
•hello.rs
•data.rs
C1 C2 C3
Git Grundlagen
Das Repository
• Aktenordner holen
• Ordnernamen merken!
• Jede Seite kopieren
• Kopien auf Tisch ausbreiten
Working Directory Version Database
„Staging Area“
• Zettel kopieren
• Kopie in Staging- Area legen
• Originalordner kopieren
• In Kopie Seiten mit neuer Version aus der Staging Area überschreiben
• Neuen Ordner merken
Professor Dr. Michael Mächtel
Das Repository
9
„Staging Area“
Version Database:
C2
C1 C3
Working Directory:
hello.rs test.rs README
$ git add
$ git commit
$ git checkout
•Ordnerstruktur auf Dateisystem
•„Blick auf ein Commit“
•Enthält alle Commits
•Versteckt gespeichert in .git/
Git Grundlagen
Datei Status
Untracked Unmodified
Modified Staged
Git sieht Datei im Dateisystem, tut aber nichts mit ihr.
Datei in Git registriert, gleicht aber dem letzten Commit.
Datei registriert und wurde seit letztem Commit verändert.
Datei wird Teil des nächsten Commits („Ich bin bereit!“)
Jemand hat was auf den Tisch gelegt und niemand weiß Bescheid Frisch kopiert auf dem Tisch Wurde auf dem Tisch verändert
Wurde kopiert und auf die Staging-Area gelegt
Professor Dr. Michael Mächtel
Datei Status
11 git add
git commit
*edit*
git add
git commit -a
Legt alle veränderten (aber keine neuen!) Dateien in die Staging-Area und führt
git commit aus
Untracked Unmodified
Modified Staged
Git Grundlagen
Typischer Ablauf
Lege Datei hello.rs und bye.rs neu an git add hello.rs bye.rs
git commit
Bearbeite einige Dateien git commit -a
Lege Datei test.rs neu an Bearbeite hello.rs git add test.rs git commit –a …
Professor Dr. Michael Mächtel
Status anzeigen
git status oft ausführen!
Immer wissen, was los ist.
13
$ git status On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>""..." to unstage) new file: bye.rs
new file: hello.rs
Changes not staged for commit:
(use "git add <file>""..." to update what will be committed) (use "git checkout "-- <file>""..." to discard changes in working directory)
modified: Cargo.toml
Untracked files:
(use "git add <file>""..." to include in what will be committed)
test.rs
Git Grundlagen
Wie oft commiten?
Commit sollte atomar sein Projekt sollte kompilieren (keine groben Fehler) Unit-Tests sollten funktionieren Bitte oft, aber bewusst committen!
Commit Nachrichten (‘Ordner Beschriftung’) Zusammenfassung der Änderungen (nicht: „stuff“, “changes”, “blabla” ….) Profi Tipps:
Erste Zeile sehr kurze Zusammenfassung Optional: Durch leere Zeile getrennte weitere
Nicht
git commit -m nutze
n!
Professor Dr. Michael Mächtel
Ein Blick in den Aktenschrank
15 C2
C1 C3
$ git commit
$ git commit
$ git commit
$ git checkout C2
$ git commit
HEAD
(wurde auf den Tisch ausgecheckt)
C4
Ein Commit kann Vorgänger mehrerer anderer Commits sein
Git Grundlagen
Branches
$ git commit
$ git commit
$ git commit
$ git checkout C2
$ git commit
$ git branch <name>
Erzeugt neuen Branch Zeigt auf den Commit, auf den HEAD zeigt
$ git checkout -b <name>
git branch name und git checkout name
•Pointer auf Commit
•Hat Namen
•‘master’ automatisch
C2
C1 C3
HEAD C4
master
Professor Dr. Michael Mächtel
Branch mergen / Conflicts
17 hello.rs
fn main() {
<<<<<<< HEAD
println!("Hello Susi");
=======
println!("Hello Willi");
>>>>>>> master }
$ git merge master To Auto-merging src/hello.rs
CONFLICT (content): Merge conflict in src/hello.rs
Automatic merge failed; fix conflicts and then commit the result.
$ git status
# On branch foo
# You have unmerged paths.
# (fix conflicts and run "git commit")
#
# Unmerged paths:
# (use "git add ..." to mark resolution)
#
# both modified: src/hello.rs
#
$ git merge --abort
$ git add src/hello.rs
$ git commit
„Deren“
(zu mergender Br.)
„Meins“
(aktueller Br.)
Git Grundlagen
Aufpassen mit dem Mergen!
Zu viele Merge-Commits vermüllen History Horror-Szenario:
- Bob und Anna starten beim selben Commit - Jeder erstellt einen eigenen commit
- Bob möchte die Änderungen von Anna: git merge anna - Wiederhole:
- Anna erstellt einen weiteren Commit
- Bob möchte nochmal die neuen Änderungen: git merge anna
≠
OH MY GOD!
Professor Dr. Michael Mächtel
git commit im Detail
Bereitet neuen ‘Aktenordner’ vor:
Alter Ordner (worauf HEAD zeigt) Neue Inhalte aus der Staging-Area Vorgänger ist der Commit, auf den HEAD zeigt Branch, auf den HEAD zeigt, wird auf neuen Commit umgebogen
“Spielen” mit commits und branches ohne Nebenwirkungen:
http://learngitbranching.js.org/?NODEMO
19
Git Grundlagen
Repository erstellen/klonen
git init
Legt neues Repository an Leerer Tisch, leerer Aktenschrank git clone REPO_URL
Kopiert Aktenschrank von angegebenem Repository Checkt speziellen Commit aus („legt auf Tisch“) Vermerkt Quellrepository als origin-Remote
Professor Dr. Michael Mächtel
git Grundlagen
1. git allgemein 2. GitHub
3. git im BSYS Labor 4. git remotes
21
Git Grundlagen
Verteilte VCS
Computer B*
Computer A
Computer C*
C1 C2
C3
C1 C4
C6
C1
C5 Ich
Willi
Susi git push
git pull
* Oft remote‘s genannt
Professor Dr. Michael Mächtel
Zentralisierte Entwicklung
23 Developer Developer Developer
Haupt-Repo Jeder Developer kann Code veröffentlichen:
Ungut!
Git Grundlagen
GitHub Workflow
Developer
privat Developer
privat Developer
privat
Haupt-Repo Pull-Request*
„Forks“ auf GitHub
Auf lokalem PC
* Vom Maintainer wird Code Review durchgeführt & CI Dienste werden ausgeführt
Developer public
Developer public
Developer public
pull / push pull / push pull / push
Professor Dr. Michael Mächtel
github ssh key
25
Um komfortabel mit github zu arbeiten, empfiehlt es sich einen ssh key zu erstellen
Für jeden Rechner, von welchem ein Zugriff auf die Repositories geschehen soll, muss ein ssh key generiert werden.
Informationen dazu:
https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it- to-the-ssh-agent/
SSH Key mit PuttyGen erstellen:
http://www.laub-home.de/wiki/SSH_Key_mit_PuttyGen_erstellen
Git Grundlagen
git Grundlagen
1. git allgemein 2. GitHub
3. git im BSYS Labor 4. git remotes
Professor Dr. Michael Mächtel
github im BSYS Labor
27 Lokal geklont Lokal geklont
Haupt-Repo der Gruppe GH/htwg-syslab-bsys/bsys-ss17—grp0
Fork Student A
GH/StudentA/bsys-ss17-grp0 Fork Student B GH/StudentB/bsys-ss17-grp0
• Tutor korrigiert und akzeptiert bei Auswertung
• Nur immer ein PR pro Gruppe pro Aufgabe!
Lokal geklont Lokal geklont
a b
a b
Git Grundlagen
Ablauf im BSYS Labor
Anmeldung in 2er Gruppe in Moodle
Mit Einladungslink aus Forum erstellen Sie Ihre Gruppe Achtung: Anweisungen für Gruppennamen beachten Mindestens einer forkt das Haupt-Repo
Wiederhole pro Abgabe Homework:
Aufgaben bearbeiten, comitten und pushen - ins geforkte Repo (Developer-Repo)!
Auf github: PullRequest (PR) für Haupt-Repo erstellen, nachdem Sie die Aufgaben alle bearbeitet haben und abgeben wollen.
Professor Dr. Michael Mächtel
github Anmeldung
29
Nach Annahme des Einladung Links Gruppe erstellen (grpN)
Git Grundlagen
Pull Request Vorbereitung
Ablauf
git co -b “Homework-Task1”
neuer Branch zur ‘Abgabe’ wird erstellt switch zu diesem Branch im lokalen Repo
git push "--set-upstream origin AbgabeTask1 dem eigenen Remote (Developer-Repo) den Branch bekannt machen
Auf github den Branch auswählen und einen Pull-Request aufmachen
Professor Dr. Michael Mächtel
Pull Request erstellen
31
Git Grundlagen
git Grundlagen
1. git allgemein 2. GitHub
3. git im BSYS Labor 4. git remotes
Professor Dr. Michael Mächtel
git Remotes
Andere Nodes/Klone des Repositories z.B. Original oder Fork auf GitHub Typische Namen für Remotes
origin: Standardname, oft der eigene Fork upstream: oft Bezeichnung für Original-Repository
33
$ git remote -v
origin git@github.com:user/bsys-ss17—grp0.git (fetch) origin git@github.com:user/bsys-ss17-grp0.git (push)
Identifiziert durch URL!
Namen sind nur lokale Kürzel für die URLs
Git Grundlagen
git remote Befehle
Hinzufügen: $ git remote add <name> <url>
Löschen: $ git remote remove <name>
Umbenennen: $ git remote rename <name> <url>
URL-Typen:
https://github.com/user/bsys-ss17-grp0.git (HTTPS) git@github.com:user/bsys-ss17—grp0.git (SSH)
Lokale Remotes ebenfalls möglich! (z.B. ~/my_other_clone/)
Professor Dr. Michael Mächtel
git remote + upstream
Wie mit Änderungen im Original Schritt halten?
Zusätzlich den upstream mit eintragen
35 Remotes auflisten
$ git remote -v
origin git@github.com:user/bsys-ss17-grp0.git (fetch) origin git@github.com:user/bsys-ss17-grp0.git (push) upstream git@github.com:syslab/bsys-ss17-grp0.git (fetch) upstream git@github.com:syslab/bsys-ss17-grp0.git (push)
Git Grundlagen
Remote Branches
Lokaler „Cache“ von Branches des Remote
Zeigt den Stand, als das letzte mal der Remote kontaktiert wurde
master
HEAD remotes/origin/master
remotes/origin/HEAD
$ git branch
* master
$ git branch -a
* master
remotes/origin/HEAD -> origin/master remotes/origin/master
Remote Branches (remotes/origin/master) Lokale Branches
(master)
≠
Professor Dr. Michael Mächtel
Remote Branches aktualisieren
„Git Fetch“
Kontaktiert Remote, aktualisiert Remote Branches Lädt alle Commits zur Vervollständigung der History runter
37
Lokal
master
origin-Remote
master backup
origin/master origin/backup
$ git fetch <remote>
Git Grundlagen
Branches mergen (Integration)
git merge <branch>
Integriert Änderungen aus anderem Branch in den aktuellen
„Merge Commit“
master origin/master
$ git checkout master
$ git merge origin/master
Professor Dr. Michael Mächtel
Branches mergen (FastForward)
git merge <branch>
„Fast Forward Merge“
- Nur Referenz-Update
39
$ git checkout master
$ git merge origin/master
master origin/master
Git Grundlagen
git pull
Vereinfacht fetch und merge Operationen
Aber: Birgt dadurch Gefahren (wie git commit –a) Leute denken: git pull ist ein Dropbox-Update 😨 Immer bewusst daran denken, was es tut!
≈
$ git pull <remote> <branch> $ git fetch <remote>
$ git merge <remote>/<branch>
Professor Dr. Michael Mächtel
git push
Push aktualisiert Branches, merged nicht Pushen nur möglich, wenn Merge FF wäre
41
$ git push origin master
To https://github.com/USERNAME/REPOSITORY.git ! [rejected] master -> master (non-fast-forward) ...
Git Grundlagen
Disclaimer / Quellen
Der Inhalt basiert auf den Folien von Lukas Kalbertodt:
https://github.com/LukasKalbertodt/programmieren-in-rust Dieses Material ist für das Labor Betriebssysteme, Studiengang AIN an der HTWG Konstanz erstellt worden.