commonmarker 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of commonmarker might be problematic. Click here for more details.

Files changed (501) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -2
  3. data/README.md +67 -42
  4. data/Rakefile +22 -2
  5. data/commonmarker.gemspec +13 -9
  6. data/ext/commonmarker/cmark/api_test/main.c +35 -0
  7. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeError.log +12 -12
  8. data/ext/commonmarker/cmark/build/CMakeFiles/CMakeOutput.log +141 -141
  9. data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/main.c.o +0 -0
  10. data/ext/commonmarker/cmark/build/api_test/api_test +0 -0
  11. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/houdini_html_u.c.o +0 -0
  12. data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/iterator.c.o +0 -0
  13. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/houdini_html_u.c.o +0 -0
  14. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/iterator.c.o +0 -0
  15. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_html_u.c.o +0 -0
  16. data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/iterator.c.o +0 -0
  17. data/ext/commonmarker/cmark/build/src/cmark +0 -0
  18. data/ext/commonmarker/cmark/build/src/libcmark.0.19.0.dylib +0 -0
  19. data/ext/commonmarker/cmark/build/src/libcmark.a +0 -0
  20. data/ext/commonmarker/cmark/build/src/libcmark.dylib +0 -0
  21. data/ext/commonmarker/cmark/src/houdini_html_u.c +26 -13
  22. data/ext/commonmarker/cmark/src/iterator.c +2 -2
  23. data/ext/commonmarker/cmark/test/__pycache__/cmark.cpython-34.pyc +0 -0
  24. data/ext/commonmarker/cmark/test/__pycache__/normalize.cpython-34.pyc +0 -0
  25. data/ext/commonmarker/cmark/test/cmark.pyc +0 -0
  26. data/ext/commonmarker/cmark/test/normalize.pyc +0 -0
  27. data/ext/commonmarker/commonmarker.c +276 -3
  28. data/ext/commonmarker/extconf.rb +3 -1
  29. data/lib/commonmarker.rb +70 -360
  30. data/lib/commonmarker/config.rb +1 -1
  31. data/lib/commonmarker/renderer.rb +91 -0
  32. data/lib/commonmarker/renderer/html_renderer.rb +149 -0
  33. data/lib/commonmarker/version.rb +1 -1
  34. data/test/benchinput.md +148414 -0
  35. data/test/benchmark.rb +13 -9
  36. data/test/progit/Gemfile +5 -0
  37. data/test/progit/README.md +9 -0
  38. data/test/progit/README.original.md +70 -0
  39. data/test/progit/Rakefile +285 -0
  40. data/test/progit/ar/01-introduction/01-chapter1.markdown +264 -0
  41. data/test/progit/ar/02-git-basics/01-chapter2.markdown +1124 -0
  42. data/test/progit/ar/NOTES +18 -0
  43. data/test/progit/ar/README +14 -0
  44. data/test/progit/az/01-introduction/01-chapter1.markdown +257 -0
  45. data/test/progit/az/02-git-basics/01-chapter2.markdown +1127 -0
  46. data/test/progit/az/03-git-branching/01-chapter3.markdown +598 -0
  47. data/test/progit/az/04-git-server/01-chapter4.markdown +861 -0
  48. data/test/progit/az/05-distributed-git/01-chapter5.markdown +897 -0
  49. data/test/progit/az/06-git-tools/01-chapter6.markdown +1126 -0
  50. data/test/progit/az/07-customizing-git/01-chapter7.markdown +937 -0
  51. data/test/progit/az/08-git-and-other-scms/01-chapter8.markdown +690 -0
  52. data/test/progit/az/09-git-internals/01-chapter9.markdown +977 -0
  53. data/test/progit/be/01-introduction/01-chapter1.markdown +257 -0
  54. data/test/progit/be/02-git-basics/01-chapter2.markdown +1126 -0
  55. data/test/progit/ca/01-introduction/01-chapter1.markdown +257 -0
  56. data/test/progit/ca/README.txt +1 -0
  57. data/test/progit/couchapp/Makefile +41 -0
  58. data/test/progit/couchapp/Readme.md +17 -0
  59. data/test/progit/couchapp/_id +1 -0
  60. data/test/progit/couchapp/shows/chapter.js +14 -0
  61. data/test/progit/couchapp/templates/foot.html +7 -0
  62. data/test/progit/couchapp/templates/head.html +51 -0
  63. data/test/progit/couchapp/vendor/markdown/showdown.js +420 -0
  64. data/test/progit/couchapp/vendor/mustache.js/mustache.js +302 -0
  65. data/test/progit/cs/01-introduction/01-chapter1.markdown +259 -0
  66. data/test/progit/cs/02-git-basics/01-chapter2.markdown +1225 -0
  67. data/test/progit/cs/03-git-branching/01-chapter3.markdown +606 -0
  68. data/test/progit/cs/04-git-server/01-chapter4.markdown +871 -0
  69. data/test/progit/cs/05-distributed-git/01-chapter5.markdown +914 -0
  70. data/test/progit/cs/06-git-tools/01-chapter6.markdown +1167 -0
  71. data/test/progit/cs/07-customizing-git/01-chapter7.markdown +940 -0
  72. data/test/progit/cs/08-git-and-other-scms/01-chapter8.markdown +700 -0
  73. data/test/progit/cs/09-git-internals/01-chapter9.markdown +1014 -0
  74. data/test/progit/de/01-introduction/01-chapter1.markdown +445 -0
  75. data/test/progit/de/02-git-basics/01-chapter2.markdown +1589 -0
  76. data/test/progit/de/03-git-branching/01-chapter3.markdown +964 -0
  77. data/test/progit/de/04-git-server/01-chapter4.markdown +1337 -0
  78. data/test/progit/de/05-distributed-git/01-chapter5.markdown +1329 -0
  79. data/test/progit/de/06-git-tools/01-chapter6.markdown +1502 -0
  80. data/test/progit/de/07-customizing-git/01-chapter7.markdown +1361 -0
  81. data/test/progit/de/08-git-and-other-scms/01-chapter8.markdown +919 -0
  82. data/test/progit/de/09-git-internals/01-chapter9.markdown +1361 -0
  83. data/test/progit/de/README.md +626 -0
  84. data/test/progit/ebooks/cover.png +0 -0
  85. data/test/progit/en/01-introduction/01-chapter1.markdown +263 -0
  86. data/test/progit/en/02-git-basics/01-chapter2.markdown +1228 -0
  87. data/test/progit/en/03-git-branching/01-chapter3.markdown +606 -0
  88. data/test/progit/en/04-git-server/01-chapter4.markdown +871 -0
  89. data/test/progit/en/05-distributed-git/01-chapter5.markdown +914 -0
  90. data/test/progit/en/06-git-tools/01-chapter6.markdown +1150 -0
  91. data/test/progit/en/07-customizing-git/01-chapter7.markdown +940 -0
  92. data/test/progit/en/08-git-and-other-scms/01-chapter8.markdown +700 -0
  93. data/test/progit/en/09-git-internals/01-chapter9.markdown +983 -0
  94. data/test/progit/eo/01-introduction/01-chapter1.markdown +257 -0
  95. data/test/progit/eo/02-git-basics/01-chapter2.markdown +1171 -0
  96. data/test/progit/epub/ProGit.css +28 -0
  97. data/test/progit/epub/title.png +0 -0
  98. data/test/progit/es-ni/01-introduction/01-chapter1.markdown +257 -0
  99. data/test/progit/es-ni/02-git-basics/01-chapter2.markdown +1127 -0
  100. data/test/progit/es/01-introduction/01-chapter1.markdown +262 -0
  101. data/test/progit/es/02-git-basics/01-chapter2.markdown +1165 -0
  102. data/test/progit/es/03-git-branching/01-chapter3.markdown +598 -0
  103. data/test/progit/es/04-git-server/01-chapter4.markdown +707 -0
  104. data/test/progit/es/05-distributed-git/01-chapter5.markdown +890 -0
  105. data/test/progit/es/06-git-tools/01-chapter6.markdown +1113 -0
  106. data/test/progit/es/07-customizing-git/01-chapter7.markdown +875 -0
  107. data/test/progit/es/08-git-and-other-scms/01-chapter8.markdown +686 -0
  108. data/test/progit/es/09-git-internals/01-chapter9.markdown +976 -0
  109. data/test/progit/es/NOTES +29 -0
  110. data/test/progit/es/README +3 -0
  111. data/test/progit/es/glosario-Benzirpi.txt +27 -0
  112. data/test/progit/es/omegat-Benzirpi.tmx +29075 -0
  113. data/test/progit/fa/01-introduction/01-chapter1.markdown +262 -0
  114. data/test/progit/fa/03-git-branching/01-chapter3.markdown +608 -0
  115. data/test/progit/fa/04-git-server/01-chapter4.markdown +872 -0
  116. data/test/progit/fa/NOTES.en-fa.md +143 -0
  117. data/test/progit/fa/README.md +7 -0
  118. data/test/progit/fi/01-introduction/01-chapter1.markdown +259 -0
  119. data/test/progit/fi/02-git-basics/01-chapter2.markdown +1171 -0
  120. data/test/progit/fi/NOTES +5 -0
  121. data/test/progit/figures-dia/fig0101.dia +617 -0
  122. data/test/progit/figures-dia/fig0102.dia +921 -0
  123. data/test/progit/figures-dia/fig0103.dia +1468 -0
  124. data/test/progit/figures-dia/fig0104.dia +1432 -0
  125. data/test/progit/figures-dia/fig0105.dia +1924 -0
  126. data/test/progit/figures-dia/fig0106.dia +562 -0
  127. data/test/progit/figures-dia/fig0201.dia +774 -0
  128. data/test/progit/figures-dia/fig0301.dia +2006 -0
  129. data/test/progit/figures-dia/fig0302.dia +2148 -0
  130. data/test/progit/figures-dia/fig0303.dia +719 -0
  131. data/test/progit/figures-dia/fig0304.dia +525 -0
  132. data/test/progit/figures-dia/fig0305.dia +622 -0
  133. data/test/progit/figures-dia/fig0306.dia +622 -0
  134. data/test/progit/figures-dia/fig0307.dia +719 -0
  135. data/test/progit/figures-dia/fig0308.dia +734 -0
  136. data/test/progit/figures-dia/fig0309.dia +831 -0
  137. data/test/progit/figures-dia/fig0310.dia +412 -0
  138. data/test/progit/figures-dia/fig0311.dia +493 -0
  139. data/test/progit/figures-dia/fig0312.dia +596 -0
  140. data/test/progit/figures-dia/fig0313.dia +774 -0
  141. data/test/progit/figures-dia/fig0314.dia +846 -0
  142. data/test/progit/figures-dia/fig0315.dia +787 -0
  143. data/test/progit/figures-dia/fig0316.dia +1078 -0
  144. data/test/progit/figures-dia/fig0317.dia +881 -0
  145. data/test/progit/figures-dia/fig0318.dia +968 -0
  146. data/test/progit/figures-dia/fig0319.dia +957 -0
  147. data/test/progit/figures-dia/fig0320.dia +1637 -0
  148. data/test/progit/figures-dia/fig0321.dia +1494 -0
  149. data/test/progit/figures-dia/fig0322.dia +1142 -0
  150. data/test/progit/figures-dia/fig0323.dia +1377 -0
  151. data/test/progit/figures-dia/fig0324.dia +1603 -0
  152. data/test/progit/figures-dia/fig0325.dia +2003 -0
  153. data/test/progit/figures-dia/fig0326.dia +2013 -0
  154. data/test/progit/figures-dia/fig0327.dia +687 -0
  155. data/test/progit/figures-dia/fig0328.dia +814 -0
  156. data/test/progit/figures-dia/fig0329.dia +793 -0
  157. data/test/progit/figures-dia/fig0330.dia +693 -0
  158. data/test/progit/figures-dia/fig0331.dia +1159 -0
  159. data/test/progit/figures-dia/fig0332.dia +1362 -0
  160. data/test/progit/figures-dia/fig0333.dia +1165 -0
  161. data/test/progit/figures-dia/fig0334.dia +1450 -0
  162. data/test/progit/figures-dia/fig0335.dia +994 -0
  163. data/test/progit/figures-dia/fig0336.dia +786 -0
  164. data/test/progit/figures-dia/fig0337.dia +1546 -0
  165. data/test/progit/figures-dia/fig0338.dia +1755 -0
  166. data/test/progit/figures-dia/fig0339.dia +1882 -0
  167. data/test/progit/figures-dia/fig0501.dia +456 -0
  168. data/test/progit/figures-dia/fig0502.dia +956 -0
  169. data/test/progit/figures-dia/fig0503.dia +915 -0
  170. data/test/progit/figures-dia/fig0504.dia +620 -0
  171. data/test/progit/figures-dia/fig0505.dia +744 -0
  172. data/test/progit/figures-dia/fig0506.dia +747 -0
  173. data/test/progit/figures-dia/fig0507.dia +895 -0
  174. data/test/progit/figures-dia/fig0508.dia +1122 -0
  175. data/test/progit/figures-dia/fig0509.dia +1243 -0
  176. data/test/progit/figures-dia/fig0510.dia +1240 -0
  177. data/test/progit/figures-dia/fig0511.dia +1201 -0
  178. data/test/progit/figures-dia/fig0512.dia +801 -0
  179. data/test/progit/figures-dia/fig0513.dia +1387 -0
  180. data/test/progit/figures-dia/fig0514.dia +1568 -0
  181. data/test/progit/figures-dia/fig0515.dia +1721 -0
  182. data/test/progit/figures-dia/fig0516.dia +997 -0
  183. data/test/progit/figures-dia/fig0517.dia +994 -0
  184. data/test/progit/figures-dia/fig0518.dia +1145 -0
  185. data/test/progit/figures-dia/fig0519.dia +992 -0
  186. data/test/progit/figures-dia/fig0520.dia +1240 -0
  187. data/test/progit/figures-dia/fig0521.dia +801 -0
  188. data/test/progit/figures-dia/fig0522.dia +922 -0
  189. data/test/progit/figures-dia/fig0523.dia +922 -0
  190. data/test/progit/figures-dia/fig0524.dia +1828 -0
  191. data/test/progit/figures-dia/fig0525.dia +2685 -0
  192. data/test/progit/figures-dia/fig0526.dia +717 -0
  193. data/test/progit/figures-dia/fig0527.dia +856 -0
  194. data/test/progit/figures-dia/fig0601.dia +790 -0
  195. data/test/progit/figures-dia/fig0702.dia +795 -0
  196. data/test/progit/figures-dia/fig0703.dia +795 -0
  197. data/test/progit/figures-dia/fig0901.dia +669 -0
  198. data/test/progit/figures-dia/fig0902.dia +834 -0
  199. data/test/progit/figures-dia/fig0903.dia +1483 -0
  200. data/test/progit/figures-dia/fig0904.dia +1728 -0
  201. data/test/progit/figures-dia/makeimages +25 -0
  202. data/test/progit/figures-source/progit.graffle +123108 -0
  203. data/test/progit/figures/18333fig0101-tn.png +0 -0
  204. data/test/progit/figures/18333fig0102-tn.png +0 -0
  205. data/test/progit/figures/18333fig0103-tn.png +0 -0
  206. data/test/progit/figures/18333fig0104-tn.png +0 -0
  207. data/test/progit/figures/18333fig0105-tn.png +0 -0
  208. data/test/progit/figures/18333fig0106-tn.png +0 -0
  209. data/test/progit/figures/18333fig0107-tn.png +0 -0
  210. data/test/progit/figures/18333fig0201-tn.png +0 -0
  211. data/test/progit/figures/18333fig0202-tn.png +0 -0
  212. data/test/progit/figures/18333fig0301-tn.png +0 -0
  213. data/test/progit/figures/18333fig0302-tn.png +0 -0
  214. data/test/progit/figures/18333fig0303-tn.png +0 -0
  215. data/test/progit/figures/18333fig0304-tn.png +0 -0
  216. data/test/progit/figures/18333fig0305-tn.png +0 -0
  217. data/test/progit/figures/18333fig0306-tn.png +0 -0
  218. data/test/progit/figures/18333fig0307-tn.png +0 -0
  219. data/test/progit/figures/18333fig0308-tn.png +0 -0
  220. data/test/progit/figures/18333fig0309-tn.png +0 -0
  221. data/test/progit/figures/18333fig0310-tn.png +0 -0
  222. data/test/progit/figures/18333fig0311-tn.png +0 -0
  223. data/test/progit/figures/18333fig0312-tn.png +0 -0
  224. data/test/progit/figures/18333fig0313-tn.png +0 -0
  225. data/test/progit/figures/18333fig0314-tn.png +0 -0
  226. data/test/progit/figures/18333fig0315-tn.png +0 -0
  227. data/test/progit/figures/18333fig0316-tn.png +0 -0
  228. data/test/progit/figures/18333fig0317-tn.png +0 -0
  229. data/test/progit/figures/18333fig0318-tn.png +0 -0
  230. data/test/progit/figures/18333fig0319-tn.png +0 -0
  231. data/test/progit/figures/18333fig0320-tn.png +0 -0
  232. data/test/progit/figures/18333fig0321-tn.png +0 -0
  233. data/test/progit/figures/18333fig0322-tn.png +0 -0
  234. data/test/progit/figures/18333fig0323-tn.png +0 -0
  235. data/test/progit/figures/18333fig0324-tn.png +0 -0
  236. data/test/progit/figures/18333fig0325-tn.png +0 -0
  237. data/test/progit/figures/18333fig0326-tn.png +0 -0
  238. data/test/progit/figures/18333fig0327-tn.png +0 -0
  239. data/test/progit/figures/18333fig0328-tn.png +0 -0
  240. data/test/progit/figures/18333fig0329-tn.png +0 -0
  241. data/test/progit/figures/18333fig0330-tn.png +0 -0
  242. data/test/progit/figures/18333fig0331-tn.png +0 -0
  243. data/test/progit/figures/18333fig0332-tn.png +0 -0
  244. data/test/progit/figures/18333fig0333-tn.png +0 -0
  245. data/test/progit/figures/18333fig0334-tn.png +0 -0
  246. data/test/progit/figures/18333fig0335-tn.png +0 -0
  247. data/test/progit/figures/18333fig0336-tn.png +0 -0
  248. data/test/progit/figures/18333fig0337-tn.png +0 -0
  249. data/test/progit/figures/18333fig0338-tn.png +0 -0
  250. data/test/progit/figures/18333fig0339-tn.png +0 -0
  251. data/test/progit/figures/18333fig0401-tn.png +0 -0
  252. data/test/progit/figures/18333fig0402-tn.png +0 -0
  253. data/test/progit/figures/18333fig0403-tn.png +0 -0
  254. data/test/progit/figures/18333fig0404-tn.png +0 -0
  255. data/test/progit/figures/18333fig0405-tn.png +0 -0
  256. data/test/progit/figures/18333fig0406-tn.png +0 -0
  257. data/test/progit/figures/18333fig0407-tn.png +0 -0
  258. data/test/progit/figures/18333fig0408-tn.png +0 -0
  259. data/test/progit/figures/18333fig0409-tn.png +0 -0
  260. data/test/progit/figures/18333fig0410-tn.png +0 -0
  261. data/test/progit/figures/18333fig0411-tn.png +0 -0
  262. data/test/progit/figures/18333fig0412-tn.png +0 -0
  263. data/test/progit/figures/18333fig0413-tn.png +0 -0
  264. data/test/progit/figures/18333fig0414-tn.png +0 -0
  265. data/test/progit/figures/18333fig0415-tn.png +0 -0
  266. data/test/progit/figures/18333fig0501-tn.png +0 -0
  267. data/test/progit/figures/18333fig0502-tn.png +0 -0
  268. data/test/progit/figures/18333fig0503-tn.png +0 -0
  269. data/test/progit/figures/18333fig0504-tn.png +0 -0
  270. data/test/progit/figures/18333fig0505-tn.png +0 -0
  271. data/test/progit/figures/18333fig0506-tn.png +0 -0
  272. data/test/progit/figures/18333fig0507-tn.png +0 -0
  273. data/test/progit/figures/18333fig0508-tn.png +0 -0
  274. data/test/progit/figures/18333fig0509-tn.png +0 -0
  275. data/test/progit/figures/18333fig0510-tn.png +0 -0
  276. data/test/progit/figures/18333fig0511-tn.png +0 -0
  277. data/test/progit/figures/18333fig0512-tn.png +0 -0
  278. data/test/progit/figures/18333fig0513-tn.png +0 -0
  279. data/test/progit/figures/18333fig0514-tn.png +0 -0
  280. data/test/progit/figures/18333fig0515-tn.png +0 -0
  281. data/test/progit/figures/18333fig0516-tn.png +0 -0
  282. data/test/progit/figures/18333fig0517-tn.png +0 -0
  283. data/test/progit/figures/18333fig0518-tn.png +0 -0
  284. data/test/progit/figures/18333fig0519-tn.png +0 -0
  285. data/test/progit/figures/18333fig0520-tn.png +0 -0
  286. data/test/progit/figures/18333fig0521-tn.png +0 -0
  287. data/test/progit/figures/18333fig0522-tn.png +0 -0
  288. data/test/progit/figures/18333fig0523-tn.png +0 -0
  289. data/test/progit/figures/18333fig0524-tn.png +0 -0
  290. data/test/progit/figures/18333fig0525-tn.png +0 -0
  291. data/test/progit/figures/18333fig0526-tn.png +0 -0
  292. data/test/progit/figures/18333fig0527-tn.png +0 -0
  293. data/test/progit/figures/18333fig0601-tn.png +0 -0
  294. data/test/progit/figures/18333fig0701-tn.png +0 -0
  295. data/test/progit/figures/18333fig0702-tn.png +0 -0
  296. data/test/progit/figures/18333fig0703-tn.png +0 -0
  297. data/test/progit/figures/18333fig0901-tn.png +0 -0
  298. data/test/progit/figures/18333fig0902-tn.png +0 -0
  299. data/test/progit/figures/18333fig0903-tn.png +0 -0
  300. data/test/progit/figures/18333fig0904-tn.png +0 -0
  301. data/test/progit/fr/01-introduction/01-chapter1.markdown +371 -0
  302. data/test/progit/fr/02-git-basics/01-chapter2.markdown +1378 -0
  303. data/test/progit/fr/03-git-branching/01-chapter3.markdown +781 -0
  304. data/test/progit/fr/04-git-server/01-chapter4.markdown +1141 -0
  305. data/test/progit/fr/05-distributed-git/01-chapter5.markdown +1163 -0
  306. data/test/progit/fr/06-git-tools/01-chapter6.markdown +1356 -0
  307. data/test/progit/fr/07-customizing-git/01-chapter7.markdown +1200 -0
  308. data/test/progit/fr/08-git-and-other-scms/01-chapter8.markdown +832 -0
  309. data/test/progit/fr/09-git-internals/01-chapter9.markdown +1228 -0
  310. data/test/progit/fr/NOTES.fr-fr.markdown +1 -0
  311. data/test/progit/fr/NOTES.fr-fr.md +127 -0
  312. data/test/progit/fr/README.md +43 -0
  313. data/test/progit/fr/glossaire-git.adoc +108 -0
  314. data/test/progit/hi/01-introduction/01-chapter1.markdown +7 -0
  315. data/test/progit/hu/01-introduction/01-chapter1.markdown +257 -0
  316. data/test/progit/id/01-introduction/01-chapter1.markdown +257 -0
  317. data/test/progit/id/02-git-basics/01-chapter2.markdown +1127 -0
  318. data/test/progit/id/03-git-branching/01-chapter3.markdown +598 -0
  319. data/test/progit/it/01-introduction/01-chapter1.markdown +263 -0
  320. data/test/progit/it/02-git-basics/01-chapter2.markdown +1227 -0
  321. data/test/progit/it/03-git-branching/01-chapter3.markdown +598 -0
  322. data/test/progit/it/04-git-server/01-chapter4.markdown +864 -0
  323. data/test/progit/it/05-distributed-git/01-chapter5.markdown +897 -0
  324. data/test/progit/it/06-git-tools/01-chapter6.markdown +1144 -0
  325. data/test/progit/it/07-customizing-git/01-chapter7.markdown +606 -0
  326. data/test/progit/it/08-git-and-other-scms/01-chapter8.markdown +707 -0
  327. data/test/progit/it/09-git-internals/01-chapter9.markdown +1000 -0
  328. data/test/progit/ja/01-introduction/01-chapter1.markdown +260 -0
  329. data/test/progit/ja/02-git-basics/01-chapter2.markdown +1221 -0
  330. data/test/progit/ja/03-git-branching/01-chapter3.markdown +604 -0
  331. data/test/progit/ja/04-git-server/01-chapter4.markdown +863 -0
  332. data/test/progit/ja/05-distributed-git/01-chapter5.markdown +908 -0
  333. data/test/progit/ja/06-git-tools/01-chapter6.markdown +1133 -0
  334. data/test/progit/ja/07-customizing-git/01-chapter7.markdown +936 -0
  335. data/test/progit/ja/08-git-and-other-scms/01-chapter8.markdown +690 -0
  336. data/test/progit/ja/09-git-internals/01-chapter9.markdown +984 -0
  337. data/test/progit/ja/README.md +58 -0
  338. data/test/progit/ja/translation glossaries.txt +33 -0
  339. data/test/progit/ko/01-introduction/01-chapter1.markdown +258 -0
  340. data/test/progit/ko/02-git-basics/01-chapter2.markdown +1181 -0
  341. data/test/progit/ko/03-git-branching/01-chapter3.markdown +612 -0
  342. data/test/progit/ko/04-git-server/01-chapter4.markdown +867 -0
  343. data/test/progit/ko/05-distributed-git/01-chapter5.markdown +913 -0
  344. data/test/progit/ko/06-git-tools/01-chapter6.markdown +1142 -0
  345. data/test/progit/ko/07-customizing-git/01-chapter7.markdown +935 -0
  346. data/test/progit/ko/08-git-and-other-scms/01-chapter8.markdown +688 -0
  347. data/test/progit/ko/09-git-internals/01-chapter9.markdown +976 -0
  348. data/test/progit/ko/README.md +75 -0
  349. data/test/progit/ko/translation_guide.txt +65 -0
  350. data/test/progit/latex/README +27 -0
  351. data/test/progit/latex/config.yml +144 -0
  352. data/test/progit/latex/makepdf +207 -0
  353. data/test/progit/latex/template.tex +155 -0
  354. data/test/progit/makeebooks +125 -0
  355. data/test/progit/makepdfs +47 -0
  356. data/test/progit/mk/01-introduction/01-chapter1.markdown +258 -0
  357. data/test/progit/mk/02-git-basics/01-chapter2.markdown +1125 -0
  358. data/test/progit/mk/03-git-branching/01-chapter3.markdown +598 -0
  359. data/test/progit/mk/05-distributed-git/01-chapter5.markdown +897 -0
  360. data/test/progit/nl/01-introduction/01-chapter1.markdown +296 -0
  361. data/test/progit/nl/02-git-basics/01-chapter2.markdown +1253 -0
  362. data/test/progit/nl/03-git-branching/01-chapter3.markdown +642 -0
  363. data/test/progit/nl/04-git-server/01-chapter4.markdown +902 -0
  364. data/test/progit/nl/05-distributed-git/01-chapter5.markdown +953 -0
  365. data/test/progit/nl/06-git-tools/01-chapter6.markdown +1177 -0
  366. data/test/progit/nl/07-customizing-git/01-chapter7.markdown +974 -0
  367. data/test/progit/nl/08-git-and-other-scms/01-chapter8.markdown +725 -0
  368. data/test/progit/nl/09-git-internals/01-chapter9.markdown +1013 -0
  369. data/test/progit/no-nb/01-introduction/01-chapter1.markdown +261 -0
  370. data/test/progit/no-nb/02-git-basics/01-chapter2.markdown +1225 -0
  371. data/test/progit/no-nb/03-git-branching/01-chapter3.markdown +606 -0
  372. data/test/progit/no-nb/04-git-server/01-chapter4.markdown +867 -0
  373. data/test/progit/no-nb/05-distributed-git/01-chapter5.markdown +914 -0
  374. data/test/progit/no-nb/06-git-tools/01-chapter6.markdown +1144 -0
  375. data/test/progit/no-nb/07-customizing-git/01-chapter7.markdown +936 -0
  376. data/test/progit/no-nb/08-git-and-other-scms/01-chapter8.markdown +689 -0
  377. data/test/progit/no-nb/09-git-internals/01-chapter9.markdown +977 -0
  378. data/test/progit/no-nb/README +2 -0
  379. data/test/progit/pl/01-introduction/01-chapter1.markdown +257 -0
  380. data/test/progit/pl/02-git-basics/02-chapter2.markdown +1128 -0
  381. data/test/progit/pl/03-git-branching/01-chapter3.markdown +598 -0
  382. data/test/progit/pl/04-git-server/01-chapter4.markdown +897 -0
  383. data/test/progit/pl/05-distributed-git/01-chapter5.markdown +1278 -0
  384. data/test/progit/pl/06-git-tools/01-chapter6.markdown +1550 -0
  385. data/test/progit/pl/07-customizing-git/01-chapter7.markdown +1058 -0
  386. data/test/progit/pl/08-git-and-other-scms/01-chapter8.markdown +948 -0
  387. data/test/progit/pl/09-git-internals/01-chapter9.markdown +1382 -0
  388. data/test/progit/pl/translation-guidelines.txt +70 -0
  389. data/test/progit/pt-br/01-introduction/01-chapter1.markdown +256 -0
  390. data/test/progit/pt-br/02-git-basics/01-chapter2.markdown +1127 -0
  391. data/test/progit/pt-br/03-git-branching/01-chapter3.markdown +596 -0
  392. data/test/progit/pt-br/04-git-server/01-chapter4.markdown +888 -0
  393. data/test/progit/pt-br/05-distributed-git/01-chapter5.markdown +896 -0
  394. data/test/progit/pt-br/06-git-tools/01-chapter6.markdown +1122 -0
  395. data/test/progit/pt-br/07-customizing-git/01-chapter7.markdown +932 -0
  396. data/test/progit/pt-br/08-git-and-other-scms/01-chapter8.markdown +691 -0
  397. data/test/progit/pt-br/09-git-internals/01-chapter9.markdown +978 -0
  398. data/test/progit/pt-br/figures-dia/fig0101.dia +617 -0
  399. data/test/progit/pt-br/figures-dia/fig0102.dia +921 -0
  400. data/test/progit/pt-br/figures-dia/fig0103.dia +1468 -0
  401. data/test/progit/pt-br/figures-dia/fig0104.dia +1432 -0
  402. data/test/progit/pt-br/figures-dia/fig0105.dia +1924 -0
  403. data/test/progit/pt-br/figures-dia/fig0106.dia +562 -0
  404. data/test/progit/pt-br/figures-dia/fig0201.dia +776 -0
  405. data/test/progit/pt-br/figures-dia/fig0301.dia +2006 -0
  406. data/test/progit/pt-br/figures-dia/fig0302.dia +2148 -0
  407. data/test/progit/pt-br/figures-dia/fig0316.dia +1079 -0
  408. data/test/progit/pt-br/figures-dia/fig0322.dia +1142 -0
  409. data/test/progit/pt-br/figures-dia/fig0323.dia +1407 -0
  410. data/test/progit/pt-br/figures-dia/fig0324.dia +1603 -0
  411. data/test/progit/pt-br/figures-dia/fig0325.dia +2003 -0
  412. data/test/progit/pt-br/figures-dia/fig0326.dia +2013 -0
  413. data/test/progit/pt-br/figures-dia/fig0336.dia +786 -0
  414. data/test/progit/pt-br/figures-dia/fig0337.dia +1546 -0
  415. data/test/progit/pt-br/figures-dia/fig0338.dia +1755 -0
  416. data/test/progit/pt-br/figures-dia/fig0339.dia +1882 -0
  417. data/test/progit/pt-br/figures-dia/fig0501.dia +456 -0
  418. data/test/progit/pt-br/figures-dia/fig0502.dia +965 -0
  419. data/test/progit/pt-br/figures-dia/fig0503.dia +914 -0
  420. data/test/progit/pt-br/figures-dia/fig0511.dia +1201 -0
  421. data/test/progit/pt-br/figures-dia/fig0515.dia +1721 -0
  422. data/test/progit/pt-br/figures-dia/fig0702.dia +795 -0
  423. data/test/progit/pt-br/figures-dia/fig0703.dia +795 -0
  424. data/test/progit/pt-br/figures-dia/fig0901.dia +669 -0
  425. data/test/progit/pt-br/figures-dia/fig0902.dia +834 -0
  426. data/test/progit/pt-br/figures-dia/fig0903.dia +1483 -0
  427. data/test/progit/pt-br/figures-dia/fig0904.dia +1728 -0
  428. data/test/progit/ro/01-introduction/01-chapter1.markdown +257 -0
  429. data/test/progit/ru/01-introduction/01-chapter1.markdown +259 -0
  430. data/test/progit/ru/02-git-basics/01-chapter2.markdown +1155 -0
  431. data/test/progit/ru/03-git-branching/01-chapter3.markdown +598 -0
  432. data/test/progit/ru/04-git-server/01-chapter4.markdown +854 -0
  433. data/test/progit/ru/05-distributed-git/01-chapter5.markdown +897 -0
  434. data/test/progit/ru/06-git-tools/01-chapter6.markdown +1126 -0
  435. data/test/progit/ru/07-customizing-git/01-chapter7.markdown +938 -0
  436. data/test/progit/ru/08-git-and-other-scms/01-chapter8.markdown +691 -0
  437. data/test/progit/ru/09-git-internals/01-chapter9.markdown +977 -0
  438. data/test/progit/ru/Glossary +38 -0
  439. data/test/progit/ru/README +12 -0
  440. data/test/progit/ru/figures-dia/fig0101.dia +647 -0
  441. data/test/progit/ru/figures-dia/fig0102.dia +1009 -0
  442. data/test/progit/ru/figures-dia/fig0103.dia +1468 -0
  443. data/test/progit/ru/figures-dia/fig0104.dia +1432 -0
  444. data/test/progit/ru/figures-dia/fig0105.dia +1924 -0
  445. data/test/progit/ru/figures-dia/fig0106.dia +561 -0
  446. data/test/progit/ru/figures-dia/fig0201.dia +774 -0
  447. data/test/progit/ru/figures-dia/fig0322.dia +1182 -0
  448. data/test/progit/ru/figures-dia/fig0323.dia +1457 -0
  449. data/test/progit/ru/figures-dia/fig0324.dia +1698 -0
  450. data/test/progit/ru/figures-dia/fig0325.dia +2101 -0
  451. data/test/progit/ru/figures-dia/fig0326.dia +2111 -0
  452. data/test/progit/ru/figures-dia/fig0336.dia +786 -0
  453. data/test/progit/ru/figures-dia/fig0337.dia +1546 -0
  454. data/test/progit/ru/figures-dia/fig0338.dia +1755 -0
  455. data/test/progit/ru/figures-dia/fig0339.dia +1882 -0
  456. data/test/progit/ru/figures-dia/fig0501.dia +477 -0
  457. data/test/progit/ru/figures-dia/fig0502.dia +1063 -0
  458. data/test/progit/ru/figures-dia/fig0503.dia +915 -0
  459. data/test/progit/ru/figures-dia/fig0511.dia +1201 -0
  460. data/test/progit/ru/figures-dia/fig0515.dia +1741 -0
  461. data/test/progit/ru/figures-dia/fig0702.dia +851 -0
  462. data/test/progit/ru/figures-dia/fig0703.dia +851 -0
  463. data/test/progit/sr/01-introduction/01-chapter1.markdown +257 -0
  464. data/test/progit/summary.rb +29 -0
  465. data/test/progit/th/01-introduction/01-chapter1.markdown +257 -0
  466. data/test/progit/th/02-git-basics/01-chapter2.markdown +1126 -0
  467. data/test/progit/th/README.md +47 -0
  468. data/test/progit/tr/01-introduction/01-chapter1.markdown +258 -0
  469. data/test/progit/tr/02-git-basics/01-chapter2.markdown +1129 -0
  470. data/test/progit/tr/03-git-branching/01-chapter3.markdown +598 -0
  471. data/test/progit/tr/04-git-server/01-chapter4.markdown +73 -0
  472. data/test/progit/tr/05-distributed-git/01-chapter5.markdown +215 -0
  473. data/test/progit/uk/01-introduction/01-chapter1.markdown +522 -0
  474. data/test/progit/vi/01-introduction/01-chapter1.markdown +259 -0
  475. data/test/progit/vi/02-git-basics/01-chapter2.markdown +1172 -0
  476. data/test/progit/vi/03-git-branching/01-chapter3.markdown +598 -0
  477. data/test/progit/zh-tw/01-introduction/01-chapter1.markdown +259 -0
  478. data/test/progit/zh-tw/02-git-basics/01-chapter2.markdown +1183 -0
  479. data/test/progit/zh-tw/03-git-branching/01-chapter3.markdown +604 -0
  480. data/test/progit/zh-tw/04-git-server/01-chapter4.markdown +866 -0
  481. data/test/progit/zh-tw/05-distributed-git/01-chapter5.markdown +912 -0
  482. data/test/progit/zh-tw/06-git-tools/01-chapter6.markdown +1139 -0
  483. data/test/progit/zh-tw/07-customizing-git/01-chapter7.markdown +932 -0
  484. data/test/progit/zh-tw/08-git-and-other-scms/01-chapter8.markdown +689 -0
  485. data/test/progit/zh-tw/09-git-internals/01-chapter9.markdown +977 -0
  486. data/test/progit/zh/01-introduction/01-chapter1.markdown +259 -0
  487. data/test/progit/zh/02-git-basics/01-chapter2.markdown +1177 -0
  488. data/test/progit/zh/03-git-branching/01-chapter3.markdown +604 -0
  489. data/test/progit/zh/04-git-server/01-chapter4.markdown +866 -0
  490. data/test/progit/zh/05-distributed-git/01-chapter5.markdown +912 -0
  491. data/test/progit/zh/06-git-tools/01-chapter6.markdown +1125 -0
  492. data/test/progit/zh/07-customizing-git/01-chapter7.markdown +935 -0
  493. data/test/progit/zh/08-git-and-other-scms/01-chapter8.markdown +689 -0
  494. data/test/progit/zh/09-git-internals/01-chapter9.markdown +976 -0
  495. data/test/spec_tests.json +4382 -4070
  496. data/test/test_basics.rb +1 -1
  497. data/test/test_helper.rb +1 -0
  498. data/test/test_maliciousness.rb +4 -2
  499. data/test/test_pathological_inputs.rb +31 -30
  500. data/test/test_spec.rb +5 -4
  501. metadata +972 -4
