$ 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.pycEine 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)