Erstes Projekt anlegen
Teil 1
### Projekt erstellen

### Git anlegen

```
git init
```
### Git ist bereit

### "Alle" Änderung commiten

```
git add .
git commit -m "meine erste änderung"
```
### Historie einsehen

```
git log
```
### Änderung einsehen

```
git diff HEAD~1
```
### Aufgabe 1
* Erstellen Sie ein Windows Consolen Projekt
* Fügen Sie ein git Repository hinzu
* Geben Sie über die Console `Hello Git!` aus
* Versionieren Sie die Änderung
> Es muss nicht compilieren, es geht nur um Quellcodeänderung.
Linerarer Prozess

https://de.atlassian.com/git/tutorials/comparing-workflows
Paralleler Prozess

Aber was ist mit: Entwicklungsstand, Features, Releases, Hotfixes und dem produktiven Stand?
https://de.atlassian.com/git/tutorials/comparing-workflows
Git Flow
https://nvie.com/posts/a-successful-git-branching-model/
Git Flow
- master (1): Der produktive Stand des
Quellcodes
- develop (1): Der Entwicklungsstand des
Quellcodes
- feature branch (n): Verzweigung vom
develop-Branch
für featurebezogene Arbeit
- release branch (n): Ein Stand, welcher für das
Mergen und Testen verwendet wird vor dem
Release
- hotfix (n): Codeänderungen auf dem Master
werden
über hotfixes realisiert, welche in
master und develop gemerged werden.
Git Flow - Namenskonvention
* `feature/produkte-bestellen`
* `hotfix/captcha`
* `release/snickers`
* master
* develop
Branchse in Visual Studio
Branches erstellen

Branches wechseln

Branches merge - 1

Branches merge - 2

Branches merge - 3

### Aufgabe 2
* Erstellen Sie einen develop Branch
* Erstellen Sie für ein beliebiges Feature einen Branch (aufbauend auf develop)
* Geben Sie über die Console "Dies ist ein beliebigse Feature" aus
* Mergen Sie das Feature in den develop Branch und löschen Sie den feature Branch
GIT Zusammenarbeit
Teil 3
Dezentrales Arbeiten

https://nvie.com/posts/a-successful-git-branching-model/
Dezentrales Arbeiten
- Bei großen Projekten kann jedes Team ein eigenes Git haben, wobei der Code in einem
zentralen Git zusammengeführt wird
- Personen können "THEORETISCH" untereinander Code tauschen
- Mergen ist ein kritischer Mechanismus für die
Zusammenarbeit
Zusammenarbeit in Visual Studio
Server hinzufügen - 1

```
git remote add origin https://github.com/user/repo.git
```
Server hinzufügen - 2

```
git remote add origin https://github.com/user/repo.git
```
Veröffentlichen

```bash
git push -u origin master # initial
git push # später
```
Stand auf dem Server

```bash
git log --all --decorate --oneline --graph
```
### Aufgabe 3
* Erstellen Sie ein zweites lokales Repository als Ersatz für einen Server
```bash
cd C:\Temp
git init --bare server # C:\Temp\server
```
* Fügen Sie diesen als Remote hinzu
* Veröffentlichen Sie master und develop
Commit zurücksetzen

```bash
git revert HEAD~2
```
https://github.blog/2015-06-08-how-to-undo-almost-anything-with-git/
Letzt Commit Nachricht ändern

```bash
git commit --amend
```
https://github.blog/2015-06-08-how-to-undo-almost-anything-with-git/
Lokale Änderung verwerfen

```bash
git checkout -- File.cs
```
https://github.blog/2015-06-08-how-to-undo-almost-anything-with-git/
Lokale Commits verwerfen

```bash
git reset --hard HEAD~2
```
https://github.blog/2015-06-08-how-to-undo-almost-anything-with-git/
"Lokale Commits verwerfen" verwerfen!
Nicht in VS möglich.
```bash
git reflog
# a474ec8 (HEAD -> develop) HEAD@{0}: c
# 8824a73 HEAD@{1}: revert: Revert "6"
# fbd342f HEAD@{2}: commit: git ignore
git checkout 8824a73
```
https://github.blog/2015-06-08-how-to-undo-almost-anything-with-git/
Lokale Commits sichern mit Branches
(Ohne anleitung, weil trivial)
* Branch anlegen an der aktuellen Stelle
* Branches gehen nicht verloren
* Ändern der Historie im GIT
* Zurückkehren über den Branchnamen
https://github.blog/2015-06-08-how-to-undo-almost-anything-with-git/
Rebase interactive
Nicht in VS möglich.
```bash
git rebase -i
# pick f7f3f6d changed my name a bit
# pick 310154e updated README formatting and added blame
# pick a5f4a0d added cat-file
#
# # Rebase 710f0f8..a5f4a0d onto 710f0f8
# #
# # Commands:
# p, pick commit = use commit
# r, reword commit = use commit, but edit the commit message
# # e, edit commit = use commit, but stop for amending
# # s, squash commit = use commit, but meld into previous commit
# # f, fixup commit = like "squash", but discard this commit's log message
# # x, exec command = run command (the rest of the line) using shell
# # b, break = stop here (continue rebase later with 'git rebase --continue')
# # d, drop commit = remove commit
# # l, label label = label current HEAD with a name
# # t, reset label = reset HEAD to a label
# # m, merge [-C commit | -c commit] label [oneline]
# # . create a merge commit using the original merge commit's
# # . message (or the oneline, if no original merge commit was
# # . specified). Use -c commit to reword the commit message.
```
https://github.blog/2015-06-08-how-to-undo-almost-anything-with-git/
Aufgabe 6
* Ändert Eure letzte Commit Nachricht
* Ändert eine Datei und verwerft die Änderung ohne zu commiten
* Setzt einen Commit zurück (revert)
### (Meine) Definition
Vorschlag für eine möglichst keine aber in sich vollständige Änderung in Form eines Branches für
bspw. für ein fertiges Feature oder ein Hotfix.
https://de.atlassian.com/git/tutorials/making-a-pull-request
### Toolunterstützung
* Ein Pull Request verhält sich wie ein Forum, um die Änderungen zu diskutieren
* Review ist möglich und und Feedback kann direkt umgesetzt werden
* Richtlinien für das Review können festgelegt werden
* Automatisierte Integration und Deployment ist möglich
https://de.atlassian.com/git/tutorials/making-a-pull-request
### Pull Request erstellen - 1

http://s060a0691:8080/tfs/CRM%20Westnetz/Westnetz%20eKuss/Einspeiser/_git/Westnetz.Portal/pullrequests?_a=mine
### Pull Request erstellen - 2

http://s060a0691:8080/tfs/CRM%20Westnetz/Westnetz%20eKuss/Einspeiser/_git/Westnetz.Portal/pullrequests?_a=mine
### Pull Request Richtlinien

http://s060a0691:8080/tfs/CRM%20Westnetz/Westnetz%20eKuss/Einspeiser/_git/Westnetz.Portal/pullrequests?_a=mine
### Pull Request Review

http://s060a0691:8080/tfs/CRM%20Westnetz/Westnetz%20eKuss/Einspeiser/_git/Westnetz.Portal/pullrequests?_a=mine
Aufgabe 7
* Kommentieren Sie in [PR
982](http://s060a0691:8080/tfs/CRM%20Westnetz/Westnetz%20eKuss/Einspeiser/_git/Westnetz.Portal/pullrequest/982#_a=overview)
eine Datei und lösen Sie ein anderes Kommentar