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,1378 @@
1
+ # Les bases de Git #
2
+
3
+ Si vous ne deviez lire qu'un chapitre avant de commencer à utiliser Git, c'est celui-ci.
4
+ Ce chapitre couvre les commandes de base nécessaires pour réaliser la vaste majorité des activités avec Git.
5
+ À la fin de ce chapitre, vous devriez être capable de configurer et initialiser un dépôt, commencer et arrêter le suivi de version de fichiers, d'indexer et valider des modifications.
6
+ Nous vous montrerons aussi comment paramétrer Git pour qu'il ignore certains fichiers ou patrons de fichiers, comment revenir sur les erreurs rapidement et facilement, comment parcourir l'historique de votre projet et voir les modifications entre deux validations, et comment pousser et tirer les modifications avec des dépôts distants.
7
+
8
+ ## Démarrer un dépôt Git ##
9
+
10
+ Vous pouvez principalement démarrer un dépôt Git de deux manières.
11
+ La première consiste à prendre un projet ou un répertoire existant et à l'importer dans Git.
12
+ La seconde consiste à cloner un dépôt Git existant sur un autre serveur.
13
+
14
+ ### Initialisation d'un dépôt Git dans un répertoire existant ###
15
+
16
+ Si vous commencez à suivre un projet existant dans Git, vous n'avez qu'à vous positionner dans le répertoire du projet et saisir :
17
+
18
+ $ git init
19
+
20
+ Cela crée un nouveau sous-répertoire nommé `.git` qui contient tous les fichiers nécessaires au dépôt — un squelette de dépôt Git.
21
+ Pour l'instant, aucun fichier n'est encore versionné.
22
+ (Cf. chapitre 9 pour plus d'information sur les fichiers contenus dans le répertoire `.git` que vous venez de créer.)
23
+
24
+
25
+ Si vous souhaitez commencer à suivre les versions des fichiers existants (contrairement à un répertoire vide), vous devriez probablement commencer par indexer ces fichiers et faire une validation initiale.
26
+ Vous pouvez réaliser ceci avec une poignée de commandes `git add` qui spécifient les fichiers que vous souhaitez suivre, suivie d'une validation :
27
+
28
+ $ git add *.c
29
+ $ git add README
30
+ $ git commit –m 'version initiale du projet'
31
+
32
+ Nous allons passer en revue ce que ces commandes font dans une petite minute.
33
+ Pour l'instant, vous avez un dépôt Git avec des fichiers sous gestion de version et une validation initiale.
34
+
35
+ ### Cloner un dépôt existant ###
36
+
37
+ Si vous souhaitez obtenir une copie d'un dépôt Git existant — par exemple, un projet auquel vous aimeriez contribuer — la commande dont vous avez besoin s'appelle `git clone`.
38
+ Si vous êtes familier avec d'autres systèmes de gestion de version tels que Subversion, vous noterez que la commande est `clone` et non `checkout`.
39
+ C'est une distinction importante — Git reçoit une copie de quasiment toutes les données dont le serveur dispose.
40
+ Toutes les versions de tous les fichiers pour l'historique du projet sont téléchargées quand vous lancez `git clone`.
41
+ En fait, si le disque du serveur se corrompt, vous pouvez utiliser n'importe quel clone pour remettre le serveur dans l'état où il était au moment du clonage (vous pourriez perdre quelques paramètres du serveur, mais toutes les données sous gestion de version seraient récupérées — cf. chapitre 4 pour de plus amples détails).
42
+
43
+ Vous clonez un dépôt avec `git clone [url]`.
44
+ Par exemple, si vous voulez cloner la bibliothèque Git Ruby appelée Grit, vous pouvez le faire de la manière suivante :
45
+
46
+ $ git clone git://github.com/schacon/grit.git
47
+
48
+ Ceci crée un répertoire nommé `grit`, initialise un répertoire `.git` à l'intérieur, récupère toutes les données de ce dépôt, et extrait une copie de travail de la dernière version.
49
+ Si vous examinez le nouveau répertoire `grit`, vous y verrez les fichiers du projet, prêts à être modifiés ou utilisés.
50
+ Si vous souhaitez cloner le dépôt dans un répertoire nommé différemment, vous pouvez spécifier le nom dans une option supplémentaire de la ligne de commande :
51
+
52
+ $ git clone git://github.com/schacon/grit.git mongrit
53
+
54
+ Cette commande réalise la même chose que la précédente, mais le répertoire cible s'appelle `mongrit`.
55
+
56
+ Git dispose de différents protocoles de transfert que vous pouvez utiliser.
57
+ L'exemple précédent utilise le protocole `git://`, mais vous pouvez aussi voir `http(s)://` ou `utilisateur@serveur:/chemin.git`, qui utilise le protocole de transfert SSH.
58
+ Le chapitre 4 introduit toutes les options disponibles pour mettre en place un serveur Git, ainsi que leurs avantages et inconvénients.
59
+
60
+ ## Enregistrer des modifications dans le dépôt ##
61
+
62
+ Vous avez à présent un dépôt Git valide et une extraction ou copie de travail du projet.
63
+ Vous devez faire quelques modifications et valider des instantanés de ces modifications dans votre dépôt chaque fois que votre projet atteint un état que vous souhaitez enregistrer.
64
+
65
+ Souvenez-vous que chaque fichier de votre copie de travail peut avoir deux états : sous suivi de version ou non suivi.
66
+ Les fichiers suivis sont les fichiers qui appartenaient déjà au dernier instantané ; ils peuvent être inchangés, modifiés ou indexés.
67
+ Tous les autres fichiers sont non suivis — tout fichier de votre copie de travail qui n'appartenait pas à votre dernier instantané et n'a pas été indexé.
68
+ Quand vous clonez un dépôt pour la première fois, tous les fichiers seront sous suivi de version et inchangés car vous venez tout juste de les enregistrer sans les avoir encore édités.
69
+
70
+ Au fur et à mesure que vous éditez des fichiers, Git les considère comme modifiés, car vous les avez modifiés depuis le dernier instantané.
71
+ Vous *indexez* ces fichiers modifiés et vous enregistrez toutes les modifications indexées, puis ce cycle se répète.
72
+ Ce cycle de vie est illustré par la figure 2-1.
73
+
74
+ Insert 18333fig0201.png
75
+ Figure 2-1. Le cycle de vie des états des fichiers.
76
+
77
+ ### Vérifier l'état des fichiers ###
78
+
79
+ L'outil principal pour déterminer quels fichiers sont dans quel état est la commande `git status`.
80
+ Si vous lancez cette commande juste après un clonage, vous devriez voir ce qui suit :
81
+
82
+ $ git status
83
+ On branch master
84
+ nothing to commit, working directory clean
85
+
86
+ Ce message signifie que votre copie de travail est propre, en d'autres mots, aucun fichier suivi n'a été modifié.
87
+ Git ne voit pas non plus de fichiers non-suivis, sinon ils seraient listés ici.
88
+ Enfin, la commande vous indique sur quelle branche vous êtes.
89
+ Pour l'instant, c'est toujours *master*, qui correspond à la valeur par défaut ; nous ne nous en soucierons pas maintenant.
90
+ Dans le chapitre suivant, nous parlerons plus en détail des branches et des références.
91
+
92
+ Supposons que vous ajoutiez un nouveau fichier à votre projet, un simple fichier `LISEZMOI`.
93
+ Si ce fichier n'existait pas auparavant, et que vous lancez la commande `git status`, vous verrez votre fichier non suivi comme ceci :
94
+
95
+ $ vim LISEZMOI
96
+ $ git status
97
+ On branch master
98
+ Untracked files:
99
+ (use "git add <file>..." to include in what will be committed)
100
+
101
+ LISEZMOI
102
+
103
+ nothing added to commit but untracked files present (use "git add" to track)
104
+
105
+ Vous pouvez constater que votre nouveau fichier `LISEZMOI` n'est pas en suivi de version, car il apparaît dans la section « Untracked files » de l'état de la copie de travail.
106
+ « Untracked » signifie simplement que Git détecte un fichier qui n'était pas présent dans le dernier instantané ; Git ne le placera sous suivi de version que quand vous lui indiquerez de le faire.
107
+ Ce comportement permet de ne pas placer accidentellement sous suivi de version des fichiers binaires générés ou d'autres fichiers que vous ne voulez pas inclure.
108
+ Mais vous voulez inclure le fichier `LISEZMOI` dans l'instantané, alors commençons à suivre ce fichier.
109
+
110
+ ### Placer de nouveaux fichiers sous suivi de version ###
111
+
112
+ Pour commencer à suivre un nouveau fichier, vous utilisez la commande `git add`.
113
+ Pour commencer à suivre le fichier `LISEZMOI`, vous pouvez entrer ceci :
114
+
115
+ $ git add LISEZMOI
116
+
117
+ Si vous lancez à nouveau la commande `git status`, vous pouvez constater que votre fichier `LISEZMOI` est maintenant suivi et indexé :
118
+
119
+ $ git status
120
+ On branch master
121
+ Changes to be committed:
122
+ (use "git reset HEAD <file>..." to unstage)
123
+
124
+ new file: LISEZMOI
125
+
126
+
127
+ Vous pouvez affirmer qu'il est indexé car il apparaît dans la section « Changes to be committed » (Modifications à valider).
128
+ Si vous enregistrez à ce moment, la version du fichier à l'instant où vous lancez `git add` est celle qui appartiendra à l'instantané.
129
+ Vous pouvez vous souvenir que lorsque vous avez précédemment lancé `git init`, vous avez ensuite lancé `git add (fichiers)` — c'était bien sûr pour commencer à placer sous suivi de version les fichiers de votre répertoire de travail.
130
+ La commande `git add` accepte en paramètre un chemin qui correspond à un fichier ou un répertoire ; dans le cas d'un répertoire, la commande ajoute récursivement tous les fichiers de ce répertoire.
131
+
132
+ ### Indexer des fichiers modifiés ###
133
+
134
+ Maintenant, modifions un fichier qui est déjà sous suivi de version.
135
+ Si vous modifiez le fichier sous suivi de version appelé `benchmarks.rb` et que vous lancez à nouveau votre commande `git status`, vous verrez ceci :
136
+
137
+ $ git status
138
+ On branch master
139
+ Changes to be committed:
140
+ (use "git reset HEAD <file>..." to unstage)
141
+
142
+ new file: LISEZMOI
143
+
144
+ Changes not staged for commit:
145
+ (use "git add <file>..." to update what will be committed)
146
+ (use "git checkout -- <file>..." to discard changes in working directory)
147
+
148
+ modified: benchmarks.rb
149
+
150
+
151
+ Le fichier `benchmarks.rb` apparaît sous la section nommée « Changes not staged for commit » ce qui signifie que le fichier sous suivi de version a été modifié dans la copie de travail mais n'est pas encore indexé.
152
+ Pour l'indexer, il faut lancer la commande `git add` (qui est une commande multi-usage — elle peut être utilisée pour placer un fichier sous suivi de version, pour indexer un fichier ou pour d'autres actions telles que marquer comme résolus des conflits de fusion de fichiers).
153
+ Lançons maintenant `git add` pour indexer le fichier `benchmarks.rb`, et relançons la commande `git status` :
154
+
155
+ $ git add benchmarks.rb
156
+ $ git status
157
+ On branch master
158
+ Changes to be committed:
159
+ (use "git reset HEAD <file>..." to unstage)
160
+
161
+ new file: LISEZMOI
162
+ modified: benchmarks.rb
163
+
164
+
165
+ À présent, les deux fichiers sont indexés et feront partie de la prochaine validation.
166
+ Mais supposons que vous souhaitiez apporter encore une petite modification au fichier `benchmarks.rb` avant de réellement valider la nouvelle version.
167
+ Vous l'ouvrez à nouveau, réalisez la petite modification et vous voilà prêt à valider.
168
+ Néanmoins, vous lancez `git status` une dernière fois :
169
+
170
+ $ vim benchmarks.rb
171
+ $ git status
172
+ On branch master
173
+ Changes to be committed:
174
+ (use "git reset HEAD <file>..." to unstage)
175
+
176
+ new file: LISEZMOI
177
+ modified: benchmarks.rb
178
+
179
+ Changes not staged for commit:
180
+ (use "git add <file>..." to update what will be committed)
181
+ (use "git checkout -- <file>..." to discard changes in working directory)
182
+
183
+ modified: benchmarks.rb
184
+
185
+
186
+ Que s'est-il donc passé ? À présent, `benchmarks.rb` apparaît à la fois comme indexé et non indexé.
187
+ En fait, Git indexe un fichier dans son état au moment où la commande `git add` est lancée.
188
+ Si on valide les modifications maintenant, la version de `benchmarks.rb` qui fera partie de l'instantané est celle correspondant au moment où la commande `git add benchmarks.rb` a été lancée, et non la version actuellement présente dans la copie de travail au moment où la commande `git commit` est lancée.
189
+ Si le fichier est modifié après un `git add`, il faut relancer `git add` pour prendre en compte l'état actuel de la copie de travail :
190
+
191
+ $ git add benchmarks.rb
192
+ $ git status
193
+ On branch master
194
+ Changes to be committed:
195
+ (use "git reset HEAD <file>..." to unstage)
196
+
197
+ new file: LISEZMOI
198
+ modified: benchmarks.rb
199
+
200
+
201
+ ### Ignorer des fichiers ###
202
+
203
+ Il apparaît souvent qu'un type de fichiers présent dans la copie de travail ne doit pas être ajouté automatiquement ou même ne doit pas apparaître comme fichier potentiel pour le suivi de version.
204
+ Ce sont par exemple des fichiers générés automatiquement tels que les fichiers de journaux ou de sauvegardes produits par l'outil que vous utilisez.
205
+ Dans un tel cas, on peut énumérer les patrons de noms de fichiers à ignorer dans un fichier `.gitignore`.
206
+ Voici ci-dessous un exemple de fichier `.gitignore` :
207
+
208
+ $ cat .gitignore
209
+ *.[oa]
210
+ *~
211
+
212
+ La première ligne ordonne à Git d'ignorer tout fichier se terminant en `.o` ou `.a` — des fichiers objet ou archive qui sont généralement produits par la compilation d'un programme.
213
+ La seconde ligne indique à Git d'ignorer tous les fichiers se terminant par un tilde (`~`), ce qui est le cas des noms des fichiers temporaires pour de nombreux éditeurs de texte tels qu'Emacs.
214
+ On peut aussi inclure un répertoire `log`, `tmp` ou `pid`, ou le répertoire de documentation générée automatiquement, ou tout autre fichier.
215
+ Renseigner un fichier `.gitignore` avant de commencer à travailler est généralement une bonne idée qui évitera de valider par inadvertance des fichiers qui ne doivent pas apparaître dans le dépôt Git.
216
+
217
+ Les règles de construction des patrons à placer dans le fichier `.gitignore` sont les suivantes :
218
+
219
+ * les lignes vides ou commençant par `#` sont ignorées ;
220
+ * les patrons standards de fichiers sont utilisables ;
221
+ * si le patron se termine par une barre oblique (`/`), il indique un répertoire ;
222
+ * un patron commençant par un point d'exclamation (`!`) indique des fichiers à inclure malgré les autres règles.
223
+
224
+ Les patrons standards de fichiers sont des expressions régulières simplifiées utilisées par les shells.
225
+ Un astérisque (`*`) correspond à un ou plusieurs caractères ; `[abc]` correspond à un des trois caractères listés dans les crochets, donc a ou b ou c ; un point d'interrogation (`?`) correspond à un unique caractère ; des crochets entourant des caractères séparés par un signe moins (`[0-9]`) correspond à un caractère dans l'intervalle des deux caractères indiqués, donc ici de 0 à 9.
226
+
227
+ Voici un autre exemple de fichier `.gitignore` :
228
+
229
+ # un commentaire, cette ligne est ignorée
230
+ # pas de fichier .a
231
+ *.a
232
+ # mais suivre lib.a malgré la règle précédente
233
+ !lib.a
234
+ # ignorer uniquement le fichier TODO à la racine du projet
235
+ /TODO
236
+ # ignorer tous les fichiers dans le répertoire build
237
+ build/
238
+ # ignorer doc/notes.txt, mais pas doc/server/arch.txt
239
+ doc/*.txt
240
+ # ignorer tous les fichiers .txt sous le répertoire doc/
241
+ doc/**/*.txt
242
+
243
+ Le patron `**/` est disponible dans Git depuis la version 1.8.2.
244
+
245
+ ### Inspecter les modifications indexées et non indexées ###
246
+
247
+ Si le résultat de la commande `git status` est encore trop vague — lorsqu'on désire savoir non seulement quels fichiers ont changé mais aussi ce qui a changé dans ces fichiers — on peut utiliser la commande `git diff`.
248
+ Cette commande sera traitée en détail plus loin ; mais elle sera vraisemblablement utilisée le plus souvent pour répondre aux questions suivantes : qu'est-ce qui a été modifié mais pas encore indexé ? Quelle modification a été indexée et est prête pour la validation ? Là où `git status` répond de manière générale à ces questions, `git diff` montre les lignes exactes qui ont été ajoutées, modifiées ou effacées — le patch en somme.
249
+
250
+ Supposons que vous éditez et indexez le fichier `LISEZMOI` et que vous éditez le fichier `benchmarks.rb` sans l'indexer.
251
+ Si vous lancez la commande `git status`, vous verrez ceci :
252
+
253
+ $ git status
254
+ On branch master
255
+ Changes to be committed:
256
+ (use "git reset HEAD <file>..." to unstage)
257
+
258
+ new file: LISEZMOI
259
+
260
+ Changes not staged for commit:
261
+ (use "git add <file>..." to update what will be committed)
262
+ (use "git checkout -- <file>..." to discard changes in working directory)
263
+
264
+ modified: benchmarks.rb
265
+
266
+
267
+ Pour visualiser ce qui a été modifié mais pas encore indexé, tapez `git diff` sans autre argument :
268
+
269
+ $ git diff
270
+ diff --git a/benchmarks.rb b/benchmarks.rb
271
+ index 3cb747f..da65585 100644
272
+ --- a/benchmarks.rb
273
+ +++ b/benchmarks.rb
274
+ @@ -36,6 +36,10 @@ def main
275
+ @commit.parents[0].parents[0].parents[0]
276
+ end
277
+
278
+ + run_code(x, 'commits 1') do
279
+ + git.commits.size
280
+ + end
281
+ +
282
+ run_code(x, 'commits 2') do
283
+ log = git.commits('master', 15)
284
+ log.size
285
+
286
+ Cette commande compare le contenu du répertoire de travail avec la zone d'index.
287
+ Le résultat vous indique les modifications réalisées mais non indexées.
288
+
289
+ Si vous souhaitez visualiser les modifications indexées qui feront partie de la prochaine validation, vous pouvez utiliser `git diff --cached` (avec les versions 1.6.1 et supérieures de Git, vous pouvez aussi utiliser `git diff --staged`, qui est plus mnémotechnique).
290
+ Cette commande compare les fichiers indexés et le dernier instantané :
291
+
292
+ $ git diff --cached
293
+ diff --git a/LISEZMOI b/LISEZMOI
294
+ new file mode 100644
295
+ index 0000000..03902a1
296
+ --- /dev/null
297
+ +++ b/LISEZMOI2
298
+ @@ -0,0 +1,5 @@
299
+ +grit
300
+ + by Tom Preston-Werner, Chris Wanstrath
301
+ + http://github.com/mojombo/grit
302
+ +
303
+ +Grit is a Ruby library for extracting information from a Git repository
304
+
305
+ Il est important de noter que `git diff` ne montre pas les modifications réalisées depuis la dernière validation — seulement les modifications qui sont non indexées.
306
+ Cela peut introduire une confusion car si tous les fichiers modifiés ont été indexés, `git diff` n'indiquera aucun changement.
307
+
308
+ Par exemple, si vous indexez le fichier `benchmarks.rb` et l'éditez ensuite, vous pouvez utiliser `git diff` pour visualiser les modifications indexées et non indexées de ce fichier :
309
+
310
+ $ git add benchmarks.rb
311
+ $ echo '# test line' >> benchmarks.rb
312
+ $ git status
313
+ # On branch master
314
+ #
315
+ # Changes to be committed:
316
+ #
317
+ # modified: benchmarks.rb
318
+ #
319
+ # Changes not staged for commit:
320
+ #
321
+ # modified: benchmarks.rb
322
+ #
323
+
324
+ À présent, vous pouvez utiliser `git diff` pour visualiser les modifications non indexées :
325
+
326
+ $ git diff
327
+ diff --git a/benchmarks.rb b/benchmarks.rb
328
+ index e445e28..86b2f7c 100644
329
+ --- a/benchmarks.rb
330
+ +++ b/benchmarks.rb
331
+ @@ -127,3 +127,4 @@ end
332
+ main()
333
+
334
+ ##pp Grit::GitRuby.cache_client.stats
335
+ +# test line
336
+
337
+ et `git diff --cached` pour visualiser ce qui a été indexé jusqu'à maintenant :
338
+
339
+ $ git diff --cached
340
+ diff --git a/benchmarks.rb b/benchmarks.rb
341
+ index 3cb747f..e445e28 100644
342
+ --- a/benchmarks.rb
343
+ +++ b/benchmarks.rb
344
+ @@ -36,6 +36,10 @@ def main
345
+ @commit.parents[0].parents[0].parents[0]
346
+ end
347
+
348
+ + run_code(x, 'commits 1') do
349
+ + git.commits.size
350
+ + end
351
+ +
352
+ run_code(x, 'commits 2') do
353
+ log = git.commits('master', 15)
354
+ log.size
355
+
356
+ ### Valider vos modifications ###
357
+
358
+ Maintenant que votre zone d'index est dans l'état désiré, vous pouvez valider vos modifications.
359
+ Souvenez-vous que tout ce qui est encore non indexé — tous les fichiers qui ont été créés ou modifiés mais n'ont pas subi de `git add` depuis que vous les avez modifiés — ne feront pas partie de la prochaine validation.
360
+ Ils resteront en tant que fichiers modifiés sur votre disque.
361
+
362
+ Dans notre cas, la dernière fois que vous avez lancé `git status`, vous avez vérifié que tout était indexé, et vous êtes donc prêt à valider vos modifications.
363
+ La manière la plus simple de valider est de taper `git commit` :
364
+
365
+ $ git commit
366
+
367
+ Cette action lance votre éditeur par défaut (qui est paramétré par la variable d'environnement `$EDITOR` de votre shell — habituellement vim ou Emacs, mais vous pouvez le paramétrer spécifiquement pour Git en utilisant la commande `git config --global core.editor` comme nous l'avons vu au chapitre 1).
368
+
369
+ L'éditeur affiche le texte suivant :
370
+
371
+ # Please enter the commit message for your changes. Lines starting
372
+ # with '#' will be ignored, and an empty message aborts the commit.
373
+ # On branch master
374
+ # Changes to be committed:
375
+ # (use "git reset HEAD <file>..." to unstage)
376
+ #
377
+ # new file: LISEZMOI
378
+ # modified: benchmarks.rb
379
+ ~
380
+ ~
381
+ ~
382
+ ".git/COMMIT_EDITMSG" 10L, 283C
383
+
384
+ Vous constatez que le message de validation par défaut contient une ligne vide suivie en commentaire par le résultat de la commande `git status`.
385
+ Vous pouvez effacer ces lignes de commentaire et saisir votre propre message de validation, ou vous pouvez les laisser en place pour vous aider à vous rappeler de ce que vous êtes en train de valider (pour un rappel plus explicite de ce que vous avez modifié, vous pouvez aussi passer l'option `-v` à la commande `git commit`.
386
+ Cette option place le résultat du diff en commentaire dans l'éditeur pour vous permettre de visualiser exactement ce que vous avez modifié.
387
+ Quand vous quittez l'éditeur (après avoir sauvegardé le message), Git crée votre *commit* avec ce message de validation (après avoir retiré les commentaires et le diff).
388
+
389
+ D'une autre manière, vous pouvez spécifier votre message de validation en ligne avec la commande `git commit` en le saisissant après l'option `-m`, comme ceci :
390
+
391
+
392
+ $ git commit -m "Story 182: Fix benchmarks for speed"
393
+ [master]: created 463dc4f: "Fix benchmarks for speed"
394
+ 2 files changed, 3 insertions(+), 0 deletions(-)
395
+ create mode 100644 LISEZMOI
396
+
397
+ À présent, vous avez créé votre premier *commit* ! Vous pouvez constater que le *commit* vous fournit quelques informations sur lui-même : sur quelle branche vous avez validé (`master`), quelle est sa somme de contrôle SHA-1 (`463dc4f`), combien de fichiers ont été modifiés, et quelques statistiques sur les lignes ajoutées et effacées dans ce *commit*.
398
+
399
+ Souvenez-vous que la validation enregistre l'instantané que vous avez préparé dans la zone d'index.
400
+ Tout ce que vous n'avez pas indexé est toujours en état modifié ; vous pouvez réaliser une nouvelle validation pour l'ajouter à l'historique.
401
+ À chaque validation, vous enregistrez un instantané du projet en forme de jalon auquel vous pourrez revenir ou avec lequel comparer votre travail ultérieur.
402
+
403
+ ### Éliminer la phase d'indexation ###
404
+
405
+ Bien qu'il soit incroyablement utile de pouvoir organiser les *commits* exactement comme on l'entend, la gestion de la zone d'index est parfois plus complexe que nécessaire dans le cadre d'une utilisation normale.
406
+ Si vous souhaitez éviter la phase de placement des fichiers dans la zone d'index, Git fournit un raccourci très simple.
407
+ L'ajout de l'option `-a` à la commande `git commit` ordonne à Git de placer automatiquement tout fichier déjà en suivi de version dans la zone d'index avant de réaliser la validation, évitant ainsi d'avoir à taper les commandes `git add` :
408
+
409
+ $ git status
410
+ # On branch master
411
+ #
412
+ # Changes not staged for commit:
413
+ #
414
+ # modified: benchmarks.rb
415
+ #
416
+ $ git commit -a -m 'added new benchmarks'
417
+ [master 83e38c7] added new benchmarks
418
+ 1 files changed, 5 insertions(+), 0 deletions(-)
419
+
420
+ Notez bien que vous n'avez pas eu à lancer `git add` sur le fichier `benchmarks.rb` avant de valider.
421
+
422
+ ### Effacer des fichiers ###
423
+
424
+ Pour effacer un fichier de Git, vous devez l'éliminer des fichiers en suivi de version (plus précisément, l'effacer dans la zone d'index) puis valider.
425
+ La commande `git rm` réalise cette action mais efface aussi ce fichier de votre copie de travail de telle sorte que vous ne le verrez pas réapparaître comme fichier non suivi en version à la prochaine validation.
426
+
427
+ Si vous effacez simplement le fichier dans votre copie de travail, il apparaît sous la section « Changes not staged for commit » (c'est-à-dire, _non indexé_) dans le résultat de `git status` :
428
+
429
+ $ rm grit.gemspec
430
+ $ git status
431
+ # On branch master
432
+ #
433
+ # Changes not staged for commit:
434
+ # (use "git add/rm <file>..." to update what will be committed)
435
+ #
436
+ # deleted: grit.gemspec
437
+ #
438
+
439
+ Ensuite, si vous lancez `git rm`, l'effacement du fichier est indexé :
440
+
441
+ $ git rm grit.gemspec
442
+ rm 'grit.gemspec'
443
+ $ git status
444
+ # On branch master
445
+ #
446
+ # Changes to be committed:
447
+ # (use "git reset HEAD <file>..." to unstage)
448
+ #
449
+ # deleted: grit.gemspec
450
+ #
451
+
452
+ Lors de la prochaine validation, le fichier sera absent et non-suivi en version.
453
+ Si vous avez auparavant modifié et indexé le fichier, son élimination doit être forcée avec l'option `-f`.
454
+ C'est une mesure de sécurité pour empêcher un effacement accidentel de données qui n'ont pas encore été enregistrées dans un instantané et qui seraient définitivement perdues.
455
+
456
+ Un autre scénario serait de vouloir abandonner le suivi de version d'un fichier tout en le conservant dans la copie de travail.
457
+ Ceci est particulièrement utile lorsqu'on a oublié de spécifier un patron dans le fichier `.gitignore` et on a accidentellement indexé un fichier, tel qu'un gros fichier de journal ou une série d'archives de compilation `.a`.
458
+ Pour réaliser ce scénario, utilisez l'option `--cached` :
459
+
460
+ $ git rm --cached readme.txt
461
+
462
+ Vous pouvez spécifier des noms de fichiers ou de répertoires, ou des patrons de fichiers à la commande `git rm`.
463
+ Cela signifie que vous pouvez lancer des commandes telles que :
464
+
465
+ $ git rm log/\*.log
466
+
467
+ Notez bien la barre oblique inverse (`\`) devant `*`.
468
+ Il est nécessaire d'échapper le caractère `*` car Git utilise sa propre expansion de nom de fichier en addition de l'expansion du shell. Ce caractère d'échappement doit être omis sous Windows si vous utilisez le terminal système.
469
+ Cette commande efface tous les fichiers avec l'extension `.log` présents dans le répertoire `log/`.
470
+ Vous pouvez aussi lancer une commande telle que :
471
+
472
+ $ git rm \*~
473
+
474
+ Cette commande élimine tous les fichiers se terminant par `~`.
475
+
476
+ ### Déplacer des fichiers ###
477
+
478
+ À la différence des autres VCS, Git ne suit pas explicitement les mouvements des fichiers.
479
+ Si vous renommez un fichier suivi par Git, aucune méta-donnée indiquant le renommage n'est stockée par Git.
480
+ Néanmoins, Git est assez malin pour s'en apercevoir après coup — la détection de mouvement de fichier sera traitée plus loin.
481
+
482
+ De ce fait, que Git ait une commande `mv` peut paraître trompeur.
483
+ Si vous souhaitez renommer un fichier dans Git, vous pouvez lancer quelque chose comme :
484
+
485
+ $ git mv nom_origine nom_cible
486
+
487
+ et cela fonctionne.
488
+ En fait, si vous lancez quelque chose comme ceci et inspectez le résultat d'une commande `git status`, vous constaterez que Git gère le renommage de fichier :
489
+
490
+ $ git mv LISEZMOI.txt LISEZMOI
491
+ $ git status
492
+ # On branch master
493
+ # Your branch is ahead of 'origin/master' by 1 commit.
494
+ #
495
+ # Changes to be committed:
496
+ # (use "git reset HEAD <file>..." to unstage)
497
+ #
498
+ # renamed: LISEZMOI.txt -> LISEZMOI
499
+ #
500
+
501
+ Néanmoins, cela revient à lancer les commandes suivantes :
502
+
503
+ $ mv LISEZMOI.txt LISEZMOI
504
+ $ git rm LISEZMOI.txt
505
+ $ git add LISEZMOI
506
+
507
+ Git trouve implicitement que c'est un renommage, donc cela importe peu si vous renommez un fichier de cette manière ou avec la commande `mv`.
508
+ La seule différence réelle est que `mv` ne fait qu'une commande à taper au lieu de trois — c'est une commande de convenance.
509
+ Le point principal est que vous pouvez utiliser n'importe quel outil pour renommer un fichier, et traiter les commandes `add`/`rm` plus tard, avant de valider la modification.
510
+
511
+ ## Visualiser l'historique des validations ##
512
+
513
+ Après avoir créé plusieurs *commits* ou si vous avez cloné un dépôt ayant un historique de *commits*, vous souhaitez probablement revoir le fil des évènements.
514
+ Pour ce faire, la commande `git log` est l'outil le plus basique et le plus puissant.
515
+
516
+ Les exemples qui suivent utilisent un projet très simple nommé `simplegit` utilisé pour les démonstrations.
517
+ Pour récupérer le projet, lancez :
518
+
519
+ git clone git://github.com/schacon/simplegit-progit.git
520
+
521
+ Lorsque vous lancez `git log` dans le répertoire de ce projet, vous devriez obtenir un résultat qui ressemble à ceci :
522
+
523
+ $ git log
524
+ commit ca82a6dff817ec66f44342007202690a93763949
525
+ Author: Scott Chacon <schacon@gee-mail.com>
526
+ Date: Mon Mar 17 21:52:11 2008 -0700
527
+
528
+ changed the version number
529
+
530
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
531
+ Author: Scott Chacon <schacon@gee-mail.com>
532
+ Date: Sat Mar 15 16:40:33 2008 -0700
533
+
534
+ removed unnecessary test code
535
+
536
+ commit a11bef06a3f659402fe7563abf99ad00de2209e6
537
+ Author: Scott Chacon <schacon@gee-mail.com>
538
+ Date: Sat Mar 15 10:31:28 2008 -0700
539
+
540
+ first commit
541
+
542
+ Par défaut, `git log` invoqué sans argument énumère en ordre chronologique inversé les *commits* réalisés.
543
+ Cela signifie que les *commits* les plus récents apparaissent en premier.
544
+ Comme vous le remarquez, cette commande indique chaque *commit* avec sa somme de contrôle SHA-1, le nom et l'e-mail de l'auteur, la date et le message du *commit*.
545
+
546
+ `git log` dispose d'un très grand nombre d'options permettant de paramétrer exactement ce que l'on cherche à voir.
547
+ Nous allons détailler quelques-unes des plus utilisées.
548
+
549
+ Une des options les plus utiles est `-p`, qui montre les différences introduites entre chaque validation.
550
+ Vous pouvez aussi utiliser `-2` qui limite la sortie de la commande aux deux entrées les plus récentes :
551
+
552
+ $ git log -p -2
553
+ commit ca82a6dff817ec66f44342007202690a93763949
554
+ Author: Scott Chacon <schacon@gee-mail.com>
555
+ Date: Mon Mar 17 21:52:11 2008 -0700
556
+
557
+ changed the version number
558
+
559
+ diff --git a/Rakefile b/Rakefile
560
+ index a874b73..8f94139 100644
561
+ --- a/Rakefile
562
+ +++ b/Rakefile
563
+ @@ -5,5 +5,5 @@ require 'rake/gempackagetask'
564
+ spec = Gem::Specification.new do |s|
565
+ s.name = "simplegit"
566
+ - s.version = "0.1.0"
567
+ + s.version = "0.1.1"
568
+ s.author = "Scott Chacon"
569
+ s.email = "schacon@gee-mail.com
570
+
571
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
572
+ Author: Scott Chacon <schacon@gee-mail.com>
573
+ Date: Sat Mar 15 16:40:33 2008 -0700
574
+
575
+ removed unnecessary test code
576
+
577
+ diff --git a/lib/simplegit.rb b/lib/simplegit.rb
578
+ index a0a60ae..47c6340 100644
579
+ --- a/lib/simplegit.rb
580
+ +++ b/lib/simplegit.rb
581
+ @@ -18,8 +18,3 @@ class SimpleGit
582
+ end
583
+
584
+ end
585
+ -
586
+ -if $0 == __FILE__
587
+ - git = SimpleGit.new
588
+ - puts git.show
589
+ -end
590
+
591
+
592
+ Cette option affiche la même information mais avec un diff suivant directement chaque entrée.
593
+ C'est très utile pour des revues de code ou pour naviguer rapidement à travers l'historique des modifications qu'un collaborateur a apportées.
594
+
595
+ Quelques fois, il est plus facile de visualiser les modifications au niveau des mots plutôt qu'au niveau des lignes.
596
+ L'option `--word-diff` ajoutée à la commande `git log -p` modifie l'affichage des différences en indiquant les modifications au sein des lignes.
597
+ Le format de différence sur les mots est généralement peu utile pour les fichiers de code source, mais s'avère particulièrement pertinent pour les grands fichiers de texte, tels que des livres ou des dissertations. En voici un exemple :
598
+
599
+ $ git log -U1 --word-diff
600
+ commit ca82a6dff817ec66f44342007202690a93763949
601
+ Author: Scott Chacon <schacon@gee-mail.com>
602
+ Date: Mon Mar 17 21:52:11 2008 -0700
603
+
604
+ changed the version number
605
+
606
+ diff --git a/Rakefile b/Rakefile
607
+ index a874b73..8f94139 100644
608
+ --- a/Rakefile
609
+ +++ b/Rakefile
610
+ @@ -7,3 +7,3 @@ spec = Gem::Specification.new do |s|
611
+ s.name = "simplegit"
612
+ s.version = [-"0.1.0"-]{+"0.1.1"+}
613
+ s.author = "Scott Chacon"
614
+
615
+ Comme vous le voyez, les indications de lignes ajoutées ou retirées d'un *diff* normal ont disparu.
616
+ Les modifications sont affichées en ligne.
617
+ Les mots ajoutés sont encadrés par `{+ +}` tandis que les mots effacés sont encadrés par `[- -]`.
618
+ Vous souhaiterez sûrement réduire le contexte habituel de trois lignes à seulement une ligne, du fait qu'il est à présent constitué de mots et non de lignes.
619
+ Cela est réalisé avec l'option `-U1` utilisée dans l'exemple précédent.
620
+
621
+ Vous pouvez aussi utiliser une liste d'options de résumé avec `git log`.
622
+ Par exemple, si vous souhaitez visualiser des statistiques résumées pour chaque *commit*, vous pouvez utiliser l'option `--stat` :
623
+
624
+ $ git log --stat
625
+ commit ca82a6dff817ec66f44342007202690a93763949
626
+ Author: Scott Chacon <schacon@gee-mail.com>
627
+ Date: Mon Mar 17 21:52:11 2008 -0700
628
+
629
+ changed the version number
630
+
631
+ Rakefile | 2 +-
632
+ 1 files changed, 1 insertions(+), 1 deletions(-)
633
+
634
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
635
+ Author: Scott Chacon <schacon@gee-mail.com>
636
+ Date: Sat Mar 15 16:40:33 2008 -0700
637
+
638
+ removed unnecessary test code
639
+
640
+ lib/simplegit.rb | 5 -----
641
+ 1 files changed, 0 insertions(+), 5 deletions(-)
642
+
643
+ commit a11bef06a3f659402fe7563abf99ad00de2209e6
644
+ Author: Scott Chacon <schacon@gee-mail.com>
645
+ Date: Sat Mar 15 10:31:28 2008 -0700
646
+
647
+ first commit
648
+
649
+ LISEZMOI | 6 ++++++
650
+ Rakefile | 23 +++++++++++++++++++++++
651
+ lib/simplegit.rb | 25 +++++++++++++++++++++++++
652
+ 3 files changed, 54 insertions(+), 0 deletions(-)
653
+
654
+ Comme vous pouvez le voir, l'option `--stat` affiche sous chaque entrée de validation une liste des fichiers modifiés, combien de fichiers ont été changés et combien de lignes ont été ajoutées ou retirées dans ces fichiers.
655
+ Elle ajoute un résumé des informations en fin de sortie.
656
+ Une autre option utile est `--pretty`.
657
+ Cette option modifie le journal vers un format différent.
658
+ Quelques options incluses sont disponibles.
659
+ L'option `oneline` affiche chaque *commit* sur une seule ligne, ce qui peut s'avérer utile lors de la revue d'un long journal.
660
+ De plus, les options `short` (court), `full` (complet) et `fuller` (plus complet) montrent le résultat à peu de choses près dans le même format mais avec plus ou moins d'informations :
661
+
662
+ $ git log --pretty=oneline
663
+ ca82a6dff817ec66f44342007202690a93763949 changed the version number
664
+ 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
665
+ a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
666
+
667
+ L'option la plus intéressante est `format` qui permet de décrire précisément le format de sortie.
668
+ C'est spécialement utile pour générer des sorties dans un format facile à analyser par une machine — lorsqu'on spécifie intégralement et explicitement le format, on s'assure qu'il ne changera pas au gré des mises à jour de Git :
669
+
670
+ $ git log --pretty=format:"%h - %an, %ar : %s"
671
+ ca82a6d - Scott Chacon, 11 months ago : changed the version number
672
+ 085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
673
+ a11bef0 - Scott Chacon, 11 months ago : first commit
674
+
675
+ Le tableau 2-1 liste les options de formatage les plus utiles.
676
+
677
+ Option Description du formatage
678
+ %H Somme de contrôle du commit
679
+ %h Somme de contrôle abrégée du commit
680
+ %T Somme de contrôle de l'arborescence
681
+ %t Somme de contrôle abrégée de l'arborescence
682
+ %P Sommes de contrôle des parents
683
+ %p Sommes de contrôle abrégées des parents
684
+ %an Nom de l'auteur
685
+ %ae E-mail de l'auteur
686
+ %ad Date de l'auteur (au format de l'option -date=)
687
+ %ar Date relative de l'auteur
688
+ %cn Nom du validateur
689
+ %ce E-mail du validateur
690
+ %cd Date du validateur
691
+ %cr Date relative du validateur
692
+ %s Sujet
693
+
694
+ Vous pourriez vous demander quelle est la différence entre _auteur_ et _validateur_.
695
+ L'_auteur_ est la personne qui a réalisé initialement le travail, alors que le _validateur_ est la personne qui a effectivement validé ce travail en gestion de version.
696
+ Donc, si quelqu'un envoie un patch à un projet et un des membres du projet l'applique, les deux personnes reçoivent le crédit — l'écrivain en tant qu'auteur, et le membre du projet en tant que validateur.
697
+ Nous traiterons plus avant de cette distinction au chapitre 5.
698
+
699
+ Les options `oneline` et `format` sont encore plus utiles avec une autre option `log` appelée `--graph`.
700
+ Cette option ajoute un joli graphe en caractères ASCII pour décrire l'historique des branches et fusions, ce que nous pouvons visualiser pour notre copie du dépôt de Grit :
701
+
702
+ $ git log --pretty=format:"%h %s" --graph
703
+ * 2d3acf9 ignore errors from SIGCHLD on trap
704
+ * 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
705
+ |\
706
+ | * 420eac9 Added a method for getting the current branch.
707
+ * | 30e367c timeout code and tests
708
+ * | 5a09431 add timeout protection to grit
709
+ * | e1193f8 support for heads with slashes in them
710
+ |/
711
+ * d6016bc require time for xmlschema
712
+ * 11d191e Merge branch 'defunkt' into local
713
+
714
+ Les options ci-dessus ne sont que des options simples de format de sortie de `git log` — il y en a de nombreuses autres.
715
+ Le tableau 2-2 donne une liste des options que nous avons traitées ainsi que d'autres options communément utilisées accompagnées de la manière dont elles modifient le résultat de la commande `log`.
716
+
717
+ Option Description
718
+ -p Affiche le patch appliqué par chaque commit
719
+ --stat Affiche les statistiques de chaque fichier pour chaque commit
720
+ --shortstat N'affiche que les ligne modifiées/insérées/effacées de l'option --stat
721
+ --name-only Affiche la liste des fichiers modifiés après les informations du commit
722
+ --name-status Affiche la liste des fichiers affectés accompagnés des informations d'ajout/modification/suppression
723
+ --abbrev-commit N'affiche que les premiers caractères de la somme de contrôle SHA-1
724
+ --relative-date Affiche la date en format relatif (par exemple "2 weeks ago" : il y a deux semaines) au lieu du format de date complet
725
+ --graph Affiche en caractères ASCII le graphe de branches et fusions en vis-à-vis de l'historique
726
+ --pretty=<format> Affiche les *commits* dans un format alternatif. Les formats incluent `oneline`, `short`, `full`, `fuller`, et `format` (où on peut spécifier son propre format)
727
+ --oneline Option de convenance correspondant à `--pretty=oneline --abbrev-commit`
728
+
729
+ ### Limiter la longueur de l'historique ###
730
+
731
+ En complément des options de formatage de sortie, `git log` est pourvu de certaines options de limitation utiles — des options qui permettent de restreindre la liste à un sous-ensemble de *commits*.
732
+ Vous avez déjà vu une de ces options — l'option `-2` qui ne montre que les deux derniers *commits*.
733
+ En fait, on peut utiliser `-<n>`, où `n` correspond au nombre de *commits* que l'on cherche à visualiser en partant des plus récents.
734
+ En vérité, il est peu probable que vous utilisiez cette option, parce que Git injecte par défaut sa sortie dans un outil de pagination qui permet de la visualiser page à page.
735
+
736
+ Cependant, les options de limitation portant sur le temps, telles que `--since` (depuis) et `--until` (jusqu'à) sont très utiles.
737
+ Par exemple, la commande suivante affiche la liste des *commits* des deux dernières semaines :
738
+
739
+ $ git log --since=2.weeks
740
+
741
+ Cette commande fonctionne avec de nombreux formats — vous pouvez indiquer une date spécifique (2008-01-05) ou une date relative au présent telle que "2 years 1 day 3 minutes ago".
742
+
743
+ Vous pouvez aussi restreindre la liste aux *commits* vérifiant certains critères de recherche.
744
+ L'option `--author` permet de filtrer sur un auteur spécifique, et l'option `--grep` permet de chercher des mots clés dans les messages de validation.
745
+ Notez que si vous spécifiez à la fois `--author` et `--grep`, la commande retournera seulement des *commits* correspondant simultanément aux deux critères.
746
+
747
+ Si vous souhaitez spécifier plusieurs options `--grep`, vous devez ajouter l'option `--all-match`, car par défaut ces commandes retournent les *commits* vérifiant au moins un critère de recherche.
748
+
749
+ La dernière option vraiment utile à `git log` est la spécification d'un chemin.
750
+ Si un répertoire ou un nom de fichier est spécifié, le journal est limité aux *commits* qui ont introduit des modifications aux fichiers concernés.
751
+ C'est toujours la dernière option de la commande, souvent précédée de deux tirets (`--`) pour séparer les chemins des options précédentes.
752
+
753
+ Le tableau 2-3 récapitule les options que nous venons de voir ainsi que quelques autres pour référence.
754
+
755
+ Option Description
756
+ -(n) N'affiche que les n derniers *commits*
757
+ --since, --after Limite l'affichage aux *commits* réalisés après la date spécifiée
758
+ --until, --before Limite l'affichage aux *commits* réalisés avant la date spécifiée
759
+ --author Ne montre que les *commits* dont le champ auteur correspond à la chaîne passée en argument
760
+ --committer Ne montre que les *commits* dont le champ validateur correspond à la chaîne passée en argument
761
+
762
+ Par exemple, si vous souhaitez visualiser quels *commits* modifiant les fichiers de test dans l'historique du source de Git ont été validés par Junio Hamano et n'étaient pas des fusions durant le mois d'octobre 2008, vous pouvez lancer ce qui suit :
763
+
764
+ $ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
765
+ --before="2008-11-01" --no-merges -- t/
766
+ 5610e3b - Fix testcase failure when extended attribute
767
+ acd3b9e - Enhance hold_lock_file_for_{update,append}()
768
+ f563754 - demonstrate breakage of detached checkout wi
769
+ d1a43f2 - reset --hard/read-tree --reset -u: remove un
770
+ 51a94af - Fix "checkout --track -b newbranch" on detac
771
+ b0ad11e - pull: allow "git pull origin $something:$cur
772
+
773
+ À partir des 20 000 *commits* constituant l'historique des sources de Git, cette commande extrait les 6 qui correspondent aux critères.
774
+
775
+ ### Utiliser une interface graphique pour visualiser l'historique ###
776
+
777
+ Si vous préférez utiliser un outil plus graphique pour visualiser l'historique d'un projet, vous pourriez jeter un œil à un programme distribué avec Git nommé `gitk`.
778
+ Gitk est un outil graphique mimant les fonctionnalités de `git log`, et il donne accès à quasiment toutes les options de filtrage de `git log`.
779
+ Si vous tapez `gitk` en ligne de commande, vous devriez voir une interface ressemblant à la figure 2-2.
780
+
781
+ Insert 18333fig0202.png
782
+ Figure 2-2. Le visualiseur d'historique gitk.
783
+
784
+ Vous pouvez voir l'historique des *commits* dans la partie supérieure de la fenêtre avec un graphique d'enchaînement.
785
+ Le visualisateur de diff dans la partie inférieure de la fenêtre affiche les modifications introduites par le *commit* sélectionné.
786
+
787
+ ## Annuler des actions ##
788
+
789
+ À tout moment, vous pouvez désirer annuler une de vos dernières actions.
790
+ Dans cette section, nous allons passer en revue quelques outils de base permettant d'annuler des modifications.
791
+ Il faut être très attentif car certaines de ces annulations sont définitives (elles ne peuvent pas être elles-mêmes annulées).
792
+ C'est donc un des rares cas d'utilisation de Git où des erreurs de manipulation peuvent entraîner des pertes définitives de données.
793
+
794
+ ### Modifier le dernier *commit* ###
795
+
796
+ Une des annulations les plus communes apparaît lorsqu'on valide une modification trop tôt en oubliant d'ajouter certains fichiers, ou si on se trompe dans le message de validation.
797
+ Si vous souhaitez rectifier cette erreur, vous pouvez valider le complément de modification avec l'option `--amend` :
798
+
799
+ $ git commit --amend
800
+
801
+ Cette commande prend en compte la zone d'index et l'utilise pour le *commit*.
802
+ Si aucune modification n'a été réalisée depuis la dernière validation (par exemple en lançant cette commande immédiatement après la dernière validation), alors l'instantané sera identique et la seule modification à introduire sera le message de validation.
803
+
804
+ L'éditeur de message de validation démarre, mais il contient déjà le message de la validation précédente.
805
+ Vous pouvez éditer ce message normalement, mais il écrasera le message de la validation précédente.
806
+
807
+ Par exemple, si vous validez une version puis réalisez que vous avez oublié de spécifier les modifications d'un fichier, vous pouvez taper les commandes suivantes :
808
+
809
+ $ git commit -m 'validation initiale'
810
+ $ git add fichier_oublie
811
+ $ git commit --amend
812
+
813
+ Les trois dernières commandes donnent lieu à la création d'un unique *commit* — la seconde validation remplace le résultat de la première.
814
+
815
+ ### Désindexer un fichier déjà indexé ###
816
+
817
+ Les deux sections suivantes démontrent comment bricoler les modifications dans votre zone d'index et votre zone de travail.
818
+ Un point sympathique est que la commande permettant de connaître l'état de ces deux zones vous rappelle aussi comment annuler les modifications.
819
+ Par exemple, supposons que vous avez modifié deux fichiers et voulez les valider comme deux modifications indépendantes, mais que vous avez tapé accidentellement `git add *` et donc indexé les deux.
820
+ Comment annuler l'indexation d'un des fichiers ? La commande `git status` vous le rappelle :
821
+
822
+ $ git add .
823
+ $ git status
824
+ # On branch master
825
+ # Changes to be committed:
826
+ # (use "git reset HEAD <file>..." to unstage)
827
+ #
828
+ # modified: LISEZMOI.txt
829
+ # modified: benchmarks.rb
830
+ #
831
+
832
+ Juste sous le texte « Changes to be committed », elle vous indique d'utiliser `git reset HEAD <fichier>...` pour désindexer un fichier.
833
+ Utilisons donc ce conseil pour désindexer le fichier `benchmarks.rb` :
834
+
835
+
836
+ $ git reset HEAD benchmarks.rb
837
+ benchmarks.rb: locally modified
838
+ $ git status
839
+ # On branch master
840
+ # Changes to be committed:
841
+ # (use "git reset HEAD <file>..." to unstage)
842
+ #
843
+ # modified: LISEZMOI.txt
844
+ #
845
+ # Changes not staged for commit:
846
+ # (use "git add <file>..." to update what will be committed)
847
+ # (use "git checkout -- <file>..." to discard changes in working directory)
848
+ #
849
+ # modified: benchmarks.rb
850
+ #
851
+
852
+ La commande à taper peut sembler étrange mais elle fonctionne.
853
+ Le fichier `benchmarks.rb` est modifié mais de retour à l'état non indexé.
854
+
855
+ ### Réinitialiser un fichier modifié ###
856
+
857
+ Que faire si vous réalisez que vous ne souhaitez pas conserver les modifications du fichier `benchmark.rb` ?
858
+ Comment le réinitialiser facilement, le ramener à son état du dernier instantané (ou lors du clonage, ou dans l'état dans lequel vous l'avez obtenu dans votre copie de travail) ?
859
+ Heureusement, `git status` est secourable.
860
+ Dans le résultat de la dernière commande, la zone de travail ressemble à ceci :
861
+
862
+ # Changes not staged for commit:
863
+ # (use "git add <file>..." to update what will be committed)
864
+ # (use "git checkout -- <file>..." to discard changes in working directory)
865
+ #
866
+ # modified: benchmarks.rb
867
+ #
868
+
869
+ Ce qui vous indique de façon explicite comment annuler des modifications que vous avez faites (du moins, les nouvelles versions de Git, 1.6.1 et supérieures le font, si vous avez une version plus ancienne, nous vous recommandons de la mettre à jour pour bénéficier de ces fonctionnalités pratiques).
870
+ Faisons comme indiqué :
871
+
872
+ $ git checkout -- benchmarks.rb
873
+ $ git status
874
+ # On branch master
875
+ # Changes to be committed:
876
+ # (use "git reset HEAD <file>..." to unstage)
877
+ #
878
+ # modified: LISEZMOI
879
+ #
880
+
881
+ Vous pouvez constater que les modifications ont été annulées.
882
+ Vous devriez aussi vous apercevoir que c'est une commande dangereuse : toutes les modifications que vous auriez réalisées sur ce fichier ont disparu — vous venez tout juste de l'écraser avec un autre fichier.
883
+ N'utilisez jamais cette commande à moins d'être vraiment sûr de ne pas vouloir de ces modifications.
884
+ Si vous souhaitez seulement écarter momentanément cette modification, nous verrons comment mettre de côté et créer des branches dans le chapitre suivant ; ce sont de meilleures façons de procéder.
885
+ Souvenez-vous, tout ce qui a été validé dans Git peut quasiment toujours être récupéré.
886
+ Y compris des *commits* sur des branches qui ont été effacées ou des *commits* qui ont été écrasés par une validation avec l'option `--amend` (se référer au chapitre 9 pour la récupération de données).
887
+ Cependant, tout ce que vous perdez avant de l'avoir validé n'a aucune chance d'être récupérable via Git.
888
+
889
+ ## Travailler avec des dépôts distants ##
890
+
891
+ Pour pouvoir collaborer sur un projet Git, il est nécessaire de savoir comment gérer les dépôts distants.
892
+ Les dépôts distants sont des versions de votre projet qui sont hébergées sur Internet ou le réseau.
893
+ Vous pouvez en avoir plusieurs, pour lesquels vous pouvez avoir des droits soit en lecture seule, soit en lecture/écriture.
894
+ Collaborer avec d'autres personnes consiste à gérer ces dépôts distants, en poussant ou tirant des données depuis et vers ces dépôts quand vous souhaitez partager votre travail.
895
+
896
+ Gérer des dépôts distants inclut savoir comment ajouter des dépôts distants, effacer des dépôts distants qui ne sont plus valides, gérer des branches distantes et les définir comme suivies ou non, et plus encore.
897
+ Dans cette section, nous traiterons des commandes de gestion distante.
898
+
899
+ ### Afficher les dépôts distants ###
900
+
901
+ Pour visualiser les serveurs distants que vous avez enregistrés, vous pouvez lancer la commande `git remote`.
902
+ Elle liste les noms des différentes références distantes que vous avez spécifiées.
903
+ Si vous avez cloné un dépôt, vous devriez au moins voir l'origine `origin` — c'est-à-dire le nom par défaut que Git donne au serveur à partir duquel vous avez cloné :
904
+
905
+ $ git clone git://github.com/schacon/ticgit.git
906
+ Initialized empty Git repository in /private/tmp/ticgit/.git/
907
+ remote: Counting objects: 595, done.
908
+ remote: Compressing objects: 100% (269/269), done.
909
+ remote: Total 595 (delta 255), reused 589 (delta 253)
910
+ Receiving objects: 100% (595/595), 73.31 KiB | 1 KiB/s, done.
911
+ Resolving deltas: 100% (255/255), done.
912
+ $ cd ticgit
913
+ $ git remote
914
+ origin
915
+
916
+ Vous pouvez aussi spécifier `-v`, qui vous montre l'URL que Git a stockée pour chaque nom court :
917
+
918
+ $ git remote -v
919
+ origin git://github.com/schacon/ticgit.git (fetch)
920
+ origin git://github.com/schacon/ticgit.git (push)
921
+
922
+ Si vous avez plus d'un dépôt distant, la commande précédente les liste tous.
923
+ Par exemple, mon dépôt Grit ressemble à ceci.
924
+
925
+ $ cd grit
926
+ $ git remote -v
927
+ bakkdoor git://github.com/bakkdoor/grit.git
928
+ cho45 git://github.com/cho45/grit.git
929
+ defunkt git://github.com/defunkt/grit.git
930
+ koke git://github.com/koke/grit.git
931
+ origin git@github.com:mojombo/grit.git
932
+
933
+ Cela signifie que je peux tirer très facilement des contributions depuis certains utilisateurs.
934
+ Mais il est à noter que seul le dépôt distant `origin` utilise une URL SSH, ce qui signifie que c'est le seul sur lequel je peux pousser (nous traiterons de ceci au chapitre 4).
935
+
936
+ ### Ajouter des dépôts distants ###
937
+
938
+ J'ai expliqué et donné des exemples d'ajout de dépôts distants dans les chapitres précédents, mais voici spécifiquement comment faire.
939
+ Pour ajouter un nouveau dépôt distant Git comme nom court auquel il est facile de faire référence, lancez `git remote add [nomcourt] [url]` :
940
+
941
+ $ git remote
942
+ origin
943
+ $ git remote add pb git://github.com/paulboone/ticgit.git
944
+ $ git remote -v
945
+ origin git://github.com/schacon/ticgit.git
946
+ pb git://github.com/paulboone/ticgit.git
947
+
948
+ Maintenant, vous pouvez utiliser le mot-clé `pb` sur la ligne de commande au lieu de l'URL complète.
949
+ Par exemple, si vous voulez récupérer toute l'information que Paul a mais que vous ne souhaitez pas l'avoir encore dans votre branche, vous pouvez lancer `git fetch pb` :
950
+
951
+ $ git fetch pb
952
+ remote: Counting objects: 58, done.
953
+ remote: Compressing objects: 100% (41/41), done.
954
+ remote: Total 44 (delta 24), reused 1 (delta 0)
955
+ Unpacking objects: 100% (44/44), done.
956
+ From git://github.com/paulboone/ticgit
957
+ * [new branch] master -> pb/master
958
+ * [new branch] ticgit -> pb/ticgit
959
+
960
+ La branche `master` de Paul est accessible localement en tant que `pb/master` — vous pouvez la fusionner dans une de vos propres branches, ou vous pouvez extraire une branche localement si vous souhaitez l'inspecter.
961
+
962
+ ### Récupérer et tirer depuis des dépôts distants ###
963
+
964
+ Comme vous venez tout juste de le voir, pour obtenir les données des dépôts distants, vous pouvez lancer :
965
+
966
+ $ git fetch [nom-distant]
967
+
968
+ Cette commande s'adresse au dépôt distant et récupère toutes les données de ce projet que vous ne possédez pas déjà.
969
+ Après cette action, vous possédez toutes les références à toutes les branches contenues dans ce dépôt, que vous pouvez fusionner ou inspecter à tout moment (nous reviendrons plus précisément sur les branches et leur utilisation au chapitre 3).
970
+
971
+ Si vous clonez un dépôt, le dépôt distant est automatiquement ajouté sous le nom `origin`.
972
+ Donc, `git fetch origin` récupère tout ajout qui a été poussé vers ce dépôt depuis que vous l'avez cloné ou la dernière fois que vous avez récupéré les ajouts.
973
+ Il faut noter que la commande `fetch` tire les données dans votre dépôt local mais sous sa propre branche — elle ne les fusionne pas automatiquement avec aucun de vos travaux ni ne modifie votre copie de travail.
974
+ Vous devez volontairement fusionner ses modifications distantes dans votre travail lorsque vous le souhaitez.
975
+
976
+ Si vous avez créé une branche pour suivre l'évolution d'une branche distante (cf.
977
+ la section suivante et le chapitre 3 pour plus d'information), vous pouvez utiliser la commande `git pull` qui récupère et fusionne automatiquement une branche distante dans votre branche locale.
978
+ Ce comportement peut correspondre à une méthode de travail plus confortable, sachant que par défaut la commande `git clone` paramètre votre branche locale pour qu'elle suive la branche `master` du dépôt que vous avez cloné (en supposant que le dépôt distant ait une branche `master`).
979
+ Lancer `git pull` récupère généralement les données depuis le serveur qui a été initialement cloné et essaie de les fusionner dans votre branche de travail actuel.
980
+
981
+ ### Pousser son travail sur un dépôt distant ###
982
+
983
+ Lorsque votre dépôt vous semble prêt à être partagé, il faut le pousser en amont.
984
+ La commande pour le faire est simple : `git push [nom-distant] [nom-de-branche]`.
985
+ Si vous souhaitez pousser votre branche `master` vers le serveur `origin` (pour rappel, cloner un dépôt définit automatiquement ces noms pour vous), alors vous pouvez lancez ceci pour pousser votre travail vers le serveur amont :
986
+
987
+ $ git push origin master
988
+
989
+ Cette commande ne fonctionne que si vous avez cloné depuis un serveur sur lequel vous avez des droits d'accès en écriture et si personne n'a poussé dans l'intervalle.
990
+ Si vous et quelqu'un d'autre clonez un dépôt au même moment et que cette autre personne pousse ses modifications et qu'après vous tentez de pousser les vôtres, votre poussée sera rejetée à juste titre.
991
+ Vous devrez tout d'abord tirer les modifications de l'autre personne et les fusionner avec les vôtres avant de pouvoir pousser.
992
+ Référez-vous au chapitre 3 pour de plus amples informations sur les techniques pour pousser vers un serveur distant.
993
+
994
+ ### Inspecter un dépôt distant ###
995
+
996
+ Si vous souhaitez visualiser plus d'informations à propos d'un dépôt distant particulier, vous pouvez utiliser la commande `git remote show [nom-distant]`.
997
+ Si vous lancez cette commande avec un nom court particulier, tel que `origin`, vous obtenez quelque chose comme :
998
+
999
+ $ git remote show origin
1000
+ * remote origin
1001
+ URL: git://github.com/schacon/ticgit.git
1002
+ Remote branch merged with 'git pull' while on branch master
1003
+ master
1004
+ Tracked remote branches
1005
+ master
1006
+ ticgit
1007
+
1008
+
1009
+ Cela donne la liste des URL pour le dépôt distant ainsi que la liste des branches distantes suivies.
1010
+ Cette commande vous informe que si vous êtes sur la branche `master` et si vous lancez `git pull`, il va automatiquement fusionner la branche `master` du dépôt distant après avoir récupéré toutes les références sur le serveur distant.
1011
+ Cela donne aussi la liste des autres références qu'il aura tirées.
1012
+
1013
+ Le résultat ci-dessus est un exemple simple mais réaliste de dépôt distant.
1014
+ Lors d'une utilisation plus intense de Git, la commande `git remote show` fournira beaucoup d'information :
1015
+
1016
+ $ git remote show origin
1017
+ * remote origin
1018
+ URL: git@github.com:defunkt/github.git
1019
+ Remote branch merged with 'git pull' while on branch issues
1020
+ issues
1021
+ Remote branch merged with 'git pull' while on branch master
1022
+ master
1023
+ New remote branches (next fetch will store in remotes/origin)
1024
+ caching
1025
+ Stale tracking branches (use 'git remote prune')
1026
+ libwalker
1027
+ walker2
1028
+ Tracked remote branches
1029
+ acl
1030
+ apiv2
1031
+ dashboard2
1032
+ issues
1033
+ master
1034
+ postgres
1035
+ Local branch pushed with 'git push'
1036
+ master:master
1037
+
1038
+ Cette commande affiche les branches poussées automatiquement lorsqu'on lance `git push` dessus.
1039
+ Elle montre aussi les branches distantes qui n'ont pas encore été rapatriées, les branches distantes présentes localement mais effacées sur le serveur, et toutes les branches qui seront fusionnées quand on lancera `git pull`.
1040
+
1041
+ ### Retirer et déplacer des branches distantes ###
1042
+
1043
+ Si vous souhaitez renommer une référence, dans les versions récentes de Git, vous pouvez lancer `git remote rename` pour modifier le nom court d'un dépôt distant.
1044
+ Par exemple, si vous souhaitez renommer `pb` en `paul`, vous pouvez le faire avec `git remote rename` :
1045
+
1046
+ $ git remote rename pb paul
1047
+ $ git remote
1048
+ origin
1049
+ paul
1050
+
1051
+ Il faut mentionner que ceci modifie aussi les noms de branches distantes.
1052
+ Celle qui était référencée sous `pb/master` l'est maintenant sous `paul/master`.
1053
+
1054
+ Si vous souhaitez retirer une référence pour certaines raisons — vous avez changé de serveur ou vous n'utilisez plus ce serveur particulier, ou peut-être un contributeur a cessé de contribuer — vous pouvez utiliser `git remote rm` :
1055
+
1056
+ $ git remote rm paul
1057
+ $ git remote
1058
+ origin
1059
+
1060
+ ## Étiquetage ##
1061
+
1062
+ À l'instar de la plupart des VCS, Git donne la possibilité d'étiqueter un certain état dans l'historique comme important.
1063
+ Généralement, les gens utilisent cette fonctionnalité pour marquer les états de publication (`v1.0` et ainsi de suite).
1064
+ Dans cette section, nous apprendrons comment lister les différentes étiquettes (*tag* en anglais), comment créer de nouvelles étiquettes et les différents types d'étiquettes.
1065
+
1066
+ ### Lister vos étiquettes ###
1067
+
1068
+ Lister les étiquettes existantes dans Git est très simple.
1069
+ Tapez juste `git tag` :
1070
+
1071
+ $ git tag
1072
+ v0.1
1073
+ v1.3
1074
+
1075
+ Cette commande liste les étiquettes dans l'ordre alphabétique.
1076
+ L'ordre dans lequel elles apparaissent n'a aucun rapport avec l'historique.
1077
+
1078
+ Vous pouvez aussi rechercher les étiquettes correspondant à un motif particulier.
1079
+ Par exemple, le dépôt des sources de Git contient plus de 240 étiquettes.
1080
+ Si vous souhaitez ne visualiser que les séries 1.4.2, vous pouvez lancer ceci :
1081
+
1082
+ $ git tag -l 'v1.4.2.*'
1083
+ v1.4.2.1
1084
+ v1.4.2.2
1085
+ v1.4.2.3
1086
+ v1.4.2.4
1087
+
1088
+ ### Créer des étiquettes ###
1089
+
1090
+ Git utilise deux types principaux d'étiquettes : légères et annotées.
1091
+ Une étiquette légère ressemble beaucoup à une branche qui ne change pas, c'est juste un pointeur sur un *commit* spécifique.
1092
+ Les étiquettes annotées, par contre sont stockées en tant qu'objets à part entière dans la base de données de Git.
1093
+ Elles ont une somme de contrôle, contiennent le nom et l'adresse e-mail du créateur, la date, un message d'étiquetage et peuvent être signées et vérifiées avec GNU Privacy Guard (GPG).
1094
+ Il est généralement recommandé de créer des étiquettes annotées pour générer toute cette information mais si l'étiquette doit rester temporaire ou l'information supplémentaire n'est pas désirée, les étiquettes légères peuvent suffire.
1095
+
1096
+ ### Les étiquettes annotées ###
1097
+
1098
+ Créer des étiquettes annotées est simple avec Git.
1099
+ Le plus simple est de spécifier l'option `-a` à la commande `tag` :
1100
+
1101
+ $ git tag -a v1.4 -m 'my version 1.4'
1102
+ $ git tag
1103
+ v0.1
1104
+ v1.3
1105
+ v1.4
1106
+
1107
+ L'option `-m` permet de spécifier le message d'étiquetage qui sera stocké avec l'étiquette.
1108
+ Si vous ne spécifiez pas de message en ligne pour une étiquette annotée, Git lance votre éditeur pour pouvoir le saisir.
1109
+
1110
+ Vous pouvez visualiser les données de l'étiquette à côté du *commit* qui a été marqué en utilisant la commande `git show` :
1111
+
1112
+ $ git show v1.4
1113
+ tag v1.4
1114
+ Tagger: Scott Chacon <schacon@gee-mail.com>
1115
+ Date: Mon Feb 9 14:45:11 2009 -0800
1116
+
1117
+ my version 1.4
1118
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
1119
+ Merge: 4a447f7... a6b4c97...
1120
+ Author: Scott Chacon <schacon@gee-mail.com>
1121
+ Date: Sun Feb 8 19:02:46 2009 -0800
1122
+
1123
+ Merge branch 'experiment'
1124
+
1125
+ Cette commande affiche le nom du créateur, la date de création de l'étiquette et le message d'annotation avant de montrer effectivement l'information de validation.
1126
+
1127
+ ### Les étiquettes signées ###
1128
+
1129
+ Vous pouvez aussi signer vos étiquettes avec GPG, à condition d'avoir une clé privée.
1130
+ Il suffit de spécifier l'option `-s` au lieu de `-a` :
1131
+
1132
+ $ git tag -s v1.5 -m 'my signed 1.5 tag'
1133
+ You need a passphrase to unlock the secret key for
1134
+ user: "Scott Chacon <schacon@gee-mail.com>"
1135
+ 1024-bit DSA key, ID F721C45A, created 2009-02-09
1136
+
1137
+ En lançant `git show` sur cette étiquette, on peut visualiser la signature GPG attachée :
1138
+
1139
+ $ git show v1.5
1140
+ tag v1.5
1141
+ Tagger: Scott Chacon <schacon@gee-mail.com>
1142
+ Date: Mon Feb 9 15:22:20 2009 -0800
1143
+
1144
+ my signed 1.5 tag
1145
+ -----BEGIN PGP SIGNATURE-----
1146
+ Version: GnuPG v1.4.8 (Darwin)
1147
+
1148
+ iEYEABECAAYFAkmQurIACgkQON3DxfchxFr5cACeIMN+ZxLKggJQf0QYiQBwgySN
1149
+ Ki0An2JeAVUCAiJ7Ox6ZEtK+NvZAj82/
1150
+ =WryJ
1151
+ -----END PGP SIGNATURE-----
1152
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
1153
+ Merge: 4a447f7... a6b4c97...
1154
+ Author: Scott Chacon <schacon@gee-mail.com>
1155
+ Date: Sun Feb 8 19:02:46 2009 -0800
1156
+
1157
+ Merge branch 'experiment'
1158
+
1159
+ Plus loin, nous verrons comment vérifier une étiquette signée.
1160
+
1161
+ ### Les étiquettes légères ###
1162
+
1163
+ Une autre manière d'étiqueter les *commits* est d'utiliser les étiquettes légères.
1164
+ Celles-ci se réduisent à stocker la somme de contrôle d'un *commit* dans un fichier, aucune autre information n'est conservée.
1165
+ Pour créer une étiquette légère, il suffit de n'utiliser aucune des option `-a`, `-s` ou `-m` :
1166
+
1167
+ $ git tag v1.4-lw
1168
+ $ git tag
1169
+ v0.1
1170
+ v1.3
1171
+ v1.4
1172
+ v1.4-lw
1173
+ v1.5
1174
+
1175
+ Cette fois-ci, en lançant `git show` sur l'étiquette, on ne voit plus aucune information complémentaire.
1176
+ La commande ne montre que l'information de validation :
1177
+
1178
+ $ git show v1.4-lw
1179
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
1180
+ Merge: 4a447f7... a6b4c97...
1181
+ Author: Scott Chacon <schacon@gee-mail.com>
1182
+ Date: Sun Feb 8 19:02:46 2009 -0800
1183
+
1184
+ Merge branch 'experiment'
1185
+
1186
+ ### Vérifier des étiquettes ###
1187
+
1188
+ Pour vérifier une étiquette signée, il faut utiliser `git tag -v [nom-d'étiquette]`.
1189
+ Cette commande utilise GPG pour vérifier la signature.
1190
+ La clé publique du signataire doit être présente dans votre trousseau :
1191
+
1192
+ $ git tag -v v1.4.2.1
1193
+ object 883653babd8ee7ea23e6a5c392bb739348b1eb61
1194
+ type commit
1195
+ tag v1.4.2.1
1196
+ tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700
1197
+
1198
+ GIT 1.4.2.1
1199
+
1200
+ Minor fixes since 1.4.2, including git-mv and git-http with alternates.
1201
+ gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
1202
+ gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
1203
+ gpg: aka "[jpeg image of size 1513]"
1204
+ Primary key fingerprint: 3565 2A26 2040 E066 C9A7 4A7D C0C6 D9A4 F311 9B9A
1205
+
1206
+ Si la clé publique du signataire n'est pas présente dans le trousseau, la commande donne le résultat suivant :
1207
+
1208
+ gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
1209
+ gpg: Can't check signature: public key not found
1210
+ error: could not verify the tag 'v1.4.2.1'
1211
+
1212
+ ### Étiqueter après coup ###
1213
+
1214
+ Vous pouvez aussi étiqueter des *commits* plus anciens.
1215
+ Supposons que l'historique des *commits* ressemble à ceci :
1216
+
1217
+ $ git log --pretty=oneline
1218
+ 15027957951b64cf874c3557a0f3547bd83b3ff6 Fusion branche 'experimental'
1219
+ a6b4c97498bd301d84096da251c98a07c7723e65 Début de l'écriture support
1220
+ 0d52aaab4479697da7686c15f77a3d64d9165190 Un truc de plus
1221
+ 6d52a271eda8725415634dd79daabbc4d9b6008e Fusion branche 'experimental'
1222
+ 0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc ajout d'une fonction de validatn
1223
+ 4682c3261057305bdd616e23b64b0857d832627b ajout fichier afaire
1224
+ 166ae0c4d3f420721acbb115cc33848dfcc2121a début de l'ecriture support
1225
+ 9fceb02d0ae598e95dc970b74767f19372d61af8 mise à jour rakefile
1226
+ 964f16d36dfccde844893cac5b347e7b3d44abbc validation afaire
1227
+ 8a5cbc430f1a9c3d00faaeffd07798508422908a mise à jour lisezmoi
1228
+
1229
+ Maintenant, supposons que vous avez oublié d'étiqueter le projet à la version `v1.2` qui correspondait au *commit* « mise à jour rakefile ».
1230
+ Vous pouvez toujours le faire après l'évènement.
1231
+ Pour étiqueter ce *commit*, vous spécifiez la somme de contrôle du *commit* (ou une partie) en fin de commande :
1232
+
1233
+ $ git tag -a v1.2 -m 'version 1.2' 9fceb02
1234
+
1235
+ Le *commit* a été étiqueté :
1236
+
1237
+ $ git tag
1238
+ v0.1
1239
+ v1.2
1240
+ v1.3
1241
+ v1.4
1242
+ v1.4-lw
1243
+ v1.5
1244
+
1245
+ $ git show v1.2
1246
+ tag v1.2
1247
+ Tagger: Scott Chacon <schacon@gee-mail.com>
1248
+ Date: Mon Feb 9 15:32:16 2009 -0800
1249
+
1250
+ version 1.2
1251
+ commit 9fceb02d0ae598e95dc970b74767f19372d61af8
1252
+ Author: Magnus Chacon <mchacon@gee-mail.com>
1253
+ Date: Sun Apr 27 20:43:35 2008 -0700
1254
+
1255
+ mise à jour rakefile
1256
+ ...
1257
+
1258
+ ### Partager les étiquettes ###
1259
+
1260
+ Par défaut, la commande `git push` ne transfère pas les étiquettes vers les serveurs distants.
1261
+ Il faut explicitement pousser les étiquettes après les avoir créées localement.
1262
+ Ce processus s'apparente à pousser des branches distantes — vous pouvez lancer `git push origin [nom-du-tag]`.
1263
+
1264
+ $ git push origin v1.5
1265
+ Counting objects: 50, done.
1266
+ Compressing objects: 100% (38/38), done.
1267
+ Writing objects: 100% (44/44), 4.56 KiB, done.
1268
+ Total 44 (delta 18), reused 8 (delta 1)
1269
+ To git@github.com:schacon/simplegit.git
1270
+ * [new tag] v1.5 -> v1.5
1271
+
1272
+ Si vous avez de nombreuses étiquettes que vous souhaitez pousser en une fois, vous pouvez aussi utiliser l'option `--tags` avec la commande `git push`.
1273
+ Ceci transférera toutes les nouvelles étiquettes vers le serveur distant.
1274
+
1275
+ $ git push origin --tags
1276
+ Counting objects: 50, done.
1277
+ Compressing objects: 100% (38/38), done.
1278
+ Writing objects: 100% (44/44), 4.56 KiB, done.
1279
+ Total 44 (delta 18), reused 8 (delta 1)
1280
+ To git@github.com:schacon/simplegit.git
1281
+ * [new tag] v0.1 -> v0.1
1282
+ * [new tag] v1.2 -> v1.2
1283
+ * [new tag] v1.4 -> v1.4
1284
+ * [new tag] v1.4-lw -> v1.4-lw
1285
+ * [new tag] v1.5 -> v1.5
1286
+
1287
+ À présent, lorsqu'une autre personne clone ou tire depuis votre dépôt, elle obtient aussi les étiquettes.
1288
+
1289
+ ## Trucs et astuces ##
1290
+
1291
+ Avant de clore ce chapitre sur les bases de Git, voici quelques trucs et astuces qui peuvent rendre votre apprentissage de Git plus simple, facile ou familier.
1292
+ De nombreuses personnes utilisent parfaitement Git sans connaître aucun de ces trucs, et nous n'y ferons pas référence, ni ne considérerons leur connaissance comme des pré-requis pour la suite de ce livre, mais il est préférable de les connaître.
1293
+
1294
+
1295
+ ### Auto-Complétion ###
1296
+
1297
+ Si vous utilisez le shell Bash, Git est livré avec un script d'auto-complétion utile.
1298
+ Téléchargez le directement depuis le code source de Git à https://github.com/git/git/blob/master/contrib/git-completion.bash .
1299
+ Copiez ce fichier dans votre répertoire personnel sous le nom `.git-completion.bash` et ajoutez cette ligne à votre fichier `.bashrc` :
1300
+
1301
+ source ~/.git-completion.bash
1302
+
1303
+ Si vous souhaitez paramétrer Bash pour activer la complétion automatique de Git pour tous les utilisateurs, copiez le script dans le répertoire `/opt/local/etc/bash_completion.d` sur les systèmes Mac ou dans le répertoire `/etc/bash_completion.d` sur les systèmes Linux.
1304
+ C'est le répertoire dans lequel Bash lit pour fournir automatiquement la complétion en ligne de commande.
1305
+
1306
+ Si vous utilisez Windows avec le Bash Git, qui est installé par défaut avec Git en msysGit, l'auto-complétion est pré-configurée.
1307
+
1308
+ Pressez la touche Tab lorsque vous écrivez une commande Git, et le shell devrait vous indiquer une liste de suggestions pour continuer la commande :
1309
+
1310
+ $ git co<tab><tab>
1311
+ commit config
1312
+
1313
+ Dans ce cas, taper `git co` et appuyer sur la touche Tab deux fois suggère `commit` et `config`.
1314
+ Ajouter `m<tab>` complète `git commit` automatiquement.
1315
+
1316
+ Cela fonctionne aussi avec les options, ce qui est probablement plus utile.
1317
+ Par exemple, si vous tapez la commande `git log` et ne vous souvenez plus d'une des options, vous pouvez commencer à la taper, et appuyer sur la touche Tab pour voir ce qui peut correspondre :
1318
+
1319
+ $ git log --s<tab>
1320
+ --shortstat --since= --src-prefix= --stat --summary
1321
+
1322
+ C'est une astuce qui peut clairement vous éviter de perdre du temps ou de lire de la documentation.
1323
+
1324
+ ### Les alias Git ###
1325
+
1326
+ Git ne complète pas votre commande si vous ne la tapez que partiellement.
1327
+ Si vous ne voulez pas avoir à taper l'intégralité du texte de chaque commande, vous pouvez facilement définir un alias pour chaque commande en utilisant `git config`.
1328
+ Voici quelques exemples qui pourraient vous intéresser :
1329
+
1330
+ $ git config --global alias.co checkout
1331
+ $ git config --global alias.br branch
1332
+ $ git config --global alias.ci commit
1333
+ $ git config --global alias.st status
1334
+
1335
+ Ceci signifie que, par exemple, au lieu de taper `git commit`, vous n'avez plus qu'à taper `git ci`.
1336
+ Au fur et à mesure de votre utilisation de Git, vous utiliserez probablement d'autres commandes plus fréquemment.
1337
+ Dans ce cas, n'hésitez pas à créer de nouveaux alias.
1338
+
1339
+ Cette technique peut aussi être utile pour créer des commandes qui vous manquent.
1340
+ Par exemple, pour corriger le problème d'ergonomie que vous avez rencontré lors de la désindexation d'un fichier, vous pourriez créer un alias pour désindexer :
1341
+
1342
+ $ git config --global alias.unstage 'reset HEAD --'
1343
+
1344
+ Cela rend les deux commandes suivantes équivalentes :
1345
+
1346
+ $ git unstage fichierA
1347
+ $ git reset HEAD fichierA
1348
+
1349
+ Cela rend les choses plus claires.
1350
+ Il est aussi commun d'ajouter un alias `last`, de la manière suivante :
1351
+
1352
+ $ git config --global alias.last 'log -1 HEAD'
1353
+
1354
+ Ainsi, vous pouvez visualiser plus facilement le dernier *commit* :
1355
+
1356
+ $ git last
1357
+ commit 66938dae3329c7aebe598c2246a8e6af90d04646
1358
+ Author: Josh Goebel <dreamer3@example.com>
1359
+ Date: Tue Aug 26 19:48:51 2008 +0800
1360
+
1361
+ test for current head
1362
+
1363
+ Signed-off-by: Scott Chacon <schacon@example.com>
1364
+
1365
+ Pour explication, Git remplace simplement la nouvelle commande par tout ce que vous lui aurez demandé d'aliaser.
1366
+ Si par contre vous souhaitez lancer une commande externe plutôt qu'une sous-commande Git, vous pouvez commencer votre commande par un caractère `!`.
1367
+ C'est utile si vous écrivez vos propres outils pour travailler dans un dépôt Git.
1368
+ On peut par exemple aliaser `git visual` pour lancer `gitk` :
1369
+
1370
+ $ git config --global alias.visual '!gitk'
1371
+
1372
+ ## Résumé ##
1373
+
1374
+ À présent, vous pouvez réaliser toutes les opérations locales de base de Git — créer et cloner un dépôt, faire des modifications, les indexer et les valider, visualiser l'historique de ces modifications.
1375
+ Au prochain chapitre, nous traiterons de la fonctionnalité unique de Git : son modèle de branches.
1376
+
1377
+ <!-- LocalWords: Junio
1378
+ -->