<commit_before><!doctype html>
<html lang="en">

	<head>
		<meta charset="utf-8">

		<title>git-Kurs - powered by reveal.js</title>

		<meta name="description" content="A framework for easily creating beautiful presentations using HTML">
		<meta name="author" content="<NAME>">

		<meta name="apple-mobile-web-app-capable" content="yes" />
		<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />

		<link href='http://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic' rel='stylesheet' type='text/css'>

		<link rel="stylesheet" href="css/main.css">
		<link rel="stylesheet" href="css/theme/beige.css">

		<!-- For syntax highlighting -->
		<link rel="stylesheet" href="lib/css/zenburn.css">

		<script>
			// If the query includes 'print-pdf' we'll use the PDF print sheet
			document.write( '<link rel="stylesheet" href="css/print/' + ( window.location.search.match( /print-pdf/gi ) ? 'pdf' : 'paper' ) + '.css" type="text/css" media="print">' );
		</script>

		<!--[if lt IE 9]>
		<script src="lib/js/html5shiv.js"></script>
		<![endif]-->
	</head>

	<body>

		<div class="reveal">

			<!-- Used to fade in a background when a specific slide state is reached -->
			<div class="state-background"></div>

			<!-- Any section element inside of this container is displayed as a slide -->
			<div class="slides">
				<section data-markdown>
                    ## `$ git kurs --now`
                </section>

				<section data-markdown>
                    ## Allgemeines

                    *   verteiltes Versionskontrollsystem für Dateien
                        * Bei Änderungen an Dateien wird komplette Datei geschrieben -> keine Diffs
                    *   von Linus Torvalds für Linux Kernel entwickelt
                    *   plattformunabhängig
                        * Linux _(per Paketmanager)_
                        * Mac _(per Homebrew oder Website)_
                        * Windows _(`msysgit` ???)_
                    * Website: [git-scm.com](http://git-scm.com)
                    * Einsatzmöglichkeiten: .... viele

				</section>

                <section>
                    <h2><code>$ git basics</code></h2>

                    <div class="fragment">
                        <p>Notwendige Konfiguration</p>
                        <pre><code>
$ git config --global user.name "<NAME>"
$ git config --global user.email "<EMAIL>"
                        </code></pre>
                    </div>

                </section>

                <section>
                    <h2>Das erste Repository</h2>

                    <pre><code>
$ mkdir meinerstesrepo
$ cd meinerstesrepo
$ git init
Initialized empty Git repository in ~/meinerstesrepo/.git/
                    </code></pre>

                    Alle git-spezifischen Daten liegen in <code>.git</code> im Wurzelverzeichnis des Projekts. Alle Dateien und Änderungen werden per SHA-1 gehasht.
                </section>

                <section>
                    <h2>Die erste Datei</h2>

                    <pre><code>
$ 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 <file>..." 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
$ git status
# On branch master
nothing to commit (working directory clean)

                    </code></pre>
                </section>


                <section>
                    <h2>Änderungen an dieser Datei</h2>

                    <pre><code>
$ 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(+)
                    </code></pre>
                </section>

                <section>
                    <h2>Lokale Operationen</h2>
                    <img src="img/file-states.png" alt="" />
                </section>

                <section>
                    <h2>Änderungen rückgängig machen</h2>

                    <pre><code>
# Letze Commit-Message ändern
$ git commit --amend
                    </code></pre>

                    <pre><code>
# Letzen Commit rückgängig machen
$ git reset --soft HEAD^

# alternativ mit vorletzter Commit ID
$ git reset --soft 7d2d214a51f84448515
                    </code></pre>

                    <pre><code>
# Änderungen an einer Datei verwerfen
$ git checkout [-f] DATEI

# Alle Änderungen im Working-Dir verwerfen
$ git checkout -f
                    </code></pre>

                </section>

                <section>
                    <h2>Unerwünschte Dateien ignorieren</h2>
                    <pre><code>
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	README.md~
#	test.pyc
                    </code></pre>

                    Eine Datei <code>.gitignore</code> enthält Dateien die ignoriert werden sollen.


                    <pre><code>
$ cat .gitignore
*~
*.pyc
$ git add .gitignore && git commit -m ".gitignore"
                    </code></pre>

                </section>

                <section data-markdown>
                    ## weitere `git`-Kommandos

                    * `git log`
                    * `git rm DATEI`
                    * `git mv DATEI NEUEDATEI`

                </section>

				<section data-markdown>
                    ## Folgerungen

                    * Alle Aktionen fanden lokal statt _(keine Serververbindung notwendig)_ --> sehr schnell
                    * `git` eignet sich sehr für Shell-Aliase
                        * `alias gs="git status"`
				</section>

                <section data-markdown>
                    ## `$ git branch`

                    * Es gibt einen Master-Branch, standardmäßig `master`
                    * `git`-Branches sind lightweight im Vergleich zu `svn`
                    * Es ist üblich, **nicht** auf dem `master`-Branch zu arbeiten, sondern auf einem Feature-Branch.

                    <pre><code>
$ git branch
* master
  nocheintest
  testest
                    </code></pre>

                </section>

                <section>
                    <h2>Neuen Branch erstellen</h2>

                    <pre><code>
# erste Möglichkeit = umständlich
$ git branch testing
$ git checkout testing
Switched to branch 'testing'
                    </code></pre>

                    <pre><code>
# Ein Shortcut
$ git checkout -b testing
Switched to branch 'testing'
                    </code></pre>

                    <img src="img/branch1.png" alt="" />
                </section>

                <section>
                    <h2>Arbeiten auf dem Branch</h2>

                    <pre><code>
$ echo "##Copyright" >> README.md
$ git commit -a -m "Copyright Info"
[testing 6245426] Copyright Info
 1 file changed, 1 insertion(+)
                    </code></pre>

                    <img src="img/branch2.png" alt="" />
                </section>

                <section>
                    <h2>Vereinigen von Branches (einfach)</h2>

                    <pre><code>
$ git checkout master
Switched to branch 'master'

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

                    </code></pre>

                    <img src="img/branch3.png" alt="" />
                </section>

                <section>
                    <h2>Komplizierteres Szenario</h2>

                    <img src="img/branch4.png" alt="" />

                    <p>Häufig im Zusammenspiel mit mehreren Entwicklern anzutreffen.</p>
                </section>

                <section>
                    <h2>Möglichkeit 1: Normaler Merge</h2>

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

                    <img src="img/branch5.png" alt="" />
                </section>

                <section>
                    <h2>Möglichkeit 2: Rebase mit Merge</h2>

                    <pre><code>
$ 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
                    </code></pre>

                    <img src="img/branch6.png" alt="" />
                </section>

                <section>
                    <h2>Merge-Konflikte</h2>

                    <pre><code>
$ 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>
=======
contact: <EMAIL>
>>>>>>> iss53:index.html

$ git commit -a -m "Changed index.html"
                    </code></pre>

                </section>

                <section>
                    <h2>Branch Management</h2>

                    <pre><code>
# Auflisten aller Branches
$ git branch [ --no-merged ] [ --merged ]
                    </code></pre>

                    <pre><code>
# Löschen von Branches
$ git branch -d BRANCHNAME

# wenn Branch nicht gemerged
$ git branch -D BRANCHNAME
                    </code></pre>
                </section>

				<section data-markdown>
                    ## `$ git remotes`

                    <pre><code>
$ 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<commit_msg>Minor changes and added name<commit_after><!doctype html>
<html lang="en">

	<head>
		<meta charset="utf-8">

		<title>git-Kurs - powered by reveal.js</title>

		<meta name="description" content="A framework for easily creating beautiful presentations using HTML">
		<meta name="author" content="<NAME>">

		<meta name="apple-mobile-web-app-capable" content="yes" />
		<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />

		<link href='http://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic' rel='stylesheet' type='text/css'>

		<link rel="stylesheet" href="css/main.css">
		<link rel="stylesheet" href="css/theme/beige.css">

		<!-- For syntax highlighting -->
		<link rel="stylesheet" href="lib/css/zenburn.css">

		<script>
			// If the query includes 'print-pdf' we'll use the PDF print sheet
			document.write( '<link rel="stylesheet" href="css/print/' + ( window.location.search.match( /print-pdf/gi ) ? 'pdf' : 'paper' ) + '.css" type="text/css" media="print">' );
		</script>

		<!--[if lt IE 9]>
		<script src="lib/js/html5shiv.js"></script>
		<![endif]-->
	</head>

	<body>

		<div class="reveal">

			<!-- Used to fade in a background when a specific slide state is reached -->
			<div class="state-background"></div>

			<!-- Any section element inside of this container is displayed as a slide -->
			<div class="slides">
				<section data-markdown>
                    ## `$ git kurs --now`

                    <div style="margin-top: 100px;">
                        <NAME> <br />
                        <small>@phboehm</small>
                    </div>
                </section>

				<section data-markdown>
                    ## 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](http://git-scm.com)
                    * Einsatzmöglichkeiten: .... viele

				</section>

                <section>
                    <h2><code>$ git basics</code></h2>

                    <div class="fragment">
                        <p>Notwendige Konfiguration</p>
                        <pre><code>
$ git config --global user.name "<NAME>"
$ git config --global user.email "<EMAIL>"
                        </code></pre>
                    </div>

                </section>

                <section data-markdown>
                    ## Das erste Repository

                    <pre><code>
$ mkdir meinerstesrepo
$ cd meinerstesrepo
$ git init
Initialized empty Git repository in ~/meinerstesrepo/.git/
                    </code></pre>

                    * `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.
                </section>

                <section>
                    <h2>Die erste Datei</h2>

                    <pre><code>
$ 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 <file>..." 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
$ git status
# On branch master
nothing to commit (working directory clean)

                    </code></pre>
                </section>


                <section>
                    <h2>Änderungen an dieser Datei</h2>

                    <pre><code>
$ 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(+)
                    </code></pre>
                </section>

                <section>
                    <h2>Lokale Operationen</h2>
                    <img src="img/file-states.png" alt="" />
                </section>

                <section>
                    <h2>Änderungen rückgängig machen</h2>

                    <pre><code>
# Letze Commit-Message ändern
$ git commit --amend
                    </code></pre>

                    <pre><code>
# Letzen Commit rückgängig machen
$ git reset --soft HEAD^

# alternativ mit vorletzter Commit ID
$ git reset --soft 7d2d214a51f84448515
                    </code></pre>

                    <pre><code>
# Änderungen an einer Datei verwerfen
$ git checkout [-f] DATEI

# Alle Änderungen im Working-Dir verwerfen
$ git checkout -f
                    </code></pre>

                </section>

                <section>
                    <h2>Unerwünschte Dateien ignorieren</h2>
                    <pre><code>
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	README.md~
#	test.pyc
                    </code></pre>

                    Eine Datei <code>.gitignore</code> enthält Dateien die ignoriert werden sollen.


                    <pre><code>
$ cat .gitignore
*~
*.pyc
$ git add .gitignore && git commit -m ".gitignore"
                    </code></pre>

                </section>

                <section data-markdown>
                    ## weitere `git`-Kommandos

                    * `git log`
                    * `git rm DATEI`
                    * `git mv DATEI NEUEDATEI`

                </section>

				<section data-markdown>
                    ## Folgerungen

                    * Alle Aktionen fanden lokal statt _(keine Serververbindung notwendig)_ --> sehr schnell
                    * `git` eignet sich sehr für Shell-Aliase
                        * `alias gs="git status"`
				</section>

                <section data-markdown>
                    ## `$ git branches`

                    * Es gibt einen Master-Branch, standardmäßig `master`
                    * `git`-Branches sind lightweight im Vergleich zu `svn`
                    * Es ist üblich, **nicht** auf dem `master`-Branch zu arbeiten, sondern auf einem Feature-Branch.

                    <pre class="fragment"><code>
$ git branch
* master
  nocheintest
  testest
                    </code></pre>

                </section>

                <section>
                    <h2>Neuen Branch erstellen</h2>

                    <pre><code>
# erste Möglichkeit = umständlich
$ git branch testing
$ git checkout testing
Switched to branch 'testing'
                    </code></pre>

                    <pre><code>
# Ein Shortcut
$ git checkout -b testing
Switched to branch 'testing'
                    </code></pre>

                    <img src="img/branch1.png" alt="" />
                </section>

                <section>
                    <h2>Arbeiten auf dem Branch</h2>

                    <pre><code>
$ echo "##Copyright" >> README.md
$ git commit -a -m "Copyright Info"
[testing 6245426] Copyright Info
 1 file changed, 1 insertion(+)
                    </code></pre>

                    <img src="img/branch2.png" alt="" />
                </section>

                <section>
                    <h2>Vereinigen von Branches (einfach)</h2>

                    <pre><code>
$ git checkout master
Switched to branch 'master'

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

                    </code></pre>

                    <img src="img/branch3.png" alt="" />
                </section>

                <section>
                    <h2>Komplizierteres Szenario</h2>

                    <img src="img/branch4.png" alt="" />

                    <p>Häufig im Zusammenspiel mit mehreren Entwicklern anzutreffen.</p>
                </section>

                <section>
                    <h2>Möglichkeit 1: Normaler Merge</h2>

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

                    <img src="img/branch5.png" alt="" />
                </section>

                <section>
                    <h2>Möglichkeit 2: Rebase mit Merge</h2>

                    <pre><code>
$ 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
                    </code></pre>

                    <img src="img/branch6.png" alt="" />
                </section>

                <section>
                    <h2>Merge-Konflikte</h2>

                    <pre><code>
$ 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>
=======
contact: <EMAIL>
>>>>>>> iss53:index.html

$ git commit -a -m "Changed index.html"
                    </code></pre>

                </section>

                <section>
                    <h2>Branch Management</h2>

                    <pre><code>
# Auflisten aller Branches
$ git branch [ --no-merged ] [ --merged ]
                    </code></pre>

                    <pre><code>
# Löschen von Branches
$ git branch -d BRANCHNAME

# wenn Branch nicht gemerged
$ git branch -D BRANCHNAME
                    </code></pre>
                </section>

				<section data-markdown>
                    ## `$ git remotes`

                    <pre class="fragment"><code>
$ 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
{'fraction_non_alphanumeric': 0.11858340397475746, 'fraction_numerical': 0.01351605915041914, 'mean_word_length': 1.637888198757764, 'pattern_counts': {'":': 0, '<': 429, '<?xml version=': 0, '>': 445, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5721171', 'n_tokens_mistral': 6786, 'n_tokens_neox': 6106, 'n_words': 1711}