Git mit Visual Studio

Paul Stempel - 07.05.2019

Agenda

  1. Git Herkunft und aktueller Stand
  2. Git Wording
  3. Unterschiede zu Team Foundation Version Control
  4. Erster Commit
  5. Prozess und Branches
  6. Zusammenarbeit und Pushen
  7. Mergen
  8. Dateien ausschließen
  9. Änderungen rückgängig machen
  10. Pull Requests
  11. Sonstige Themen

GIT

Hernkunft und aktueller Stand

GIT

Herkunft

* Erscheinungsjahr: 2005 * Initiiert durch _Linus Torvalds_, weil BitKeeper kostenpflichtig wurde * Webseite: [https://git-scm.com/](https://git-scm.com/) > "I’m an egotistical bastard, and I name all my projects after myself. First ‘Linux’, now [Git](https://www.dict.cc/?s=git)" - Linus Torvalds
https://de.wikipedia.org/wiki/Git

GIT

aktueller Stand

https://de.wikipedia.org/wiki/Git

Git Wording

Glossar für Präsentation

Basis

* _Stage_: Vormerken für den Commit * _Commit_: Quellcode lokal sichern * _Push_: Hochladen neuer Commits zum Server * _Pull_: Herunterladen neuer Commits vom Server * _Fetch_: Wie Pull, aber nur mit Metadaten * _Diff_: Änderung zwischen zwei Versionen der selben Dateien

Erweitert

* _Branch_: Eine Verzweigung im Quellcode * _Checkout_: Branches wechseln * _Merge_: Zusammenführung von Branches * _Origin_: Üblicherweise der Name des Servers * _Rebase_: Umschreiben der Commit History * _Stash_: Lokale Zwischenablage für Quellcode

Unterschiede zwischen GIT und Team Foundation Version Control (TFVC)

### Team Foundation Version Control * Zentralisiert (Nur der Abreitsstand ist lokal) * Tendenz zu großen Check-Ins * Branch (als Kopie) * Merge (die Historie wird evt. verändert) * Shelve-Sets (Änderungen für Später merken) * Locking
https://www.nebbiatech.com/2017/06/22/choosing-git-tfvc-vsts/
## GIT * Dezentral (Funktioniert auch ohne Server) * Funktioniert offline * Wird nur eine Zeile geändert, wird auch nur diese gespeichert (Kleines Repository) * Branch (als Verweis auf einen Commit) * Merge (ist nur ein weiterer Commit) * Stash (wie Shelve-Sets, nur lokal!) * Versionierung auf Zeilenbasis möglich (hunks) * CLI und div. GUI Clients * Kein Source Explorer mehr in VS
https://www.nebbiatech.com/2017/06/22/choosing-git-tfvc-vsts/

Erstes Projekt anlegen

Teil 1

### Projekt erstellen ![](images/create-project.gif)
### Git anlegen ![](images/git-init.png)
``` git init ```
### Git ist bereit ![](images/git-init-1.png)
### "Alle" Änderung commiten ![](images/git-commit.png)
``` git add . git commit -m "meine erste änderung" ```
### Historie einsehen ![](images/git-log.png)
``` git log ```
### Änderung einsehen ![](images/git-diff.png)
``` 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.

GIT Prozess

Teil 2

Linerarer Prozess

![](images/t1-1.png)
https://de.atlassian.com/git/tutorials/comparing-workflows

Paralleler Prozess

![](images/t1-2.png)
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

![](images/t1-vs-branch-new.png)

Branches wechseln

![](images/t1-vs-branch-checkout.png)

Branches merge - 1

![](images/t1-vs-branch-merge-1.png)

Branches merge - 2

![](images/t1-vs-branch-merge-2.png)

Branches merge - 3

![](images/t1-vs-branch-merge-3.png)
### 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

![](images/t2-1.png)
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

![](images/git-remote-add-1.png)
``` git remote add origin https://github.com/user/repo.git ```

Server hinzufügen - 2

![](images/git-remote-add-2.png)
``` git remote add origin https://github.com/user/repo.git ```

Veröffentlichen

![](images/git-remote-add-3.png)
```bash git push -u origin master # initial git push # später ```

Stand auf dem Server

![](images/git-remote-add-4.png)
```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

Merge Konflikte

Teil 4

Konflikte bereinigen - 1

![](images/git-merge-1.png)
```bash git checkout develop git merge feature/bestellung ```

Konflikte bereinigen - 2

![](images/git-merge-2.png)
```bash git commit -a -m "merge" # nach dem merge ```

Konflikte bereinigen - 3

![](images/git-merge-4.png)
```bash git log ```

Aufgabe 4

* Erstellt auf dem Development branch eine ein Feature Branch, bleibt aber auf develop * Ändert eine Zeile * Welchselt auf den Feature Branch (als ob ein Kollege daran arbeitet) * Ändert die selbe Zeile auf eine andere Weise * Wechselt auf develop und merged Euren Feature branch

Dateien ausschließen

Teil 5

### gitignore Datei * Steuerung der Ausschlüsse über `.gitignore` in dem Projektverzeichnis * VS legt bei neuen Projekten selbst eine .gitignore an * Empfehlung: Alle Binaries ausschließen, geht aber nicht immer
### gitignore Syntax ``` *.nupkg # Dateien mit der Endung nupkg packages/ # Den Ordner packages irgendwo !**/packages/build/ # build einschließen *.nuget.props b?n/ # Den Ordner ban, bbn, etc. /script.sh # script.sh in dem .gitignore/root-Verzeichnis src/**/test/* # Alle Dateien im Ordner test unterhalb von src ```
### Aufgabe 5 Legt bitte die folgenden Dateien an: ``` /analyse/runner.cmd /analyse/other.cmd /analyse/result1.txt /analyse/result2.txt ``` Ignoriert alles in dem Order analyse ausßer den Scripten.

Rückgängig machen

Teil 6

Commit zurücksetzen

![](images/git-revert.png)
```bash git revert HEAD~2 ```
https://github.blog/2015-06-08-how-to-undo-almost-anything-with-git/

Letzt Commit Nachricht ändern

![](images/git-commit-amend.png)
```bash git commit --amend ```
https://github.blog/2015-06-08-how-to-undo-almost-anything-with-git/

Lokale Änderung verwerfen

![](images/git-checkout-file.png)
```bash git checkout -- File.cs ```
https://github.blog/2015-06-08-how-to-undo-almost-anything-with-git/

Lokale Commits verwerfen

![](images/git-reset-hard.png)
```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)

Pull Prequests

Teil 7

### (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 ![](images/pr-1.png)
http://s060a0691:8080/tfs/CRM%20Westnetz/Westnetz%20eKuss/Einspeiser/_git/Westnetz.Portal/pullrequests?_a=mine
### Pull Request erstellen - 2 ![](images/pr-2.png)
http://s060a0691:8080/tfs/CRM%20Westnetz/Westnetz%20eKuss/Einspeiser/_git/Westnetz.Portal/pullrequests?_a=mine
### Pull Request Richtlinien ![](images/pr-3.png)
http://s060a0691:8080/tfs/CRM%20Westnetz/Westnetz%20eKuss/Einspeiser/_git/Westnetz.Portal/pullrequests?_a=mine
### Pull Request Review ![](images/pr-4.png)
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

Sonstiges

(Falls wir noch Zeit haben)

Clone

Demo

Stage

Demo

Stash

Demo

Cherry Pick

Demo

Anlagen

Linkssammlung

* https://docs.microsoft.com/en-us/azure/devops/repos/git/branches?view=azure-devops&tabs=visual-studio * https://de.atlassian.com/git/tutorials * https://nic-hartley.github.io/git-gud/ * https://whatthecommit.com/

Client Empfehlungen

* Kommandozeile * Fork [https://git-fork.com/](https://git-fork.com/) * GitKraken [https://www.gitkraken.com/git-client](https://www.gitkraken.com/git-client) * [SourceTree](https://www.sourcetreeapp.com/)
git vom Visual Studio 2017 als Umgebungsvariable in PowerShell setzen. ``` $env:Path += ";C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\cmd" ```

Vielen Dank!


Paul Stempel
paul.stempel@acando.de