$ whoami Philipp Böhm $ whoami --online - blog.pboehm.org - github.com/pboehm - twitter.com/phboehm
Notwendige Konfiguration
$ git config --global user.name "Philipp Böhm"
$ git config --global user.email "philipp.boehm@igd-r.fraunhofer.de"
                        
                    $ mkdir meinerstesrepo $ cd meinerstesrepo $ git init Initialized empty Git repository in ~/meinerstesrepo/.git/
$ 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
                    
                
$ 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(+)
                    
                
# 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
                    
                
$ 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
                    
                $ git branch * master nocheintest testest
# 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'
                    
                    
$ echo "## Copyright" >> README.md
$ git commit -a -m "Copyright Info"
[testing c2b9e] Copyright Info
 1 file changed, 1 insertion(+)
                    
                    
$ git checkout master
Switched to branch 'master'
$ git merge testing
Updating f30ab..c2b9e
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)
                    
                    Häufig im Zusammenspiel mit mehreren Entwicklern anzutreffen.
$ git checkout master
$ git merge iss53
# Öffnet den Editor und erstellt einen Merge-Commit (C6)
                    
                    
$ 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
                    
                    
$ 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"
                    
                
# 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 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
$ cd existing_git_repo $ git remote add origin git@git.igd-r.fraunhofer.de:mein_cooles_repo.git $ git push -u origin master
# Ä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
Alle Entwickler arbeiten auf Feature-Branches und pushen in ein gemeinsames Repo.
Anwendung: Linux Kernel
Ä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
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
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.
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
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
Möglichkeit bei bestimmten Ereignissen (Commit, Push ...) Scripte auszuführen.
Client-Side- und Server-Side-Hooks sind möglich. Templates liegen in .git/hooks/
$ man git-[TAB]
Display all 146 possibilities? (y or n)