Agenda – Einleitung – Grundlagen



Agenda – Einleitung – Grundlagen

0 1


advanced-git

A deep-dive talk on Git internals and best practices.

On Github distilledhype / advanced-git

Agenda

Einleitung

Grundlagen

Best Practices

Fragen/Diskussion

Einleitung

Prinzipien

Dezentral

Nicht-lineare Entwicklung

Sicher

Effizient

SVN

File basiert, Delta-Storage

Git

Hash basiert, Snapshot-Speicherung

Grundlagen

Plumbing vs Porcelain

Begriffe

Repository

Commit

Working Tree

HEAD

Staging Area / Index

master

Branch

Tag

Repository

Blob

ID = SHA ( Dateiinhalt + Dateigröße )

Jede Datei wird nur einmal gespeichert

Blobs sind unveränderlich

Tree

ID = SHA ( Blob-Hashes + Tree-Hashes )

Verzeichniszuordnung

Berechtigungen

Dateiname

Verweis auf untergeordnete Trees

Trees sind unveränderlich

Commit

ID = SHA ( Autor + Datum + Trees + Blobs )

Commits referenzieren 1..n Eltern-Commits

Ein Commit mit mehreren Eltern: Merge-Commit

Ein Commit mit mehreren Kindern: Branch-Knoten

Alle Commits = History

Commits sind unveränderlich

Commit

Branches: Referenzen auf einen Commit

Tags: Referenzen auf einen Commit

Referenz: Name für einen Hash

$ git branch -v
  master      8dc350a SW-5671 - Add parellel lint processing
* shop-ekz-de ac9e8af Konfiguration der OxaionDB jetzt per PDO
~~~
                        

Demo

Branching, Merging & Rebasing

Branches

Branchen ist günstig

Branch early, Branch often

Zusammenführen: Merging & Rebasing

Merging

Änderungen von Dev in Master verfügbar machen

git checkout master; git merge dev

Merging

Ausnahme: Fast Forward Merge

Rebasing

Rebasing: Verändern des Base-Commits eines Branches

git checkout dev; git rebase master

Rebasing

TODO: Feature soll aus Dev gebrancht sein

Rebasing

TODO: Feature soll aus Dev gebrancht sein

git rebase --onto dev master feature

Interaktives Rebase

Pick

Squash

Edit

Drop

Rebase On Pull

Lineare Entwicklungshistory

Best Practices

Filemode

Notes
git config core.filemode true|false
If false, the executable bit differences between the index and the working copy are ignored; useful on broken filesystems like FAT. See git-update-index(1). True by default.

Zeilenendungen

Notes

CRLF vs. LF

.gitattributes

text=auto
text eol=lf

Rebase

Niemals veröffentlichte Commits rebasen.

git config branch.autosetuprebase always

Notes

Branchen, Branchen, Branchen!

Features, Bugs, Experimente.

Müssen nicht gepusht werden.

Stashen, Stashen, Stashen!

git stash save "Stashname oder. Beschreibung"
git stash apply stash@{1}

CLI bevor GUI!

Bash Autocomplete

Git Bash auf Windows

Commit Message

Capitalized, short (50 chars or less) summary

More detailed explanatory text, if necessary.  Wrap it to about 72
characters or so. In some contexts, the first line is treated as the
subject of an email and the rest of the text as the body.  The blank
line separating the summary from the body is critical (unless you omit
the body entirely); tools like rebase can get confused if you run the
two together.

Write your commit message in the imperative: "Fix bug" and not "Fixed bug"
or "Fixes bug." This convention matches up with commit messages generated
by commands like git merge and git revert.

Further paragraphs come after blank lines.

- Bullet points are okay, too

- Typically a hyphen or asterisk is used for the bullet, preceded by a
  single space, with blank lines in between, but conventions vary here

- Use a hanging indent
Notes

Integration mit Tools

JIRA

Jabber

...

Notes

http://git/gitweb

Nur Fast-Forwards

git init --shared

initialisiert ein Repo mit

"receive.denyNonFastForwards = true"

Remote Unlöschbar

"receive.denyDeletes = true"

git log subsets

git log branchtomerge ^master

Workflows

Simple

git add .

git commit

Commit Message.

Feature-Spezifisch Commiten

git status

git add filename filename filename

Feingranular Commiten

git add -p

Workflow mit Branches

Branches: master, dev, feature-***, bug-***, hotfix-***

dev und master leben für immer

feature-, bug- und hotfix-Branches werden gelöscht

master ist immer sauber, keine direkte Arbeit

Nur fast-forward commits nach master

dev ist der Hauptentwicklungsbranch

dev -> release -> master

Schlusswort

Git muss verstanden werden

Investierte Zeit, zahlt sich definitiv aus

Nimmt uns Arbeit ab

Erhöht Versionierungqualität

Hilft uns die Codebasis zu verbessern

Einfach rumspielen!

Sonst Fragen, Git Know-How ist da

Links

Scott Chacon's Git Einführung Video & Slides

Git Bücher (free online) Pro Git & Git Magic

Git Webseitegit-scm.com

Wichtige Artikel & ein Video Advanced Git mit Tim Berglund A successful Git branching model A Note About Git Commit Messages

? / ↯

Bonus

Reset vs Checkout

Checkout

Auschecken von Branches, Tags

Überschreiben von lokalen Änderungen mit --force

Setzt HEAD um

                        
git checkout master
git checkout v1.0
git checkout c10b9
                        
                        

Checkout

Kopieren von Files aus der History in das Working Directory

git checkout c10b9 files

Checkout

Auschecken von Commit ohne Referenz: Detached Mode

Trotzdem erzeugen von Commits möglich

Diese sind in der History nicht sichtbar

Nachträgliches Erstellen von Branch

... oder cherry pick, rebasen, merging...

Reset

Unstagen von Änderungen:

git add file; git reset file

Reset

Verschiebt HEAD von Branch auf andere Position

Ohne Wegwerfen von Änderungen: --soft

Übersprungene Commits als Änderungen angezeigt

Mit Wegwerfen von Änderungen: --hard

Reset

Wegwerfen lokaler Änderungen / Leeren der Stage:

git reset --hard

Clean

git clean

History vs Reflog

History

Zeigt alle durch Referenzen erreichbare Commits + deren History

git log

Reflog

Zeigt alle Commits

git reflog

Stashing

Stashing

Wegpacken von lokalen Änderungen

Erzeugt unsichtbaren Spezialcommit

Nutzbar z.B. als lokale History

git stash save -u "message"

git stash list

git stash apply stash@{1}

Submodules

Submodules

Einbinden von anderen Repositories

z.B. Vendor-Libs, Plugins, ...

Submodules

Referenziert gezielt einen Commit aus Repo an URL

Super-Repo enthält eigenen Code + referenziert Subrepos an bestimmten Stand

Versionierung von Releases

Mithilfe Submodules: Version 1.0 von Plugin A,Version 2.1 von Modul B

Hauptrepository taggen

Dann möglich: git checkout release-v1.1