git-course



git-course

1 0


git-course

Beginners talk about git in german

On Github pboehm / git-course

$ git kurs --now

$ whoami
Philipp Böhm

$ whoami --online
-  blog.pboehm.org
-  github.com/pboehm
-  twitter.com/phboehm

Allgemeines

  • verteiltes Versionskontrollsystem für Dateien
  • von Linus Torvalds für Linux Kernel entwickelt
  • plattformunabhängig
    • Linux (per Paketmanager)
    • Mac (per Homebrew oder Website)
    • Windows (msysgit ???)
  • Website: git-scm.com
  • Einsatzmöglichkeiten: .... viele

$ git basics

Notwendige Konfiguration

$ git config --global user.name "Philipp Böhm"
$ git config --global user.email "philipp.boehm@igd-r.fraunhofer.de"
                        

Das erste Repository

$ mkdir meinerstesrepo
$ cd meinerstesrepo
$ git init
Initialized empty Git repository in ~/meinerstesrepo/.git/
  • git-spezifische Daten liegen in .git im Wurzelverzeichnis des Projekts
  • Dateien und Metadaten werden per SHA-1 gehasht
    • bei Änderungen an Dateien wird komplette Datei geschrieben -> keine Diffs.

Die erste Datei

$ cat >> README.md
# Mein erstes git-Repository

Nützliche Infos für andere Entwickler

$ git add README.md

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached ..." to unstage)#
#	new file:   README.md
#

$ git commit -m "Mein erster git Commit"
[master (root-commit) 0ed6244] Mein erster git Commit
 1 file changed, 3 insertions(+)
 create mode 100644 README.md
                    

Änderungen an dieser Datei

$ cat >> README.md

## LICENSE
Du kannst hiermit alles machen, was du willst.

$ git diff
diff --git a/README.md b/README.md
index d3c1d07..ed02056 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,6 @@
 # Mein erstes git-Repository

 Nützliche Infos für andere Entwickler
+
+## LICENSE
+Du kannst hiermit alles machen, was du willst.

$ git add .
$ git commit -m "Ein Lizenzhinweis hinzugefügt"
[master 3949ab1] Ein Lizenzhinweis hinzugefügt
 1 file changed, 3 insertions(+)
                    

Lokale Operationen

Änderungen rückgängig machen

# Letze Commit-Message ändern
$ git commit --amend
                    
# Letzen Commit rückgängig machen
$ git reset --soft HEAD^

# alternativ mit vorletzter Commit ID
$ git reset --soft 7d2d214a51f84448515
                    
# Änderungen an einer Datei verwerfen
$ git checkout [-f] DATEI

# Alle Änderungen im Working-Dir verwerfen
$ git checkout -f
                    

Unerwünschte Dateien ignorieren

$ git status
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)#
#	README.md~
#	test.pyc
                    
Eine Datei .gitignore enthält Dateien die ignoriert werden sollen.
$ cat .gitignore
*~
*.pyc
                    

weitere git-Kommandos

  • git log
  • git rm DATEI
  • git mv DATEI NEUEDATEI

Folgerungen

  • Alle Aktionen fanden lokal statt
    • keine Serververbindung notwendig
    • sehr schnell
  • git eignet sich sehr für Shell-Aliase
    • alias gs="git status"

$ git branch

  • Es gibt einen Default-Branch, standardmäßig master
  • git-Branches sind leichtgewichtig im Vergleich zu svn's
  • Es ist üblich, nicht auf dem master-Branch zu arbeiten, sondern auf einem Feature-Branch.
$ git branch
* master
  nocheintest
  testest

Neuen Branch erstellen

# erste Möglichkeit = umständlich
$ git branch testing
$ git checkout testing
Switched to branch 'testing'
                    
# Ein Shortcut
$ git checkout -b testing
Switched to branch 'testing'
                    

Arbeiten auf dem Branch

$ echo "## Copyright" >> README.md

$ git commit -a -m "Copyright Info"
[testing c2b9e] Copyright Info
 1 file changed, 1 insertion(+)
                    

Vereinigen von Branches (einfach)

$ git checkout master
Switched to branch 'master'

$ git merge testing
Updating f30ab..c2b9e
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)

                    

Komplizierteres Szenario

