forked from derphilipp/schulung_git
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
708 lines (611 loc) · 18.4 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="keywords" content="git,Präsentation" />
<meta name="description" content="Git für Einsteiger" />
<title>Git für Einsteiger</title>
<style>
@import url(https://fonts.googleapis.com/css?family=Droid+Serif);
@import url(https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz);
@import url(https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic);
body {
font-family: 'Droid Serif';
}
h1, h2, h3 {
font-family: 'Yanone Kaffeesatz';
font-weight: 400;
margin-bottom: 0;
}
table { border-collapse: collapse;
margin-top: 1em;
}
th { padding: 5px; border: 5px solid ; }
td { padding: 5px; border: 3px solid ; }
/*th, td { padding: 5px; border: 5px solid red; }*/
.remark-slide-content h1 { font-size: 3em; }
.remark-slide-content h2 { font-size: 2em; }
.remark-slide-content h3 { font-size: 1.6em; }
.footnote {
position: absolute;
bottom: 3em;
}
li p { line-height: 1.25em; }
.red { color: #fa0000; }
.large { font-size: 2em; }
a, a > code {
color: rgb(249, 38, 114);
text-decoration: none;
}
code {
background: #e7e8e2;
border-radius: 5px;
}
.remark-code, .remark-inline-code { font-family: 'Ubuntu Mono'; }
.remark-code-line-highlighted { background-color: #373832; }
.pull-left {
float: left;
width: 47%;
}
.pull-right {
float: right;
width: 47%;
}
.pull-right ~ p {
clear: both;
}
#slideshow .slide .content code {
font-size: 0.8em;
}
#slideshow .slide .content pre code {
font-size: 0.9em;
padding: 15px;
}
.inverse {
background: #272822;
color: #777872;
text-shadow: 0 0 20px #333;
}
.inverse h1, .inverse h2 {
color: #f3f3f3;
line-height: 0.8em;
}
/* Slide-specific styling */
#slide-inverse .footnote {
bottom: 12px;
left: 20px;
}
#slide-how .slides {
font-size: 0.9em;
position: absolute;
top: 151px;
right: 140px;
}
#slide-how .slides h3 {
margin-top: 0.2em;
}
#slide-how .slides .first, #slide-how .slides .second {
padding: 1px 20px;
height: 90px;
width: 120px;
-moz-box-shadow: 0 0 10px #777;
-webkit-box-shadow: 0 0 10px #777;
box-shadow: 0 0 10px #777;
}
#slide-how .slides .first {
background: #fff;
position: absolute;
top: 20%;
left: 20%;
z-index: 1;
}
#slide-how .slides .second {
position: relative;
background: #fff;
z-index: 0;
}
/* Two-column layout */
.left-column {
color: #777;
width: 20%;
height: 92%;
float: left;
}
.left-column h2:last-of-type, .left-column h3:last-child {
color: #000;
}
.right-column {
width: 75%;
float: right;
padding-top: 1em;
}
</style>
</head>
<body>
<!-- class: left, middle, inverse -->
<textarea id="source">
name: inverse
layout: true
class: left, middle, inverse
---
# Einführung in Git
Philipp Weißmann
[[email protected]](mailto:[email protected])
---
# Agenda
* Motivation
* Einführung
* Hintergrund
* Konzepte und Arbeiten mit Git
* Tipps, Quellen und Links
* Fragen, Fragen, Fragen
---
#[Simply Explained...](http://geek-and-poke.com/geekandpoke/2012/11/3/simply-explained.html)
---
#[Wir starten hier...](http://geekandpoke.typepad.com/geekandpoke/2012/07/simply-explained-2.html)
---
# Motivation für Versionsmanagement
- Dateien sichern
- Sicherungskopie
- Versionen
- Dokumentation von Arbeitsschritten
- Zusammenarbeit
- Austausch
- Konkurrierende Änderungen
---
# Historie
- 2005 von L. Torvards gestartet
- Ziele:
- Verteilt
- Sicherheit gegen Verfälschung
- Effizienz
- 10 Jahre Git: Beliebtestes Versionsmanagementsystem
---
# Was macht Git?
- Git verfolgt Änderungen von Inhalten
---
# Eigenschaften 1
- Verteilt / Dezentral: Kein Server notwendig
- Entwicklung in Zweigen (*Branching*)
- Datentransfer unabhängig von Dienst
- `file`, `http`, `https`, `ftp`, `rsync`, Email, ...
- Kryptografisch sicher (*Hashes*, *Signaturen*)
---
# Eigenschaften 2
- Läuft auf allen großen Betriebssystemen
- Schnell und leichtgewichtig
- Viele Workflows möglich
- Kostenlos und frei
---
# Installation
- Linux:
- Meist schon installiert, Paktmanager
- macOS:
- Schon installiert, neuere Version: Installationspaket, Homebrew oder Macports
- Windows:
- Installationspaket
Empfohlener Download: [Offizielle Homepage](https://git-scm.com/download/)
---
# Setup
Einstellungen werden an 3 Orten gespeichert:
- Systemweit
- `gitconf`
- Benutzerglobal
- `BENUTZER-VERZEICHNIS/.gitconfig`
- Projektspezifisch
- `PROJEKT-VERZEICHNIS/.git/config`
---
# Setup
- Emailadresse und Name einstellen:
- `git config --global user.name "Philipp Weißmann"`
- `git config --global user.email "[email protected]"`
- Editor einstellen:
- `git config --global core.editor notepad`
- `git config --global core.editor "'c:\Program Files (x86)\Notepad++\notepad++.exe' -multiInst -notabbar -nosession -noPlugin"`
---
# Zustände
![inline](states.png)
---
# Neues Repository
- Vorhandenes Verzeichnis in Terminal öffnen
`git init .`
- Erstellt *.git* Verzeichnis
- Beinhaltet Informationen und Daten (dezentral!)
---
# Zustand ansehen
`git status`
- Hat viele Parameter
- Kann angepasst werden
- Hinweis: Bei jedem Befehl kann (offline) Hilfe aufgerufen werden
- `git help status` oder `git status --help`
---
## Zustand: Stage Files
![inline](states.png)
---
# Stage Files
- Datei in Stage hinzufügen
- `git add` *DATEINAME*
- Datei aus Stage wieder entfernen
- `git reset HEAD` *DATEINAME*
- Tipp:
- `git config --global alias.unadd "reset HEAD"`
---
# Zustand: Commit
![inline](states.png)
---
# Commit
- `git commit -m "NACHRICHT"`
oder interaktiv (öffnet Editor)
- `git commit`
- Änderungs-Set
- Atomar
- Beschreibung
---
#[The first check-in of the day](http://geekandpoke.typepad.com/geekandpoke/2010/04/one-day-in-the-life-of-a-coder-part-3.html)
---
# Zu Commit Nachricht
##Tipps:
- Nachvollziehbare, kurze Nachricht
- Beschreibung der Änderung auf logischer Ebene
- Commit editieren: `git commit --amend`
Beispiele:
- *Changes API from sqlite2 to sqlite3*
- *Fixes printer LF32 Bug*
- *Work*
- *Change to Worker.cs*
---
# Zu Commit Größe
##Tipps:
- Commit early
- Commit often
- Eine Änderung, ein Commit
- Jeder Stand sollte *lauffähig* sein
---
# Zustand: Checkout Projekt
![inline](states.png)
---
# Checkout
- Stellt definierten Zustand von Datei(en) her
- Eine Datei:
- `git checkout ` *DATEINAME*
- Ein kompletter Zustand:
- `git checkout ` *VERSION*
- Achtung: Ohne neuen Branch befindet man sich im "detached head state", d.h. es können keine Änderungen commited werden
- Aus "detached head state" zurückkehren:
- `git checkout -`
---
# Workflow
![inline](workflow.png)
---
# Vorhandenes Repository benutzen
- Von Verzeichnis:
- `git clone /pfad/zu/repository`
- Via SSH:
- `git clone user@server:repostory`
- Via HTTPS:
- `git clone https://server/repository`
- Konkretes Beispiel
- `git clone https://github.com/jnv/lists.git`
---
# Unterschied darstellen:
`git diff`
z.B. `git diff DATEINAME`
oder `git diff` für alle Änderungen
- Stellt Unterschiede dieser Datei dar (jetzt zu "letzter Stand")
- Kann ältere Versionen vergleichen
---
# Commits ansehen
`git log`
- Zeigt (alle) commits an:
```
commit 465d5a1e23bf7c65cd2c7531cb8897533a5d10e1
Merge: c8bd6d0 6e1cc6f
Author: Jan Vlnas <[email protected]>
Date: Tue Sep 29 10:44:43 2015 +0200
Merge pull request #70 from deephacks/jvm
Add awesome-jvm
commit c8bd6d03b522232c69503db27b62c53fa2ce07c1
Author: Jan Vlnas <[email protected]>
...
```
---
# Commits ansehen
Anzeige extrem personalisierbar, z.B.
- `git log --oneline --decorate`
```
465d5a1 (HEAD -> master, origin/master, origin/HEAD) Merge pull request #70 from deephacks/jvm
c8bd6d0 Add awesome-opensource-documents
30bba1f Add awesome-promises
6885317 Add awesome-rails-gem
18ea885 Add Resources-for-Writing-Shaders-in-Unity
6e1cc6f Loosely low level, performance related JVM stuff
878757c Fix desc for Fresh-Node.js-Library-Collection
5d3c5e4 Add Fresh-Node.js-Library-Collection
c4abb5f Add awesome-android-performance
0faf86f Add idaplugins-list
6dbce72 Fix link for bookmarklets
53ae3e5 Add awesome-awesome-awesome
512f62c Add awesome-osx
9821b39 Add neural-network-papers
f088a53 Merge pull request #68 from tomasbedrich/master
a3f4b7a Add big-list-of-naughty-strings
f83fcb6 Add awesome-gyazo
19a9dcb Merge pull request #67 from peterkokot/patch-jquery
```
---
# Commits ansehen
`git log --color --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset" --abbrev-commit`
```
* 3f414f7 Add learn-tt Jan Vlnas, 80 minutes ago
* 209db94 Merge pull request #55
|\
| * 264147b Adds Awesome-ConservationTech
|/
* 2272531 Merge pull request #54
|\
| * cb446f8 Fixed typo
|/
* 703f1bd Merge pull request #53
|\
| * c44a93e Add awesome-gulp
|/
* 71ef478 Add AngularJS-Learning and AngularJS2-Learning
```
---
# Exkurs: Eigene Kommandos
- Eigene Kommandos können in der Konfiguration angelegt werden
- Beispiel: Datei an vorhandenen Commit einfügen
- `git commit --amend --no-edit` soll eigenen Befehl bekommen
- `git config --global alias.commend 'commit --amend --no-edit'`
- Anwendung:
- `git add filereader.cpp`
- `git commit -m "Adds capabilities of reading files"`
- "Oh je..."
- `git add filereader.h`
- `git commend`
---
# Exkurs: Eigene Kommandos
- Beispiel: Neues Projekt:
- `$ git config --global alias.it '!git init && git commit -m "Erster Commit" --allow-empty'`
- Wirklich alles 'Stashen'
- `git config --global alias.stashall 'stash --all'`
- Hübsches git log (siehe zuvor)
- `git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"`
---
# Inhalt eines Commits ansehen
`git show VERSION`
z.B. `git show 6885317`
```
commit 6885317d6275be672a4a78de300231f4b2688952
Author: Jan Vlnas <[email protected]>
Date: Fri Sep 25 13:09:49 2015 +0200
Add awesome-rails-gem
diff --git a/README.md b/README.md
index 9104311..d9df5cb 100644
--- a/README.md
+++ b/README.md
@@ -477,6 +477,7 @@ List of useful, silly and [awesome](#awesome-) lists curated on GitHub. Contribu
* [awesome-rails](https://github.com/dpaluy/awesome-rails) by @dpaluy
* [awesome-rails](https://github.com/ekremkaraca/awesome-rails) by @ekremkaraca – Projects and sites made with Rails.
* [awesome-rails](https://github.com/ruby-vietnam/awesome-rails) by @ruby-vietnam – Rails libraries/app examples/ebooks/tutorials/screencasts/magazines/news.
+* [awesome-rails-gem](https://github.com/hothero/awesome-rails-gem) – Ruby Gems for Rails development.
* [awesome-react](https://github.com/enaqx/awesome-react) – ReactJS tools, resources, videos.
* [awesome-recommender-system](https://github.com/Geek4IT/awesome-recommender-system) – Recommender System frameworks, libraries and software.
* [awesome-redux](https://github.com/xgrommx/awesome-redux) – Resources for [Redux](https://github.com/gaearon/redux), the predictable state container.
```
---
# Branching
- Motivation:
- Entwicklung und Änderungen durchführen, ohne den Main-Branch stören
- Ist normales Vorgehen bei gemeinsamer Entwicklung
---
# Branch(es) anzeigen:
`git branch`
- Zeigt (lokal) verfügbare Branches an und welcher gerade aktiv ist
---
# Auf vorhandenen Branch wechseln:
`git checkout BRANCHNAME`
- Wechselt auf schon vorhandenen Branch
z.B. `git checkout add_scanner_support`
---
# Branch erstellen:
`git checkout -b BRACHNAME`
- Legt neuen Branch an
z.B. `git checkout -b feature/add_scanner_support`
---
# Branching Tipps
Tipps:
- Branch Namen mit "/" gruppieren
- Ein Branch pro Aufgabe
- Branches kosten nichts
- Branches können auf den Server übertragen werden
- Ungebrauchte Branches löschen
---
# Branches zusammenführen: Merge
- Beim Abschluss eines Branches (z.B. Aufgabe komplett) soll dieser in einen andere (z.B. *main*) Branch überführt werden
- Wechsle in den Ziel-Branch (hier: *master*)
- `git merge BRANCH`
- z.B. `git merge bug/burning_printer`
---
# Versionsstände markieren: Tagging
`git tag TAG-BEZEICHUNG`
- z.B. `git tag v1.2.0 1b2c3d4f`
- z.B. `git tag my_favorite_version 4400440`
---
# Änderungen zurücksetzen
`git reset`
- Tipp: Fast jede Situation ist in der Hilfe von `git reset` beschrieben.
- Hilfe unter `git reset --help` konsultieren!
---
# Änderungen "parken": Stash
`git stash`
- "Parkt" Änderungen an Projekt lokal
- `git stash`
- Wie "lokales" Commit, jedoch nicht in History; Kann ausgegeben werden
- `git stash list`
- Kann wieder appliziert werden:
- `git stash apply`
- ... und dann entfernt werden:
- `git stash drop`
- Alternative: Anwenden und entfernen:
- `git stash pop`
---
## Erweitertes Stashen:
- Kann "de-appliziert" werden:
- `git stash show -p | git apply -R`
- Alternativ:
- `git config --global alias.stash-unapply '!git stash show -p | git apply -R'`
- Ab dann
- `git stash-unapply`
- Neuen Branch aus Stashes
- `git stash branch "feature/adds_password_manager"`
---
# Änderungen abholen
`git fetch`
- Abholen von Änderungen aus gemeinsamen Repository (dezentral!)
- Änderungen werden (noch) nicht angewendet
---
# Änderungen anwenden
`git merge`
- Zusammenführen von 2 Branches
- (z.B. entfernter Branch und lokaler Branch *master*)
- `git pull`
- Führt `git fetch` und `git merge` in einem aus
- Tipp: Anfangs `git fetch` und `git merge` manuell ausführen!
---
#[Merge Konflikte vermeiden](http://geekandpoke.typepad.com/geekandpoke/2010/10/being-a-code-made-easy-chapter-1.html)
---
# Änderungen hochladen
`git push`
- Commits auf den Server übertragen
- Bei erstem push Serverangabe und Branch notwendig:
- z.B. `git push origin master`
- *origin*: Standard Servername
- *master*: Standard Branch
- Falls der Server noch nicht bekannt ist:
- `git remote add origin SERVER`
- z.B. `git remote add origin [email protected]:jnv/lists.git`
---
# Merge Konflikte
- Tritt nur bei Widersprüchen auf
- Bei Konflikten müssen diese gelöst werden
- Manuelles Editieren von Dateien notwendig
- Zusammengeführte Dateien mit `git add` markieren
---
# Merge Beispiel
- Beispielsituation:
- Beim Versuch zu mergen (z.B. via `git pull`) entsteht ein Konflikt
- Der Konflikt in der Datei wird in die Datei geschrieben
```
Anzahl der Planeten im Sonnensystem:
<<<<<<< HEAD
Neun
=======
Acht
>>>>>>> branch-a
```
- Durch Editieren muss der Konflikt gelöst werden
- Am Ende fertige Dateien hinzufügen (`git add`) und comitten (`git commit`)
---
# Alle lokalen Änderungen verwerfen:
- `git fetch origin` # Neueste Version von Server holen
- `git reset --hard origin/master` # Kompletter Reset des Branches
---
# Online Services
- Github http://github.com
- Gitlab http://gitlab.com (Empfehlung)
- Bitbucket http://bitbucket.org
- Eigene Server:
- Gitosis
- Gitolite
- Gitlab
---
# Git statt ...
- Brückentools
- Eingebaut oder Zusatztools
- Migration oder Brücke
---
# Git mit Subversion
- Git kann als Brücke zu Subversion genutzt werden
- Alle Commits von Subversion werden lokal geladen (Kann lange dauern)
- Lokale Commits können auf Subversion Server gepusht werden
- Mehr Informationen: Stichwort [git-svn](https://git-scm.com/docs/git-svn)
---
# Git mit TFS
- Git kann als Brücke zu TFS genutzt werden
- Von Microsoft selbst initiiert
- Projekthomepage: [github.com/git-tfs/git-tfs](https://github.com/git-tfs/git-tfs)
---
# Deployment via Git?
- Hooks
- z.B. Deploy (http://deployhq.com)
---
# Fortgeschrittenes
## Rebasing
- Basis eines Branches auf den neuesten Stand verschieben
`git checkout feature/add_sqlite3_support`
`git rebase master`
---
## History verändern
- Lässt einen alle Commits neue schreiben (z.B. zusammenfassen)
z.B. `git rebase -i feature/add/sqlite3/support`
- Achtung: Erfordert i.d.R. `git push --force`, was die History verändert.
- Dies ist bei gemeinsamen Arbeiten i.d.R. nicht möglich
---
## Cherry-Picking
- Ermöglicht Auswahl von zu nutzenden Commits
- Nur mit hoher Entwicklerdisziplin und temporären Einsatz praktikabel
- Siehe `git cherry-pick`
---
# Arbeiten mit Github
- Bei Entwickeln auf Github (u.a.) ist folgender Workflow üblich:
- Eigenen Branch erstellen
- Auf eigenen Branch commiten
- Bei abgeschlossener Aufgabe "Pull-Request" stellen
- Als Projekt-Maintainer: Pull-Request reviewen, annehmen
---
# GUIs:
- gitk (Sehr rudimentär, in git oft eingebaut, OpenSource)
- Git Kraken (Kostenlos, macOS, Windows, Linux)
- Source Tree (Kostenlos, macOS, Windows)
- Github Desktop (Kostenlos, macOS, Windows)
- GitX (Open Source, macOS)
- TortoiseGit (Windows) (Warnung!)
---
# Integration:
- Praktisch jede moderne IDE
- Qualität/Anwendung schwankt extrem
- Visual Studio ab 2015
---
# Weiterführendes und Quellen
## Weiterlesen:
- Chacon, Straub "Pro Git Book", Apress, https://git-scm.com/book/de
- Loelinger, McCullough "Version Control with Git: Powerful tools and techniques for collaborative software development", Oreilly, 2012
## Quellen
- Vortrag von Gareth Hall - Introduction to Git Version Control, 2013
- Pro Git Book https://git-scm.com/book/de
## Weitermachen
- [Try Git](https://try.github.io)
---
# Cheat Sheets
- [Github](https://services.github.com/kit/downloads/github-git-cheat-sheet.pdf)
- [NDP Software](http://ndpsoftware.com/git-cheatsheet.html)
- [Zack Rusin](http://www.cheat-sheets.org/saved-copy/git-cheat-sheet.pdf)
- [Git Tower](https://www.git-tower.com/blog/git-cheat-sheet-de)
- [Rawgit](https://rawgit.com/pastjean/git-cheat-sheet/master/git-cheat-sheet.svg)
---
# Wenn alles schlimm ist
- [Cheatsheet](http://justinhileman.info/article/git-pretty/git-pretty.png)
---
# Kontakt:
- Philipp Weißmann
</textarea>
<!--<script src="https://gnab.github.io/remark/downloads/remark-latest.min.js">-->
<script src="remark-latest.min.js">
</script>
<script>
var slideshow = remark.create();
</script>
</body>
</html>