GIT-Tutorial.adoc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. = Hitchhikers Guide to GIT
  2. m0e42 <info@enigma42.de>
  3. v1.0, 19.07.2019
  4. :toc: right
  5. :homepage: http://enigma42.de
  6. :source-highlighter: coderay
  7. [quote, Work in Progress!!!]
  8. ____
  9. eine kurze Reise durchs GIT-Universum +
  10. Made by m0e@2019 -- E42L (C)
  11. ____
  12. == Hilfreiche Links vorab:
  13. https://git-scm.com/book/de/v1/[Offizielles GIT Buch] -- Sehr gut, mehrsprachig
  14. https://rogerdudler.github.io/git-guide/index.de.html[Tutorial - kein SchnickSchnack] -- kurz und knackig
  15. https://www.thewebhatesme.com/entwicklung/git-fuer-einsteiger/[Git für Einsteiger]
  16. https://try.github.io/[Github Playground] -- inkteraktive Spielwiese
  17. http://think-like-a-git.net/[Think like (a) GIT]
  18. http://git.enigma42.de/m0e/GIT-Tut[Daten diese Tutorials] -- Repo des Tutorials
  19. https://github.com/darthm0e/Test-GIT-TUT[Tutorial Repo] -- Das Beispielrepository
  20. <<<
  21. == Grundlegende Befehle:
  22. ----
  23. git init
  24. git add . || git add <filename>
  25. git commit -m "grund" || git commit -a -m "grund"
  26. git remote add origin http://pfad.zum/repo.git
  27. git push -u origin master (master ist hier der Name des Branch, also hier der Hauptbranch)
  28. git clone url (opt. lokalesVerzeichniss)
  29. git clone --recursive
  30. ----
  31. <<<
  32. ## Grundlagen
  33. GIT ist ein relativ neues VCS (Version-Controll-System), welches im Unterschied zu vielen anderen Änderungen an Dateien und Ordnern nicht als Diffs (fortlaufende Liste der Änderung an Dateien) sondern erzeugt bei einem Commit einen Snapshot des Repository-*"Dateisystems"*
  34. Hierbei werden effizienter weise nur geänderte Dateien neu gespeichert. Auf unveränderte Dateien wird nur ein Verweis auf den jeweiligen Snapshot angelegt. Dieses Konzept vereinfacht unter anderem die Arbeit mit Branches (*Grundlagen > Branching*).
  35. image::img/snapshot.png[Snapshots in GIT, width=512]
  36. Lokal wird mit `git init` ein Repository erzeugt, und der Ordner `.git` angelegt. Hier liegen Konfigurationsdateien des Repositorys und weiter Daten (für uns hier unrelevant).
  37. In der Regel wird man ein Verzeichnis wählen das bereits Daten enthält. Um diese dem Repository bekannt zu machen (einchecken) führen wir den Befehl `git add .` aus. Hiermit werden alle im Verzeichnis enthaltenen Dateien und Ordner ins Repository aufgenommen. Um nur bestimmte Dateien oder Ordner aufzunehmen kann man statt des Punktes den Datei-/Ordnernamen angeben. Möglich ist auch die Angabe in Form von "Wildcards" um etwa alle Dateien eines Typs auzunehmen -> `git add *.png` oder `git add GenialeDateien.*`
  38. ....
  39. ~Screendump:~
  40. $ git init
  41. Initialized empty Git repository in /mnt/c/Users/m0e/Documents/GIT/Test-GIT-TUT/.git/
  42. $ git add *.md
  43. ....
  44. <<<
  45. Unsere Dateien wurden jetzt zur Versionskontrolle (Staging Area) hinzugefügt, im Git Jargon `staged` oder `staging` genannt.
  46. mit `git status` zeigt uns GIT diesen Zustand auch an:
  47. [source,bash]
  48. ----
  49. ~Screendump:~
  50. $ git status
  51. On branch master
  52. Initial commit
  53. Changes to be committed:
  54. (use "git rm --cached <file>..." to unstage)
  55. new file: README.md
  56. new file: Test.md
  57. ----
  58. Nachdem nun alle Dateien in der Staging Area gesammelt sind können wir einen Commit ausführen und die Dateien zum Repository hinzufügen.
  59. `git commit` öffnet den Standard Texteditor mit einer ähnlichen Meldung:
  60. ....
  61. GNU nano 2.7.4 File: /mnt/c/Users/m0e/Documents/GIT/Test-GIT-TUT/.git/COMMIT_EDITMSG
  62. # Please enter the commit message for your changes. Lines starting
  63. # with '#' will be ignored, and an empty message aborts the commit.
  64. # On branch master
  65. #
  66. # Initial commit
  67. #
  68. # Changes to be committed:
  69. # new file: README.md
  70. # new file: Test.md
  71. #
  72. ....
  73. hier kann man noch weiter Kommentare einfügen, i.d.R. wird man die vorhanden Kommentare lassen, welches die Ausgabe von `git status` enthält. Hierdurch erkennt man besser was genau mit dem Commit geändert wurde. Gibt man zusätzlich den Schalter -v mit an wird noch ein DateiDiff der Commitmeldung hinzugefügt.
  74. Bei kleinen Änderungen kann die Commit Nachricht auch direkt im Befehl mitgegeben werden
  75. ....
  76. $ git commit -m "Schneller Commit, kleine Bugfixes"
  77. [master (root-commit) f99b0dd] Schneller Commit, kleine Bugfixes
  78. 2 files changed, 4 insertions(+)
  79. create mode 100644 README.md
  80. create mode 100644 Test.md
  81. ....
  82. Die Ausgabe darunter teilt uns nun mit das der Commit erfolgreich dem `master Branch` hinzugefügt wurde, die SHA-1 Checksumme *(f99b0dd)*, die Commitmeldung, die geänderten Dateien und eine Angabe über die hinzugefügten oder entfernten Zeilen.
  83. Für Dateien die bereits mit `git add` hinzugefügt wurden kann man später das Staging überspringen.
  84. ....
  85. $ git commit -a -m "Schneller Commit, kleine Bugfixes, OHNE Staging"
  86. [master f205c80] Schneller Commit, kleine Bugfixes, OHNE Staging
  87. 1 file changed, 3 insertions(+)
  88. ....
  89. Normalerweise wird man im Umgang mit GIT einen Zentralen Server wie Github, Gitlab, Bitbucket oder selbsteghostet benutzen. Um unserem Lokalen Repository diesen Server bekannt zu machen führen wir den folgenden Befehl aus:
  90. `git remote add origin https://github.com/darthm0e/Test-GIT-TUT.git`
  91. Im Beispiel wird das **Vorher** angelegte Repository [Test-GIT-TUT](https://github.com/darthm0e/Test-GIT-TUT) auf [Github](http://www.github.com) benutzt.
  92. Wenn wir jetzt `git push -u origin master` ausführen werden unsere Daten des Commits auf den Remote Server (origin, Name wählbar) in den Master-Branch geladen. Hiermit können auch weiter Server oder Branches hinzugefügt werden.
  93. `git push -u developer nightly` würde die Daten auf einen mit `git remote` als Developer in die *Nightly-Branch* laden.
  94. ....
  95. $ git push -u origin master
  96. Username for 'https://github.com': supamoe25@gmail.com
  97. Password for 'https://supamoe25@gmail.com@github.com':
  98. Counting objects: 7, done.
  99. Delta compression using up to 8 threads.
  100. Compressing objects: 100% (4/4), done.
  101. Writing objects: 100% (7/7), 612 bytes | 0 bytes/s, done.
  102. Total 7 (delta 0), reused 0 (delta 0)
  103. To https://github.com/darthm0e/Test-GIT-TUT.git
  104. * [new branch] master -> master
  105. Branch master set up to track remote branch master from origin.
  106. ....
  107. Gibt man nun jemandem den Link zum Repository, kann sich dieser den Inhalt anschauen, auf seinen Rechner laden, bearbeiten, änderungen hochladen (schreibrechte vorrausgesetzt) etc.
  108. `git clone <link>` oder `git clone --recursive <link>`
  109. lädt das Repository in einen Unterordner(Name des Repo) ins aktuelle Verzeichniss.
  110. ....
  111. $ git clone https://github.com/darthm0e/Test-GIT-TUT.git
  112. Cloning into 'Test-GIT-TUT'...
  113. remote: Enumerating objects: 7, done.
  114. remote: Counting objects: 100% (7/7), done.
  115. remote: Compressing objects: 100% (4/4), done.
  116. remote: Total 7 (delta 0), reused 7 (delta 0), pack-reused 0
  117. Unpacking objects: 100% (7/7), done.
  118. ....
  119. Mit `git log` bzw `git log -p` kann man sich alle Commits bzw alle Commits mit änderungen anzeigen lassen:
  120. ....
  121. $ git log
  122. commit f205c80841f3b37957101285fc6af5b1691cc81d
  123. Author: m0e <supamoe25@gmail.com>
  124. Date: Sat Jan 19 16:01:40 2019 +0100
  125. Schneller Commit, kleine Bugfixes, OHNE Staging
  126. commit f99b0dd5b53a0f66e893bf6cd269eca779851082
  127. Author: m0e <supamoe25@gmail.com>
  128. Date: Sat Jan 19 15:55:32 2019 +0100
  129. Schneller Commit, kleine Bugfixes
  130. (END)
  131. ....
  132. ....
  133. git log -p
  134. commit f205c80841f3b37957101285fc6af5b1691cc81d
  135. Author: m0e <supamoe25@gmail.com>
  136. Date: Sat Jan 19 16:01:40 2019 +0100
  137. Schneller Commit, kleine Bugfixes, OHNE Staging
  138. diff --git a/Test.md b/Test.md
  139. index 980a0d5..d6baa93 100644
  140. --- a/Test.md
  141. +++ b/Test.md
  142. @@ -1 +1,4 @@
  143. Hello World!
  144. +
  145. +
  146. +Was hinzugef<C3><BC>gt
  147. commit f99b0dd5b53a0f66e893bf6cd269eca779851082
  148. Author: m0e <supamoe25@gmail.com>
  149. Date: Sat Jan 19 15:55:32 2019 +0100
  150. Schneller Commit, kleine Bugfixes
  151. diff --git a/README.md b/README.md
  152. new file mode 100644
  153. index 0000000..8829e9f
  154. --- /dev/null
  155. +++ b/README.md
  156. @@ -0,0 +1,3 @@
  157. +Hello World !
  158. +
  159. +Daten fuers GIT Tut
  160. diff --git a/Test.md b/Test.md
  161. new file mode 100644
  162. index 0000000..980a0d5
  163. --- /dev/null
  164. +++ b/Test.md
  165. @@ -0,0 +1 @@
  166. +Hello World!
  167. (END)
  168. ....
  169. Eine Übersicht über die vorhandenen Remote Repositorys gibt `git remote -v`
  170. ....
  171. $ git remote -v
  172. origin https://github.com/darthm0e/Test-GIT-TUT.git (fetch)
  173. origin https://github.com/darthm0e/Test-GIT-TUT.git (push)
  174. ....
  175. Um die aktuellsten Änderungen ins lokale Repository zu übertragen führt man `git pull` aus. GIT versucht die neuen Commits aus dem Remote Repository zu holen und mit den lokalen Dateien zusammenzuführen.
  176. ### Branching
  177. image::img/branching.png[branching]
  178. git branch "branchname" -> Branch erstellen
  179. git checkout "branchname" -> Zum Branch wechseln
  180. git push --set-upstream origin "branchname" -> Branch hochladen
  181. git checkout master -> Zurück zum master Branch
  182. git merge "branchname" -> branch einchecken
  183. git branch -d "brnachname" -> branch löschen
  184. git push -> hochladen
  185. ### Tags
  186. In GIT (wie auch in anderen VersionControll-Systemen - VCS) können mit Hilfe von Tags wichtige Punkte in der Commit-Hitory markiert werden. Normalerweise werden hiermit ReleaseVersionen oder andere Meilensteine markiert.
  187. ![tags](img/tag.png)
  188. Um sich die in einem Repository vorhandenn Tags anzeigen zu lassen wird `git tag` benutzt. Hiermit werden die Tags in alphabetischer Reihenfolge aufgelistet
  189. ....
  190. $> git tag
  191. 0.1
  192. help
  193. testing
  194. ....
  195. Um nur bestimmte Tags zu sehen kann man folgenden Befehl verwenden: `git tag -l 'v1.4.2'
  196. `
  197. GIT unterscheidet 2 Arten von Tags, einfache (engl. lightweight) und kommentierte (engl. annotated)
  198. Ein normaler Tag ist lediglich ein Zeiger auf einen Commit. Der Tag bleibt mit dem Commit verbunden und wird auch von nachfolgenden Änderungen nicht beeinflusst.
  199. Ein Kommentierter Tag wird als vollwertiges Objekt in GIT gespeichert (ähnlich Commit) und umfasst eine Checksumme, Namen des Verfassers, die eMail Adresse das Datum und sowie eine Tag Nachricht. Desweiteren kann solch ein Tag mit GPG signiert werden.
  200. Um nur bestimmte Tags zu sehen kann man folgenden Befehl verwenden: `git tag -l 'v1.4.2'
  201. `
  202. git tag -> Tags anzeigen
  203. git tag -a v1.2.3 -m "Version 1.2.3" -> Kommentierter Tag erstellen
  204. git tag -s v1.5 -m 'my signed 1.5 tag' -> Tag mit GPG signieren
  205. git push origin --tags -> Tags in Repo pushen
  206. ## Aliase und Autovervollständigung
  207. ### Autocompletion
  208. Um für GIT Befehle eine Autovervollständigung zu erhalten, läd man (hier für BASH) das Script unter: https://github.com/git/git/blob/master/contrib/completion/git-completion.bash[Git-completion.bash]
  209. herunter, und fügt `source ~/git-completion.bash` zu .bashrc hinzu.
  210. ### Alias
  211. -- coming soon --
  212. ## Reset lokal Repository
  213. git fetch origin
  214. git reset –hard origin/master
  215. <<<
  216. ## Software (Windows oder MultiPlattform) ##
  217. https://git-scm.com/download/win[GitBash & GitGUI]
  218. image:img/gitGUI.png[gitGUI,width=512]
  219. https://www.sourcetreeapp.com/[SourceTree]
  220. https://desktop.github.com/[Github Desktop]
  221. image:img/gitDesktop.png[gitDesktop,width=512]
  222. https://www.gitkraken.com/[Git Kraken]
  223. https://git-fork.com/[Fork]
  224. https://github.com/FabriceSalvaire/CodeReview/[CodeReview]
  225. https://gitblade.com/[Git Blade]
  226. ---
  227. ## Häufiger Workflow ##
  228. Während der Entwicklungsarbeit wird der Workflow meistens in etwa so aussehen:
  229. - Aktuellen master-Branch vom Server downloaden (vorher mit git status sicherstellen, dass man sich auf dem master-Branch befindet. Wenn nicht: git checkout master):
  230. `#> git pull`
  231. - Einen neuen Branch für das kommende Feature anlegen:
  232. `#> git checkout -b meinfeature master`
  233. - [Änderungen am Code durchführen]
  234. - Geänderte und neue Dateien stagen:
  235. `#> git add .`
  236. - Änderungen committen:
  237. `#> git commit -m "Changes xyz"`
  238. - Jetzt den Branch auf den Server laden, wenn gewünscht:
  239. `#> git push -u origin meinfeature`
  240. - … oder direkt in dem master wechseln:
  241. `#> git checkout master`
  242. - (nochmals aktuellen Code ziehen - zur Sicherheit)
  243. `#> git pull`
  244. - Eigenen Code mit master zusammenführen:
  245. `#> git merge meinfeature`
  246. - Nicht mehr benötigten Branch löschen:
  247. `#> git branch -d meinfeature`
  248. - Aktualisierten master auf den Server pushen:
  249. `#> git push`
  250. - Fertig
  251. ## weitere Befehle ##
  252. `git stat`
  253. `git diff`
  254. `git fetch`
  255. `git mv`
  256. `git show`
  257. `git remote show origin`
  258. `git remote rm <name>`
  259. `git rebase`
  260. ---
  261. *~ Made by m0e@2019 --- enigma42Labs ~*