Häufig im Zusammenspiel mit mehreren Entwicklern anzutreffen.

Möglichkeit 1: Normaler Merge

$ git checkout master
$ git merge iss53
# Öffnet den Editor und erstellt einen Merge-Commit (C6)
                    

Möglichkeit 2: Rebase mit Merge

$ git checkout iss53
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added testest

# Nachfolgend kann ein normaler Merge mit master durchgeführt werden
$ git checkout master
$ git merge iss53
                    

Merge-Konflikte

$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

$ git status
index.html: needs merge
# On branch master
# Changed but not updated:
#
#   unmerged:   index.html

$ cat index.html
<<<<<<< HEAD:index.html
contact: email.support@github.com
=======
contact: support@github.com
>>>>>>> iss53:index.html

$ git commit -a -m "Changed index.html"
                    

Branch Management

# Auflisten aller Branches
$ git branch [ --no-merged ] [ --merged ]
                    
# Löschen von Branches
$ git branch -d BRANCHNAME

# wenn Branch nicht gemerged
$ git branch -D BRANCHNAME
                    

$ git remote

$ git clone https://github.com/hakimel/reveal.js.git
# Dies kopiert das komplette Repo mit History und registriert die URL als Quelle

$ cd reveal.js
$ cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = https://github.com/hakimel/reveal.js.git
[branch "master"]
    remote = origin
    merge = refs/heads/master

Illustration von git clone

Ein lokales Repo veröffentlichen

$ cd existing_git_repo

$ git remote add origin git@git.igd-r.fraunhofer.de:mein_cooles_repo.git

$ git push -u origin master

Kommunikation mit remotes

# Änderungen von origin/master holen
$ git fetch origin
$ git merge origin

# Shortcut
$ git pull
# lokale Commits nach origin übertragen
$ git push

# Einen Lokalen Brach auf origin veröffentlichen
$ git push origin LOCALBRANCH

# Einen remote Branch löschen
$ git push origin :LOCALBRANCH

$ git workflows

Workflow 1

Alle Entwickler arbeiten auf Feature-Branches und pushen in ein gemeinsames Repo.

Workflow 2

Workflow 3

Anwendung: Linux Kernel

$ git nice2know

git stash

Änderungen können gesichert werden, ohne dass sie committed werden müssen. Sie können zu einem beliebigen Zeitpunkt zurückgespielt werden.

# Aktuelle Änderungen im Working Directory sichern
$ git stash

# gesicherte Änderungen anzeigen
$ git stash list

# Letze gesicherte Änderung zurückspielen
$ git stash apply

# Letzte gesicherte Änderung zurückspielen und vom Stack löschen
$ git stash pull

Interaktiver Rebase

Möglichkeit Commits zu vertauschen, zusammenzufassen, neu zu ordnen oder zu verwerfen.

Keine History-Manipulation bei gepushten Commits !!!

$ git rebase -i HEAD~3

# Es öffnet sich der Editor und zeigt folgendes:

pick d54719f removed useless whitespace
pick 83b8948 deleted readme
pick 8929323 added line to license

# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message

Interaktives Staging

Möglichkeit einzelne Änderungen (hunks) an einer Datei zum Index hinzuzufügen.

$ git add -i

# Es öffnet sich der Editor und lässt einen mittels Kommandos einzelne hunks hinzufügen.

git bisect

Binäre Suche in Commits, welcher Commit einen bestimmten Bug erzeugt hat.

$ git bisect start
$ git bisect bad
$ git bisect good v1.0
Bisecting: 6 revisions left to test after this
[ecb6e1bc347ccecc5f9350d878ce677feb13d3b2] error handling on repo

git submodule

Möglichkeit andere git-Repos in eigenes git-Repo einzufügen ohne sie zu kopieren. Volle History und Möglichkeit zum Updates besteht.

$ git submodule add git://github.com/chneukirchen/rack.git lib/rack
# erstellt .gitmodules und ändert .git/config

git clone --recursive git://url.to.my.git.repo

git hooks

Möglichkeit bei bestimmten Ereignissen (Commit, Push ...) Scripte auszuführen.

Client-Side- und Server-Side-Hooks sind möglich. Templates liegen in .git/hooks/

Es gibt noch viel zu entdecken ...

$ man git-[TAB]
Display all 146 possibilities? (y or n)