@@ -0,0 +1,296 @@
1
+ <!-- Attentie heren en dames vertalers.
2
+ Ik zou het volgende willen voorstellen:
3
+ Er zijn bepaalde termen die voor de gemiddelde Nederlandse computer gebruiker
4
+ veel beter klinken (of bekender voorkomen) dan de orginele Engelse term. In het
5
+ begin zullen deze termen niet vaak voorkomen, maar in de meer diepgaandere
6
+ hoofdstukken komen deze steeds meer voor. Termen als "Committen", "Mergen"
7
+ en "Applyen" klinken beter dan "Plegen" of "Toepassen", "Samenvoegen" en
8
+ "Toepassen" (wat bovendien slecht valt te onderscheiden van de
9
+ commit-toepassing). De mensen die dit boek lezen zijn, naar mijn bescheiden
10
+ inschatting, al redelijk op de hoogte van versiebeheer en passen (zie ik in
11
+ de praktijk) deze termen al toe. Een nieuwe terminologie introduceren lijkt
12
+ me dan ook niet noodzakelijk.
13
+ Verder blijven er altijd kreten over als "directory", wat vertaald zou kunnen
14
+ worden als "map", maar bij het Engelse werkwoord to map krijgen we dan weer het
15
+ probleem: hoe dit weer te vertalen? Daarom zou ik willen voorstellen om deze
16
+ basis-termen toch onvertaald te laten.
17
+
18
+ Twijfelgevallen zullen altijd blijven zoals de term "file", daarvan wordt in de
19
+ praktijk zowel de term file als bestand gebruikt. Ik denk dat we hier moeten
20
+ kijken hoe het in de context past.
21
+ Maar ook een term als "tool" en (ik zit zelf nog op een mooie Nederlandse term
22
+ te broeden) "plumbing", hierbij stel ik voor om eenmalig een Nederlandse
23
+ vertaling te geven, tussen haakjes de Engelse term te geven en in het vervolg
24
+ de Engelse term te gebruiken. Wederom is de context hier belangrijk.
25
+
26
+ Verder stel ik ook voor om de regels op https://onzetaal.nl/taaladvies zoveel
27
+ mogelijk te volgen. Bijvoorbeeld de regels omtrent het spellen van Engelse
28
+ werkwoorden die in het Nederlands gebruikt worden.
29
+
30
+ Let wel: ik wil niemand tot iets verplichten, maar ik denk dat we moeten
31
+ streven naar een zo duidelijk mogelijke en best bij de praktijk aansluitende
32
+ vertaling moeten proberen te maken.
33
+
34
+ Veel succes en plezier bij het vertalen...
35
+ -->
36
+ <!-- SHA-1 of last checked en-version: 4cefec -->
37
+ # Aan de slag #
38
+
39
+ In dit hoofdstuk wordt uitgelegd hoe je aan de slag kunt gaan met Git. We zullen beginnen met wat achtergrondinformatie over versiebeheersystemen te geven, daarna een korte uitleg hoe je Git werkend kan krijgen op je computer en sluiten af door uit te leggen hoe je Git kan instellen zodat je ermee aan het werk kunt. Aan het einde van dit hoofdstuk zou je moeten kunnen begrijpen waarom Git er is, waarom je het zou moeten gebruiken en zal je helemaal klaar zijn om er mee aan de slag te gaan.
40
+
41
+ ## Het wat en waarom van versiebeheer ##
42
+
43
+ Wat is versiebeheer, en wat heeft dat met jou te maken? Versiebeheer is het systeem waarbij veranderingen in een bestand of groep van bestanden over de tijd wordt bijgehouden, zodat je later specifieke versies kan opvragen. In de voorbeelden in dit boek is het broncode van computersoftware waarvan de versies beheerd worden maar in principe kan elk soort bestand op een computer aan versiebeheer worden onderworpen.
44
+
45
+ Als je een grafisch ontwerper bent of websites ontwerpt en elke versie van een afbeelding of opmaak wilt bewaren (wat je vrijwel zeker zult willen), is het verstandig een versiebeheersysteem (Version Control System in het Engels, afgekort tot VCS) te gebruiken. Als je dat gebruikt kan je eerdere versies van bestanden of het hele project terughalen, wijzigingen tussen twee momententen in tijd bekijken, zien wie het laatst iets aangepast heeft wat een probleem zou kunnen veroorzaken, wie een probleem heeft veroorzaakt en wanneer en nog veel meer. Een VCS gebruiken betekent meestal ook dat je de situatie gemakkelijk terug kan draaien als je een fout maakt of bestanden kwijtraakt. Daarbij komt nog dat dit allemaal heel weinig extra belasting met zich mee brengt.
46
+
47
+ ### Lokale versiebeheersystemen ###
48
+
49
+ Veel mensen hebben hun eigen versiebeheer methode: ze kopiëren bestanden naar een andere map (en als ze slim zijn, geven ze die map ook een datum). Deze methode wordt veel gebruikt omdat het zo simpel is, maar het is ook ongelofelijk foutgevoelig. Het is makkelijk te vergeten in welke map je zit en naar het verkeerde bestand te schrijven, of onbedoeld over bestanden heen te kopiëren.
50
+
51
+ Om met dit probleem om te gaan hebben programmeurs lang geleden lokale VCSen ontwikkeld die een simpele database gebruikten om alle veranderingen aan bestanden te beheren (zie Figuur 1-1).
52
+
53
+ Insert 18333fig0101.png
54
+ Figuur 1-1. Een diagram van een lokaal versiebeheersysteem.
55
+
56
+ Een populair gereedschap voor VCS was een systeem genaamd rcs, wat vandaag de dag nog steeds met veel computers wordt meegeleverd. Zelfs het populaire besturingssysteem Mac OS X heeft rcs als je de Developer Tools installeert. Dit gereedschap werkt in principe door verzamelingen van ‘patches’ (de verschillen tussen bestanden) van de opvolgende bestandsversies in een speciaal formaat op de harde schijf op te slaan. Zo kan je een bestand reproduceren zoals deze er uitzag op enig moment in tijd door alle patches bij elkaar op te tellen.
57
+
58
+ ### Gecentraliseerde versiebeheersystemen ###
59
+
60
+ De volgende belangrijke uitdaging waar mensen tegenaan lopen is dat ze samen moeten werken met ontwikkelaars op andere computers. Om deze uitdaging aan te gaan ontwikkelde men Gecentraliseerde Versiebeheersystemen (Centralized Version Control Systems, afgekort CVCSs). Deze systemen, zoals CVS, Subversion en Perforce, hebben één centrale server waarop alle versies van de bestanden staan en een aantal clients die de bestanden daar van ophalen (‘check out’). Vele jaren was dit de standaard voor versiebeheer (zie Figuur 1-2).
61
+
62
+ Insert 18333fig0102.png
63
+ Figuur 1-2. Een diagram van een gecentraliseerd versiebeheersysteem.
64
+
65
+ Deze manier van versiebeheer biedt veel voordelen, zeker ten opzichte van lokale VCSen. Bijvoorbeeld weet iedereen, tot op zekere hoogte, wat de overige project-medewerkers aan het doen zijn. Beheerders hebben een hoge mate van controle over wie wat kan doen, en het is veel eenvoudiger om een CVCS te beheren dan te moeten werken met lokale databases op elke client.
66
+
67
+ Maar helaas, deze methode heeft ook behoorlijke nadelen. De duidelijkste is de ‘single point of failure’: als de centrale server plat gaat en een uur later weer terug online komt kan niemand in dat uur samenwerken of versies bewaren van de dingen waar ze aan werken. Als de harde schrijf waar de centrale database op staat corrupt raakt en er geen backups van zijn verlies je echt alles; de hele geschiedenis van het project, behalve de momentopnames die mensen op hun eigen computers hebben staan. Lokale VCSen hebben hetzelfde probleem: als je de hele geschiedenis van het project op één enkele plaats bewaart, loop je ook kans alles te verliezen.
68
+
69
+ ### Gedistribueerde versiebeheersystemen ###
70
+
71
+ En hier verschijnen Gedistribueerde versiebeheersystemen (Distributed Version Control Systems, DVCSs) ten tonele. In een DVCS (zoals Git, Mercurial, Bazaar en Darcs) downloaden clients niet simpelweg de laatste momentopnames van de bestanden: de hele opslagplaats (de ‘repository’) wordt gekopiëerd. Dus als een server neergaat en deze systemen werkten via die server samen dan kan de repository van elke willekeurige client terug worden gekopiëerd naar de server om deze te herstellen. Elke checkout is dus in feite een complete backup van alle data (zie Figuur 1-3).
72
+
73
+ Insert 18333fig0103.png
74
+ Figuur 1-3. Diagram van een gedistribueerd versiebeheersysteem
75
+
76
+ Bovendien kunnen veel van deze systemen behoorlijk goed omgaan met meerdere (niet-lokale) repositories tegelijk, zodat je met verschillende groepen mensen op verschillende manieren tegelijk aan hetzelfde project kan werken. Hierdoor kan je verschillende werkprocessen (‘workflows’) opzetten die niet mogelijk waren geweest met gecentraliseerde systemen zoals hiërarchische modellen.
77
+
78
+ ## Een kort historisch overzicht van Git ##
79
+
80
+ Zoals zoveel goede dingen in het leven begon Git met een beetje creatieve destructie en een hoogoplopende controverse. De Linux kernel is een open source softwareproject met een behoorlijk grote omvang. Voor een lange tijd tijdens het onderhoud van de Linux kernel (1991–2002), werden aanpassingen aan de software voornamelijk verspreid via patches en gearchiveerde bestanden. In 2002 begon het project een gesloten DVCS genaamd BitKeeper te gebruiken.
81
+
82
+ In 2005 viel de relatie tussen de gemeenschap die de Linux kernel ontwikkelde en het commerciële bedrijf dat BitKeeper maakte uiteen, en het programma mocht niet langer meer gratis worden gebruikt. Dit was de aanleiding voor de gemeenschap (en Linus Torvalds, de maker van Linux, in het bijzonder) om hun eigen gereedschap te ontwikkelen, gebaseerd op de ervaring die opgedaan was toen ze nog BitKeeper gebruikten. Een paar van de doelen die ze hadden voor het nieuwe systeem waren als volgt:
83
+
84
+ * Snelheid
85
+ * Eenvoudig ontwerp
86
+ * Goede ondersteuning voor niet-lineaire ontwikkeling (duizenden parallelle takken (branches) )
87
+ * Volledig gedistribueerd
88
+ * In staat om efficiënt om te gaan met grote projecten als de Linux kernel (voor wat betreft snelheid maar ook opslagruimte)
89
+
90
+ Sinds het ontstaan in 2005 is Git gegroeid tot zijn huidige vorm: het is eenvoudig te gebruiken en heeft toch die oorspronkelijke eigenschappen behouden. Het is ongelofelijk snel, enorm efficiënt met grote projecten en een ongeëvenaard systeem van branches voor het ondersteunen van niet-lineaire ontwikkeling (zie Hoofdstuk 3).
91
+
92
+ ## De basis van Git ##
93
+
94
+ Dus, wat is Git in een notendop? Dit is een belangrijke paragraaf om in je op te nemen, omdat, als je goed begrijpt wat Git is en de fundamenten van de interne werking begrijpt, het waarschijnlijk een stuk makkelijker wordt om Git effectief te gebruiken. Probeer, als je Git aan het leren bent, te vergeten wat je al weet over andere VCSen zoals Subversion en Perforce; zo kan je verwarring bij gebruik door de subtiele verschillen voorkomen. Git gaat op een hele andere manier met informatie om dan die andere systemen, ook al lijken de verschillende commando’s behoorlijk op elkaar. Als je die verschillen begrijpt, kan je voorkomen dat je verward raakt als je Git gebruikt.
95
+
96
+ ### Momentopnames in plaats van verschillen ###
97
+
98
+ Een groot verschil tussen Git en elke andere VCS (inclusief Subversion en consorten) is hoe Git denkt over zijn data. Conceptueel bewaren de meeste andere systemen informatie als een lijst van veranderingen per bestand. Deze systemen (CVS, Subversion, Perforce, Bazaar, enzovoort) zien de informatie die ze bewaren als een aantal bestanden en de veranderingen die aan die bestanden zijn aangebracht over de tijd, zoals geïllustreerd in Figuur 1-4.
99
+
100
+ Insert 18333fig0104.png
101
+ Figuur 1-4. Andere systemen bewaren data meestal als veranderingen aan een basisversie van elk bestand.
102
+
103
+ Git ziet en bewaart zijn data heel anders. De kijk van Git op zijn data kan worden uitgelegd als een reeks momentopnames (snapshots) van een miniatuurbestandssysteem. Elke keer dat je ‘commit’ (de status van je project in Git opslaat) neemt het een soort van foto van hoe al je bestanden er op dat moment uitzien en slaat een verwijzing naar die foto op. Voor efficiëntie slaat Git ongewijzigde bestanden niet elke keer opnieuw op, alleen een verwijzing naar het eerdere identieke bestand dat het eerder al opgeslagen had. In Figuur 1-5 kan je zie hoe Git ongeveer over zijn data denkt.
104
+
105
+ Insert 18333fig0105.png
106
+ Figuur 1-5. Git bewaart data als momentopnames van het project.
107
+
108
+ Dat is een belangrijk onderscheid tussen Git en bijna alle overige VCSen. Hierdoor moet Git bijna elk aspect van versiebeheer heroverwegen, terwijl de meeste andere systemen het hebben overgenomen van voorgaande generaties. Dit maakt Git meer een soort mini-bestandssysteem met een paar ongelooflijk krachtige gereedschappen, in plaats van niets meer of minder dan een VCS. We zullen een paar van de voordelen die je krijgt als je op die manier over data denkt gaan onderzoeken, als we ‘branching’ (gesplitste ontwikkeling) toelichten in Hoofdstuk 3.
109
+
110
+ ### Bijna alles is lokaal ###
111
+
112
+ De meeste handelingen in Git hebben alleen lokale bestanden en hulpmiddelen nodig. Normaalgesproken is geen informatie nodig van een andere computer in je netwerk. Als je gewend bent aan een CVCS, waar de meeste handelingen vertraagd worden door het netwerk, lijkt Git door de goden van snelheid begenadigd met onwereldse krachten. Omdat je de hele geschiedenis van het project op je lokale harde schijf hebt staan, lijken de meeste acties geen tijd in beslag te nemen.
113
+
114
+ Een voorbeeld: om de geschiedenis van je project te doorlopen hoeft Git niet bij een of andere server de geschiedenis van je project op te vragen; het leest simpelweg jouw lokale database. Dat betekent dat je de geschiedenis van het project bijna direct te zien krijgt. Als je de veranderingen wilt zien tussen de huidige versie van een bestand en de versie van een maand geleden kan Git het bestand van een maand geleden opzoeken en lokaal de verschillen berekenen, in plaats van aan een niet-lokale server te moeten vragen om het te doen, of de oudere versie van het bestand ophalen van een server om het vervolgens lokaal te doen.
115
+
116
+ Dit betekent dat er maar heel weinig is dat je niet kunt doen als je offline bent of zonder VPN zit. Als je in een vliegtuig of trein zit en je wilt nog even wat werken, kan je vrolijk doorgaan met commits maken tot je een netwerkverbinding hebt zodat je dat werk kunt uploaden. Als je naar huis gaat en je VPN client niet aan de praat krijgt kan je nog steeds doorwerken. Bij veel andere systemen is dat onmogelijk of zeer onaangenaam. Als je bijvoorbeeld Perforce gebruikt kun je niet zo veel doen als je niet verbonden bent met de server. Met Subversion en CVS kun je bestanden bewerken maar je kunt geen commits maken naar je database (omdat die offline is). Dat lijkt misschien niet zo belangrijk maar je zult nog versteld staan wat een verschil het kan maken.
117
+
118
+ ### Git heeft integriteit ###
119
+
120
+ Alles in Git krijgt een controlegetal (‘checksum’) voordat het wordt opgeslagen en er wordt later met dat controlegetal ernaar gerefereerd. Dat betekent dat het onmogelijk is om de inhoud van een bestand of map te veranderen zonder dat Git er weet van heeft. Deze functionaliteit is in het diepste deel van Git ingebouwd en staat centraal in zijn filosofie. Je kunt geen informatie kwijtraken als het wordt verstuurd en bestanden kunnen niet corrupt raken zonder dat Git het kan opmerken.
121
+
122
+ Het mechanisme dat Git gebruikt voor deze controlegetallen heet een SHA-1-hash. Dat is een tekenreeks van 40 karakters lang, bestaande uit hexadecimale tekens (0–9 en a–f) en wordt berekend uit de inhoud van een bestand of directory-structuur in Git. Een SHA-1-hash ziet er ongeveer zo uit:
123
+
124
+ 24b9da6552252987aa493b52f8696cd6d3b00373
125
+
126
+ Je zult deze hashwaarden overal tegenkomen omdat Git er zoveel gebruik van maakt. Sterker nog, Git bewaart alles niet onder een bestandsnaam maar in de database van Git met de hash van de inhoud als sleutel.
127
+
128
+ ### Git voegt normaal gesproken alleen data toe ###
129
+
130
+ Bijna alles wat je in Git doet, leidt tot toevoeging van data in de Git database. Het is erg moeilijk om het systeem iets te laten doen wat je niet ongedaan kan maken of het de gegevens te laten wissen op wat voor manier dan ook. Zoals met elke VCS kun je veranderingen verliezen of verhaspelen als je deze nog niet hebt gecommit; maar als je dat eenmaal hebt gedaan, is het erg moeilijk om die data te verliezen, zeker als je de lokale database regelmatig uploadt (‘push’) naar een andere repository.
131
+
132
+ Dit maakt het gebruik van Git zo plezierig omdat je weet dat je kunt experimenteren zonder het gevaar te lopen jezelf behoorlijk in de nesten te werken. Zie Hoofdstuk 9 voor een iets diepgaandere uitleg over hoe Git zijn data bewaart en hoe je de data die verloren lijkt kunt terughalen.
133
+
134
+ ### De drie toestanden ###
135
+
136
+ Let nu goed op. Dit is het belangrijkste dat je over Git moet weten als je wilt dat de rest van het leerproces gladjes verloopt. Git heeft drie hoofdtoestanden waarin bestanden zich kunnen bevinden: gecommit (‘commited’), aangepast (‘modified’) en voorbereid voor een commit (‘staged’). Committed houdt in dat alle data veilig opgeslagen is in je lokale database. Modified betekent dat je het bestand hebt gewijzigd maar dat je nog niet naar je database gecommit hebt. Staged betekent dat je al hebt aangegeven dat de huidige versie van het aangepaste bestand in je volgende commit meegenomen moet worden.
137
+
138
+ Dit brengt ons tot de drie hoofdonderdelen van een Gitproject: de Git directory, de werk-directory, en de wachtrij voor een commit (‘staging area’)
139
+
140
+ Insert 18333fig0106.png
141
+ Figuur 1-6. Werk-directory, wachtrij en Git directory
142
+
143
+ De Git directory is waar Git de metadata en objectdatabase van je project opslaat. Dit is het belangrijkste deel van Git. Deze directory wordt gekopiëerd wanneer je een repository kloont vanaf een andere computer.
144
+
145
+ De werk directory is een checkout van een bepaalde versie van het project. Deze bestanden worden uit de gecomprimeerde database in de Git directory gehaald en op de harde schijf geplaatst waar jij ze kunt gebruiken of bewerken.
146
+
147
+ De wachtrij is een simpel bestand, dat zich normaalgesproken in je Git directory bevindt, waar informatie opgeslagen wordt over wat in de volgende commit meegaat. Het wordt soms de index genoemd, maar tegenwoordig wordt het de staging area genoemd.
148
+
149
+ De algemene workflow met Git gaat ongeveer zo:
150
+
151
+ 1. Je bewerkt bestanden in je werk directory.
152
+ 2. Je bereidt de bestanden voor (staged), waardoor momentopnames (snapshots) worden toegevoegd aan de staging area.
153
+ 3. Je maakt een commit. Een commit neemt alle snapshots van de staging area en bewaart die voorgoed in je Git directory.
154
+
155
+ Als een bepaalde versie van een bestand in de Git directory staat, wordt het beschouwd als gecommit. Als het is aangepast, maar wel aan de staging area is toegevoegd, is het staged. En als het veranderd is sinds het was uitgechecked maar niet staged is, is het aangepast. In Hoofdstuk 2 leer je meer over deze toestanden en hoe je er je voordeel mee kunt doen, maar ook hoe je de staging area compleet over kunt slaan.
156
+
157
+ ## Git installeren ##
158
+
159
+ Laten we Git eens beginnen te gebruiken. Je kunt natuurlijk niet meteen beginnen, je moet het eerst installeren. Er zijn een aantal manieren om eraan te komen; de belangrijkste twee zijn installeren vanaf broncode of een bestaand pakket voor jouw platform gebruiken.
160
+
161
+ ### Installeren vanaf de broncode ###
162
+
163
+ Als het mogelijk is, is het meestal nuttig om Git vanaf de broncode te installeren, omdat je dan de meest recente versie krijgt. Elke versie van Git brengt meestal nuttige verbeteringen aan de gebruikersinterface met zich mee, dus de laatste versie is vaak de beste manier als je het gewend bent software vanaf de broncode te compileren. Vaak hebben Linuxdistributies behoorlijk oude pakketen, dus tenzij je een hele up-to-date distro hebt of ‘backports’ (verbeteringen van een nieuwe versie op een oudere versie toepassen) gebruikt, is installeren vanaf broncode misschien wel het beste voor je.
164
+
165
+ Om Git te installeren heb je een aantal bibliotheken (‘libraries’) nodig waar Git van afhankelijk is: curl, zlib, openssl, expat, en libiconv. Als je bijvoorbeeld op een systeem werkt dat yum heeft (zoals Fedora) of apt-get (zoals systemen gebaseerd op Debian), kun je één van de volgende commando's gebruiken om alle bibliotheken waar Git van afhankelijk is te installeren:
166
+
167
+ $ yum install curl-devel expat-devel gettext-devel \
168
+ openssl-devel zlib-devel
169
+
170
+ $ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
171
+ libz-dev
172
+
173
+ Als je alle benodigde afhankelijkheden hebt, kun je de laatste snapshot van Git vanaf de officiële website downloaden:
174
+
175
+ http://git-scm.com/download
176
+
177
+ Daarna compileren en installeren:
178
+
179
+ $ tar -zxf git-1.7.10.4.tar.gz
180
+ $ cd git-1.7.10.4
181
+ $ make prefix=/usr/local all
182
+ $ sudo make prefix=/usr/local install
183
+
184
+ Als dat allemaal klaar is, kun je de ook nieuwste versie van Git met Git ophalen met dit commando:
185
+
186
+ $ git clone git://git.kernel.org/pub/scm/git/git.git
187
+
188
+ ### Op Linux installeren ###
189
+
190
+ Als je direct de uitvoerbare bestanden van Git op Linux wilt installeren, kun je dat over het algemeen doen via het standaard pakketbeheersysteem dat meegeleverd is met je distributie. Als je Fedora gebruikt kun je yum gebruiken:
191
+
192
+ $ yum install git-core
193
+
194
+ Of als je een distributie hebt die op Debian gebaseerd is, zoals Ubuntu, kun je apt-get proberen:
195
+
196
+ $ apt-get install git
197
+
198
+ ### Op een Mac installeren ###
199
+
200
+ Er zijn twee makkelijke manieren om Git op een Mac te installeren. De simpelste is om het grafische Git installatieprogramma te gebruiken, dat je van de volgende pagina op SourceForge kunt downloaden (zie Figuur 1-7):
201
+
202
+ http://sourceforge.net/projects/git-osx-installer/
203
+
204
+ Insert 18333fig0107.png
205
+ Figuur 1-7. Gitinstallatieprogramma voor OS X.
206
+
207
+ De andere veelgebruikte manier is om Git via MacPorts (`http://www.macports.org`) te installeren. Als je MacPorts geïnstalleerd hebt, kun je Git installeren met
208
+
209
+ $ sudo port install git-core +svn +doc +bash_completion +gitweb
210
+
211
+ Je hoeft niet alle extra’s toe te voegen, maar je wilt waarschijnlijk +svn erbij hebben voor het geval je ooit Git moet gebruiken met Subversion repositories (zie Hoofdstuk 8).
212
+
213
+ ### Op Windows installeren ###
214
+
215
+ Git op Windows installeren is erg eenvoudig. Het msysGit project heeft één van de eenvoudigere installatieprocedures. Je hoeft alleen maar het installatieprogramma te downloaden van GitHub, en het uit te voeren:
216
+
217
+ http://msysgit.github.com/
218
+
219
+ Nadat het geïnstalleerd is, kun je Git zowel vanaf de commando-regel gebruiken (waar ook een SSH client bijzit die later nog van pas zal komen) als via de standaard GUI.
220
+
221
+ Opmerking voor Windows gebruikers: je zou Git moeten gebruiken met de meegeleverde msysGit shell (Unix stijl), dit staat je toe de complexe commando's gegeven in dit boek te gebruiken. Als je om een of andere reden de Windows shell / commando-regel moet gebruiken, moet je dubbele quotes gebruiken in plaats van enkele quotes (voor parameters met spaties ertussen) en je moet quotes gebruiken bij parameters die eindigen met een circumflex (^) als ze als laatste op de regel staan, omdat dit een voortzettingssymbool is in Windows.
222
+
223
+ ## Git klaarmaken voor eerste gebruik ##
224
+
225
+ Nu je Git op je computer hebt staan, is het handig dat je een paar dingen doet om je Gitomgeving aan je voorkeuren aan te passen. Je hoeft deze instellingen normaliter maar één keer te doen, ze blijven hetzelfde als je een nieuwe versie van Git installeert. Je kunt ze ook op elk moment weer veranderen door de commando’s opnieuw uit te voeren.
226
+
227
+ Git bevat standaard een stuk gereedschap genaamd `git config`, waarmee je de configuratie-eigenschappen kunt bekijken en veranderen, die alle aspecten van het uiterlijk en gedrag van Git regelen. Deze eigenschappen kunnen op drie verschillende plaatsen worden bewaard:
228
+
229
+ * Het bestand `/etc/gitconfig`: Bevat eigenschappen voor elk account op de computer en al hun repositories. Als je de optie `--system` meegeeft aan `git config`, zal het de configuratiegegevens in dit bestand lezen en schrijven.
230
+ * Het bestand `~/.gitconfig`: Eigenschappen voor jouw account. Je kunt Git dit bestand laten lezen en schrijven door de optie `--global` mee te geven.
231
+ * Het configuratiebestand in de Gitdirectory (dus `.git/config`) van de repository die je op het moment gebruikt: Specifiek voor die ene repository. Elk niveau neemt voorrang boven het voorgaande, dus waarden die in `.git/config` zijn gebruikt zullen worden gebruikt in plaats van die in `/etc/gitconfig`.
232
+
233
+ Op systemen met Windows zoekt Git naar het `.gitconfig`-bestand in de `$HOME` directory (`%USERPROFILE%` in een Windows omgeving) wat zich vertaalt in `C:\Documents and Settings\$USER` of `C:\Users\$USER` voor de meesten, afhankelijk van de versie (`$USER` is `%USERNAME%` in Windows omgevingen). Het zoekt ook nog steeds naar `/etc/gitconfig`, maar dan gerelateerd aan de plek waar je MSys hebt staan, en dat is de plek is waar je Git op je Windowscomputer geïnstalleerd hebt.
234
+
235
+ ### Jouw identiteit ###
236
+
237
+ Het eerste wat je zou moeten doen nadat je Git geïnstalleerd hebt, is je gebruikersnaam en e-mail adres opgeven. Dat is belangrijk omdat elke commit in Git deze informatie gebruikt, en het onveranderlijk ingebed zit in de commits die je ronddeelt:
238
+
239
+ $ git config --global user.name "John Doe"
240
+ $ git config --global user.email johndoe@example.com
241
+
242
+ Nogmaals, dit hoef je maar één keer te doen als je de `--global` optie erbij opgeeft, omdat Git die informatie zal gebruiken voor alles wat je doet op dat systeem. Als je een andere naam of e-mail wilt gebruiken voor specifieke projecten, kun je het commando uitvoeren zonder de `--global` optie als je in de directory van dat project zit.
243
+
244
+ ### Je tekstverwerker ###
245
+
246
+ Nu Git weet wie je bent, kun je de standaard tekstverwerker instellen die gebruikt zal worden als Git je een bericht in wil laten typen. Normaliter gebruikt Git de standaardtekstverwerker van je systeem, wat meestal Vi of Vim is. Als je een andere tekstverwerker wilt gebruiken, zoals Emacs, kun je het volgende doen:
247
+
248
+ $ git config --global core.editor emacs
249
+
250
+ ### Je diffprogramma ###
251
+
252
+ Een andere nuttige optie die je misschien wel wilt instellen is het standaard diffprogramma om mergeconflicten op te lossen. Stel dat je vimdiff wilt gebruiken:
253
+
254
+ $ git config --global merge.tool vimdiff
255
+
256
+ Git accepteert kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge en opendiff als geldige merge tools. Je kunt ook een ander programma gebruiken, zie Hoofdstuk 7 voor meer informatie daarover.
257
+
258
+ ### Je instellingen controleren ###
259
+
260
+ Als je je instellingen wilt controleren, kan je het `git config --list` commando gebruiken voor een lijst met alle instellingen die Git vanaf die locatie kan vinden:
261
+
262
+ $ git config --list
263
+ user.name=Scott Chacon
264
+ user.email=schacon@gmail.com
265
+ color.status=auto
266
+ color.branch=auto
267
+ color.interactive=auto
268
+ color.diff=auto
269
+ ...
270
+
271
+ Je zult sommige sleutels misschien meerdere keren langs zien komen, omdat Git dezelfde sleutel uit verschillende bestanden heeft gelezen (bijvoorbeeld `/etc/gitconfig` en `~/.gitconfig`). In dit geval gebruikt Git de laatste waarde van elke unieke sleutel die het tegenkomt.
272
+
273
+ Je kan ook bekijken wat Git als instelling heeft bij een specifieke sleutel door `git config {sleutel}` in te voeren:
274
+
275
+ $ git config user.name
276
+ Scott Chacon
277
+
278
+ ## Hulp krijgen ##
279
+
280
+ Als je ooit hulp nodig hebt terwijl je Git gebruikt, zijn er drie manieren om de gebruiksaanwijzing (manpage) voor elk Git commando te krijgen:
281
+
282
+ $ git help <actie>
283
+ $ git <actie> --help
284
+ $ man git-<actie>
285
+
286
+ Bijvoorbeeld, je kunt de gebruikershandleiding voor het config commando krijgen door het volgende te typen:
287
+
288
+ $ git help config
289
+
290
+ Deze commando's zijn prettig omdat je ze overal kunt opvragen, zelfs als je offline bent.
291
+ Als de manpage en dit boek niet genoeg zijn en je persoonlijke hulp nodig hebt, kan je de kanalen `#git` of `#github` (beiden Engelstalig) op het Freenode IRC netwerk (irc.freenode.net) proberen. In deze kanalen zijn regelmatig honderden mensen aangemeld die allemaal zeer ervaren zijn met Git en vaak bereidwillig om te helpen.
292
+
293
+ ## Samenvatting ##
294
+
295
+ Je zou nu een beetje een idee moeten hebben wat Git is en op welke manieren het verschilt van het versiebeheersysteem dat je misschien eerder gebruikte. Je zou nu ook een werkende versie van Git op je systeem moeten hebben dat is ingesteld met jouw identiteit. Nu is het tijd om een aantal andere grondbeginselen van Git te gaan leren.
296
+
@@ -0,0 +1,1253 @@
1
+ <!-- Attentie heren en dames vertalers.
2
+ Ik zou het volgende willen voorstellen:
3
+ Er zijn bepaalde termen die voor de gemiddelde Nederlandse computer gebruiker
4
+ veel beter klinken (of bekender voorkomen) dan de orginele Engelse term. In het
5
+ begin zullen deze termen niet vaak voorkomen, maar in de meer diepgaandere
6
+ hoofdstukken komen deze steeds meer voor. Termen als "Committen", "Mergen"
7
+ en "Applyen" klinken beter dan "Plegen" of "Toepassen", "Samenvoegen" en
8
+ "Toepassen" (wat bovendien slecht valt te onderscheiden van de
9
+ commit-toepassing). De mensen die dit boek lezen zijn, naar mijn bescheiden
10
+ inschatting, al redelijk op de hoogte van versiebeheer en passen (zie ik in
11
+ de praktijk) deze termen al toe. Een nieuwe terminologie introduceren lijkt
12
+ me dan ook niet noodzakelijk.
13
+ Verder blijven er altijd kreten over als "directory", wat vertaald zou kunnen
14
+ worden als "map", maar bij het Engelse werkwoord to map krijgen we dan weer het
15
+ probleem: hoe dit weer te vertalen? Daarom zou ik willen voorstellen om deze
16
+ basis-termen toch onvertaald te laten.
17
+
18
+ Twijfelgevallen zullen altijd blijven zoals de term "file", daarvan wordt in de
19
+ praktijk zowel de term file als bestand gebruikt. Ik denk dat we hier moeten
20
+ kijken hoe het in de context past.
21
+ Maar ook een term als "tool" en (ik zit zelf nog op een mooie Nederlandse term
22
+ te broeden) "plumbing", hierbij stel ik voor om eenmalig een Nederlandse
23
+ vertaling te geven, tussen haakjes de Engelse term te geven en in het vervolg
24
+ de Engelse term te gebruiken. Wederom is de context hier belangrijk.
25
+
26
+ Verder stel ik ook voor om de regels op https://onzetaal.nl/taaladvies zoveel
27
+ mogelijk te volgen. Bijvoorbeeld de regels omtrent het spellen van Engelse
28
+ werkwoorden die in het Nederlands gebruikt worden.
29
+
30
+ Let wel: ik wil niemand tot iets verplichten, maar ik denk dat we moeten
31
+ streven naar een zo duidelijk mogelijke en best bij de praktijk aansluitende
32
+ vertaling moeten proberen te maken.
33
+
34
+ Veel succes en plezier bij het vertalen...
35
+ -->
36
+ <!-- SHA-1 of last checked en-version: 4cefec -->
37
+ # De basis van Git #
38
+
39
+ Als je slechts één hoofdstuk kunt lezen om met Git aan de slag te gaan, dan is dit het. In dit hoofdstuk worden alle basiscommando's behandeld, die je nodig hebben om het leeuwendeel van de dingen te doen waarmee je uiteindelijk je tijd met Git zult doorbrengen. Als je dit hoofdstuk doorgenomen hebt, zul je een repository kunnen configureren en initialiseren, bestanden beginnen en stoppen te volgen en veranderingen te ‘stagen’ en ‘committen’. We laten ook zien hoe je Git kunt instellen zodat het bepaalde bestanden en bestandspatronen negeert, hoe je vergissingen snel en gemakkelijk ongedaan kunt maken, hoe je de geschiedenis van je project kan doorlopen en wijzigingen tussen commits kunt zien, en hoe je kunt pushen naar en pullen van repositories.
40
+
41
+ ## Een Git repository verkrijgen ##
42
+
43
+ Je kunt op twee manieren een Git project verkrijgen. De eerste maakt gebruik van een bestaand project of directory en importeert dit in Git. De tweede maakt een kloon (clone) van een bestaande Git repository op een andere server.
44
+
45
+ ### Een repository initialiseren in een bestaande directory ###
46
+
47
+ Als je een bestaand project in Git wilt volgen (tracken), dan moet je naar de projectdirectory gaan en het volgende typen
48
+
49
+ $ git init
50
+
51
+ Dit maakt een nieuwe subdirectory met de naam `.git` aan, die alle noodzakelijke repository bestanden bevat, een Git repository raamwerk. Op dit moment wordt nog niets in je project gevolgd. (Zie *Hoofdstuk 9* voor meer informatie over welke bestanden er precies in de `.git` directory staan, die je zojuist gemaakt hebt.)
52
+
53
+ Als je de versies van bestaande bestanden wilt gaan beheren (in plaats van een lege directory), dan zul je die bestanden moeten beginnen te tracken en een eerste commit doen. Dit kun je bereiken door een paar `git add` commando's waarin je de te volgen bestanden specificeert, gevolgd door een commit:
54
+
55
+ $ git add *.c
56
+ $ git add README
57
+ $ git commit –m 'initial project version'
58
+
59
+ We zullen zodadelijk beschrijven wat deze commando's doen. Op dit punt heb je een Git repository met gevolgde (tracked) bestanden en een initiële commit.
60
+
61
+ ### Een bestaand repository clonen ###
62
+
63
+ Als je een kopie wilt van een bestaande Git repository, bijvoorbeeld een project waaraan je wilt bijdragen, dan is `git clone` het commando dat je nodig hebt. Als je bekend bent met andere versie-beheersystemen zoals Subversion, dan zal het je opvallen dat het commando `clone` is en niet `checkout`. Dit is een belangrijk verschil: Git ontvangt een kopie van bijna alle gegevens die de server heeft. Elke versie van ieder bestand in de hele geschiedenis van een project wordt binnengehaald als je `git clone` doet. In feite kun je als de schijf van de server kapot gaat, een clone van een willekeurige client gebruiken om de server terug in de status te brengen op het moment van clonen (al zou je wel wat hooks aan de kant van de server en dergelijke verliezen, maar alle versies van alle bestanden zullen er zijn; zie *Hoofdstuk 4* voor meer informatie).
64
+
65
+ Je clonet een repository met `git clone [url]`. Bijvoorbeeld, als je de Ruby Git bibliotheek genaamd Grit wilt clonen, kun je dit als volgt doen:
66
+
67
+ $ git clone git://github.com/schacon/grit.git
68
+
69
+ Dat maakt een directory genaamd `grit` aan, initialiseert hierin een `.git` directory, haalt alle data voor die repository binnen en doet een checkout van een werkkopie van de laatste versie. Als je in de nieuwe `grit` directory gaat kijken zal je de projectbestanden vinden, klaar om gebruikt of aan gewerkt te worden. Als je de repository in een directory met een andere naam dan grit wilt clonen, dan kun je dit met het volgende commando specificeren:
70
+
71
+ $ git clone git://github.com/schacon/grit.git mygrit
72
+
73
+ Dat commando doet hetzelfde als het vorige, maar dan heet de doeldirectory `mygrit`.
74
+
75
+ Git heeft een aantal verschillende transportprotocollen die je kunt gebruiken. Het vorige voorbeeld maakt gebruik van het `git://` protocol, maar je kunt ook `http(s)://` of `gebruiker@server:/pad.git` tegenkomen, dat het SSH transport protocol gebruikt. *Hoofdstuk 4* zal alle beschikbare opties introduceren die de server kan inrichten om je toegang tot de Git-repositories te geven, met daarbij de voors en tegens van elk.
76
+
77
+ ## Wijzigingen aan het repository vastleggen ##
78
+
79
+ Je hebt een eersteklas Git-repository en een checkout of werkkopie van de bestanden binnen dat project. Als je wijzigingen maakt dan moet je deze committen in je repository op elk moment dat het project een status bereikt die je wilt vastleggen.
80
+
81
+ Onthoud dat elk bestand in je werkdirectory in een van twee statussen kan verkeren: *gevolgd (tracked)* of *niet gevolgd (untracked)*. *Tracked* bestanden zijn bestanden die in het laatste snapshot zaten; ze kunnen *ongewijzigd (unmodified)*, *gewijzigd (modified)* of *staged* zijn. *untracked* bestanden zijn al het andere; elk bestand in je werkdirectory dat niet in je laatste snapshot en niet in je staging area zit. Als je een repository voor het eerst clonet, zullen alle bestanden tracked en unmodified zijn, omdat je ze zojuist uitgechecked hebt en nog niets gewijzigd hebt.
82
+
83
+ Zodra je bestanden wijzigt, ziet Git ze als modified omdat je ze veranderd hebt sinds je laatste commit. Je *staget* deze gewijzigde bestanden en commit al je gestagede wijzigingen, en de cyclus begint weer van voor af aan. Deze cyclus wordt in Figuur 2-1 geïllustreerd.
84
+
85
+ Insert 18333fig0201.png
86
+ Figuur 2-1. De levenscyclus van de status van je bestanden.
87
+
88
+ ### De status van je bestanden controleren ###
89
+
90
+ Het commando dat je voornamelijk zult gebruiken om te bepalen welk bestand zich in welke status bevindt is `git status`. Als je dit commando direct na het clonen uitvoert, dan zal je zoiets als het volgende zien:
91
+
92
+ $ git status
93
+ # On branch master
94
+ nothing to commit, working directory clean
95
+
96
+ Dit betekent dat je een schone werkdirectory hebt, met andere woorden er zijn geen tracked bestanden die gewijzigd zijn. Git ziet ook geen untracked bestanden, anders zouden ze hier getoond worden. Als laatste vertelt het commando op welke tak (branch) je nu zit. Voor nu is dit altijd `master`, dat is de standaard; besteed daar voor nu nog geen aandacht aan. In het volgende hoofdstuk wordt gedetaileerd ingegaan op branches en referenties.
97
+
98
+ Stel dat je een nieuw bestand toevoegt aan je project, een simpel README bestand. Als het bestand voorheen nog niet bestond, en je doet `git status`, dan zul je het niet getrackte bestand op deze manier zien:
99
+
100
+ $ vim README
101
+ $ git status
102
+ On branch master
103
+ Untracked files:
104
+ (use "git add <file>..." to include in what will be committed)
105
+
106
+ README
107
+
108
+ nothing added to commit but untracked files present (use "git add" to track)
109
+
110
+ Je kunt zien dat het nieuwe README bestand untrackt is, omdat het onder de “Untracked files” kop staat in je status output. Untrackt betekent eigenlijk dat Git een bestand ziet dat je niet in het vorige snapshot (commit) had; Git zal het niet in je commit snapshots toevoegen totdat jij dit expliciet aangeeft. Dit wordt zo gedaan zodat je niet per ongeluk gegenereerde binaire bestanden toevoegt, of andere bestanden die je niet wilt toevoegen. Je wilt dit README bestand wel meenemen, dus laten we het gaan tracken.
111
+
112
+ ### Nieuwe bestanden volgen (tracking) ###
113
+
114
+ Om een nieuw bestand te beginnen te tracken, gebruik je het commando `git add`. Om de README te tracken, voer je dit uit:
115
+
116
+ $ git add README
117
+
118
+ Als je het `status` commando nogmaals uitvoert, zie je dat je README bestand nu getrackt en ge-staged is:
119
+
120
+ $ git status
121
+ On branch master
122
+ Changes to be committed:
123
+ (use "git reset HEAD <file>..." to unstage)
124
+
125
+ new file: README
126
+
127
+
128
+ Je kunt zien dat het gestaged is, omdat het onder de kop “Changes to be committed” staat. Als je nu een commit doet, zal de versie van het bestand zoals het was ten tijde van je `git add` commando in de historische snapshot toegevoegd worden. Je zult je misschien herinneren dat, toen je `git init` eerder uitvoerde, je daarna `git add (bestanden)` uitvoerde; dat was om bestanden in je directory te beginnen te tracken. Het `git add` commando beschouwt een padnaam als een bestand of een directory. Als de padnaam een directory is, dan voegt het commando alle bestanden in die directory recursief toe.
129
+
130
+ ### Gewijzigde bestanden stagen ###
131
+
132
+ Laten we een getrackt bestand wijzigen. Als je een reeds getrackt bestand genaamd `benchmarks.rb` wijzigt, en dan je `status` commando nog eens uitvoert, krijg je iets dat er zo uitziet:
133
+
134
+ $ git status
135
+ On branch master
136
+ Changes to be committed:
137
+ (use "git reset HEAD <file>..." to unstage)
138
+
139
+ new file: README
140
+
141
+ Changes not staged for commit:
142
+ (use "git add <file>..." to update what will be committed)
143
+ (use "git checkout -- <file>..." to discard changes in working directory)
144
+
145
+ modified: benchmarks.rb
146
+
147
+
148
+ Het `benchmarks.rb` bestand verschijnt onder een sectie genaamd “Changes not staged for commit”, wat inhoudt dat een bestand dat wordt getrackt is gewijzigd in de werkdirectory, maar nog niet is gestaged. Om het te stagen, voer je het `git add` commando uit (het is een veelzijdig commando: je gebruikt het om bestanden te laten tracken, om bestanden te stagen, en om andere dingen zoals een bestand met een mergeconflict als opgelost te markeren). Laten we nu `git add` uitvoeren om het `benchmarks.rb` bestand te stagen, en dan nog eens `git status` uitvoeren:
149
+
150
+ $ git add benchmarks.rb
151
+ $ git status
152
+ On branch master
153
+ Changes to be committed:
154
+ (use "git reset HEAD <file>..." to unstage)
155
+
156
+ new file: README
157
+ modified: benchmarks.rb
158
+
159
+
160
+ Beide bestanden zijn gestaged en zullen met je volgende commit meegaan. Stel nu dat je je herinnert dat je nog een kleine wijziging in `benchmarks.rb` wilt maken voordat je het commit. Je kunt het opnieuw openen en die wijziging maken, en dan ben je klaar voor de commit. Alhoewel, laten we `git status` nog een keer uitvoeren:
161
+
162
+ $ vim benchmarks.rb
163
+ $ git status
164
+ On branch master
165
+ Changes to be committed:
166
+ (use "git reset HEAD <file>..." to unstage)
167
+
168
+ new file: README
169
+ modified: benchmarks.rb
170
+
171
+ Changes not staged for commit:
172
+ (use "git add <file>..." to update what will be committed)
173
+ (use "git checkout -- <file>..." to discard changes in working directory)
174
+
175
+ modified: benchmarks.rb
176
+
177
+
178
+ Asjemenou?! Nu staat `benchmarks.rb` zowel bij de staged en unstaged genoemd. Hoe is dat mogelijk? Het blijkt dat Git een bestand precies zoals het is staget wanneer je het `git add` commando uitvoert. Als je nu commit, dan zal de versie van `benchmarks.rb` zoals het was toen je voor 't laatst `git add` uitvoerde worden toegevoegd in de commit, en niet de versie van het bestand zoals het eruit ziet in je werkdirectory toen je `git commit` uitvoerde. Als je een bestand wijzigt nadat je `git add` uitvoert, dan moet je `git add` nogmaals uitvoeren om de laatste versie van het bestand te stagen:
179
+
180
+ $ git add benchmarks.rb
181
+ $ git status
182
+ On branch master
183
+ Changes to be committed:
184
+ (use "git reset HEAD <file>..." to unstage)
185
+
186
+ new file: README
187
+ modified: benchmarks.rb
188
+
189
+
190
+ ### Bestanden negeren ###
191
+
192
+ Vaak zul je een klasse bestanden hebben waarvan je niet wilt dat Git deze automatisch toevoegt of zelfs maar als untracked toont. Dit zijn doorgaans automatisch gegenereerde bestanden zoals logbestanden of bestanden die geproduceerd worden door je bouwsysteem. In die gevallen kun je een bestand genaamd `.gitignore` maken, waarin patronen staan die die bestanden passen. Hier is een voorbeeld van een `.gitignore` bestand:
193
+
194
+ $ cat .gitignore
195
+ *.[oa]
196
+ *~
197
+
198
+ De eerste regel vertelt Git om ieder bestand te negeren waarvan de naam eindigt op een `.o` of `.a` (*object* en *archief* bestanden die het product kunnen zijn van het bouwen van je code). De tweede regel vertelt Git dat ze alle bestanden moet negeren die eindigen op een tilde (`~`), wat gebruikt wordt door editors zoals Emacs om tijdelijke bestanden aan te geven. Je mag ook `log`, `tmp` of een `pid` directory toevoegen, automatisch gegenereerde documentatie, enzovoort. Een `.gitignore` bestand aanmaken voordat je gaat beginnen is over 't algemeen een goed idee, zodat je niet per ongeluk bestanden commit die je echt niet in je repository wilt hebben.
199
+
200
+ De regels voor patronen die je in het `.gitignore` bestand kunt zetten zijn als volgt:
201
+
202
+ * Lege regels of regels die beginnen met een `#` worden genegeerd.
203
+ * Standaard expansie (glob) patronen werken.
204
+ * Je mag patronen laten eindigen op een schuine streep (`/`) om een directory te specificeren.
205
+ * Je mag een patroon ontkennend maken door het te laten beginnen met een uitroepteken (`!`).
206
+
207
+ Expansie (`glob`) patronen zijn vereenvoudigde reguliere expressies die in shell-omgevingen gebruikt worden. Een asterisk (`*`) komt overeen met nul of meer karakters, `[abc]` komt overeen met ieder karakter dat tussen de blokhaken staat (in dit geval `a`, `b` of `c`), een vraagteken (`?`) komt overeen met een enkel karakter en blokhaken waartussen karakters staan die gescheiden zijn door een streepje (`[0-9]`) komen overeen met ieder karakter wat tussen die karakters zit (in dit geval 0 tot en met 9).
208
+
209
+ Hier is nog een voorbeeld van een `.gitignore` bestand:
210
+
211
+ # een commentaar – dit wordt genegeerd
212
+ # geen .a files
213
+ *.a
214
+ # maar track lib.a wel, ook al negeer je hierboven .a files
215
+ !lib.a
216
+ # negeer alleen de file TODO in de root, niet de subdirectory /TODO
217
+ /TODO
218
+ # negeer alle bestanden in de build/ directory
219
+ build/
220
+ # negeer doc/notes.txt, maar niet doc/server/arch.txt
221
+ doc/*.txt
222
+
223
+ Een `**/` patroon is sinds versie 1.8.2 beschikbaar in Git.
224
+
225
+ ### Je staged en unstaged wijzigingen zien ###
226
+
227
+ Als het `git status` commando te vaag is voor je, je wilt precies weten wat je veranderd hebt en niet alleen welke bestanden veranderd zijn, dan kun je het `git diff` commando gebruiken. We zullen `git diff` later in meer detail bespreken, maar je zult dit commando het meest gebruiken om deze twee vragen te beantwoorden: Wat heb je veranderd maar nog niet gestaged? En wat heb je gestaged en sta je op het punt te committen? Waar `git status` deze vragen heel algemeen beantwoordt, laat `git diff` je de exacte toegevoegde en verwijderde regels zien, de patch, als het ware.
228
+
229
+ Stel dat je het `README` bestand opnieuw verandert en staget, en dan het `benchmarks.rb` bestand verandert zonder het te stagen. Als je je `status` commando uitvoert, dan zie je nogmaals zoiets als dit:
230
+
231
+ $ git status
232
+ On branch master
233
+ Changes to be committed:
234
+ (use "git reset HEAD <file>..." to unstage)
235
+
236
+ new file: README
237
+
238
+ Changes not staged for commit:
239
+ (use "git add <file>..." to update what will be committed)
240
+ (use "git checkout -- <file>..." to discard changes in working directory)
241
+
242
+ modified: benchmarks.rb
243
+
244
+
245
+ Om te zien wat je gewijzigd maar nog niet gestaged hebt, typ `git diff` in zonder verdere argumenten:
246
+
247
+ $ git diff
248
+ diff --git a/benchmarks.rb b/benchmarks.rb
249
+ index 3cb747f..da65585 100644
250
+ --- a/benchmarks.rb
251
+ +++ b/benchmarks.rb
252
+ @@ -36,6 +36,10 @@ def main
253
+ @commit.parents[0].parents[0].parents[0]
254
+ end
255
+
256
+ + run_code(x, 'commits 1') do
257
+ + git.commits.size
258
+ + end
259
+ +
260
+ run_code(x, 'commits 2') do
261
+ log = git.commits('master', 15)
262
+ log.size
263
+
264
+ Dat commando vergelijkt wat er in je werkdirectory zit met wat er in je staging area zit. Het resultaat laat je zien welke wijzigingen je gedaan hebt, die je nog niet gestaged hebt.
265
+
266
+ Als je wilt zien wat je gestaged hebt en in je volgende commit zal zitten, dan kun je `git diff –-cached` gebruiken. (In Git versie 1.6.1 en nieuwer kun je ook `git diff --staged` gebruiken, wat misschien beter te onthouden is.) Dit commando vergelijkt je staged wijzigingen met je laatste commit:
267
+
268
+ $ git diff --cached
269
+ diff --git a/README b/README
270
+ new file mode 100644
271
+ index 0000000..03902a1
272
+ --- /dev/null
273
+ +++ b/README2
274
+ @@ -0,0 +1,5 @@
275
+ +grit
276
+ + by Tom Preston-Werner, Chris Wanstrath
277
+ + http://github.com/mojombo/grit
278
+ +
279
+ +Grit is a Ruby library for extracting information from a Git repository
280
+
281
+ Het is belangrijk om te zien dat `git diff` zelf niet alle wijzigingen sinds je laatste commit laat zien, alleen wijzigingen die nog niet gestaged zijn. Dit kan verwarrend zijn, omdat als je al je wijzigingen gestaged hebt, `git diff` geen output zal geven.
282
+
283
+ Nog een voorbeeld. Als je het `benchmarks.rb` bestand staget en vervolgens verandert, dan kun je `git diff` gebruiken om de wijzigingen in het bestand te zien dat gestaged is en de wijzigingen die niet gestaged zijn:
284
+
285
+ $ git add benchmarks.rb
286
+ $ echo '# test line' >> benchmarks.rb
287
+ $ git status
288
+ On branch master
289
+ Changes to be committed:
290
+ (use "git reset HEAD <file>..." to unstage)
291
+
292
+ modified: benchmarks.rb
293
+
294
+ Changes not staged for commit:
295
+ (use "git add <file>..." to update what will be committed)
296
+ (use "git checkout -- <file>..." to discard changes in working directory)
297
+
298
+ modified: benchmarks.rb
299
+
300
+
301
+ Nu kun je `git diff` gebruiken om te zien wat nog niet gestaged is
302
+
303
+ $ git diff
304
+ diff --git a/benchmarks.rb b/benchmarks.rb
305
+ index e445e28..86b2f7c 100644
306
+ --- a/benchmarks.rb
307
+ +++ b/benchmarks.rb
308
+ @@ -127,3 +127,4 @@ end
309
+ main()
310
+
311
+ ##pp Grit::GitRuby.cache_client.stats
312
+ +# test line
313
+
314
+ en `git diff --cached` om te zien wat je tot nog toe gestaged hebt:
315
+
316
+ $ git diff --cached
317
+ diff --git a/benchmarks.rb b/benchmarks.rb
318
+ index 3cb747f..e445e28 100644
319
+ --- a/benchmarks.rb
320
+ +++ b/benchmarks.rb
321
+ @@ -36,6 +36,10 @@ def main
322
+ @commit.parents[0].parents[0].parents[0]
323
+ end
324
+
325
+ + run_code(x, 'commits 1') do
326
+ + git.commits.size
327
+ + end
328
+ +
329
+ run_code(x, 'commits 2') do
330
+ log = git.commits('master', 15)
331
+ log.size
332
+
333
+ ### Je wijzigingen committen ###
334
+
335
+ Nu je staging area gevuld is zoals jij het wilt, kun je de wijzigingen committen. Onthoud dat alles wat niet gestaged is, dus ieder bestand dat je gemaakt of gewijzigd hebt en waarop je nog geen `git add` uitgevoerd hebt, niet in deze commit mee zal gaan. Ze zullen als gewijzigde bestanden op je schijf blijven staan.
336
+ In dit geval zag je de laatste keer dat je `git status` uitvoerde, dat alles gestaged was. Dus je bent er klaar voor om je wijzigingen te committen. De makkelijkste manier om te committen is om `git commit` in te typen:
337
+
338
+ $ git commit
339
+
340
+ Dit start de door jou gekozen editor op. (Dit wordt bepaald door de `$EDITOR` omgevingsvariabele in je shell, meestal vim of emacs, alhoewel je dit kunt instellen op welke editor je wilt gebruiken met het `git config --global core.editor` commando zoals je in *Hoofdstuk 1* gezien hebt).
341
+
342
+ De editor laat de volgende tekst zien (dit voorbeeld is een Vim scherm):
343
+
344
+ # Please enter the commit message for your changes. Lines starting
345
+ # with '#' will be ignored, and an empty message aborts the commit.
346
+ # On branch master
347
+ # Changes to be committed:
348
+ # new file: README
349
+ # modified: benchmarks.rb
350
+ #
351
+ ~
352
+ ~
353
+ ~
354
+ ".git/COMMIT_EDITMSG" 10L, 283C
355
+
356
+ Je kunt zien dat de standaard commit boodschap de laatste output van het `git status` commando als commentaar bevat en een lege regel bovenaan. Je kunt deze commentaren verwijderen en je eigen commit boodschap intypen, of je kunt ze laten staan om je eraan te helpen herinneren wat je aan het committen bent. (Om een meer expliciete herinnering van je wijzigingen te zien kun je de `-v` optie meegeven aan `git commit`. Als je dit doet zet Git de diff van je veranderingen in je editor zodat je precies kunt zien wat je gedaan hebt.) Als je de editor verlaat, creëert Git je commit boodschap (zonder de commentaren of de diff).
357
+
358
+ Als alternatief kun je de commit boodschap met het `commit` commando meegeven door hem achter de `-m` optie te specificeren, zoals hier:
359
+
360
+ $ git commit -m "Story 182: Fix benchmarks for speed"
361
+ [master 463dc4f] Story 182: Fix benchmarks for speed
362
+ 2 files changed, 3 insertions(+)
363
+ create mode 100644 README
364
+
365
+ Nu heb je je eerste commit gemaakt! Je kunt zien dat de commit je wat output over zichzelf heeft gegeven: op welke branch je gecommit hebt (`master`), welke SHA-1 checksum de commit heeft (`463dc4f`), hoeveel bestanden er veranderd zijn, en statistieken over toegevoegde en verwijderde regels in de commit.
366
+
367
+ Onthoud dat de commit de snapshot, die je in je staging area ingesteld hebt, opslaat. Alles wat je niet gestaged hebt staat nog steeds gewijzigd; je kunt een volgende commit doen om het aan je geschiedenis toe te voegen. Iedere keer dat je een commit doet, leg je een snapshot van je project vast dat je later terug kunt draaien of waarmee je kunt vergelijken.
368
+
369
+ ### De staging area overslaan ###
370
+
371
+ Alhoewel het ontzettend makkelijk kan zijn om commits precies zoals je wilt te maken, is de staging area soms iets ingewikkelder dan je in je workflow nodig hebt. Als je de staging area wilt overslaan, dan kan je met Git makkelijk de route inkorten. Door de `-a` optie aan het `git commit` commando mee te geven zal Git automatisch ieder bestand dat al getrackt wordt voor de commit stagen, zodat je het `git add` gedeelte kunt overslaan:
372
+
373
+ $ git status
374
+ On branch master
375
+ Changes not staged for commit:
376
+ (use "git add <file>..." to update what will be committed)
377
+ (use "git checkout -- <file>..." to discard changes in working directory)
378
+
379
+ modified: benchmarks.rb
380
+
381
+ no changes added to commit (use "git add" and/or "git commit -a")
382
+ $ git commit -a -m 'added new benchmarks'
383
+ [master 83e38c7] added new benchmarks
384
+ 1 files changed, 5 insertions(+)
385
+
386
+ Merk op dat je nu geen `git add` op het `benchmarks.rb` bestand hoeft te doen voordat je commit.
387
+
388
+ ### Bestanden verwijderen ###
389
+
390
+ Om een bestand van Git te verwijderen, moet je het van de getrackte bestanden verwijderen (of om precies te zijn: verwijderen van je staging area) en dan een commit doen. Het `git rm` commando doet dat, en verwijdert het bestand ook van je werkdirectory zodat je het de volgende keer niet als een untrackt bestand ziet.
391
+
392
+ Als je het bestand simpelweg verwijdert uit je werkdirectory, zal het te zien zijn onder het “Changes not staged for commit” (dat wil zeggen, _unstaged_) gedeelte van je `git status` output:
393
+
394
+ $ rm grit.gemspec
395
+ $ git status
396
+ On branch master
397
+ Changes not staged for commit:
398
+ (use "git add/rm <file>..." to update what will be committed)
399
+ (use "git checkout -- <file>..." to discard changes in working directory)
400
+
401
+ deleted: grit.gemspec
402
+
403
+ no changes added to commit (use "git add" and/or "git commit -a")
404
+
405
+ Als je daarna `git rm` uitvoert, zal de verwijdering van het bestand gestaged worden:
406
+
407
+ $ git rm grit.gemspec
408
+ rm 'grit.gemspec'
409
+ $ git status
410
+ On branch master
411
+ Changes to be committed:
412
+ (use "git reset HEAD <file>..." to unstage)
413
+
414
+ deleted: grit.gemspec
415
+
416
+
417
+ Als je de volgende keer een commit doet, zal het bestand verdwenen zijn en niet meer getrackt worden. Als je het bestand veranderd hebt en al aan de index toegevoegd, dan zul je de verwijdering moeten forceren met de `-f` optie. Dit is een veiligheidsmaatregel om te voorkomen dat je per ongeluk data die nog niet in een snapshot zit, en dus niet teruggehaald kan worden uit Git, weggooit.
418
+
419
+ Een ander handigheidje wat je misschien wilt gebruiken is het bestand in je werkdirectory houden, maar van je staging area verwijderen. Met andere woorden, je wilt het bestand misschien op je harde schijf bewaren, maar niet dat Git het bestand nog trackt. Dit is erg handig als je iets vergeten bent aan je `.gitignore` bestand toe te voegen, en het per ongeluk toegevoegd hebt. Zoals een groot logbestand, of een serie `.a` gecompileerde bestanden. Gebruik de `--cached` optie om dit te doen:
420
+
421
+ $ git rm --cached readme.txt
422
+
423
+ Je kunt bestanden, directories en bestandspatronen aan het `git rm` commando meegeven. Dat betekent dat je zoiets als dit kunt doen
424
+
425
+ $ git rm log/\*.log
426
+
427
+ Let op de backslash (`\`) voor de `*`. Dit is nodig omdat Git zijn eigen bestandsnaam-expansie doet, naast die van je shell. In de Windows systeemconsole moet de backslash worden weggelaten. Dit commando verwijdert alle bestanden die de `.log` extensie hebben in de `log/` directory. Of, je kunt zoiets als dit doen:
428
+
429
+ $ git rm \*~
430
+
431
+ Dit commando verwijdert alle bestanden die eindigen met `~`.
432
+
433
+ ### Bestanden verplaatsen ###
434
+
435
+ Anders dan vele andere VCS systemen, traceert Git niet expliciet verplaatsingen van bestanden. Als je een bestand een nieuwe naam geeft in Git, is er geen metadata opgeslagen in Git die vertelt dat je het bestand hernoemd hebt. Maar Git is slim genoeg om dit alsnog te zien, we zullen bestandsverplaatsing-detectie wat later behandelen.
436
+
437
+ Het is daarom een beetje verwarrend dat Git een `mv` commando heeft. Als je een bestand wilt hernoemen in Git, kun je zoiets als dit doen
438
+
439
+ $ git mv file_from file_to
440
+
441
+ en dat werkt prima. Sterker nog, als je zoiets als dit uitvoert en naar de status kijkt, zul je zien dat Git het als een hernoemd bestand beschouwt:
442
+
443
+ $ git mv README README.txt
444
+ $ git status
445
+ On branch master
446
+ Changes to be committed:
447
+ (use "git reset HEAD <file>..." to unstage)
448
+
449
+ renamed: README -> README.txt
450
+
451
+
452
+ Maar dat is gelijk aan het uitvoeren van het volgende:
453
+
454
+ $ mv README README.txt
455
+ $ git rm README
456
+ $ git add README.txt
457
+
458
+ Git komt er impliciet achter dat het om een hernoemd bestand gaat, dus het maakt niet uit of je een bestand op deze manier hernoemt of met het `mv` commando. Het enige echte verschil is dat het `mv` commando slechts één commando is in plaats van drie. En belangrijker nog is dat je iedere applicatie kunt gebruiken om een bestand te hernoemen, en de add/rm later kunt afhandelen voordat je commit.
459
+
460
+ ## De commit geschiedenis bekijken ##
461
+
462
+ Nadat je een aantal commits gemaakt hebt, of als je een repository met een bestaande commit-geschiedenis gecloned hebt, zul je waarschijnlijk terug willen zien wat er gebeurd is. De meest basale en krachtige tool om dit te doen is het `git log` commando.
463
+
464
+ Deze voorbeelden maken gebruik van een eenvoudig project genaamd simplegit dat ik vaak voor demonstraties gebruik. Om het project op te halen, voer dit uit
465
+
466
+ git clone git://github.com/schacon/simplegit-progit.git
467
+
468
+ Als je `git log` in dit project uitvoert, zou je output moeten krijgen die er ongeveer zo uitziet:
469
+
470
+ $ git log
471
+ commit ca82a6dff817ec66f44342007202690a93763949
472
+ Author: Scott Chacon <schacon@gee-mail.com>
473
+ Date: Mon Mar 17 21:52:11 2008 -0700
474
+
475
+ changed the version number
476
+
477
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
478
+ Author: Scott Chacon <schacon@gee-mail.com>
479
+ Date: Sat Mar 15 16:40:33 2008 -0700
480
+
481
+ removed unnecessary test code
482
+
483
+ commit a11bef06a3f659402fe7563abf99ad00de2209e6
484
+ Author: Scott Chacon <schacon@gee-mail.com>
485
+ Date: Sat Mar 15 10:31:28 2008 -0700
486
+
487
+ first commit
488
+
489
+ Zonder argumenten toont `git log` standaard de commits die gedaan zijn in die repository, in omgekeerde chronologische volgorde. Dat wil zeggen: de meest recente commits worden als eerste getoond. Zoals je kunt zien, toont dit commando iedere commit met zijn SHA-1 checksum, de naam van de auteur en zijn e-mail, de datum van opslaan, en de commit boodschap.
490
+
491
+ Een gigantisch aantal en variëteit aan opties zijn beschikbaar voor het `git log` commando om je precies te laten zien waar je naar op zoek bent. Hier laten we je de meest gebruikte opties zien.
492
+
493
+ Een van de meest behulpzame opties is `-p`, wat de diff laat zien van de dingen die in iedere commit geïntroduceerd zijn. Je kunt ook `-2` gebruiken, om alleen de laatste twee items te laten zien:
494
+
495
+ $ git log –p -2
496
+ commit ca82a6dff817ec66f44342007202690a93763949
497
+ Author: Scott Chacon <schacon@gee-mail.com>
498
+ Date: Mon Mar 17 21:52:11 2008 -0700
499
+
500
+ changed the version number
501
+
502
+ diff --git a/Rakefile b/Rakefile
503
+ index a874b73..8f94139 100644
504
+ --- a/Rakefile
505
+ +++ b/Rakefile
506
+ @@ -5,7 +5,7 @@ require 'rake/gempackagetask'
507
+ spec = Gem::Specification.new do |s|
508
+ - s.version = "0.1.0"
509
+ + s.version = "0.1.1"
510
+ s.author = "Scott Chacon"
511
+
512
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
513
+ Author: Scott Chacon <schacon@gee-mail.com>
514
+ Date: Sat Mar 15 16:40:33 2008 -0700
515
+
516
+ removed unnecessary test code
517
+
518
+ diff --git a/lib/simplegit.rb b/lib/simplegit.rb
519
+ index a0a60ae..47c6340 100644
520
+ --- a/lib/simplegit.rb
521
+ +++ b/lib/simplegit.rb
522
+ @@ -18,8 +18,3 @@ class SimpleGit
523
+ end
524
+
525
+ end
526
+ -
527
+ -if $0 == __FILE__
528
+ - git = SimpleGit.new
529
+ - puts git.show
530
+ -end
531
+
532
+
533
+ Deze optie toont dezelfde informatie, maar dan met een diff volgend op ieder item. Dit is erg handig voor een code review, of om snel te zien wat er tijdens een reeks commits gebeurd is die een medewerker toegevoegd heeft.
534
+
535
+ Soms is het handiger om wijzigingen na te kijken op woordniveau in plaats van op regelniveau. Er is een `--word-diff` optie beschikbaar in Git, die je aan het `git log -p` commando kan toevoegen om een woord diff te krijgen inplaats van de reguliere regel voor regel diff. Woord diff formaat is nogal nutteloos als het wordt toegepast op broncode, maar is erg handig als het wordt toegepast op grote tekstbestanden, zoals boeken of een dissertatie. Hier is een voorbeeld.
536
+
537
+ $ git log -U1 --word-diff
538
+ commit ca82a6dff817ec66f44342007202690a93763949
539
+ Author: Scott Chacon <schacon@gee-mail.com>
540
+ Date: Mon Mar 17 21:52:11 2008 -0700
541
+
542
+ changed the version number
543
+
544
+ diff --git a/Rakefile b/Rakefile
545
+ index a874b73..8f94139 100644
546
+ --- a/Rakefile
547
+ +++ b/Rakefile
548
+ @@ -7,3 +7,3 @@ spec = Gem::Specification.new do |s|
549
+ s.name = "simplegit"
550
+ s.version = [-"0.1.0"-]{+"0.1.1"+}
551
+ s.author = "Scott Chacon"
552
+
553
+ Zoals je kunt zien zijn er geen toegevoegde of verwijderde regels in deze uitvoer zoals in een normale diff. Wijzigingen worden daarentegen binnen de regel getoond. Je kunt het toegevoegde woord zien binnen een `{+ +}` en verwijderde binnen een `[- -]`. Je kunt ook kiezen om de gebruikelijke 3 regels context in de diff uitvoer tot één regel te verminderen, omdat de context nu woorden is, en geen regels. Je kunt dit doen met `-U1` zoals hierboven in het voorbeeld.
554
+
555
+ Je kunt ook een serie samenvattende opties met `git log` gebruiken. Bijvoorbeeld, als je wat verkorte statistieken bij iedere commit wilt zien, kun je de `--stat` optie gebruiken:
556
+
557
+ $ git log --stat
558
+ commit ca82a6dff817ec66f44342007202690a93763949
559
+ Author: Scott Chacon <schacon@gee-mail.com>
560
+ Date: Mon Mar 17 21:52:11 2008 -0700
561
+
562
+ changed the version number
563
+
564
+ Rakefile | 2 +-
565
+ 1 file changed, 1 insertion(+), 1 deletion(-)
566
+
567
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
568
+ Author: Scott Chacon <schacon@gee-mail.com>
569
+ Date: Sat Mar 15 16:40:33 2008 -0700
570
+
571
+ removed unnecessary test code
572
+
573
+ lib/simplegit.rb | 5 -----
574
+ 1 file changed, 5 deletions(-)
575
+
576
+ commit a11bef06a3f659402fe7563abf99ad00de2209e6
577
+ Author: Scott Chacon <schacon@gee-mail.com>
578
+ Date: Sat Mar 15 10:31:28 2008 -0700
579
+
580
+ first commit
581
+
582
+ README | 6 ++++++
583
+ Rakefile | 23 +++++++++++++++++++++++
584
+ lib/simplegit.rb | 25 +++++++++++++++++++++++++
585
+ 3 files changed, 54 insertions(+)
586
+
587
+ Zoals je ziet, drukt de `--stat` optie onder iedere commit een lijst gewijzigde bestanden af, hoeveel bestanden gewijzigd zijn, en hoeveel regels in die bestanden zijn toegevoegd en verwijderd. Het toont ook een samenvatting van de informatie aan het einde.
588
+ Een andere handige optie is `--pretty`. Deze optie verandert de log output naar een ander formaat dan de standaard. Er zijn al een paar voorgebouwde opties voor je beschikbaar. De `oneline` optie drukt iedere commit op een eigen regel af, wat handig is als je naar een hoop commits kijkt. Daarnaast tonen de `short`, `full` en `fuller` opties de output in grofweg hetzelfde formaat, maar met minder of meer informatie, respectievelijk:
589
+
590
+ $ git log --pretty=oneline
591
+ ca82a6dff817ec66f44342007202690a93763949 changed the version number
592
+ 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
593
+ a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
594
+
595
+ De meest interessante optie is `format`, waarmee je je eigen log-uitvoer-formaat kunt specificeren. Dit is in het bijzonder handig als je output aan het genereren bent voor automatische verwerking; omdat je expliciet het formaat kan specificeren, weet je dat het niet zal veranderen bij volgende versies van Git:
596
+
597
+ $ git log --pretty=format:"%h - %an, %ar : %s"
598
+ ca82a6d - Scott Chacon, 11 months ago : changed the version number
599
+ 085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
600
+ a11bef0 - Scott Chacon, 11 months ago : first commit
601
+
602
+ Tabel 2-1 toont een aantal handige opties die aan format gegeven kunnen worden.
603
+
604
+ <!-- Attention to translators: this is a table declaration.
605
+ The lines must be formatted as follows
606
+ <TAB><First column text><TAB><Second column text>
607
+ -->
608
+
609
+ Optie Omschrijving van de Output
610
+ %H Commit hash
611
+ %h Afgekorte commit hash
612
+ %T Tree hash
613
+ %t Afgekorte tree hash
614
+ %P Parent hashes
615
+ %p Afgekorte parent hashes
616
+ %an Auteur naam
617
+ %ae Auteur e-mail
618
+ %ad Auteur datum (formaat respecteert de –date= optie)
619
+ %ar Auteur datum, relatief
620
+ %cn Committer naam
621
+ %ce Committer e-mail
622
+ %cd Committer datum
623
+ %cr Committer datum, relatief
624
+ %s Onderwerp
625
+
626
+ Je zult je misschien afvragen wat het verschil is tussen _author_ en _committer_. De _author_ is de persoon die de patch oorspronkelijk geschreven heeft, en de _committer_ is de persoon die de patch als laatste heeft toegepast. Dus als je een patch naar een project stuurt en een van de kernleden past de patch toe, dan krijgen jullie beiden de eer, jij als de auteur en het kernlid als de committer. We gaan hier wat verder op in in *Hoofdstuk 5*.
627
+
628
+ De `oneline` en `format` opties zijn erg handig in combinatie met een andere `log` optie genaamd `--graph`. Deze optie maakt een mooie ASCII grafiek waarin je branch- en merge-geschiedenis getoond worden, die we kunnen zien in onze kopie van het Grit project repository:
629
+
630
+ $ git log --pretty=format:"%h %s" --graph
631
+ * 2d3acf9 ignore errors from SIGCHLD on trap
632
+ * 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
633
+ |\
634
+ | * 420eac9 Added a method for getting the current branch.
635
+ * | 30e367c timeout code and tests
636
+ * | 5a09431 add timeout protection to grit
637
+ * | e1193f8 support for heads with slashes in them
638
+ |/
639
+ * d6016bc require time for xmlschema
640
+ * 11d191e Merge branch 'defunkt' into local
641
+
642
+ Dat zijn slechts een paar simpele output formaat opties voor `git log`; er zijn er nog veel meer. Tabel 2-2 toont de opties waarover we het tot nog toe gehad hebben, en wat veel voorkomende formaat-opties die je misschien handig vindt, samen met hoe ze de output van het `log` commando veranderen.
643
+
644
+ <!-- Attention to translators: this is a table declaration.
645
+ The lines must be formatted as follows
646
+ <TAB><First column text><TAB><Second column text>
647
+ -->
648
+
649
+ Optie Omschrijving
650
+ -p Toon de patch geïntroduceerd bij iedere commit.
651
+ --word-diff Toon de patch in een woord diff formaat.
652
+ --stat Toon statistieken voor gewijzigde bestanden per commit.
653
+ --shortstat Toon alleen de gewijzigde/ingevoegde/verwijderde regel van het --stat commando.
654
+ --name-only Toon de lijst van bestanden die gewijzigd zijn na de commit-informatie.
655
+ --name-status Toon ook de lijst van bestanden die beïnvloed zijn door de toegevoegde/gewijzigde/verwijderde informatie.
656
+ --abbrev-commit Toon alleen de eerste paar karakters van de SHA-1 checksum in plaats van alle 40.
657
+ --relative-date Toon de datum in een relatief formaat (bijvoorbeeld, "2 weken geleden"), in plaats van het volledige datum formaat.
658
+ --graph Toon een ASCII grafiek van de branch- en merge-geschiedenis naast de log output.
659
+ --pretty Toon commits in een alternatief formaat. De opties bevatten oneline, short, full, fuller, en format (waarbij je je eigen formaat specificeert).
660
+ --oneline Een gemaks-optie, staat voor `--pretty=oneline --abbrev-commit`.
661
+
662
+ ### Log output limiteren ###
663
+
664
+ Naast het formatteren van de output, heeft `git log` nog een aantal bruikbare limiterende opties; dat wil zeggen, opties die je een subset van de commits tonen. Je hebt zo'n optie al gezien: de `-2` optie, die slechts de laatste twee commits laat zien. Sterker nog: je kunt `-<n>` doen, waarbij `n` een heel getal is om de laatste `n` commits te laten zien. In feite zul je deze vorm weinig gebruiken, omdat Git standaard alle output door een pager (pagineer applicatie) stuurt zodat je de log-uitvoer pagina voor pagina ziet.
665
+
666
+ Dat gezegd hebbende, zijn de tijd-limiterende opties zoals `--since` en `--until` erg handig. Dit commando bijvoorbeeld, geeft een lijst met commits die gedaan zijn gedurende de laatste twee weken:
667
+
668
+ $ git log --since=2.weeks
669
+
670
+ Dit commando werkt met veel formaten: je kunt een specifieke datum kiezen ("2008-01-15”) of een relatieve datum zoals "2 jaar 1 dag en 3 minuten geleden".
671
+
672
+ Je kunt ook de lijst met commits filteren op bepaalde criteria. De `--author` optie laat je filteren op een specifieke auteur, en de `--grep` optie laat je op bepaalde zoekwoorden filteren in de commit boodschappen. (Let op dat als je zowel auteur als grep opties specificeert het commando commits zal matchen met beide.) Als je meerdere grep opties wilt specificeren, zal je `--all-match` moet toevoegen, anders zal het commando ook commits met één van de twee criteria selecteren.
673
+
674
+ De laatste echt handige optie om aan `git log` als filter mee te geven is een pad. Als je een directory of bestandsnaam opgeeft, kun je de log output limiteren tot commits die een verandering introduceren op die bestanden. Dit is altijd de laatste optie en wordt over het algemeen vooraf gegaan door dubbele streepjes (`--`) om de paden van de opties te scheiden.
675
+
676
+ In Tabel 2-3 laten we deze en een paar andere veel voorkomende opties zien als referentie.
677
+
678
+ <!-- Attention to translators: this is a table declaration.
679
+ The lines must be formatted as follows
680
+ <TAB><First column text><TAB><Second column text>
681
+ -->
682
+
683
+ Optie Omschrijving
684
+ -(n) Laat alleen de laatste n commits zien
685
+ --since, --after Limiteer de commits tot degenen waarvan de CommitDate op of na de gegeven datum/tijd ligt.
686
+ --until, --before Limiteer de commits tot degenen waarvan de CommitDate op of voor de gegeven datum/tijd ligt.
687
+ --author Laat alleen de commits zien waarvan de auteur bij de gegeven tekst past.
688
+ --committer Laat alleen de commits zien waarvan de committer bij de gegeven tekst past.
689
+
690
+ ### Log uitvoer beperken volgens datum/tijd ###
691
+
692
+ Om te bepalen welke commits in de Git broncode repository aanwezig zijn (git://git.kernel.org/pub/scm/git/git.git) met een CommitDate van 2014-04-29 relatief aan je lokale tijdzone (zoals ingesteld op jouw computer), gebruik je
693
+
694
+ $ git log --after="2014-04-29 00:00:00" --before="2014-04-29 23:59:59" \
695
+ --pretty=fuller
696
+
697
+ Omdat de uitvoer zal verschillen met de tijdzone waar dit commando wordt gegeven, wordt het aangeraden om altijd een absolute tijd zoals volgens het ISO 8601 formaat (welke tijdzone informatie bevat) als argument bij `--after` and `--before` te gebruiken, zodat iedereen die het commando geeft dezelfde herhaalbare resultaten krijgt.
698
+
699
+ Om de commits gemaakt op een specifiek moment in de tijd te krijgen (bijv. 29 April 2013 om 17:07:22 CET), kunnen we dit gebruiken
700
+
701
+ $ git log --after="2013-04-29T17:07:22+0200" \
702
+ --before="2013-04-29T17:07:22+0200" --pretty=fuller
703
+
704
+ commit de7c201a10857e5d424dbd8db880a6f24ba250f9
705
+ Author: Ramkumar Ramachandra <artagnon@gmail.com>
706
+ AuthorDate: Mon Apr 29 18:19:37 2013 +0530
707
+ Commit: Junio C Hamano <gitster@pobox.com>
708
+ CommitDate: Mon Apr 29 08:07:22 2013 -0700
709
+
710
+ git-completion.bash: lexical sorting for diff.statGraphWidth
711
+
712
+ df44483a (diff --stat: add config option to limit graph width,
713
+ 2012-03-01) added the option diff.startGraphWidth to the list of
714
+ configuration variables in git-completion.bash, but failed to notice
715
+ that the list is sorted alphabetically. Move it to its rightful place
716
+ in the list.
717
+
718
+ Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
719
+ Signed-off-by: Junio C Hamano <gitster@pobox.com>
720
+
721
+ De bovenstaande tijden (`AuthorDate`, `CommitDate`) worden getoond in het standaard formaat (`--date=default`), welke de tijdzone informatie van respectievelijk de auteur en committer weergeeft.
722
+
723
+ Andere nuttige formaten zijn onder andere `--date=iso` (ISO 8601), `--date=rfc` (RFC 2822), `--date=raw` (seconden sinds de "epoch" (1970-01-01 UTC)) `--date=local` (tijden volgens jouw locale tijdzone) alsmede `--date=relative` (bijv. "2 hours ago").
724
+
725
+ Als het commando `git log` zonder tijdsaanduiding gebruikt wordt, wordt de tijd van je computer aangehouden op het moment dat het commando wordt uitgevoerd (met behoud van het relatieve verschil met UTC).
726
+
727
+ Bijvoorbeeld, het uitvoeren van een `git log` commando om 09:00 op jouw computer waarbij je tijdzone op dat moment 3 uur voorloopt op UTC, maakt de uitvoer van de volgende twee commando's gelijk:
728
+
729
+ $ git log --after=2008-06-01 --before=2008-07-01
730
+ $ git log --after="2008-06-01T09:00:00+0300" \
731
+ --before="2008-07-01T09:00:00+0300"
732
+
733
+ Als laatste voorbeeld, als je commits wilt zien die de testbestanden wijzigen in de Git sourcecode geschiedenis die door Junio Hamano gecommit waren met de CommitDate in de maand oktober 2008 (relatief tot de tijdzone van New York) en die geen merges waren, kan je bijvoorbeeld het volgende commando typen:
734
+
735
+ $ git log --pretty="%h - %s" --author=gitster \
736
+ --after="2008-10-01T00:00:00-0400" \
737
+ --before="2008-10-31T23:59:59-0400" --no-merges -- t/
738
+ 5610e3b - Fix testcase failure when extended attribute
739
+ acd3b9e - Enhance hold_lock_file_for_{update,append}()
740
+ f563754 - demonstrate breakage of detached checkout wi
741
+ d1a43f2 - reset --hard/read-tree --reset -u: remove un
742
+ 51a94af - Fix "checkout --track -b newbranch" on detac
743
+ b0ad11e - pull: allow "git pull origin $something:$cur
744
+
745
+ Van de bijna 36.000 commits in de Git broncode historie, laat dit commando de 6 zien die bij die criteria passen.
746
+
747
+ ### Een grafische interface gebruiken om de historie te visualiseren ###
748
+
749
+ Als je een meer grafische applicatie wilt gebruiken om je commit historie te visualiseren, wil je misschien een kijkje nemen naar het Tcl/Tk programma genaamd `gitk` dat met Git meegeleverd wordt. Gitk is eigenlijk een visuele `git log` tool, en het accepteert bijna alle filter opties die `git log` ook accepteert. Als je `gitk` in op de commandoregel in je project typt, zou je zoiets als in Figuur 2-2 moeten zien.
750
+
751
+ Insert 18333fig0202.png
752
+ Figuur 2-2. De gitk historie-visualiseerder.
753
+
754
+ Je kunt de commit-historie in de bovenste helft van het scherm zien, samen met een afkomst graaf. De diff in de onderste helft van het scherm laat je de veranderingen zien die geïntroduceerd zijn bij iedere commit die je aanklikt.
755
+
756
+ ## Dingen ongedaan maken ##
757
+
758
+ Op enig moment wil je misschien iets ongedaan maken. Hier zullen we een aantal basis-tools laten zien om veranderingen die je gemaakt hebt weer ongedaan te maken. Maar pas op, je kunt niet altijd het ongedaan maken weer ongedaan maken. Dit is één van de weinige gedeeltes in Git waarbij je werk kwijt kunt raken als je het verkeerd doet.
759
+
760
+ ### Je laatste commit veranderen ###
761
+
762
+ Een van de veel voorkomende acties die ongedaan gemaakt moeten worden vinden plaats als je te vroeg commit en misschien vergeet een aantal bestanden toe te voegen, of je verknalt je commit boodschap. Als je opnieuw wilt proberen te committen, dan kun je commit met de `--amend` optie uitvoeren:
763
+
764
+ $ git commit --amend
765
+
766
+ Dit commando neemt je staging area en gebruikt dit voor de commit. Als je geen veranderingen sinds je laatste commit hebt gedaan (bijvoorbeeld, je voert dit commando meteen na je laatste commit uit), dan zal je snapshot er precies hetzelfde uitzien en zal je commit boodschap het enige zijn dat je verandert.
767
+
768
+ Dezelfde commit-boodschap editor start op, maar deze bevat meteen de boodschap van je vorige commit. Je kunt de boodschap net als andere keren aanpassen, maar het overschrijft je vorige commit.
769
+
770
+ Bijvoorbeeld, als je commit en je dan realiseert dat je vergeten bent de veranderingen in een bestand dat je wou toevoegen in deze commit te stagen, dan kun je zoiets als dit doen:
771
+
772
+ $ git commit -m 'initial commit'
773
+ $ git add vergeten_bestand
774
+ $ git commit --amend
775
+
776
+ Na deze drie commando's eindig je met één commit; de tweede commit vervangt de resultaten van de eerste.
777
+
778
+ ### Een staged bestand unstagen ###
779
+
780
+ De volgende twee paragrafen laten zien hoe je de staging area en veranderingen in je werkdirectories aanpakt. Het prettige hier is dat het commando dat je gebruikt om de status van die gebieden te bepalen, je er ook aan herinnert hoe je de veranderingen eraan weer ongedaan kunt maken. Bijvoorbeeld, stel dat je twee bestanden gewijzigd hebt en je wilt ze committen als twee aparte veranderingen, maar je typt per ongeluk `git add *` en staged ze allebei. Hoe kun je één van de twee nu unstagen? Het `git status` commando herinnert je eraan:
781
+
782
+ $ git add .
783
+ $ git status
784
+ On branch master
785
+ Changes to be committed:
786
+ (use "git reset HEAD <file>..." to unstage)
787
+
788
+ modified: README.txt
789
+ modified: benchmarks.rb
790
+
791
+
792
+ Direct onder de "Changes to be committed" tekst, staat dat je `git reset HEAD <file>...` moet gebruiken om te unstagen. Laten we dat advies volgen om het `benchmarks.rb` bestand te unstagen:
793
+
794
+ $ git reset HEAD benchmarks.rb
795
+ Unstaged changes after reset:
796
+ M benchmarks.rb
797
+ $ git status
798
+ On branch master
799
+ Changes to be committed:
800
+ (use "git reset HEAD <file>..." to unstage)
801
+
802
+ modified: README.txt
803
+
804
+ Changes not staged for commit:
805
+ (use "git add <file>..." to update what will be committed)
806
+ (use "git checkout -- <file>..." to discard changes in working directory)
807
+
808
+ modified: benchmarks.rb
809
+
810
+
811
+ Het commando is een beetje vreemd, maar het werkt. Het benchmarks.rb bestand is gewijzigd maar weer geunstaged.
812
+
813
+ ### Een gewijzigd bestand weer ongewijzigd maken ###
814
+
815
+ Wat als je je realiseert dat je de wijzigingen aan het `benchmarks.rb` bestand niet wilt behouden? Hoe kun je dit makkelijk ongedaan maken; terugbrengen in de staat waarin het was toen je voor het laatst gecommit hebt (of initieel gecloned, of hoe je het ook in je werkdirectory gekregen hebt)? Gelukkig vertelt `git status` je ook hoe je dat moet doen. In de laatste voorbeeld-output, ziet het unstaged gebied er zo uit:
816
+
817
+ Changes not staged for commit:
818
+ (use "git add <file>..." to update what will be committed)
819
+ (use "git checkout -- <file>..." to discard changes in working directory)
820
+
821
+ modified: benchmarks.rb
822
+
823
+
824
+ Het vertelt je behoorlijk expliciet hoe je je veranderingen moet weggooien (tenminste, de nieuwere versies van Git, 1.6.1 of nieuwer, doen dit. Als je een oudere versie hebt, raden we je ten zeerste aan om het te upgraden zodat je een aantal van deze fijne bruikbaarheidsopties krijgt). Laten we eens doen wat er staat:
825
+
826
+ $ git checkout -- benchmarks.rb
827
+ $ git status
828
+ On branch master
829
+ Changes to be committed:
830
+ (use "git reset HEAD <file>..." to unstage)
831
+
832
+ modified: README.txt
833
+
834
+
835
+ Je kunt zien dat de veranderingen teruggedraaid zijn. Je moet je ook beseffen dat dit een gevaarlijk commando is: alle veranderingen die je aan dat bestand gedaan hebt zijn weg; je hebt er zojuist een ander bestand overheen gezet. Gebruik dit commando dan ook nooit, tenzij je heel zeker weet dat je het bestand niet wilt. Als je het alleen maar uit de weg wilt hebben, gebruik dan branching of stashing wat we behandelen in het volgende hoofdstuk; dit zijn vaak de betere opties.
836
+
837
+ Onthoud, alles dat in Git gecommit is kan bijna altijd weer hersteld worden. Zelfs commits die op reeds verwijderde branches gedaan zijn, of commits die zijn overschreven door een `--amend` commit, kunnen weer hersteld worden (zie *Hoofdstuk 9* voor data herstel). Maar, alles wat je verliest dat nog nooit was gecommit is waarschijnlijk voor altijd verloren.
838
+
839
+ ## Werken met remotes ##
840
+
841
+ Om samen te kunnen werken op eender welke Git project, moet je weten hoe je de remote repositories moet beheren. Remote repositories zijn versies van je project, die worden beheerd op het Internet of ergens op een netwerk. Je kunt er meerdere hebben, waarvan over het algemeen ieder ofwel alleen leesbaar, of lees- en schrijfbaar is voor jou. Samenwerken met anderen houdt in dat je deze remote repositories kunt beheren en data kunt pushen en pullen op het moment dat je werk moet delen.
842
+ Remote repositories beheren houdt ook in weten hoe je ze moet toevoegen, ongeldige repositories moet verwijderen, meerdere remote branches moet beheren en ze als tracked of niet kunt definiëren, en meer. In deze sectie zullen we deze remote-beheer vaardigheden behandelen.
843
+
844
+ ### Laat je remotes zien ###
845
+
846
+ Om te zien welke remote servers je geconfigureerd hebt, kun je het `git remote` commando uitvoeren. Het laat de verkorte namen van iedere remote alias zien die je gespecificeerd hebt. Als je de repository gecloned hebt, dan zul je op z'n minst de *origin* zien; dat is de standaard naam die Git aan de server geeft waarvan je gecloned hebt:
847
+
848
+ $ git clone git://github.com/schacon/ticgit.git
849
+ Cloning into 'ticgit'...
850
+ remote: Reusing existing pack: 1857, done.
851
+ remote: Total 1857 (delta 0), reused 0 (delta 0)
852
+ Receiving objects: 100% (1857/1857), 374.35 KiB | 193.00 KiB/s, done.
853
+ Resolving deltas: 100% (772/772), done.
854
+ Checking connectivity... done.
855
+ $ cd ticgit
856
+ $ git remote
857
+ origin
858
+
859
+ Je kunt ook `-v` specificeren, wat je de URL laat zien die Git bij de verkorte naam heeft opgeslagen om naar geëxpandeerd te worden:
860
+
861
+ $ git remote -v
862
+ origin git://github.com/schacon/ticgit.git (fetch)
863
+ origin git://github.com/schacon/ticgit.git (push)
864
+
865
+ Als je meer dan één remote hebt, dan laat het commando ze allemaal zien. Bijvoorbeeld, mijn Grit repository ziet er ongeveer zo uit.
866
+
867
+ $ cd grit
868
+ $ git remote -v
869
+ bakkdoor git://github.com/bakkdoor/grit.git
870
+ cho45 git://github.com/cho45/grit.git
871
+ defunkt git://github.com/defunkt/grit.git
872
+ koke git://github.com/koke/grit.git
873
+ origin git@github.com:mojombo/grit.git
874
+
875
+ Dit betekent dat we vrij gemakkelijk de bijdragen van ieder van deze gebruikers naar binnen kunnen pullen. Maar merk ook op dat alleen de origin een SSH URL is, dus dat is de enige waar ik naartoe kan pushen (we laten in *Hoofdstuk 4* zien waarom dat zo is).
876
+
877
+ ### Remote repositories toevoegen ###
878
+
879
+ Ik heb het toevoegen van remote repositories al genoemd en getoond in vorige paragrafen, maar hier toon ik expliciet hoe dat gedaan wordt. Om een nieuw Git remote repository als een makkelijk te refereren alias toe te voegen, voer je `git remote add [verkorte naam] [url]` uit:
880
+
881
+ $ git remote
882
+ origin
883
+ $ git remote add pb git://github.com/paulboone/ticgit.git
884
+ $ git remote -v
885
+ origin git://github.com/schacon/ticgit.git
886
+ pb git://github.com/paulboone/ticgit.git
887
+
888
+ Nu kun je de naam pb op de commandoregel gebruiken in plaats van de hele URL. Bijvoorbeeld, als je alle informatie die Paul wel, maar jij niet in je repository hebt wilt fetchen, dan kun je git fetch pb uitvoeren:
889
+
890
+ $ git fetch pb
891
+ remote: Counting objects: 58, done.
892
+ remote: Compressing objects: 100% (41/41), done.
893
+ remote: Total 44 (delta 24), reused 1 (delta 0)
894
+ Unpacking objects: 100% (44/44), done.
895
+ From git://github.com/paulboone/ticgit
896
+ * [new branch] master -> pb/master
897
+ * [new branch] ticgit -> pb/ticgit
898
+
899
+ De master branch van Paul is lokaal toegankelijk als `pb/master`; je kunt het in een van jouw branches mergen, of je kunt een lokale branch uitchecken op dat punt als je het wil zien.
900
+
901
+ ### Van je remotes fetchen en pullen ###
902
+
903
+ Zoals je zojuist gezien hebt, kun je om data van je remote projecten te halen dit uitvoeren:
904
+
905
+ $ git fetch [remote-name]
906
+
907
+ Het commando gaat naar het remote project en haalt alle data van dat remote project dat jij nog niet hebt. Nadat je dit gedaan hebt, zou je references (referenties) naar alle branches van dat remote project moeten hebben, die je op ieder tijdstip kunt mergen en bekijken. (We zullen in meer detail zien wat branches precies zijn, en hoe je ze moet gebruiken in *Hoofdstuk 3*.)
908
+
909
+ Als je een repository clonet, voegt dat commando die remote repository automatisch toe onder de naam *origin*. Dus `git fetch origin` fetcht (haalt) ieder nieuw werk dat gepusht is naar die server sinds je gecloned hebt (of voor het laatst gefetcht hebt). Het is belangrijk om te weten dat het fetch commando de data naar je locale repository haalt; het merget niet automatisch met je werk of verandert waar je momenteel aan zit te werken. Je moet het handmatig in je werk mergen wanneer je er klaar voor bent.
910
+
911
+ Als je een branch geconfigureerd hebt om een remote branch te volgen (tracken) (zie de volgende paragraaf en *Hoofdstuk 3* voor meer informatie), dan kun je het `git pull` commando gebruiken om automatisch een remote branch te fetchen en mergen in je huidige branch. Dit kan makkelijker of meer comfortabele workflow zijn voor je; en standaard stelt het `git clone` commando je lokale master branch zo in dat het de remote master branch van de server waarvan je gecloned hebt volgt (aangenomen dat de remote een master branch heeft). Over het algemeen zal een `git pull` dat van de server waarvan je origineel gecloned hebt halen en proberen het automatisch in de code waar je op dat moment aan zit te werken te mergen.
912
+
913
+ ### Naar je remotes pushen ###
914
+
915
+ Wanneer je jouw project op een punt hebt dat je het wilt delen, dan moet je het stroomopwaarts pushen. Het commando hiervoor is simpel: `git push [remote-name] [branch-name]`. Als je de master branch naar je `origin` server wilt pushen (nogmaals, over het algemeen zet clonen beide namen automatisch goed voor je), dan kun je dit uitvoeren om je werk terug op de server te pushen:
916
+
917
+ $ git push origin master
918
+
919
+ Dit commando werkt alleen als je gecloned hebt van een server waarop je schrijfrechten hebt, en als niemand in de tussentijd gepusht heeft. Als jij en iemand anders op hetzelfde tijdstip gecloned hebben en zij pushen eerder stroomopwaarts dan jij, dan zal je push terecht geweigerd worden. Je zult eerst hun werk moeten pullen en in jouw werk verwerken voordat je toegestaan wordt te pushen. Zie *Hoofdstuk 3* voor meer gedetailleerde informatie over hoe je naar remote servers moet pushen.
920
+
921
+ ### Een remote inspecteren ###
922
+
923
+ Als je meer informatie over een bepaalde remote wilt zien, kun je het `git remote show [remote-name]` commando gebruiken. Als je dit commando met een bepaalde alias uitvoert, zoals `origin`, dan krijg je zoiets als dit:
924
+
925
+ $ git remote show origin
926
+ * remote origin
927
+ URL: git://github.com/schacon/ticgit.git
928
+ Remote branch merged with 'git pull' while on branch master
929
+ master
930
+ Tracked remote branches
931
+ master
932
+ ticgit
933
+
934
+ Het toont de URL voor de remote repository samen met de tracking branch informatie. Het commando vertelt je behulpzaam dat als je op de master branch zit en je voert `git pull` uit, dat Git dan automatisch de master branch van de remote zal mergen nadat het alle remote references opgehaald heeft. Het toont ook alle remote referenties die het gepulled heeft.
935
+
936
+ Dat is een eenvoudig voorbeeld dat je vaak zult tegenkomen. Als je Git echter intensiever gebruikt, zul je veel meer informatie van `git remote show` krijgen:
937
+
938
+ $ git remote show origin
939
+ * remote origin
940
+ URL: git@github.com:defunkt/github.git
941
+ Remote branch merged with 'git pull' while on branch issues
942
+ issues
943
+ Remote branch merged with 'git pull' while on branch master
944
+ master
945
+ New remote branches (next fetch will store in remotes/origin)
946
+ caching
947
+ Stale tracking branches (use 'git remote prune')
948
+ libwalker
949
+ walker2
950
+ Tracked remote branches
951
+ acl
952
+ apiv2
953
+ dashboard2
954
+ issues
955
+ master
956
+ postgres
957
+ Local branch pushed with 'git push'
958
+ master:master
959
+
960
+ Dit commando toont welke branch automatisch gepusht wordt als je `git push` uitvoert op bepaalde branches. Het toont je ook welke remote branches op de server je nog niet hebt, welke remote branches je hebt die verwijderd zijn van de server, en meerdere branches die automatisch gemerged worden als je `git pull` uitvoert.
961
+
962
+ ### Remotes verwijderen en hernoemen ###
963
+
964
+ Als je een referentie wilt hernoemen, dan kun je in nieuwere versie van Git `git remote rename` uitvoeren om een alias van een remote te wijzigen. Bijvoorbeeld, als je `pb` wilt hernoemen naar `paul`, dan kun je dat doen met `git remote rename`:
965
+
966
+ $ git remote rename pb paul
967
+ $ git remote
968
+ origin
969
+ paul
970
+
971
+ Het is de moeite waard om te melden dat dit ook je remote branch naam verandert. Wat voorheen gerefereerd werd als `pb/master` is nu `paul/master`.
972
+
973
+ Als je om een of andere reden een referentie wilt verwijderen, je hebt de server verplaatst of je gebruikt een bepaalde mirror niet meer, of een medewerker doet niet meer mee, dan kun je `git remote rm` gebruiken:
974
+
975
+ $ git remote rm paul
976
+ $ git remote
977
+ origin
978
+
979
+ ## Taggen (Labelen) ##
980
+
981
+ Zoals de meeste VCS'en, heeft git de mogelijkheid om specifieke punten in de history als belangrijk te taggen (labelen). Over het algemeen gebruiken mensen deze functionaliteit om versie-punten te markeren (`v1.0`, en zo). In deze paragraaf zul je leren hoe de beschikbare tags te tonen, hoe nieuwe tags te creëren, en wat de verschillende typen tags zijn.
982
+
983
+ ### Jouw tags laten zien ###
984
+
985
+ De beschikbare tags in Git laten zien is rechttoe rechtaan. Type gewoon `git tag`:
986
+
987
+ $ git tag
988
+ v0.1
989
+ v1.3
990
+
991
+ Dit commando toont de tags in alfabetische volgorde; de volgorde waarin ze verschijnen heeft geen echte betekenis.
992
+
993
+ Je kunt ook zoeken op tags met een bepaald patroon. De Git bron-repository, bijvoorbeeld, bevat meer dan 240 tags. Als je alleen geïnteresseerd bent om naar de 1.4.2 serie te kijken, kun je dit uitvoeren:
994
+
995
+ $ git tag -l 'v1.4.2.*'
996
+ v1.4.2.1
997
+ v1.4.2.2
998
+ v1.4.2.3
999
+ v1.4.2.4
1000
+
1001
+ ### Tags creëren ###
1002
+
1003
+ Git gebruikt twee soorten tags: lightweight (lichtgewicht) en annotated (beschreven). Een lightweight tag komt overeen met een branch die niet verandert: het is slechts een wijzer naar een specifieke commit. Annotated tags daarentegen, zijn als volwaardige objecten in de Git database opgeslagen. Ze worden gechecksummed, bevatten de naam van de tagger, e-mail en datum, hebben een tag boodschap, en kunnen gesigneerd en geverifieerd worden met GNU Privacy Guard (GPG). Het wordt over het algemeen aangeraden om annotated tags te maken zodat je deze informatie hebt; maar als je een tijdelijke tag wilt of om een of andere reden de andere informatie niet wilt houden, dan zijn er ook lichtgewicht tags.
1004
+
1005
+ ### Annotated tags ###
1006
+
1007
+ Een annotated tag in Git maken is eenvoudig. Het makkelijkst is om de `-a` optie te specificeren als je het `tag` commando uitvoert:
1008
+
1009
+ $ git tag -a v1.4 -m 'my version 1.4'
1010
+ $ git tag
1011
+ v0.1
1012
+ v1.3
1013
+ v1.4
1014
+
1015
+ De `-m` specificeert een tag boodschap, die bij de tag opgeslagen wordt. Als je geen boodschap voor een beschreven tag opgeeft, dan opent Git je editor zodat je hem in kunt typen.
1016
+
1017
+ Je kunt de tag data zien, samen met de commit die getagged was, door het `git show` commando te gebruiken:
1018
+
1019
+ $ git show v1.4
1020
+ tag v1.4
1021
+ Tagger: Scott Chacon <schacon@gee-mail.com>
1022
+ Date: Mon Feb 9 14:45:11 2009 -0800
1023
+
1024
+ my version 1.4
1025
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
1026
+ Merge: 4a447f7... a6b4c97...
1027
+ Author: Scott Chacon <schacon@gee-mail.com>
1028
+ Date: Sun Feb 8 19:02:46 2009 -0800
1029
+
1030
+ Merge branch 'experiment'
1031
+
1032
+ Dat toont de tagger informatie, de datum waarop de commit getagged was, en de beschrijvende boodschap alvorens de commit boodschap te laten zien.
1033
+
1034
+ ### Ondertekende tags ###
1035
+
1036
+ Je kunt je tags ook ondertekenen met GPG, aangenomen dat je een privésleutel hebt. Het enige dat je moet doen is de `-s` optie gebruiken in plaats van de `-a`:
1037
+
1038
+ $ git tag -s v1.5 -m 'my signed 1.5 tag'
1039
+ You need a passphrase to unlock the secret key for
1040
+ user: "Scott Chacon <schacon@gee-mail.com>"
1041
+ 1024-bit DSA key, ID F721C45A, created 2009-02-09
1042
+
1043
+ Als je `git show` op die tag uitvoert, dan kun je jouw GPG handtekening eraan vast zien zitten:
1044
+
1045
+ $ git show v1.5
1046
+ tag v1.5
1047
+ Tagger: Scott Chacon <schacon@gee-mail.com>
1048
+ Date: Mon Feb 9 15:22:20 2009 -0800
1049
+
1050
+ my signed 1.5 tag
1051
+ -----BEGIN PGP SIGNATURE-----
1052
+ Version: GnuPG v1.4.8 (Darwin)
1053
+
1054
+ iEYEABECAAYFAkmQurIACgkQON3DxfchxFr5cACeIMN+ZxLKggJQf0QYiQBwgySN
1055
+ Ki0An2JeAVUCAiJ7Ox6ZEtK+NvZAj82/
1056
+ =WryJ
1057
+ -----END PGP SIGNATURE-----
1058
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
1059
+ Merge: 4a447f7... a6b4c97...
1060
+ Author: Scott Chacon <schacon@gee-mail.com>
1061
+ Date: Sun Feb 8 19:02:46 2009 -0800
1062
+
1063
+ Merge branch 'experiment'
1064
+
1065
+ Verderop zul je leren hoe je ondertekende tags kunt verifiëren.
1066
+
1067
+ ### Lightweight tags ###
1068
+
1069
+ Een andere manier om een tag te committen is met behulp van een lightweight tag. Dit is in principe de commit checksum in een bestand opgeslagen; er wordt geen andere informatie bijgehouden. Om een lightweight tag te maken voeg je niet de `-a`, `-s` noch de `-m` optie toe:
1070
+
1071
+ $ git tag v1.4-lw
1072
+ $ git tag
1073
+ v0.1
1074
+ v1.3
1075
+ v1.4
1076
+ v1.4-lw
1077
+ v1.5
1078
+
1079
+ Als je deze keer `git show` op de tag doet, zie je niet de extra tag informatie. Het commando toont alleen de commit:
1080
+
1081
+ $ git show v1.4-lw
1082
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
1083
+ Merge: 4a447f7... a6b4c97...
1084
+ Author: Scott Chacon <schacon@gee-mail.com>
1085
+ Date: Sun Feb 8 19:02:46 2009 -0800
1086
+
1087
+ Merge branch 'experiment'
1088
+
1089
+ ### Tags verifiëren ###
1090
+
1091
+ Om een ondertekende tag te verifiëren, gebruik je `git tag -v [tag-naam]`. Dit commando gebruikt GPG om de handtekening te verifiëren. Je moet de publieke sleutel van degene die getekend heeft wel in je sleutelbos hebben staan om het goed te laten werken:
1092
+
1093
+ $ git tag -v v1.4.2.1
1094
+ object 883653babd8ee7ea23e6a5c392bb739348b1eb61
1095
+ type commit
1096
+ tag v1.4.2.1
1097
+ tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700
1098
+
1099
+ GIT 1.4.2.1
1100
+
1101
+ Minor fixes since 1.4.2, including git-mv and git-http with alternates.
1102
+ gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
1103
+ gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
1104
+ gpg: aka "[jpeg image of size 1513]"
1105
+ Primary key fingerprint: 3565 2A26 2040 E066 C9A7 4A7D C0C6 D9A4 F311 9B9A
1106
+
1107
+ Als je de publieke sleutel van degene die getekend heeft niet hebt, dan krijg je in plaats daarvan zoiets:
1108
+
1109
+ gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
1110
+ gpg: Can't check signature: public key not found
1111
+ error: could not verify the tag 'v1.4.2.1'
1112
+
1113
+ ### Later taggen ###
1114
+
1115
+ Je kunt ook commits taggen waar je al voorbij bent. Stel dat je commit historie er zo uitziet:
1116
+
1117
+ $ git log --pretty=oneline
1118
+ 15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
1119
+ a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
1120
+ 0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
1121
+ 6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
1122
+ 0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
1123
+ 4682c3261057305bdd616e23b64b0857d832627b added a todo file
1124
+ 166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
1125
+ 9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
1126
+ 964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
1127
+ 8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
1128
+
1129
+ Stel nu dat je vergeten bent het project op v1.2 te taggen, daar waar de "updated rakefile" commit was. Je kunt dit nadien toevoegen. Om die commit te taggen, specificeer je de commit boodschap (of een gedeelte daarvan) aan het einde van het commando:
1130
+
1131
+ $ git tag -a v1.2 9fceb02
1132
+
1133
+ Je kunt zien dat je de commit getagged hebt:
1134
+
1135
+ $ git tag
1136
+ v0.1
1137
+ v1.2
1138
+ v1.3
1139
+ v1.4
1140
+ v1.4-lw
1141
+ v1.5
1142
+
1143
+ $ git show v1.2
1144
+ tag v1.2
1145
+ Tagger: Scott Chacon <schacon@gee-mail.com>
1146
+ Date: Mon Feb 9 15:32:16 2009 -0800
1147
+
1148
+ version 1.2
1149
+ commit 9fceb02d0ae598e95dc970b74767f19372d61af8
1150
+ Author: Magnus Chacon <mchacon@gee-mail.com>
1151
+ Date: Sun Apr 27 20:43:35 2008 -0700
1152
+
1153
+ updated rakefile
1154
+ ...
1155
+
1156
+ ### Tags delen ###
1157
+
1158
+ Standaard zal het `git push` commando geen tags naar remote servers versturen. Je zult expliciet tags naar een gedeelde server moeten pushen, nadat je ze gemaakt hebt. Dit proces is hetzelfde als remote branches delen — je kunt `git push origin [tagnaam]` uitvoeren.
1159
+
1160
+ $ git push origin v1.5
1161
+ Counting objects: 50, done.
1162
+ Compressing objects: 100% (38/38), done.
1163
+ Writing objects: 100% (44/44), 4.56 KiB, done.
1164
+ Total 44 (delta 18), reused 8 (delta 1)
1165
+ To git@github.com:schacon/simplegit.git
1166
+ * [new tag] v1.5 -> v1.5
1167
+
1168
+ Als je veel tags hebt die je ineens wilt pushen, kun je ook de `--tags` optie aan het `git push` commando toevoegen. Dit zal al je tags, die nog niet op de remote server zijn, in één keer er naartoe sturen.
1169
+
1170
+ $ git push origin --tags
1171
+ Counting objects: 50, done.
1172
+ Compressing objects: 100% (38/38), done.
1173
+ Writing objects: 100% (44/44), 4.56 KiB, done.
1174
+ Total 44 (delta 18), reused 8 (delta 1)
1175
+ To git@github.com:schacon/simplegit.git
1176
+ * [new tag] v0.1 -> v0.1
1177
+ * [new tag] v1.2 -> v1.2
1178
+ * [new tag] v1.4 -> v1.4
1179
+ * [new tag] v1.4-lw -> v1.4-lw
1180
+ * [new tag] v1.5 -> v1.5
1181
+
1182
+ Als nu iemand anders van jouw repository clonet of pullt, dan zullen zij al jouw tags ook krijgen.
1183
+
1184
+ ## Tips en trucs ##
1185
+
1186
+ Voordat we dit hoofdstuk over de basis van Git afsluiten laten we je nog wat kleine tips en trucs zien die je Git ervaring een beetje eenvoudiger, makkelijker of bekender maken. Veel mensen gebruiken Git zonder deze tips, en we refereren er niet meer aan of gaan er niet vanuit dat je ze gebruikt verderop in dit boek; maar je zult waarschijnlijk willen weten hoe je ze moet doen.
1187
+
1188
+ ### Auto-aanvulling ###
1189
+
1190
+ Als je de Bash shell gebruikt, heeft Git een prettige auto-aanvulling script dat je aan kunt zetten. Download het direct van de Git broncode op https://github.com/git/git/blob/master/contrib/completion/git-completion.bash. Kopieer dit bestand naar je home directory, en voeg dit aan je `.bashrc` bestand toe:
1191
+
1192
+ source ~/.git-completion.bash
1193
+
1194
+ Als je Git wilt instellen dat het automatische Bash shell aanvulling heeft voor alle gebruikers, kopieer dit script dan naar de `/opt/local/etc/bash_completion.d` directory op Mac systemen, of naar de `/etc/bash_completion.d/` directory op Linux systemen. Dit is een directory met scripts dat Bash automatisch zal laden om shell aanvullingen aan te bieden.
1195
+
1196
+ Als je Windows gebruikt met Git Bash, wat de standaard is als je Git op Windows installeert met msysGit, dan zou auto-aanvulling voorgeconfigureerd moeten zijn.
1197
+
1198
+ Druk de Tab toets als je een Git commando aan het typen bent, en het zou een lijstje suggesties voor je moeten teruggeven:
1199
+
1200
+ $ git co<tab><tab>
1201
+ commit config
1202
+
1203
+ In dit geval zal `git co` en dan de Tab toets twee keer indrukken git commit en config voorstellen. Als je daarna `m<tab>` toevoegt, wordt het automatisch tot `git commit` gecompleteerd.
1204
+
1205
+ Dit werkt ook met opties, wat nog bruikbaarder is. Bijvoorbeeld, als je een `git log` commando uitvoert en je een van de opties niet meer kunt herinneren, dan kun je beginnen met het te typen en Tab indrukken om te zien wat er past:
1206
+
1207
+ $ git log --s<tab>
1208
+ --shortstat --since= --src-prefix= --stat --summary
1209
+
1210
+ Dat is een erg handig trucje en zal je misschien wat tijd en documentatie lezen besparen.
1211
+
1212
+ ### Git aliassen ###
1213
+
1214
+ Git zal geen commando's afleiden uit wat je gedeeltelijk intypt. Als je niet de hele tekst van ieder Git commando wilt intypen, kun je gemakkelijk een alias voor ieder commando configureren door `git config` te gebruiken. Hier zijn een aantal voorbeelden die je misschien wilt instellen:
1215
+
1216
+ $ git config --global alias.co checkout
1217
+ $ git config --global alias.br branch
1218
+ $ git config --global alias.ci commit
1219
+ $ git config --global alias.st status
1220
+
1221
+ Dit betekent dat je, bijvoorbeeld, in plaats van `git commit` je alleen `git ci` hoeft in te typen. Als je verder gaat met Git, zul je waarschijnlijk andere commando's ook vaker gaan gebruiken; in dat geval: schroom niet om nieuwe aliassen te maken.
1222
+
1223
+ Deze techniek kan ook makkelijk zijn om commando's te maken waarvan je vindt dat ze zouden moeten bestaan. Bijvoorbeeld, om het bruikbaarheidsprobleem wat je met het unstagen van een bestand tegenkwam op te lossen, kun je jouw eigen unstage alias aan Git toevoegen:
1224
+
1225
+ $ git config --global alias.unstage 'reset HEAD --'
1226
+
1227
+ Dit maakt de volgende twee commando's equivalent:
1228
+
1229
+ $ git unstage fileA
1230
+ $ git reset HEAD fileA
1231
+
1232
+ Het lijkt wat duidelijker. Het is ook gebruikelijk om een `last` commando toe te voegen:
1233
+
1234
+ $ git config --global alias.last 'log -1 HEAD'
1235
+
1236
+ Op deze manier kun je de laatste commit makkelijk zien:
1237
+
1238
+ $ git last
1239
+ commit 66938dae3329c7aebe598c2246a8e6af90d04646
1240
+ Author: Josh Goebel <dreamer3@example.com>
1241
+ Date: Tue Aug 26 19:48:51 2008 +0800
1242
+
1243
+ test for current head
1244
+
1245
+ Signed-off-by: Scott Chacon <schacon@example.com>
1246
+
1247
+ Zoals je kunt zien, vervangt Git eenvoudigweg het nieuwe commando met hetgeen waarvoor je het gealiassed hebt. Maar, misschien wil je een extern commando uitvoeren, in plaats van een Git subcommando. In dat geval begin je het commando met een `!` karakter. Dit is handig als je je eigen applicaties maakt die met een Git repository werken. We kunnen dit demonstreren door `git visual` een `gitk` te laten uitvoeren:
1248
+
1249
+ $ git config --global alias.visual '!gitk'
1250
+
1251
+ ## Samenvatting ##
1252
+
1253
+ Op dit punt kun je alle basis locale Git operaties doen: een repository creëren of clonen, wijzigingen maken, de wijzigingen stagen en committen en de historie bekijken van alle veranderingen die de repository ondergaan heeft. Als volgende gaan we de beste eigenschap van Git bekijken: het branching model.