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,263 @@
1
+ # Per Iniziare #
2
+
3
+ Questo capitolo spiegherà come iniziare ad usare Git. Inizieremo con una introduzione sugli strumenti per il controllo delle versioni, per poi passare a come far funzionare Git sul proprio sistema e quindi come configurarlo per lavorarci. Alla fine di questo capitolo, dovresti capire a cosa serve Git, perché dovresti usarlo e dovresti essere pronto ad usarlo.
4
+
5
+ ## Il Controllo di Versione ##
6
+
7
+ Cos'è il controllo di versione, e perché dovresti usarlo? Il controllo di versione è un sistema che registra, nel tempo, i cambiamenti ad un file o ad una serie di file, così da poter richiamare una specifica versione in un secondo momento. Sebbene gli esempi di questo libro usino i sorgenti di un software per controllarne la versione, qualsiasi file di un computer può essere posto sotto controllo di versione.
8
+
9
+ Se sei un grafico o un webdesigner e vuoi tenere tutte le versioni di un'immagine o di un layout (e sicuramente lo vorrai fare), sarebbe saggio usare un Sistema per il Controllo di Versione (_Version Control System_ - VCS). Un VCS ti permette di ripristinare i file ad una versione precedente, ripristinare l'intero progetto a uno stato precedente, revisionare le modifiche fatte nel tempo, vedere chi ha cambiato qualcosa che può aver causato un problema, chi ha introdotto un problema e quando, e molto altro ancora. Usare un VCS significa anche che se fai un pasticcio o perdi qualche file, puoi facilmente recuperare la situazione. E ottieni tutto questo con poca fatica.
10
+
11
+ ### Sistema di Controllo di Versione Locale ###
12
+
13
+ Molte persone gestiscono le diverse versioni copiando i file in un'altra directory (magari una directory denominata con la data, se sono furbi). Questo approccio è molto comune perché è molto semplice, ma è anche incredibilmente soggetto ad errori. É facile dimenticare in quale directory sei e modificare il file sbagliato o copiare dei file che non intendevi copiare.
14
+
15
+ Per far fronte a questo problema, i programmatori svilupparono VCS locali che avevano un database semplice che manteneva tutti i cambiamenti dei file sotto controllo di revisione (vedi Figura 1-1).
16
+
17
+ Insert 18333fig0101.png
18
+ Figura 1-1. Diagramma di controllo di un sistema locale.
19
+
20
+ Uno dei più popolari strumenti VCS era un sistema chiamato rcs, che è ancora oggi distribuito con molti computer. Anche il popolare sistema operativo Mac OS X include il comando rcs quando si installano gli Strumenti di Sviluppo. Questo strumento funziona salvando sul disco una serie di patch (ovvero le differenze tra i file) tra una versione e l'altra, in un formato specifico; può quindi ricreare lo stato di qualsiasi file in qualsiasi momento determinato momento, aggiungendo le varie patch.
21
+
22
+ ### Sistemi di Controllo di Versione Centralizzati ###
23
+
24
+ Successivamente queste persone dovettero affrontare il problema del collaborare con altri sviluppatori su altri sistemi. Per far fronte a questo problema, vennero sviluppati sistemi di controllo di versione centralizzati (_Centralized Version Control Systems_ - CVCS). Questi sistemi, come CVS, Subversion e Perforce, hanno un unico server che contiene tutte le versioni dei file e un numero di utenti che scaricano i file dal server centrale. Questo è stato lo standard del controllo di versione per molti anni (vedi Figura 1-2).
25
+
26
+ Insert 18333fig0102.png
27
+ Figura 1-2. Diagramma controllo di versione centralizzato.
28
+
29
+ Questa impostazione offre molti vantaggi, specialmente rispetto ai VCS locali. Per esempio, chiunque sa, con una certa approssimazione, cosa stia facendo un'altra persona del progetto. Gli amministratori hanno un controllo preciso su chi può fare cosa, ed è molto più facile amministrare un CVCS che un database locale su ogni client.
30
+
31
+ Questa configurazione ha tuttavia alcune gravi controindicazioni. La più ovvia è che il server centralizzato rappresenta il singolo punto di rottura del sistema. Se questo va giù per un'ora, in quel periodo nessuno può collaborare o salvare una nuova versione di qualsiasi cosa su cui sta lavorando. Se il disco rigido del database centrale si danneggia, e non ci sono i backup, perdi assolutamente tutto: tutta la storia del progetto ad eccezione dei singoli snapshot (istantanee) che le persone possono avere in locale sulle loro macchine. Anche i sistemi locali di VCS soffrono di questo problema: ogni volta che tutta la storia del progetto è in un unico posto, si rischia di perdere tutto.
32
+
33
+ ### Sistemi di Controllo di Versione Distribuiti ###
34
+
35
+ E qui entrano in gioco i Sistemi di Controllo di Versione Distribuiti (_Distributed Version Control Systems_ - DVCS). In un DVCS (come Git, Mercurial, Bazaar o Darcs), i client non solo controllano lo _snapshot_ più recente dei file, ma fanno una copia completa del repository. In questo modo se un server morisse e i sistemi interagiscono tramite il DVCS, il repository di un qualsiasi client può essere copiato sul server per ripristinarlo. Ogni checkout è un backup completo di tutti i dati (vedi Figura 1-3).
36
+
37
+ Insert 18333fig0103.png
38
+ Figura 1-3. Diagramma del controllo di versione distribuito.
39
+
40
+ Inoltre, molti di questi sistemi trattano bene l'avere più repository remoti su cui poter lavorare, così puoi collaborare con gruppi differenti di persone in modi differenti, simultaneamente sullo stesso progetto. Questo ti permette di impostare diversi tipi di flussi di lavoro che non sono possibili in sistemi centralizzati, come i modelli gerarchici.
41
+
42
+ ## Una Breve Storia di Git ##
43
+
44
+ Come per molte grandi cose della vita, Git è nato con un po' di distruzione creativa e polemiche infuocate. Il kernel di Linux è un progetto software open source di grande portata. Per buona parte del tempo (1991-2002) della manutenzione del kernel Linux le modifiche al software venivano passate sotto forma di patch e file compressi. Nel 2002, il progetto del kernel Linux iniziò ad utilizzare un sistema DVCS proprietario chiamato BitKeeper.
45
+
46
+ Nel 2005 il rapporto tra la comunità che sviluppa il kernel Linux e la società commerciale che aveva sviluppato BitKeeper si ruppe, e fu revocato l'uso gratuito di BitKeeper. Ciò indusse la comunità di sviluppo di Linux (e in particolare Linus Torvalds, il creatore di Linux) a sviluppare uno strumento proprio, basandosi su alcune delle lezioni apprese durante l'utilizzo di BitKeeper. Alcuni degli obiettivi del nuovo sistema erano i seguenti:
47
+
48
+ * Velocità
49
+ * Design semplice
50
+ * Ottimo supporto allo sviluppo non-lineare (migliaia di rami paralleli)
51
+ * Completamente distribuito
52
+ * Capacità di gestire, in modo efficiente (velocità e dimensione dei dati), grandi progetti come il kernel Linux
53
+
54
+ Fin dalla sua nascita nel 2005 Git si è evoluto e maturato per essere facile da usare e tuttora mantiene le sue qualità iniziali. È incredibilmente veloce, è molto efficiente con progetti grandi e ha un incredibile sistema di ramificazioni, per lo sviluppo non lineare (Vedi Capitolo 3).
55
+
56
+ ## Basi di Git ##
57
+
58
+ Quindi, cos'è Git in poche parole? Questa è una sezione importante da comprendere, perché se capisci che cos'è Git e gli elementi fondamentali di come funziona, allora sarà probabilmente molto più facile per te usare efficacemente Git. Mentre impari Git, cerca di liberare la tua mente dalle cose che eventualmente già conosci di altri VCS come Subversion e Perforce; ciò ti aiuterà a evitare di far confusione utilizzando lo strumento. Git immagazzina e tratta le informazioni in modo molto diverso dagli altri sistemi, anche se l'interfaccia utente è abbastanza simile; comprendere queste differenze aiuta a prevenire di sentirsi confusi mentre lo si usa.
59
+
60
+ ### Istantanee, non Differenze ###
61
+
62
+ La principale differenza tra Git e gli altri VCS (inclusi Subversion e compagni), è come Git considera i suoi dati. Concettualmente la maggior parte degli altri sistemi salvano l'informazione come una lista di modifiche ai file. Questi sistemi (CVS, Subversion, Perforce, Bazaar e così via), considerano le informazioni che mantengono come un insieme di file, con le relative modifiche fatte ai file nel tempo, come illustrato in Figura 1-4.
63
+
64
+ Insert 18333fig0104.png
65
+ Figura 1-4. Gli altri sistemi tendono ad immagazzinare i dati come cambiamenti alla versione base di ogni file.
66
+
67
+ Git non considera i dati né li registra in questo modo. Git considera i propri dati più come una serie di istantanee (_snapshot_) di un mini filesystem. Ogni volta che committi, o salvi lo stato del tuo progetto in Git, fondamentalmente lui fa un'immagine di tutti i file in quel momento, salvando un riferimento allo _snapshot_. Per essere efficiente, se alcuni file non sono cambiati, Git non li risalva, ma crea semplicemente un collegamento al file precedente già salvato. Git considera i propri dati più come in Figura 1-5.
68
+
69
+ Insert 18333fig0105.png
70
+ Figura 1-5. Git immagazzina i dati come snapshot del progetto nel tempo.
71
+
72
+ Questa è una distinzione importante tra Git e pressocché tutti gli altri VCS. Git riconsidera quasi tutti gli aspetti del controllo di versione che la maggior parte degli altri sistemi ha copiato dalle generazioni precedenti. Questo rende Git più simile a un mini filesystem con a disposizione strumenti incredibilmente potenti che un semplice VCS. Esploreremo alcuni benefici che ottieni pensando in questo modo ai tuoi dati e vedremo le ramificazioni (i _branch_) in Git nel Capitolo 3.
73
+
74
+ ### Quasi Tutte le Operazioni Sono Locali ###
75
+
76
+ La maggior parte delle operazioni in Git, necessitano solo di file e risorse locali per operare — generalmente non occorrono informazioni da altri computer della rete. Se sei abituato ad un CVCS in cui la maggior parte delle operazioni sono soggette alle latenze di rete, questo aspetto di Git ti farà pensare che gli Dei della velocità abbiano benedetto Git con poteri soprannaturali. Poiché hai l'intera storia del progetto sul tuo disco locale, molte operazioni sembrano quasi istantanee.
77
+
78
+ Per esempio, per navigare la storia di un progetto, Git non ha bisogno di connettersi al server per scaricarla e per poi mostrarla: la legge direttamente dal tuo database locale. Questo significa che puoi vedere la storia del progetto quasi istantaneamente. Se vuoi vedere le modifiche introdotte tra la versione corrente e la versione di un mese fa di un file, Git può accedere al file com'era un mese fa e calcolare le differenze localmente, invece di dover chiedere a un server remoto di farlo o di scaricare dal server remoto una versione precedente del file, per poi farlo in locale.
79
+
80
+ Questo significa anche che sono pochissime le cose che non puoi fare se sei offline o non sei connesso alla VPN. Se sei in aereo o sul treno e vuoi fare un po' di lavoro, puoi committare tranquillamente in attesa di essere di nuovo connesso per fare l'upload. Se vai a casa e il tuo client VPN non funziona correttamente, puoi lavorare ugualmente. In molti altri sistemi questo è impossibile o molto penoso. Con Perforce, per esempio, puoi fare ben poco se non sei connesso al server; e con Subversion e CVS, puoi modificare i file, ma non puoi inviare le modifiche al tuo database (perché il database è offline). Tutto ciò potrebbe non sembrarti una gran cosa, ma potrebbe sorprenderti quanta differenza possa fare.
81
+
82
+ ### Git Ha Integrità ###
83
+
84
+ Qualsiasi cosa in Git è controllata, tramite checksum, prima di essere salvata ed è referenziata da un checksum. Questo significa che è impossibile cambiare il contenuto di qualsiasi file o directory senza che Git lo sappia. Questa è una funzionalità interna di basso livello di Git ed è intrinseco della sua filosofia. Non può capitare che delle informazioni in transito si perdano o che un file si corrompa senza che Git non sia in grado di accorgersene.
85
+
86
+ Il meccanismo che Git usa per fare questo checksum è un hash chiamato SHA-1. Si tratta di una stringa di 40-caratteri, composta da caratteri esadecimali (0–9 ed a–f) e calcolata in base al contenuto di file o della struttura della directory in Git. Un hash SHA-1 assomiglia a qualcosa come:
87
+
88
+ 24b9da6552252987aa493b52f8696cd6d3b00373
89
+
90
+ Vedrai questi hash dappertutto in Git perché li usa tantissimo. Infatti Git salva qualsiasi cosa nel suo database, e il riferimento ad un file non è basato sul nome del file, ma sull'hash del suo contenuto.
91
+
92
+ ### Git Generalmente Aggiunge Solo Dati ###
93
+
94
+ Quasi tutte le azioni in Git aggiungono dati al database di Git. È piuttosto difficile fare qualcosa che non sia annullabile o che cancelli i dati in una qualche maniera. Come negli altri VCS, puoi perdere o fare confusione con le modifiche che non hai ancora committato, ma dopo aver committato uno snapshot in Git, è veramente difficile perderle, specialmente se regolarmente fai il push del tuo database su un altro repository.
95
+
96
+ Questo rende piaceole l'uso di Git perché sappiamo che possiamo sperimentare senza il pericolo di causare danni pesanti. Per un maggior approfondimento su come Git salvi i dati e come tu possa recuperare quelli che sembrino persi, consulta il Capitolo 9.
97
+
98
+ ### I Tre Stati ###
99
+
100
+ Ora, presta attenzione. La prima cosa da ricordare sempre di Git se vuoi affrontare al meglio il processo di apprendimento è che i tuoi file in Git possono essere in tre stati: _committed_ (committati), _modified_ (modificati) e _staged_ (in stage). Committato significa che il file è al sicuro nel database locale. Modificato significa che il file è stato modificato, ma non è ancora stato committato nel database. In stage significa che hai contrassegnato un file, modificato nella versione corrente, perché venga inserito nello snapshot alla prossima commit.
101
+
102
+ Questo ci porta alle tre sezioni principali di un progetto Git: la directory di Git, la directory di lavoro e l'area di stage.
103
+
104
+ Insert 18333fig0106.png
105
+ Figura 1-6. Directory di lavoro, area di stage e directory di Git.
106
+
107
+ La directory di Git è dove Git salva i metadati e il database degli oggetti del tuo progetto. Questa è la parte più importante di Git, ed è ciò che viene copiato quando si clona un repository da un altro computer.
108
+
109
+ La directory di lavoro è un checkout di una versione specifica del progetto. Questi file vengono estratti dal database compresso nella directory di Git, e salvati sul disco per essere usati o modificati.
110
+
111
+ L'area di stage è un file, contenuto generalmente nella directory di Git, con tutte le informazioni riguardanti la tua prossima commit. A volte viene indicato anche come 'indice', ma lo standard è definirlo come 'area di stage' (area di sosta, ndt).
112
+
113
+ Il flusso di lavoro (_workflow_) di base in Git funziona così:
114
+
115
+ 1. Modifica i file nella tua directory di lavoro
116
+ 2. Fanne lo stage, aggiungendone le istantanee all'area di stage
117
+ 3. Committa, ovvero salva i file nell'area di stage in un'istantanea (_snapshot_) permanente nella tua directory di Git.
118
+
119
+ Se una particolare versione di un file è nella directory git, viene considerata già committata. Se il file è stato modificato, ma è stato aggiunto all'area di staging, è _in stage_. E se è stato modificato da quando è stata estratto, ma non è _in stage_, è modificato. Nel Capitolo 2, imparerai di più su questi stati e come trarne vantaggio o saltare la parte di staging.
120
+
121
+ ## Installare Git ##
122
+
123
+ Incominciamo ad usare un po' di Git! Per prima cosa devi installarlo. Puoi ottenere Git in diversi modi; i principali due sono: installarlo dai sorgenti o installarlo da un pacchetto pre-esistente per la tua piattaforma.
124
+
125
+ ### Installare da Sorgenti ###
126
+
127
+ Se puoi, generalmente è vantaggioso installare Git dai sorgenti perché avrai la versione più recente. Ogni versione di Git tende ad includere utili miglioramenti all'interfaccia utente e avere quindi l'ultima versione disponibile è spesso la scelta migliore, se hai familiarità con la compilazione dei sorgenti. Inoltre capita anche, che molte distribuzioni Linux usino pacchetti molto vecchi; perciò, se non stai usando una distro aggiornata o dei backport, l'installazione da sorgente può essere la cosa migliore da fare.
128
+
129
+ Per installare Git, hai bisogno delle librerie da cui dipende Git che sono: curl, zlib, openssl, expat e libiconv. Per esempio, se sei su un sistema che usa yum (come Fedora), o apt-get (come nei sistemi Debian), puoi usare uno dei seguenti comandi per installare tutte le dipendenze:
130
+
131
+ $ yum install curl-devel expat-devel gettext-devel \
132
+ openssl-devel zlib-devel
133
+
134
+ $ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
135
+ libz-dev
136
+
137
+ Quando avrai tutte le dipendenze necessarie, puoi proseguire ed andare a recuperare l'ultimo snapshot dal sito web di Git:
138
+
139
+ http://git-scm.com/download
140
+
141
+ Poi, compilalo ed installalo:
142
+
143
+ $ tar -zxf git-1.7.2.2.tar.gz
144
+ $ cd git-1.7.2.2
145
+ $ make prefix=/usr/local all
146
+ $ sudo make prefix=/usr/local install
147
+
148
+ Dopo aver fatto questo, puoi scaricare gli aggiornamenti di Git con lo stesso Git:
149
+
150
+ $ git clone git://git.kernel.org/pub/scm/git/git.git
151
+
152
+ ### Installare su Linux ###
153
+
154
+ Se vuoi installare Git su Linux, tramite una installazione da binario, generalmente puoi farlo con lo strumento base di amministrazione dei pacchetti della tua distribuzione. Se usi Fedora, puoi usare yum:
155
+
156
+ $ yum install git
157
+
158
+ O, se usi una distribuzione basata su Debian (come Ubuntu) prova apt-get:
159
+
160
+ $ apt-get install git
161
+
162
+ ### Installazione su Mac ###
163
+
164
+ Ci sono due metodi per installare facilmente Git su Mac. Il più semplice è usare l'installazione l'installer grafico di Git, che puoi scaricare da SourceForge (vedi Figura 1-7):
165
+
166
+ http://sourceforge.net/projects/git-osx-installer/
167
+
168
+ Insert 18333fig0107.png
169
+ Figura 1-7. Installer di Git per OS X.
170
+
171
+ La prima alternativa è usando MacPorts (`http://www.macports.org`). Se hai già installato MacPorts puoi installare Git con:
172
+
173
+ $ sudo port install git +svn +doc +bash_completion +gitweb
174
+
175
+ Non ti occorre aggiungere tutti i pacchetti extra, ma probabilmente vorrai includere +svn, nel caso tu debba usare Git con i repository di Subversion (vedi Capitolo 8).
176
+
177
+ La seconda alternativa è Homebrew (`http://brew.sh/`). Se hai già installato Homebrew puoi installare Git con:
178
+
179
+ $ brew install git
180
+
181
+ ### Installare su Windows ###
182
+
183
+ Installare Git su Windows è davvero facile. Il progetto msysGit ha una delle procedure di installazione più facili. Semplicemente scarica l'eseguibile dalla pagina di GitHub e lancialo:
184
+
185
+ http://msysgit.github.io/
186
+
187
+ Una volta installato avrai a disposizione sia la versione da riga di comando (incluso un client SSH ti servirà in seguito) sia l'interfaccia grafica (_GUI_) standard.
188
+
189
+ Nota sull'uso su Windows: dovresti usare Git con la shell msysGit fornita (stile Unix) perché permette di usare le complesse linee di comando di questo libro. Se hai bisogno, per qualche ragione, di usare la shell nativa di Windows / la console a linea di comando, devi usare le doppie virgolette invece delle virgolette singole (per i parametri con che contengono spazi) e devi virgolettare i parametri che terminano con l'accento circonflesso (^) se questi sono al termine della linea, poiché in Windows è uno dei simboli di proseguimento.
190
+
191
+ ## Prima Configurazione di Git ##
192
+
193
+ Ora che hai Git sul tuo sistema vorrai fare un paio di cose per personalizzare l'ambiente di Git. Devi farle solo una volta: rimarrano invariate anche dopo un aggiornamento. Puoi comunque cambiarle in ogni momento, rieseguendo i comandi.
194
+
195
+ Git viene con uno strumento che si chiama 'git config' che ti permetterà d'impostare e conoscere le variabili di configurazione che controllano ogni aspetto di come appare Git e come opera. Queste variabili possono essere salvate in tre posti differenti:
196
+
197
+ * `/etc/gitconfig`: Contiene i valori per ogni utente sul sistema e per tutti i loro repository. Se passi l'opzione` --system` a `git config`, lui legge e scrive da questo file specifico.
198
+ * `~/.gitconfig`: Specifico per il tuo utente. Puoi far leggere e scrivere a Git questo file passando l'opzione `--global`.
199
+ * file di configurazione nella directory git (cioè `.git/config`) di qualsiasi repository che si stia usando. È Specifico di quel singolo repository. Ogni livello sovrascrive i valori del precedente, così che i valori in `.git/config` vincono su quelli in `/etc/gitconfig`.
200
+
201
+ Su Windows Git cerca il file `.gitconfig` nella directory `$HOME` (`%USERPROFILE%` in Windows), che per la maggior parte delle persone è `C:\Documents and Settings\$USER` o `C:\Users\$USER`, dipendendo dalla versione (`$USER` è `%USERNAME%` in Windows). Controlla comunque anche /etc/gitconfig, sebbene sia relativo alla root di MSys, che è dove hai deciso di installare Git in Windows quando si lancia l'installazione.
202
+
203
+ ### La tua Identità ###
204
+
205
+ La prima cosa che occorrerebbe fare quando installi Git è impostare il tuo nome utente e il tuo indirizzo e-mail. Questo è importante perché ogni commit di Git usa queste informazioni che vengono incapsulate nelle tue commit:
206
+
207
+ $ git config --global user.name "John Doe"
208
+ $ git config --global user.email johndoe@example.com
209
+
210
+ Con l'opzione `--global` dovrai farlo solo una volta, dopo di che Git userà sempre queste informazioni per qualsiasi operazione fatta sul sistema. Se vuoi sovrascriverle con un nome o una e-mail diversi per progetti specifici potrai eseguire il comando senza l'opzione `--global`stando in uno di quei progetti.
211
+
212
+ ### Il tuo Editor ###
213
+
214
+ Ora che hai configurato la tua identità, puoi configurare il tuo editor di testo predefinito, che verrà usato quando Git avrà bisogno che scriva un messaggio. Per impostazione predefinita Git usa l'editor di testo predefinito del sistema, che generalmente è Vi o Vim. Se vuoi usarne uno diverso, come Emacs, potrai eseguire:
215
+
216
+ $ git config --global core.editor emacs
217
+
218
+ ### Il tuo Diff ###
219
+
220
+ Un'altra opzione utile che potresti voler configurare, è lo strumento diff predefinito, da usare per risolvere i conflitti di _merge_ (unione, ndt). Per usare vimdiff, potrai eseguire:
221
+
222
+ $ git config --global merge.tool vimdiff
223
+
224
+ Git accetta kdeff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge e opendiff, come strumenti di merge validi. Puoi anche definire uno personalizzato: vedi il Capitolo 7 per maggiori informazioni su come farlo.
225
+
226
+ ### Controlla le tue impostazioni ###
227
+
228
+ Per controllare le tue impostazioni puoi usare il comando `git config --list` che elenca tutte le impostazioni attuali di Git:
229
+
230
+ $ git config --list
231
+ user.name=Scott Chacon
232
+ user.email=schacon@gmail.com
233
+ color.status=auto
234
+ color.branch=auto
235
+ color.interactive=auto
236
+ color.diff=auto
237
+ ...
238
+
239
+ Potresti vedere più volte la stessa chiave perché Git legge la stessa chiave da file differenti (`/etc/gitconfig` e `~/.gitconfig`, per esempio). In questo caso, Git usa l'ultimo valore per ogni chiave unica che trova.
240
+
241
+ Puoi anche controllare quale sia il valore di una chiave specifica digitando `git config {key}`:
242
+
243
+ $ git config user.name
244
+ Scott Chacon
245
+
246
+ ## Ottieni aiuto ##
247
+
248
+ Se dovessi avere bisogno di aiuto durante l'uso di Git, ci sono tre modi per vedere le pagine del manuale (_manpage_) per ogni comando di Git:
249
+
250
+ $ git help <verb>
251
+ $ git <verb> --help
252
+ $ man git-<verb>
253
+
254
+ Per esempio, puoi consultare la pagina del manuale per il comando config digitanto
255
+
256
+ $ git help config
257
+
258
+ Questi comandi sono utili perché puoi accedervi dappertutto, anche quando sei offline.
259
+ Se il manuale e questo libro non fossero sufficienti e avessi bisogno dell'aiuto di una persona, puoi provare i canali `#git` o `#github` sul server IRC di Freenode (irc.freenode.com). Questi canali sono frequentati regolarmente da centinaia di persone che conoscono molto bene Git e spesso sono disponibili per dare una mano.
260
+
261
+ ## Sommario ##
262
+
263
+ Dovresti avere le basi per capire cos'è Git e com'è diverso dai CVCS che potresti aver usato. Dovresti avere già una versione funzionante di Git sul tuo sistema che è configurata con i tuoi dati. È ora tempo di imparare alcune delle basi di Git.
@@ -0,0 +1,1227 @@
1
+ # Basi di Git #
2
+
3
+ Se puoi leggere un solo capitolo per imparare Git, leggi questo. Questo capitolo illustra tutti i comandi base di cui hai bisogno per la stragrande maggioranza delle cose che farai con Git. Alla fine del capitolo sarai in grado di configurare e creare un repository, iniziare e interrompere il tracciamento dei file e mettere in stage e committare le modifiche. Vedremo come impostare Git per ignorare certi file o pattern, come annullare velocemente e facilmente gli errori, come navigare la cronologia del tuo progetto e vedere le modifiche tra le varie commit e come fare il push ed il pull da repository remoti.
4
+
5
+ ## Repository Git ##
6
+
7
+ Puoi creare un progetto Git principalmente con due approcci. Il primo prende un progetto esistente o una directory e la importa in Git. Il secondo clona un repository Git esistente, su un altro server.
8
+
9
+ ### Creare un repository in una directory preesistente ###
10
+
11
+ Se vuoi iniziare a tenere traccia con Git di un progetto esistente, devi andare nella directory del progetto e digitare:
12
+
13
+ $ git init
14
+
15
+ Questo creerà una nuova sottodirectory chiamata `.git` che conterrà tutti i file necessari per il tuo repository, una struttura del repository Git. A questo punto non è ancora stato tracciato niente del tuo progetto. (Vedi il *Capitolo 9* per sapere quali file sono contenuti nella directory `.git` che hai appena creato.)
16
+
17
+ Se vuoi iniziare a tracciare i file esistenti (a differenza di una directory vuota), dovresti iniziare a monitorare questi file con una commit iniziale. Lo puoi fare con pochi `git add`, che specificano quali file vuoi tracciare, seguiti da una commit:
18
+
19
+ $ git add *.c
20
+ $ git add README
21
+ $ git commit -m 'initial project version'
22
+
23
+ Tra un minuto vedremo cosa fanno questi comandi. A questo punto hai un repository Git con dei file tracciati e una commit iniziale.
24
+
25
+ ### Clonare un Repository Esistente ###
26
+
27
+ Se vuoi copiare un repository Git esistente — per esempio, un progetto a cui vuoi contribuire — il comando di cui hai bisogno è `git clone`. Se hai familiarità con altri sistemi VCS come Subversion, noterai che il comando è `clone` e non `checkout`. Questa è una distinzione importante: Git riceve una copia di quasi tutti i dati che sono sul server. Quando esegui `git clone` vengono scaricate tutte le versioni di ciascun file della cronologia del progetto. Infatti, se si danneggiasse il disco del tuo server, potresti usare qualsiasi clone di qualsiasi client per ripristinare il server allo stato in cui era quando è stato clonato (potresti perdere alcuni `hooks` lato-server, ma tutte le versioni dei dati saranno presenti: vedi il *Capitolo 4* per maggiori dettagli).
28
+
29
+ Cloni un repository con `git clone [url]`. Per esempio, se vuoi clonare la libreria Ruby Git chiamata Grit, puoi farlo così:
30
+
31
+ $ git clone git://github.com/schacon/grit.git
32
+
33
+ Questo comando crea un directory "grit", dentro di questa inizializza una directory `.git`, scarica tutti i dati del repository e fa il checkout dell'ultima versione per poterci lavorare su. Se vai nella nuova directory `grit`, vedrai i file del progetto, pronti per essere modificati o usati. Se vuoi clonare il repository in una directory con un nome diverso da grit, puoi specificarlo sulla riga di comando:
34
+
35
+ $ git clone git://github.com/schacon/grit.git mygrit
36
+
37
+ Questo comando fa la stessa cosa del precedente, ma la directory di destinazione è chiamata `mygrit`.
38
+
39
+ Git può usare differenti protocolli di trasferimento. L'esempio precedente usa il protocollo `git://`, ma puoi anche vedere `http(s)://` o `user@server:/path.git`, che usa il protocollo di trasferimento SSH. Il *Capitolo 4* introdurrà tutte le opzioni che un server può rendere disponibili per l'accesso al repository Git e i pro e i contro di ciascuna.
40
+
41
+ ## Salvare le modifiche sul repository ##
42
+
43
+ Hai clonato un vero repository Git e hai la copia di lavoro dei file del progetto. Ora puoi fare qualche modifica e inviare gli snapshots di queste al tuo repository ogni volta che il progetto raggiunga uno stato che vuoi salvare.
44
+
45
+ Ricorda che ogni file della tua directory di lavoro può essere in uno dei due stati seguenti: *tracked* (tracciato, ndt.) o *untracked* (non tracciato, ndt.). I file *tracked* sono già presenti nell'ultimo snapshot; possono quindi essere *unmodified* (non modificati, ndt.), *modified* (modificati, ndt.) o *staged*. I file *untracked* sono tutti gli altri: qualsiasi file nella tua directory di lavoro che non è presente nell'ultimo snapshot o nella tua area di stage. Quando cloni per la prima volta un repository, tutti i tuoi file sono tracciati e non modificati perché li hai appena prelevati e non hai modificato ancora niente.
46
+
47
+ Quando editi dei file, Git li vede come modificati, perché sono cambiati rispetto all'ultima commit. Metti nell'area di stage i file modificati e poi fai la commit di tutto ciò che è in quest'area, e quindi il ciclo si ripete. Questo ciclo di vita è illustrato nella Figura 2-1.
48
+
49
+ Insert 18333fig0201.png
50
+ Figura 2-1. Il ciclo di vita dello stato dei tuoi file.
51
+
52
+ ### Controlla lo stato dei tuoi file ###
53
+
54
+ Lo strumento principale che userai per determinare lo stato dei tuoi file è il comando `git status`. Se esegui questo comando appena dopo un clone, dovresti vedere qualcosa di simile:
55
+
56
+ $ git status
57
+ # On branch master
58
+ nothing to commit, working directory clean
59
+
60
+ Questo significa che hai una directory di lavoro pulita, ovvero che nessuno dei file tracciati è stato modificato. Inoltre Git non ha trovato nessun file non ancora tracciato, altrimenti sarebbero elencati qui. In aggiunta il comando indica anche in quale ramo sei. Per ora, è sempre `master`, che è il predefinito; non preoccupartene per ora. Il prossimo capitolo tratterà in dettagli dei `branch` (ramificazioni) e dei riferimenti.
61
+
62
+ Immagina di aver aggiunto un nuovo file al tuo progetto, un semplice README. Se il file non esisteva e lanci `git status`, vedrai così il file non tracciato:
63
+
64
+ $ vim README
65
+ $ git status
66
+ On branch master
67
+ Untracked files:
68
+ (use "git add <file>..." to include in what will be committed)
69
+
70
+ README
71
+
72
+ nothing added to commit but untracked files present (use "git add" to track)
73
+
74
+ Puoi vedere che il nuovo file README non è tracciato poiché nell'output è nella sezione dal titolo "Untracked files". `Untracked` significa che Git vede un file che non avevi nello `snapshot` precedente (commit); Git non lo includerà negli snapshot delle tuoe commit fino a quando non glielo dirai esplicitamente. Fa così per evitare che includa accidentalmente dei file binari generati o qualsiasi altro tipo di file che non intendi includere. Se vuoi includere il README, iniziamo a tracciarlo.
75
+
76
+ ### Tracciare Nuovi File ###
77
+
78
+ Per iniziare a tracciare un nuovo file, si usa il comando `git add`. Per tracciare il file `README`, usa questo comando:
79
+
80
+ $ git add README
81
+
82
+ Se lanci nuovamente il comando per lo stato, puoi vedere che il tuo file `README` ora è tracciato e nell'area di `stage`:
83
+
84
+ $ git status
85
+ On branch master
86
+ Changes to be committed:
87
+ (use "git reset HEAD <file>..." to unstage)
88
+
89
+ new file: README
90
+
91
+
92
+ Sai che è nell'area di `stage` perché è nella sezione "Changes to be committed". Se a questo punto fai commit, la versione del file com'era quando hai lanciato `git add` sarà quella che troverai nella cronologia dello snapshot. Ricorderai che quando prima hai eseguito `git init`, poi hai dovuto lanciare `git add (file)`, che era necessario per iniziare a tracciare i file nella tua directory. Il comando `git add` accetta il nome del percorso di un file o una directory; se è una directory, il comando aggiunge ricorsivamente tutti i file in quella directory.
93
+
94
+ ### Fare lo stage dei file modificati ###
95
+
96
+ Modifichiamo un file che è già tracciato. Se modifichi un file tracciato chiamato `benchmarks.rb` e poi esegui il comando `status`, otterrai qualcosa di simile a:
97
+
98
+ $ git status
99
+ On branch master
100
+ Changes to be committed:
101
+ (use "git reset HEAD <file>..." to unstage)
102
+
103
+ new file: README
104
+
105
+ Changes not staged for commit:
106
+ (use "git add <file>..." to update what will be committed)
107
+ (use "git checkout -- <file>..." to discard changes in working directory)
108
+
109
+ modified: benchmarks.rb
110
+
111
+
112
+ Il file benchmarks.rb appare nella sezione chiamata "Changes not staged for commit" — che significa che un file tracciato è stato modificato nella directory di lavoro ma non è ancora nello stage. Per farlo, esegui il comando `git add` (è un comando multifunzione — lo usi per iniziare a tracciare nuovi file, per fare lo stage dei file e per fare altre cose, ad esempio per segnare come risolti i conflitti causati da un `merge`). Esegui `git add` per mettere in `stage` il file benchmarks.rb, e riesegui `git status`:
113
+
114
+ $ git add benchmarks.rb
115
+ $ git status
116
+ On branch master
117
+ Changes to be committed:
118
+ (use "git reset HEAD <file>..." to unstage)
119
+
120
+ new file: README
121
+ modified: benchmarks.rb
122
+
123
+
124
+ Entrambi i file sono nello `stage` e staranno nella prossima commit. A questo punto, immagina che ti sia ricordato di una piccola modifica da fare in 'benchmarks.rb' prima della commit. Riapri il file e fai la modifica: ora sei pronto per la commit. Come sempre, esegui `git status` di nuovo:
125
+
126
+ $ vim benchmarks.rb
127
+ $ git status
128
+ On branch master
129
+ Changes to be committed:
130
+ (use "git reset HEAD <file>..." to unstage)
131
+
132
+ new file: README
133
+ modified: benchmarks.rb
134
+
135
+ Changes not staged for commit:
136
+ (use "git add <file>..." to update what will be committed)
137
+ (use "git checkout -- <file>..." to discard changes in working directory)
138
+
139
+ modified: benchmarks.rb
140
+
141
+
142
+ Cos'è successo? Ora `benchmarks.rb` è elencato sia dentro che fuori lo `stage`. Come è possibile? È saltato fuori che Git ha messo in `stage` il file esattamente com'era quando hai eseguito `git add`. Se committi ora, la versione di `benchmarks.rb` che verrà committata sarà quella che avevi quando hai eseguito il `git add`, non la versione del file che trovi nella directory di lavoro quando esegui `git commit`. Se modifichi un file dopo che hai eseguito `git add`, devi rieseguire `git add` per mettere nello `stage` l'ultima versione del file:
143
+
144
+ $ git add benchmarks.rb
145
+ $ git status
146
+ On branch master
147
+ Changes to be committed:
148
+ (use "git reset HEAD <file>..." to unstage)
149
+
150
+ new file: README
151
+ modified: benchmarks.rb
152
+
153
+
154
+ ### Ignorare File ###
155
+
156
+ Spesso hai dei file che non vuoi che Git aggiunga automaticamente e nemmeno che te li mostri come tracciati. Generalmente si tratta di file generati automaticamente, come i log o quelli prodotti dal tuoi sistema di `build`. In questi casi puoi creare un file chiamato `.gitignore` con la lista di pattern dei file che vuoi ignorare. Questo è un `.gitignore` d'esempio:
157
+
158
+ $ cat .gitignore
159
+ *.[oa]
160
+ *~
161
+
162
+ La prima riga dice a Git di ignorare qualsiasi file che finisce in `.o` o `.a` — file di oggetti o archivi che possono essere il prodotto di una compilazione del tuo codice. La seconda riga dice a Git di ignorare tutti i file che finiscono con tilde (`~`), che è usata da alcuni editor di testo come Emacs per marcare i file temporanei. Puoi anche includere le directory `log`, `tmp` o `pid`, documenti generati automaticamente e così via. Definire un file `.gitignore` prima di iniziare generalmente è una buona idea, così eviti il rischio di committare accidentalmente dei file che non vuoi nel tuo repository Git.
163
+
164
+ Queste sono le regole per i pattern che puoi usare in `.gitignore`:
165
+
166
+ * Le righe vuote o che inizino con `#` vengono ignorate.
167
+ * Gli standard `glob pattern` funzionano (http://it.wikipedia.org/wiki/Glob_pattern, ndt).
168
+ * Puoi terminare i pattern con uno slash (`/`) per indicare una directory.
169
+ * Puoi negare un pattern facendolo iniziare con un punto esclamativo (`!`).
170
+
171
+ I `glob pattern` sono come espressioni regolari semplificate, usate dalla shell. L'asterisco (`*`) corrisponde a zero o più caratteri; `[abc]` corrisponde a ogni carattere all'interno delle parentesi (in questo caso `a`, `b`, o `c`); il punto interrogativo (`?`) corrisponden ad un carattere singolo; e i caratteri all'interno delle parentesi quadre separati dal segno meno (`[0-9]`) corrispondono ad ogni carattere all'interno dell'intervallo (in questo caso da 0 a 9).
172
+
173
+ Questo è un altro esempio di file `.gitignore`:
174
+
175
+ # un commento - questo è ignorato
176
+ # escludi i file .a
177
+ *.a
178
+ # ma traccia lib.a, sebbene su tu stia ignorando tutti i file `.a`
179
+ !lib.a
180
+ # ignora solo il TODO nella root, e non subdir/TODO
181
+ /TODO
182
+ # ignora tutti i file nella directory build/
183
+ build/
184
+ # ignora doc/note.txt, ma non doc/server/arch.txt
185
+ doc/*.txt
186
+ # ignora tutti i file .txt nella directory doc/
187
+ doc/**/*.txt
188
+
189
+ Il pattern `**/` è disponibile in Git dalla version 1.8.2.
190
+
191
+ ### Mostra le modifiche dentro e fuori lo `stage` ###
192
+
193
+ Se `git status` è troppo vago per te - vuoi sapere cos'è stato effettivamente modificato e non solo quali file — puoi usare il comando `git diff`. Tratteremo più avanti `git diff` con maggior dettaglio, ma probabilmente lo userai molto spesso per rispondere a queste due domande: Cos'è che hai modificato ma non è ancora in `stage`? E cos'hai nello `stage` che non hai ancora committato? Sebbene `git status` risponda a queste domande in modo generico, `git diff` mostra le righe effettivamente aggiunte e rimosse — la patch così com'è.
194
+
195
+ Supponiamo che tu abbia modificato nuovamente `README` e `benchmarks.rb` ma messo nello `stage` solo il primo. Se esegui il comando `status`, vedrai qualcosa come questo:
196
+
197
+ $ git status
198
+ On branch master
199
+ Changes to be committed:
200
+ (use "git reset HEAD <file>..." to unstage)
201
+
202
+ new file: README
203
+
204
+ Changes not staged for commit:
205
+ (use "git add <file>..." to update what will be committed)
206
+ (use "git checkout -- <file>..." to discard changes in working directory)
207
+
208
+ modified: benchmarks.rb
209
+
210
+
211
+ Per vedere cosa hai modificato, ma non ancora nello `stage`, digita `git diff` senza altri argomenti:
212
+
213
+ $ git diff
214
+ diff --git a/benchmarks.rb b/benchmarks.rb
215
+ index 3cb747f..da65585 100644
216
+ --- a/benchmarks.rb
217
+ +++ b/benchmarks.rb
218
+ @@ -36,6 +36,10 @@ def main
219
+ @commit.parents[0].parents[0].parents[0]
220
+ end
221
+
222
+ + run_code(x, 'commits 1') do
223
+ + git.commits.size
224
+ + end
225
+ +
226
+ run_code(x, 'commits 2') do
227
+ log = git.commits('master', 15)
228
+ log.size
229
+
230
+ Questo comando confronta cosa c'è nella tua directory di lavoro con quello che c'è nella tua area di `stage`. Il risultato mostra le tue modifiche che ancora non hai messo nello `stage`.
231
+
232
+ Se vuoi vedere cosa c'è nello `stage` e che farà parte della prossima commit, puoi usare `git diff --cached`. (Da Git 1.6.1 in poi, puoi usare anche `git diff --staged`, che dovrebbe essere più facile da ricordare). Questo comando confronta le modifiche che hai nell'area di `stage` e la tua ultima commit:
233
+
234
+ $ git diff --cached
235
+ diff --git a/README b/README
236
+ new file mode 100644
237
+ index 0000000..03902a1
238
+ --- /dev/null
239
+ +++ b/README2
240
+ @@ -0,0 +1,5 @@
241
+ +grit
242
+ + by Tom Preston-Werner, Chris Wanstrath
243
+ + http://github.com/mojombo/grit
244
+ +
245
+ +Grit is a Ruby library for extracting information from a Git repository
246
+
247
+ È importante notare che `git diff` di per se non visualizza tutte le modifiche fatte dall'ultima commit, ma solo quelle che non sono ancora in `stage`. Questo può confondere, perché se hai messo in `stage` tutte le tue modifiche, `git diff` non mostrereà nulla.
248
+
249
+ Ecco un altro esempio, se metti in `stage` il file `benchmarks.rb` e lo modifichi, puoi usare `git diff` per vedere quali modifiche al file sono in stage e i quali non ancora:
250
+
251
+ $ git add benchmarks.rb
252
+ $ echo '# test line' >> benchmarks.rb
253
+ $ git status
254
+ On branch master
255
+ Changes to be committed:
256
+ (use "git reset HEAD <file>..." to unstage)
257
+
258
+ modified: benchmarks.rb
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
+ Puoi quindi usare `git diff` per vedere cosa non è ancora in `stage`
268
+
269
+ $ git diff
270
+ diff --git a/benchmarks.rb b/benchmarks.rb
271
+ index e445e28..86b2f7c 100644
272
+ --- a/benchmarks.rb
273
+ +++ b/benchmarks.rb
274
+ @@ -127,3 +127,4 @@ end
275
+ main()
276
+
277
+ ##pp Grit::GitRuby.cache_client.stats
278
+ +# test line
279
+
280
+ e `git diff --cached` per vedere cos'è già in `stage`:
281
+
282
+ $ git diff --cached
283
+ diff --git a/benchmarks.rb b/benchmarks.rb
284
+ index 3cb747f..e445e28 100644
285
+ --- a/benchmarks.rb
286
+ +++ b/benchmarks.rb
287
+ @@ -36,6 +36,10 @@ def main
288
+ @commit.parents[0].parents[0].parents[0]
289
+ end
290
+
291
+ + run_code(x, 'commits 1') do
292
+ + git.commits.size
293
+ + end
294
+ +
295
+ run_code(x, 'commits 2') do
296
+ log = git.commits('master', 15)
297
+ log.size
298
+
299
+ ### Committa le tue modifiche ###
300
+
301
+ Ora che la tua area di stage è configurata come vuoi, puoi fare la commit delle tue modifiche. Ricorda che tutto ciò che non è in `stage` — qualsiasi file che hai creato o modificato per cui non hai fatto `git add` — non sarà nella commit. Rimarranno come file modificati sul tuo disco.
302
+ In questo caso, l'ultima volta che hai eseguito `git status`, hai visto che tutto era in `stage`, così sei pronto a committare le tue modifiche. Il modo più semplice per farlo è eseguire `git commit`:
303
+
304
+ $ git commit
305
+
306
+ Facendolo lanci il tuo editor predefinito. (Questo è impostato nella tua shell con la variabile di ambiente `$EDITOR` — generalmente vim o emacs, sebbene tu possa configurarlo con qualsiasi altro editor, usando il comando `git config --global core.editor` come hai visto nel *Capitolo 1*).
307
+
308
+ L'editor visualizzerà il testo (questo è un esempio della schermata di Vim):
309
+
310
+ # Please enter the commit message for your changes. Lines starting
311
+ # with '#' will be ignored, and an empty message aborts the commit.
312
+ # On branch master
313
+ # Changes to be committed:
314
+ # new file: README
315
+ # modified: benchmarks.rb
316
+ #
317
+ ~
318
+ ~
319
+ ~
320
+ ".git/COMMIT_EDITMSG" 10L, 283C
321
+
322
+ Come vedi, il messaggio predefinito della commit contiene l'ultimo output del comando `git status`, commentato, e la prima riga in alto è vuota. Puoi rimuovere questi commenti e inserire il tuo messaggio di commit, o puoi lasciarli così per aiutarti a ricordare cosa stai committando. (Per una nota ancora più esplicita puoi usare l'opzione `-v` a `git commit`. Facendo saranno nel commento saranno inserite anche le modifiche stesse, così che tu possa vedere esattamente cosa hai fatto). Quando esci dall'editor, Git crea la tuo commit con un messaggio (rimuovendo commenti ed eventuali diff).
323
+
324
+ In alternativa, puoi inserire il messaggio per la tua commit alla riga di comando della `commit` specificando l'opzione -m, come segue:
325
+
326
+ $ git commit -m "Storia 182: Corretti benchmarks per la velocità"
327
+ [master 463dc4f] Storia 182: Corretti benchmarks per la velocità
328
+ 2 files changed, 3 insertions(+)
329
+ create mode 100644 README
330
+
331
+ Hai creato la tua prima commit! Puoi vedere che la commit restituisce alcune informazioni su se stessa: su quale `branch` (ramo, ndt) hai fatto la commit (`master`), quale checksum SHA-1 ha la commit (`463dc4f`), quanti file sono stati modificati e le statistiche sulle righe aggiunte e rimosse con la commit.
332
+
333
+ Ricorda che la commit registra lo snapshot che hai salvato nella tua area di `stage`. Qualsiasi cosa che non è nello `stage` rimarrà lì come modificata; puoi fare un'altra commit per aggiungerli alla cronologia del progetto. Ogni volta che fai una commit, stai salvando un'istantanea (`snapshot`) del tuo progetto che puoi ripristinare o confrontare in seguito.
334
+
335
+ ### Saltare l'area di stage ###
336
+
337
+ Sebbene sia estremamente utile per amministrare le commit come vuoi, l'area di stage è molto più complessa di quanto tu possa averne bisogno nel lavoro normale. Se vuoi saltare l'area di `stage`, Git fornisce una semplice accorciatoia. Con l'opzione `-a` al comando `git commit`, Git, committando, mette automaticamente nello `stage` tutti i file che erano già tracciati, permettendoti di saltare la parte `git add`:
338
+
339
+ $ git status
340
+ On branch master
341
+ Changes not staged for commit:
342
+ (use "git add <file>..." to update what will be committed)
343
+ (use "git checkout -- <file>..." to discard changes in working directory)
344
+
345
+ modified: benchmarks.rb
346
+
347
+ no changes added to commit (use "git add" and/or "git commit -a")
348
+ $ git commit -a -m 'added new benchmarks'
349
+ [master 83e38c7] added new benchmarks
350
+ 1 files changed, 5 insertions(+)
351
+
352
+ Nota come in questo caso non hai bisogno di eseguire `git add` per benchmarks.rb prima della commit.
353
+
354
+ ### Rimuovere i file ###
355
+
356
+ Per rimuovere un file da Git devi rimuoverlo dai file tracciati (più precisamente, rimuoverlo dall'area di `stage`) e quindi committare. Il comando `git rm` fa questo e lo rimuove dalla tua directory di lavoro, così che la prossima volta non lo vedrai come un file non tracciato.
357
+
358
+ Se rimuovi semplicemente il file dalla directory di lavoro, apparirà nella sezione "Changes not staged for commit" (cioè, _no in `stage`_) dell'output `git status`:
359
+
360
+ $ rm grit.gemspec
361
+ $ git status
362
+ On branch master
363
+ Changes not staged for commit:
364
+ (use "git add/rm <file>..." to update what will be committed)
365
+ (use "git checkout -- <file>..." to discard changes in working directory)
366
+
367
+ deleted: grit.gemspec
368
+
369
+ no changes added to commit (use "git add" and/or "git commit -a")
370
+
371
+ Se poi esegui `git rm`, la rimozione del file viene messa nello `stage`:
372
+
373
+ $ git rm grit.gemspec
374
+ rm 'grit.gemspec'
375
+ $ git status
376
+ On branch master
377
+ Changes to be committed:
378
+ (use "git reset HEAD <file>..." to unstage)
379
+
380
+ deleted: grit.gemspec
381
+
382
+
383
+ La prossima volta che committerai, il file sparirà e non sarà più tracciato. Se avevi già modificato il file e lo avevi aggiunto all'indice, devi forzarne la rimozione con l'opzione `-f`. Questa è una misura di sicurezza per prevenire la rimozione accidentale dei dati che non sono ancora stati salvati in uno `snapshot` e che non possono essere recuperati con Git.
384
+
385
+ Un'altra cosa utile che potresti voler fare è mantenere il file nel tuo ambiente di di lavoro ma rimuoverlo dall'area di `stage`. In altre parole, vuoi mantenere il file sul tuo disco ma non vuoi che Git continui a tracciarlo. Questo è particolarmente utile se hai dimenticato di aggiungere qualcosa al tuo `.gitignore` e accidentalmente lo metti in `stage`, come un file di log molto grande o un gruppo di file compilati `.a`. Per farlo usa l'opzione `--cached`:
386
+
387
+ $ git rm --cached readme.txt
388
+
389
+ Puoi passare file, directory o pattern glob di file al comando `git rm`. Questo significa che puoi fare
390
+
391
+ $ git rm log/\*.log
392
+
393
+ Nota la barra inversa (`\`) prima di `*`. Questo è necessario perché Git ha un'espansione propria dei nomi di file oltre a quella della tua shell. Questo comando rimuove tutti i file che hanno l'estensione `.log` nella directory `log/`. O puoi eseguire:
394
+
395
+ $ git rm \*~
396
+
397
+ Per rimuovere tutti i file che finiscono con `~`.
398
+
399
+ ### Spostare i file ###
400
+
401
+ A differenza di altri sistemi VCS, Git non traccia esplicitamente gli spostamenti dei file. Se rinomini un file in Git, nessun metadato viene salvato per dirgli che lo hai rinominato. Tuttavia, Git è abbastanza intelligente da capirlo dopo che l'hai fatto — più in la ci occuperemo di rilevare il movimento dei file.
402
+
403
+ Può perciò creare un po' di confusione il fatto che Git abbia un comando `mv`. Se vuoi rinominare un file in Git puoi eseguire qualcosa come
404
+
405
+ $ git mv file_from file_to
406
+
407
+ e funziona. Se, infatti, lanci un comando del genere e controlli lo stato, vedrai che Git considera il file rinominato:
408
+
409
+ $ git mv README README.txt
410
+ $ git status
411
+ On branch master
412
+ Changes to be committed:
413
+ (use "git reset HEAD <file>..." to unstage)
414
+
415
+ renamed: README -> README.txt
416
+
417
+
418
+ Ovviamente, questo è equivalente a eseguire:
419
+
420
+ $ mv README README.txt
421
+ $ git rm README
422
+ $ git add README.txt
423
+
424
+ Git capisce che, implicitamente stai rinominando il file, così che non c'è differenza se rinominare un file in questo modo o con il comando `mv`. L'unica differenza reale è che `mv` è un solo comando invece di tre: è un questione di convenienza. La cosa più importante è che puoi usare qualsiasi strumento per rinominare un file, e gestire l'aggiunta/rimozione più tardi, prima della commit.
425
+
426
+ ## Vedere la cronologia delle commit ##
427
+
428
+ Dopo che avrai creato un po' di commit, o se hai clonato un repository che già ha la sua cronologia di commit, vorrai probabilmente guardare cos'è successo nel passato. Lo strumento essenziale e quello più potente per farlo è il comando `git log`.
429
+
430
+ Questi esempi usano un progetto veramente semplice chiamato `simplegit` che uso spesso per gli esempi. Per ottenere il progetto, esegui
431
+
432
+ git clone git://github.com/schacon/simplegit-progit.git
433
+
434
+ Quando esegui `git log` in questo progetto, dovresti avere un output che assomiglia a questo:
435
+
436
+ $ git log
437
+ commit ca82a6dff817ec66f44342007202690a93763949
438
+ Author: Scott Chacon <schacon@gee-mail.com>
439
+ Date: Mon Mar 17 21:52:11 2008 -0700
440
+
441
+ changed the version number
442
+
443
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
444
+ Author: Scott Chacon <schacon@gee-mail.com>
445
+ Date: Sat Mar 15 16:40:33 2008 -0700
446
+
447
+ removed unnecessary test code
448
+
449
+ commit a11bef06a3f659402fe7563abf99ad00de2209e6
450
+ Author: Scott Chacon <schacon@gee-mail.com>
451
+ Date: Sat Mar 15 10:31:28 2008 -0700
452
+
453
+ first commit
454
+
455
+ In modo predefinito, senza argomenti, `git log` mostra le commit fatte nel repository in ordine cronologico inverso. In questo modo la commit più recente è la prima ad apparire. Come vedi, questo comando elenca ogni commit con il suo codice SHA-1, il nome e l'email dell'autore, la data di salvataggio e il messaggio della commit.
456
+
457
+ Sono disponibili moltissime opzioni da passare al comando `git log` per vedere esattamente quello che stai cercando. Qui ne vedremo alcune tra quelle più usate.
458
+
459
+ Una delle opzioni più utili è `-p`, che mostra le differenze introdotte da ciascuna commit. Puoi usare anche `-2`, che limita l'output agli ultimi due elementi:
460
+
461
+ $ git log -p -2
462
+ commit ca82a6dff817ec66f44342007202690a93763949
463
+ Author: Scott Chacon <schacon@gee-mail.com>
464
+ Date: Mon Mar 17 21:52:11 2008 -0700
465
+
466
+ changed the version number
467
+
468
+ diff --git a/Rakefile b/Rakefile
469
+ index a874b73..8f94139 100644
470
+ --- a/Rakefile
471
+ +++ b/Rakefile
472
+ @@ -5,5 +5,5 @@ require 'rake/gempackagetask'
473
+ spec = Gem::Specification.new do |s|
474
+ s.name = "simplegit"
475
+ - s.version = "0.1.0"
476
+ + s.version = "0.1.1"
477
+ s.author = "Scott Chacon"
478
+ s.email = "schacon@gee-mail.com
479
+
480
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
481
+ Author: Scott Chacon <schacon@gee-mail.com>
482
+ Date: Sat Mar 15 16:40:33 2008 -0700
483
+
484
+ removed unnecessary test code
485
+
486
+ diff --git a/lib/simplegit.rb b/lib/simplegit.rb
487
+ index a0a60ae..47c6340 100644
488
+ --- a/lib/simplegit.rb
489
+ +++ b/lib/simplegit.rb
490
+ @@ -18,8 +18,3 @@ class SimpleGit
491
+ end
492
+
493
+ end
494
+ -
495
+ -if $0 == __FILE__
496
+ - git = SimpleGit.new
497
+ - puts git.show
498
+ -end
499
+
500
+
501
+ Quest'opzione mostra le stessi informazioni ma ciascun elemento è seguito dalle differenze. Questo è molto utile per revisionare il codice o per dare un'occhiata veloce a cosa è successo in una serie di commit che un collaboratore ha aggiunto.
502
+
503
+ Qualche volta è più semplice verificare le singole modifiche piuttosto che intere righe. Per questo in Git è disponibile l'opzione `--word-diff`, che puoi aggiungere al comando `git log -p` per vedere le differenze tra le parole invece di quella normale, linea per linea. Il formato `word diff` è piuttosto inutile quando applicato al codice sorgente, ma diventa utile quando applicato a grandi file di testo, come i libri o la tua tesi. Ecco un esempio:
504
+
505
+ $ git log -U1 --word-diff
506
+ commit ca82a6dff817ec66f44342007202690a93763949
507
+ Author: Scott Chacon <schacon@gee-mail.com>
508
+ Date: Mon Mar 17 21:52:11 2008 -0700
509
+
510
+ changed the version number
511
+
512
+ diff --git a/Rakefile b/Rakefile
513
+ index a874b73..8f94139 100644
514
+ --- a/Rakefile
515
+ +++ b/Rakefile
516
+ @@ -7,3 +7,3 @@ spec = Gem::Specification.new do |s|
517
+ s.name = "simplegit"
518
+ s.version = [-"0.1.0"-]{+"0.1.1"+}
519
+ s.author = "Scott Chacon"
520
+
521
+ Come puoi vedere, non ci sono righe aggiunte o rimosse in questo output, come in una normale differenza. I cambiamente sono invece mostrati sulla stessa riga. Puoi vedere la parola aggiunta racchiusa tra `{+ +}` e quella rimossa tra `[- -]`. Potresti anche volere ridurre le solite tre righe di contesto dall'output delle differenze a una sola, poiché ora il contesto è costituito da parole e non righe. Puoi farlo con `-U1`, come abbiamo fatto nell'esempio qui sopra.
522
+
523
+ Puoi usare anche una serie di opzioni di riassunto con `git log`. Per esempio, se vuoi vedere alcune statistiche brevi per ciascuna commit, puoi usare l'opzione `--stat`:
524
+
525
+ $ git log --stat
526
+ commit ca82a6dff817ec66f44342007202690a93763949
527
+ Author: Scott Chacon <schacon@gee-mail.com>
528
+ Date: Mon Mar 17 21:52:11 2008 -0700
529
+
530
+ changed the version number
531
+
532
+ Rakefile | 2 +-
533
+ 1 file changed, 1 insertion(+), 1 deletion(-)
534
+
535
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
536
+ Author: Scott Chacon <schacon@gee-mail.com>
537
+ Date: Sat Mar 15 16:40:33 2008 -0700
538
+
539
+ removed unnecessary test code
540
+
541
+ lib/simplegit.rb | 5 -----
542
+ 1 file changed, 5 deletions(-)
543
+
544
+ commit a11bef06a3f659402fe7563abf99ad00de2209e6
545
+ Author: Scott Chacon <schacon@gee-mail.com>
546
+ Date: Sat Mar 15 10:31:28 2008 -0700
547
+
548
+ first commit
549
+
550
+ README | 6 ++++++
551
+ Rakefile | 23 +++++++++++++++++++++++
552
+ lib/simplegit.rb | 25 +++++++++++++++++++++++++
553
+ 3 files changed, 54 insertions(+)
554
+
555
+ Come puoi vedere, l'opzione `--stat` visualizza sotto ogni commit la lista dei file modificati, quanti file sono stati modificati, e quante righe in questi file sono state aggiunte e rimosse. Alla fine aggiunge anche un resoconto delle informazioni.
556
+ Un'altra opzione veramente utile è `--pretty`. Questa opzione modifica gli output di log rispetto a quella predefinita. Alcune opzioni predefinite sono pronte per l'uso. L'opzione `oneline` visualizza ogni commit su una singola linea, che è utile se stai controllando una lunga serie di commit. In aggiunta le opzioni `short`, `full` e `fuller` mostrano più o meno lo stesso output ma con più o meno informazioni, rispettivamente:
557
+
558
+ $ git log --pretty=oneline
559
+ ca82a6dff817ec66f44342007202690a93763949 changed the version number
560
+ 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
561
+ a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
562
+
563
+ L'opzione più interessante è `format`, che ti permette di specificare la formattazione dell'output di log. Questa è specialmente utile quando stai generando un output che sarà analizzo da una macchina, perché specificando esplicitamente il formato, sai che non cambierà con gli aggiornamenti di Git:
564
+
565
+ $ git log --pretty=format:"%h - %an, %ar : %s"
566
+ ca82a6d - Scott Chacon, 11 months ago : changed the version number
567
+ 085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
568
+ a11bef0 - Scott Chacon, 11 months ago : first commit
569
+
570
+ Table 2-1 lists some of the more useful options that format takes.
571
+
572
+ <!-- Messaggio per i traduttori: questa è una tabella dichiarativa.
573
+ Le righe devono essere formattate come segue:
574
+ <TAB><Prima colonna di testo><TAB><Seconda colunna di testo>
575
+ -->
576
+
577
+ Opzione Descrizione dell'output
578
+ %H Hash della commit
579
+ %h Hash della commit abbreviato
580
+ %T Hash dell'albero
581
+ %t Hash dell'albero abbreviato
582
+ %P Hash del genitore
583
+ %p Hash del genitore abbreviato
584
+ %an Nome dell'autore
585
+ %ae e-mail dell'autore
586
+ %ad Data di commit dell'autore (il formato rispetta l'opzione --date=)
587
+ %ar Data relativa di commit dell'autore
588
+ %cn Nome di chi ha fatto la commit (`committer`, in inglese)
589
+ %ce e-mail di chi ha fatto la commit
590
+ %cd Data della commit
591
+ %cr Data relativa della commit
592
+ %s Oggetto
593
+
594
+ Potresti essere sorpreso dalla differenza tra autore e _committer_ (chi ha eseguito la commit). L'autore è la persona che ha scritto la modifica, mentre il _committer_ è l'ultima persona che ha applicato la modifica. Così, se invii una modifica a un progetto ed uno dei membri principali del progetto la applica, ne avranno entrambi il riconoscimento — tu come l'autore ed il membro del progetto come chi l'ha committata. Vedremo meglio questa distinzione nel *Capitolo 5*.
595
+
596
+ Le opzioni `oneline` e `format` sono particolarmente utili con un'altra opzione di `log` chiamata `--graph`. Questa aggiunge un piccolo grafico ASCII carino che mostra le diramazioni e le unioni della cronologia, che possiamo vedere nella copia del repository del progetto Grit:
597
+
598
+ $ git log --pretty=format:"%h %s" --graph
599
+ * 2d3acf9 ignore errors from SIGCHLD on trap
600
+ * 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
601
+ |\
602
+ | * 420eac9 Added a method for getting the current branch.
603
+ * | 30e367c timeout code and tests
604
+ * | 5a09431 add timeout protection to grit
605
+ * | e1193f8 support for heads with slashes in them
606
+ |/
607
+ * d6016bc require time for xmlschema
608
+ * 11d191e Merge branch 'defunkt' into local
609
+
610
+ Queste sono solo alcune opzioni semplici per la formattazione dell'output di `git log` — ce ne sono altre. La tabella 2-2 elenca le opzioni che abbiamo visto prima e altre opzioni comunemente usate che possono essere utili per cambiare l'output del comando log.
611
+
612
+ <!-- Messaggio per i traduttori: questa è una tabella dichiarativa.
613
+ Le righe devono essere formattate come segue:
614
+ <TAB><Prima colonna di testo><TAB><Seconda colonna di testo>
615
+ -->
616
+
617
+ Opzione Descrizione
618
+ -p Mostra la modifica introdotta con ogni commit.
619
+ --word-diff Mostra la modifica nel formato `word diff`.
620
+ --stat Mostra le statistiche per i file modificati in ogni commit.
621
+ --shortstat Mostra solo le righe cambiate/aggiunte/rimosse del comando --stat.
622
+ --name-only Mostra l'elenco dei file modificati dopo le informazione della commit.
623
+ --name-status Mostra l'elenco dei file con le informazioni aggiunte/modifiche/eliminate.
624
+ --abbrev-commit Mostra solo i primi caratteri del codice SHA-1 invece di tutti i 40.
625
+ --relative-date Mostra la data in un formato relativo (per esempio, "2 week ago", "2 settimane fa") invece di usare il formato completo della data.
626
+ --graph Mostra un grafico ASCII delle diramazioni e delle unioni della cronologia insieme all'output del log.
627
+ --pretty Mostra le commit in un formato alternativo. L'opzione include oneline, short, full, fuller, e format (quando specifichi un tuo formato).
628
+ --oneline Un'opzione di convenienza abbreviazione per `--pretty=oneline --abbrev-commit`.
629
+
630
+ ### Limita l'output del log ###
631
+
632
+ Oltre alle opzioni per la formattazione dell'output, `git log` accetta una serie di utili opzioni restrittive, ovvero opzioni che ti permettono di vedere solo alcune commit. Abbiamo già visto una opzione del genere, l'opzione `-2`, che mostra solamente le ultime due commit. Infatti, puoi usare `-<n>`, dove `n` è un intero, per vedere le ultime `n` commit. In realtà non la userai spesso, perché Git accoda tutti gli output paginandoli, così vedrai solamente una pagina alla volta.
633
+
634
+ Le opzioni temporali come `--since` e `--until` sono invece molto utili. Questo comando, per esempio, prende la lista dei commit fatti nelle ultime due settimane:
635
+
636
+ $ git log --since=2.weeks
637
+
638
+ Questo comando funziona con molti formati — puoi specificare una data (“2008-01-15”) o una data relativa come “2 years 1 day 3 minutes ago”.
639
+
640
+ Puoi inoltre filtrare l'elenco delle commit che corrispondono a dei criteri di ricerca. L'opzione `--author` ti permette di filtrare per uno specifico autore e l'opzione `--grep` ti permette di cercare delle parole chiave nei messaggi delle commit. (Nota che specifichi entrambe le opzioni il comando cercherà le commit che corrispondano a tutte le opzioni specificate.)
641
+
642
+ Se vuoi specificare più opzioni `--grep` alternative devi usare `--all-match`.
643
+
644
+ L'ultima opzione di `git log` per il filtraggio è il percorso. Se specifichi il nome di una directory o di un file, puoi limitare l'output del log alle sole commit che introducono modifiche a quei file. Questa è sempre l'ultima opzione specificata e generalmente è preceduta dal doppio meno (`--`) per separare i percorsi dalle opzioni.
645
+
646
+ Nella tabella 2-3 vediamo una lista di riferimento di queste e di altre opzioni comuni.
647
+
648
+ <!-- Attention to translators: this is a table declaration.
649
+ The lines must be formatted as follows
650
+ <TAB><First column text><TAB><Second column text>
651
+ -->
652
+
653
+ Opzioni Descrizione
654
+ -(n) Vedi solo le ultime n commit
655
+ --since, --after Mostra solo le commit fatte dalla data specificata.
656
+ --until, --before Mostra solo le commit fatte entro la data specificata.
657
+ --author Mostra solo le commit dell'autore specificato.
658
+ --committer Mostra solo le commit del committer specificato.
659
+
660
+
661
+ ### Filtrare i risultati in base a data e ora ###
662
+
663
+ Per sapere cosa è stato committato nel repository di Git (git://git.kernel.org/pub/scm/git/git.git) il 29/04/2014 (usando come riferimento il fuso orario impostato sul tuo computer)
664
+
665
+ $ git log --after="2014-04-29 00:00:00" --before="2014-04-29 23:59:59" \
666
+ --pretty=fuller
667
+
668
+ Il risultato che si ottiene eseguendo questo comando cambia in base al fuso orario dove viene eseguito. È quindi consigliato usare un orario assoluto quando si usano le opzioni `--after` e `--before`, come per esempio l'ISO 8601 (che include anche informazioni sul furo orario), così da ottenere gli stessi risultati indipendentemente dal fuso orario.
669
+
670
+ Per ottenere le commit eseguite in un determinato istante (per esempio il 29 Aprile 2013 alle 17:07:22 CET), possiamo eseguire:
671
+
672
+ $ git log --after="2013-04-29T17:07:22+0200" \
673
+ --before="2013-04-29T17:07:22+0200" --pretty=fuller
674
+
675
+ commit de7c201a10857e5d424dbd8db880a6f24ba250f9
676
+ Author: Ramkumar Ramachandra <artagnon@gmail.com>
677
+ AuthorDate: Mon Apr 29 18:19:37 2013 +0530
678
+ Commit: Junio C Hamano <gitster@pobox.com>
679
+ CommitDate: Mon Apr 29 08:07:22 2013 -0700
680
+
681
+ git-completion.bash: lexical sorting for diff.statGraphWidth
682
+
683
+ df44483a (diff --stat: add config option to limit graph width,
684
+ 2012-03-01) added the option diff.startGraphWidth to the list of
685
+ configuration variables in git-completion.bash, but failed to notice
686
+ that the list is sorted alphabetically. Move it to its rightful place
687
+ in the list.
688
+
689
+ Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
690
+ Signed-off-by: Junio C Hamano <gitster@pobox.com>
691
+
692
+ Data e ora di `AuthorDate` e `CommitDate` hanno un formato standard (`--date=default`) che mostra le informazioni sul fuso orario, rispettivamente, dell'autore e di chi ha eseguito la commit.
693
+
694
+ Altri formati utili sono `--date=iso` (ISO 8601), `--date=rfc` (RFC 2822), `--date=raw` (i secondi passati dall'1/1/1970 UTC) `--date=local` (l'orario del tuo attuale fuso) e `--date=relative` (per esempio: "2 ore fa").
695
+
696
+ Usando `git log` senza specificare un orario equivale a specificare l'orario attuale del tuo computer (mantenendo la differenza con l'UTC).
697
+
698
+ Per esempio, eseguendo `git log` alle 09:00 su un computer che sia 3 ore avanti rispetto all'UTC, rende equivalenti questi comandi:
699
+
700
+ $ git log --after=2008-06-01 --before=2008-07-01
701
+ $ git log --after="2008-06-01T09:00:00+0300" \
702
+ --before="2008-07-01T09:00:00+0300"
703
+
704
+ Per fare un ultimo esempio, se vuoi vedere quale commit di Junio Hamano dell'ottobre del 2008 (relative al fuso di New York) che modificano i file di test nella cronologia dei sorgenti di Git che non sono ancora state unite con merge, puoi eseguire questo:
705
+
706
+ $ git log --pretty="%h - %s" --author=gitster \
707
+ --after="2008-10-01T00:00:00-0400" \
708
+ --before="2008-10-31T23:59:59-0400" --no-merges -- t/
709
+ 5610e3b - Fix testcase failure when extended attribute
710
+ acd3b9e - Enhance hold_lock_file_for_{update,append}()
711
+ f563754 - demonstrate breakage of detached checkout wi
712
+ d1a43f2 - reset --hard/read-tree --reset -u: remove un
713
+ 51a94af - Fix "checkout --track -b newbranch" on detac
714
+ b0ad11e - pull: allow "git pull origin $something:$cur
715
+
716
+ Ci sono circa 20,000 commit nella cronologia dei sorgenti di git, questo comando mostra 6 righe che corrispondono ai termini della ricerca.
717
+
718
+ ### Usare una GUI per visualizzare la cronologia ###
719
+
720
+ Se vuoi usare uno strumento più grafico per visualizzare la cronologia delle tue commit, puoi provare un programma in Tck/Tk chiamato `gitk` che viene distribuito con Git. Gitk è fondamentalmente uno strumento grafico come `git log`, e accetta quasi tutte le opzioni di filtro supportate da `git log`. Se digiti `gitk` dalla riga di comando nel tuo progetto, dovresti vedere qualcosa di simile alla Figura 2-2.
721
+
722
+ Insert 18333fig0202.png
723
+ Figura 2-2. Il grafico della cronologia con gitk.
724
+
725
+ Puoi vedere la cronologia delle commit, nella metà superiore, della finestra come un albero genealogico carino. La finestra delle differenza, nella metà inferiore, mostra le modifiche introdotte con ciascuna commit che selezioni.
726
+
727
+ ## Annullare qualcosa ##
728
+
729
+ In qualsiasi momento puoi voler annullare qualcosa. Rivedremo alcuni strumenti basilari per annullare le modifiche fatte. Attenzione però, perché non sempre puoi ripristinare ciò che annulli. Questa è una delle aree di Git dove puoi perdere del lavoro svolto se commetti un errore.
730
+
731
+ ### Modifica la tua ultima commit ###
732
+
733
+ Uno degli annullamenti più comuni si verifica quando committi qualcosa troppo presto e magari dimentichi di aggiungere qualche file, o sbagli qualcosa nel messaggio di commit. Se vuoi modificare questa commit puoi eseguire il comando commit con l'opzione `--amend`:
734
+
735
+ $ git commit --amend
736
+
737
+ Questo comando usa la tua area di `stage` per la commit. Se non hai fatto modifiche dalla tua ultima commit (per esempio, esegui questo comando subito dopo la tua commit precedente), allora il tuo snapshot sarà identico e potrai cambiare il tuo messaggio di commit.
738
+
739
+ Verrà lanciata la stessa applicazione per scrivere il messaggio della commit, ma conterrà già il messaggio della commit precedente. Puoi modificare il messaggio normalmente, ma questo sovrascriverà la commit precedente.
740
+
741
+ Per esempio, se fai una commit e realizzi di non aver messo nello `stage` le modifiche a un file e vuoi aggiungerlo a questa commit, puoi fare così:
742
+
743
+ $ git commit -m 'initial commit'
744
+ $ git add forgotten_file
745
+ $ git commit --amend
746
+
747
+ Dopo questi tre comandi ti ritroverai con una sola commit: la seconda sovrascrive la prima.
748
+
749
+ ### Rimuovere un file dall'area di `stage` ###
750
+
751
+ Le prossime due sezioni mostrano come gestire le modifiche della tua area di stage e della directory di lavoro. La parte divertente è che il comando che usi per determinare lo stato di queste due aree ti ricorda come annullare le modifiche alle stesse. Per esempio, supponiamo che hai modificato due file e vuoi committarli come modifiche separate, ma accidentalmente digiti `git add *` e li metti entrambi in `stage`. Come puoi rimuoverne uno? Il comando `git status` ti ricorda:
752
+
753
+ $ git add .
754
+ $ git status
755
+ On branch master
756
+ Changes to be committed:
757
+ (use "git reset HEAD <file>..." to unstage)
758
+
759
+ modified: README.txt
760
+ modified: benchmarks.rb
761
+
762
+
763
+ Il testo sotto “Changes to be committed” ti dice di usare `git reset HEAD <file>...` per rimuovere dallo `stage`. Usa quindi questo consiglio per rimuoever `benchmarks.rb`:
764
+
765
+ $ git reset HEAD benchmarks.rb
766
+ Unstaged changes after reset:
767
+ M benchmarks.rb
768
+ $ git status
769
+ On branch master
770
+ Changes to be committed:
771
+ (use "git reset HEAD <file>..." to unstage)
772
+
773
+ modified: README.txt
774
+
775
+ Changes not staged for commit:
776
+ (use "git add <file>..." to update what will be committed)
777
+ (use "git checkout -- <file>..." to discard changes in working directory)
778
+
779
+ modified: benchmarks.rb
780
+
781
+
782
+ Il comando è un po' strano, ma funziona. Il file `benchmarks.rb` ora è modificato ma non più nello `stage`.
783
+
784
+ ### Annullare le modifiche a un file ###
785
+
786
+ Come fare se ti rendi conto che non vuoi più mantenere le modifiche di `benchmarks.rb`? Come puoi annullarle facilmente — ritornare a come era prima dell'ultima commit (o al clone iniziale, o comunque lo avevi nella tua directory di lavoro)? Fortunatamente `git status` ti dice come farlo. Nell'ultimo output di esempio, l'area dei file modificati appare così:
787
+
788
+ Changes not staged for commit:
789
+ (use "git add <file>..." to update what will be committed)
790
+ (use "git checkout -- <file>..." to discard changes in working directory)
791
+
792
+ modified: benchmarks.rb
793
+
794
+
795
+ Ti dice abbastanza chiaramente come annullare le tue modifiche (almeno le nuove versioni di Git, dalla 1.6.1 in poi, lo fanno: se hai una versione più vecchia ti raccomandiamo di aggiornarla per avere alcune di queste funzioni utili e carine). Vediamo cosa dice:
796
+
797
+ $ git checkout -- benchmarks.rb
798
+ $ git status
799
+ On branch master
800
+ Changes to be committed:
801
+ (use "git reset HEAD <file>..." to unstage)
802
+
803
+ modified: README.txt
804
+
805
+
806
+ Puoi vedere come le modifiche siano state annullate. Dovresti capire quanto questo sia un comando pericoloso: tutte le modifiche fatte al file sono sparite: lo hai praticamente sovrascritto con un altro file. Non usare mai questo comando a meno che non sia assolutamente certo di non volere il file. Se hai solo bisogno di toglierlo di torno, vedremo i `ripostigli` (*stash*) e le diramazioni (*branch*) nei prossimi capitoli, che generalmente sono le strade migliori da seguire.
807
+
808
+ Ricorda: qualsiasi cosa che sia stata committata in Git può quasi sempre essere recuperata. Tutte le commit che erano sulle diramazioni che sono state cancellate o sovrascritte con una commit `--amend` possono essere recuperate (vedi il *Capitolo 9* per il recupero dei dati). Ma qualsiasi cosa che perdi che non sia stata mai committata non la vedrai mai più.
809
+
810
+ ## Lavorare coi server remote ##
811
+
812
+ Per poter collaborare con un qualsiasi progetto Git, devi sapere come amministrare i tuoi repository remoti. I repository remoti sono versioni dei progetti ospitate da qualche parte su Internet o sulla rete locale. Puoi averne molti e normalmente avrai un accesso in sola lettura o anche in scrittura. Collaborare con altri implica di sapere amministrare questi repository remoti, inviarne e prelevarne dati per condividere il lavoro.
813
+ Amministrare i repository remoti significa sapere come aggiungerli, rimuovere quelli che non più validi, amministrare varie diramazioni remote e decidere quali tracciare e quali no, e ancora altro. Di seguito tratteremo le conoscenze necessarie per farlo.
814
+
815
+ ### Vedi i tuoi server remoti ###
816
+
817
+ Per vedere i server remoti che hai configurato, puoi eseguire il comando `git remote`. Questo elenca i nomi brevi di ogni nodo remoto che hai configurato. Se hai clonato il tuo repository, dovresti vedere almeno *origin* — che è il nome predefinito che Git da al server da cui cloni:
818
+
819
+ $ git clone git://github.com/schacon/ticgit.git
820
+ Cloning into 'ticgit'...
821
+ remote: Reusing existing pack: 1857, done.
822
+ remote: Total 1857 (delta 0), reused 0 (delta 0)
823
+ Receiving objects: 100% (1857/1857), 374.35 KiB | 193.00 KiB/s, done.
824
+ Resolving deltas: 100% (772/772), done.
825
+ Checking connectivity... done.
826
+ $ cd ticgit
827
+ $ git remote
828
+ origin
829
+
830
+ Puoi anche aggiungere `-v`, che mostra anche l'URL che Git ha associato a quel nome breve:
831
+
832
+ $ git remote -v
833
+ origin git://github.com/schacon/ticgit.git (fetch)
834
+ origin git://github.com/schacon/ticgit.git (push)
835
+
836
+ Se hai più di un server remoto, il comando li elenca tutti. Per esempio, il mio repository di Grit appare così:
837
+
838
+ $ cd grit
839
+ $ git remote -v
840
+ bakkdoor git://github.com/bakkdoor/grit.git
841
+ cho45 git://github.com/cho45/grit.git
842
+ defunkt git://github.com/defunkt/grit.git
843
+ koke git://github.com/koke/grit.git
844
+ origin git@github.com:mojombo/grit.git
845
+
846
+ Questo significa che posso prendere facilmente i contributi da qualunque di questi utenti. Nota però che solamente *origin* è un URL SSH, e quindi è l'unico dove posso inviare il mio lavoro con `push` (il perché lo vedremo nel *Capitolo 4*).
847
+
848
+ ### Aggiungere un repository remoto ###
849
+
850
+ Nelle sezioni precedenti ho accennato all'aggiunta dei repository remoti e dato alcuni esempi, ma qui lo vedremo nello specifico. Per aggiungere un nuovo repository Git remoto con un nome breve a cui possa riferirti facilmente, esegui `git remote add [nome breve] [url]`:
851
+
852
+ $ git remote
853
+ origin
854
+ $ git remote add pb git://github.com/paulboone/ticgit.git
855
+ $ git remote -v
856
+ origin git://github.com/schacon/ticgit.git
857
+ pb git://github.com/paulboone/ticgit.git
858
+
859
+ Ora potrai usare il nome `pb` alla riga di comando al posto dell'URL intero. Se vuoi, per esempio, prendere tutto ciò che ha Paul, ma che non sono ancora nel tuo repository, puoi eseguire `git fetch pb`:
860
+
861
+ $ git fetch pb
862
+ remote: Counting objects: 58, done.
863
+ remote: Compressing objects: 100% (41/41), done.
864
+ remote: Total 44 (delta 24), reused 1 (delta 0)
865
+ Unpacking objects: 100% (44/44), done.
866
+ From git://github.com/paulboone/ticgit
867
+ * [new branch] master -> pb/master
868
+ * [new branch] ticgit -> pb/ticgit
869
+
870
+ La diramazione `master` di Paul è accessibile localmente come `pb/master` — puoi farne il `merge` in uno delle tue diramazioni, o puoi scaricarla in una tua diramazione locale se vuoi controllarla.
871
+
872
+ ### Scarica e condividi coi server remoti ###
873
+
874
+ Come abbiamo appena visto, per scaricare dati da un progetto remoto, puoi fare:
875
+
876
+ $ git fetch [nome-remoto]
877
+
878
+ Il comando va sul progetto remoto e scarica tutti i dati dal progetto remoto che tu ancora non hai. Dopo averlo fatto dovresti trovare i riferimenti a tutte le diramazioni di quel server, che potrai unire o controllare in qualsiasi momento. (Vedremo in dettaglio cosa sono le diramazioni e come usarle nel *Capitolo 3*).
879
+
880
+ Quando cloni un repository, viene aggiunto automaticamente un repository remoto chiamato *origin*. In questo modo `git fetch origin` scarica le modifiche che sono state condividise con server remoto da quando lo hai clonato (o dall'ultimo tuo aggiornamento). È importante notare che il comando `fetch` scarica queste informazioni nel tuo repository locale: non le unisce automaticamente e non modifica alcun file su cui stai lavorando. Quando sei pronto dovrai essere tu a unirle al tuo lavoro, manualmente.
881
+
882
+ Se hai una diramazione impostata per tracciarne una remota (vedi la prossima sezione e il *Capitolo 3* per maggiori informazioni), puoi usare il comando `git pull` per scaricare e unire automaticamente una diramazione remota in quella attuale. Questo potrebbe essere un modo più facile e più comodo per lavorare; e in modo predefinito, il comando `git clone` imposta automaticamente la tua diramazione `master` per tracciare il master del server che hai clonato (supponendo che il server remoto abbia una diramazione `master`). Eseguendo `git pull` vengono generalmente scaricati i dati dal server da cui hai fatto il clone originario e prova a unirli automaticamente con il codice su cui stai lavorando.
883
+
884
+ ### Condividi coi server remoti ###
885
+
886
+ Quando il tuo progetto raggiunge uno stato che vuoi condividere, devi caricarlo sul server principale. Il comando perlo è semplice: `git push [nome-remoto] [diramazione]`. Se vuoi condividere la tua diramazione `master` sul tuo server `origin` (lo ripeto: clonando questi nomi vengono generalmente definiti automaticamente), puoi eseguire il comando seguente per caricare il tuo lavoro sul server:
887
+
888
+ $ git push origin master
889
+
890
+ Questo comando funziona solamente se hai clonato il tuo progetto da un server su cui hai i permessi di scrittura e se nessun altro ha caricato modifiche nel frattempo. Se cloni un repository assieme ad altri e questi caricano delle modifiche sul server, il tuo invio verrà rifiutato. Dovrai prima scaricare le loro modifiche e incorporarle con le tue per poterle poi inviare. Vedi il *Capitolo 3* per maggiori informazioni su come fare il `push` su server remoti.
891
+
892
+ ### Controllare un server remoto ###
893
+
894
+ Se vuoi più informazioni su una particolare server remoto, puoi usare il comando `git remote show [nome-remoto]`. Se esegui il comando con un nome particolare, per esempio `origin`, avrai qualcosa di simile:
895
+
896
+ $ git remote show origin
897
+ * remote origin
898
+ URL: git://github.com/schacon/ticgit.git
899
+ Remote branch merged with 'git pull' while on branch master
900
+ master
901
+ Tracked remote branches
902
+ master
903
+ ticgit
904
+
905
+ che mostra gli URL del repository remoto oltre alle informazioni sulle diramazioni tracciate. Il comando ti dice anche se esegui `git pull` mentre sei su `master`, integrerà le modifiche sul `master` remoto dopo aver scaricato tutti i riferimenti remoti. Elenca anche i riferimenti remoti che hai già scaricato.
906
+
907
+ Questo è un esempio semplice di quanto probabilmente vedrai. Tuttavia, quando usi intensamente Git potresti trovare molte più informazioni con `git remote show`:
908
+
909
+ $ git remote show origin
910
+ * remote origin
911
+ URL: git@github.com:defunkt/github.git
912
+ Remote branch merged with 'git pull' while on branch issues
913
+ issues
914
+ Remote branch merged with 'git pull' while on branch master
915
+ master
916
+ New remote branches (next fetch will store in remotes/origin)
917
+ caching
918
+ Stale tracking branches (use 'git remote prune')
919
+ libwalker
920
+ walker2
921
+ Tracked remote branches
922
+ acl
923
+ apiv2
924
+ dashboard2
925
+ issues
926
+ master
927
+ postgres
928
+ Local branch pushed with 'git push'
929
+ master:master
930
+
931
+ Questo comando mostra quale diramazione viene scaricata automaticamente quando esegui `git push` su certe diramazioni. Mostra anche quali diramazioni remote non hai ancora scaricato, quali diramazioni remote hai in locale che sono state rimosse dal server, e le diramazioni che vengono unite automaticamente quando esegui `git pull`.
932
+
933
+ ### Rimuovere e rinominare server remoti ###
934
+
935
+ Se vuoi rinominare un riferimento, con versioni più recenti di Git, puoi farlo con `git remote rename` per cambiare il nome breve di un server remoto. Se vuoi per esempio rinominare `pb` in `paul`, puoi farlo con `git remote rename`:
936
+
937
+ $ git remote rename pb paul
938
+ $ git remote
939
+ origin
940
+ paul
941
+
942
+ Vale la pena ricordare che questo cambia anche i nomi delle diramazioni remote. Quello che prima veniva chiamato `pb/master` ora è `paul/master`.
943
+
944
+ Se vuoi rimuovere un riferimento per qualsiasi ragione (hai spostato il server o non stai più usando un particolare mirror, o magari un collaboratore che non collabora più) puoi usare `git remote rm`:
945
+
946
+ $ git remote rm paul
947
+ $ git remote
948
+ origin
949
+
950
+ ### Etichettare ###
951
+
952
+ Come la maggior parte dei VCS, Git ha la possibilità di contrassegnare (tag, ndt) dei punti specifici della cronologia come importanti. Le persone normalmente usano questa funzionalità per segnare i punti di rilascio (v1.0, e così via). In questa sezione, imparerai come elencare le etichette disponibili, come crearne di nuove, e i diversi tipi di etichette esistenti.
953
+
954
+ ### Elena le etichette ###
955
+
956
+ Elencare le etichette esistenti in Git è facilissimo. Digita semplicemente `git tag`:
957
+
958
+ $ git tag
959
+ v0.1
960
+ v1.3
961
+
962
+ Questo comando elenca le etichette in ordine alfabetico; l'ordine con cui appaiono non ha importanza.
963
+
964
+ Puoi inoltre cercare etichette con uno schema specifico. Il repository sorgente di Git, per esempio, contiene più di 240 etichette. Se sei interessato a vedere solo quelli della serie 1.4.2, puoi eseguire:
965
+
966
+ $ git tag -l 'v1.4.2.*'
967
+ v1.4.2.1
968
+ v1.4.2.2
969
+ v1.4.2.3
970
+ v1.4.2.4
971
+
972
+ ### Creare etichette ###
973
+
974
+ Git ha due tipi di etichette: semplici (`lightweight`, ndt) e annotate (`annotated`, ndt). Un'etichetta semplice è molto simile a una ramificazione che non cambia mai: è semplicemente un riferimento ad una commit specifica. Le etichette annotate, al contrario, sono salvate come oggetti complessi nel database Git. Ne viene calcolato il checksum, contengono il nome, l'e-mail e la data di chi ha inserito l'etichetta, hanno un messaggio d'etichetta; e possono essere firmate e verificate con GPG (GNU Privacy Guard). Generalmente si raccomanda di usare le etichette annotate così da avere tutte queste informazioni, ma se vuoi aggiungere un'etichetta temporanea o per qualche ragione non vuoi salvare quelle informazioni aggiuntive, hai sempre a disposizione le etichette semplici.
975
+
976
+ ### Etichette annotate ###
977
+
978
+ Creare un'etichetta annotate in Git è semplice. Il modo più facile è specificare `-a` quando esegui il comando `tag`:
979
+
980
+ $ git tag -a v1.4 -m 'my version 1.4'
981
+ $ git tag
982
+ v0.1
983
+ v1.3
984
+ v1.4
985
+
986
+ `-m` specifica il messaggio per l'etichetta, che viene salvato con la stessa. Se non specifichi un messaggio per un'etichetta annotata, Git lancerà il tuo editor così da scriverla.
987
+
988
+ Puoi vedere i dati dell'etichetta assieme alla commit etichettata con il comando `git show`:
989
+
990
+ $ git show v1.4
991
+ tag v1.4
992
+ Tagger: Scott Chacon <schacon@gee-mail.com>
993
+ Date: Mon Feb 9 14:45:11 2009 -0800
994
+
995
+ my version 1.4
996
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
997
+ Merge: 4a447f7... a6b4c97...
998
+ Author: Scott Chacon <schacon@gee-mail.com>
999
+ Date: Sun Feb 8 19:02:46 2009 -0800
1000
+
1001
+ Merge branch 'experiment'
1002
+
1003
+ Questo mostra le informazioni dell'etichetta, la data in cui la commit è stata etichettata e il messaggio, prima di mostrare le informazioni della commit.
1004
+
1005
+ ### Etichette firmate ###
1006
+
1007
+ Puoi anche firmare le tue etichette con GPG, presumendo che tu abbia una chiave privata. Tutto quello che devi fare è usare `-s` invece di `-a`:
1008
+
1009
+ $ git tag -s v1.5 -m 'my signed 1.5 tag'
1010
+ You need a passphrase to unlock the secret key for
1011
+ user: "Scott Chacon <schacon@gee-mail.com>"
1012
+ 1024-bit DSA key, ID F721C45A, created 2009-02-09
1013
+
1014
+ Se esegui `git show` per questa etichetta, puoi vedere che è stata allegata la tua firma GPG:
1015
+
1016
+ $ git show v1.5
1017
+ tag v1.5
1018
+ Tagger: Scott Chacon <schacon@gee-mail.com>
1019
+ Date: Mon Feb 9 15:22:20 2009 -0800
1020
+
1021
+ my signed 1.5 tag
1022
+ -----BEGIN PGP SIGNATURE-----
1023
+ Version: GnuPG v1.4.8 (Darwin)
1024
+
1025
+ iEYEABECAAYFAkmQurIACgkQON3DxfchxFr5cACeIMN+ZxLKggJQf0QYiQBwgySN
1026
+ Ki0An2JeAVUCAiJ7Ox6ZEtK+NvZAj82/
1027
+ =WryJ
1028
+ -----END PGP SIGNATURE-----
1029
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
1030
+ Merge: 4a447f7... a6b4c97...
1031
+ Author: Scott Chacon <schacon@gee-mail.com>
1032
+ Date: Sun Feb 8 19:02:46 2009 -0800
1033
+
1034
+ Merge branch 'experiment'
1035
+
1036
+ Più avanti, imparerai come verificare le etichette firmate.
1037
+
1038
+ ### Etichette semplici ###
1039
+
1040
+ Un altro modo per etichettare una commit è con le etichette semplici. Questo in pratica è salvare il checksum della commit in un file: non viene salvata nessun'altra informazione. Per creare un'etichetta semplice, non usare le opzioni `-a`, `s` o `-m`:
1041
+
1042
+ $ git tag v1.4-lw
1043
+ $ git tag
1044
+ v0.1
1045
+ v1.3
1046
+ v1.4
1047
+ v1.4-lw
1048
+ v1.5
1049
+
1050
+ Se ora lanci `git show` per questa etichetta, non vedrai altre informazioni aggiuntive. Il comando mostra solamente la commit:
1051
+
1052
+ $ git show v1.4-lw
1053
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
1054
+ Merge: 4a447f7... a6b4c97...
1055
+ Author: Scott Chacon <schacon@gee-mail.com>
1056
+ Date: Sun Feb 8 19:02:46 2009 -0800
1057
+
1058
+ Merge branch 'experiment'
1059
+
1060
+ ### Verificare le etichette ###
1061
+
1062
+ Per verificare un'etichetta firmata, usa `git tag -v [nome-tag]`. Questo comando usa GPG per verificare la verifica. Affinché funzioni hai bisogno che la chiave pubblica del firmatario sia nel tuo portachiavi:
1063
+
1064
+ $ git tag -v v1.4.2.1
1065
+ object 883653babd8ee7ea23e6a5c392bb739348b1eb61
1066
+ type commit
1067
+ tag v1.4.2.1
1068
+ tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700
1069
+
1070
+ GIT 1.4.2.1
1071
+
1072
+ Minor fixes since 1.4.2, including git-mv and git-http with alternates.
1073
+ gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
1074
+ gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
1075
+ gpg: aka "[jpeg image of size 1513]"
1076
+ Primary key fingerprint: 3565 2A26 2040 E066 C9A7 4A7D C0C6 D9A4 F311 9B9A
1077
+
1078
+ Se non hai la chiave pubblica del firmatario, otterrai invece qualcosa così:
1079
+
1080
+ gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
1081
+ gpg: Can't check signature: public key not found
1082
+ error: could not verify the tag 'v1.4.2.1'
1083
+
1084
+ ### Etichettare successivamente ###
1085
+
1086
+ Puoi etichettare anche commit passate. Supponiamo che la cronologia delle tue commit sia questa:
1087
+
1088
+ $ git log --pretty=oneline
1089
+ 15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
1090
+ a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
1091
+ 0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
1092
+ 6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
1093
+ 0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
1094
+ 4682c3261057305bdd616e23b64b0857d832627b added a todo file
1095
+ 166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
1096
+ 9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
1097
+ 964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
1098
+ 8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
1099
+
1100
+ Supponiamo che abbia dimenticato di etichettare il progetto alla `v1.2`, che era con la commit "updated rakefile". Puoi sempre aggiungerla in un secondo momento. Per etichettare questa commit, alla fine del comando, devi indicare il checksum (o parte di esso) della commit:
1101
+
1102
+ $ git tag -a v1.2 -m 'version 1.2' 9fceb02
1103
+
1104
+ Puoi vedere che hai etichettato la commit:
1105
+
1106
+ $ git tag
1107
+ v0.1
1108
+ v1.2
1109
+ v1.3
1110
+ v1.4
1111
+ v1.4-lw
1112
+ v1.5
1113
+
1114
+ $ git show v1.2
1115
+ tag v1.2
1116
+ Tagger: Scott Chacon <schacon@gee-mail.com>
1117
+ Date: Mon Feb 9 15:32:16 2009 -0800
1118
+
1119
+ version 1.2
1120
+ commit 9fceb02d0ae598e95dc970b74767f19372d61af8
1121
+ Author: Magnus Chacon <mchacon@gee-mail.com>
1122
+ Date: Sun Apr 27 20:43:35 2008 -0700
1123
+
1124
+ updated rakefile
1125
+ ...
1126
+
1127
+ ### Condividere le etichette ###
1128
+
1129
+ Normalmente il comando `git push` non invia le etichette sui server remoti. Devi farlo esplicitamente, dopo averle create, per condividerle con il server. Questo procedimento è come la condivisione delle diramazioni remote: puoi eseguire `git push origin [nome-tag]`
1130
+
1131
+ $ git push origin v1.5
1132
+ Counting objects: 50, done.
1133
+ Compressing objects: 100% (38/38), done.
1134
+ Writing objects: 100% (44/44), 4.56 KiB, done.
1135
+ Total 44 (delta 18), reused 8 (delta 1)
1136
+ To git@github.com:schacon/simplegit.git
1137
+ * [new tag] v1.5 -> v1.5
1138
+
1139
+ Se hai molte etichetta che vuoi inviare tutte assieme, puoi farlo usando l'opzione `--tags` col comando `git push`. Questo trasferirà al server remoto tutte le tue etichette che non sono ancora presenti.
1140
+
1141
+ $ git push origin --tags
1142
+ Counting objects: 50, done.
1143
+ Compressing objects: 100% (38/38), done.
1144
+ Writing objects: 100% (44/44), 4.56 KiB, done.
1145
+ Total 44 (delta 18), reused 8 (delta 1)
1146
+ To git@github.com:schacon/simplegit.git
1147
+ * [new tag] v0.1 -> v0.1
1148
+ * [new tag] v1.2 -> v1.2
1149
+ * [new tag] v1.4 -> v1.4
1150
+ * [new tag] v1.4-lw -> v1.4-lw
1151
+ * [new tag] v1.5 -> v1.5
1152
+
1153
+ Quando qualcuno clonerà il repository o scaricherà gli aggiornamenti, scaricherà anche tutte le tue etichette.
1154
+
1155
+ ## Suggerimenti ##
1156
+
1157
+ Prima di terminare questo capitolo sulle basi di Git, ecco alcuni suggerimenti e trucchi per rendere la tua esperienza con Git più semplice, più facile e più familiare. Molte persone usano Git ma nessuno di questi suggerimenti e in seguito nel libro non ci riferiremo ad essi né presumeremo che tu li abbia usati, ma probabilmente dovresti sapere come realizzarli.
1158
+
1159
+ ### Completamento automatico ###
1160
+
1161
+ Se usi una shell Bash, Git fornisce uno script carino per il completamento automatico che potresti usare. Scaricalo direttamente dai sorgenti di Git su https://github.com/git/git/blob/master/contrib/completion/git-completion.bash. Copia questo file nella tua directory `home` e al tuo file `.bashrc` aggiungi:
1162
+
1163
+ source ~/.git-completion.bash
1164
+
1165
+ Se vuoi che Git usi il completamento automatico in Bash per tutti gli utenti, copia lo script nella directory `/opt/local/etc/bash_completion.d` sui sistemi Mac o in `/etc/bash_completion.d/` sui sistemi Linux. Questa è una directory di script che Bash carica automaticamente, per fornire il completamento automatico nella shell.
1166
+
1167
+ Se stai usando Windows con Git Bash, che è il predefinito quando installi Git su Windows con msysGit, il completamento automatico dovrebbe essere preconfigurato.
1168
+
1169
+ Premi il tasto Tab quando stai scrivendo un comando Git, e dovresti vedere una serie di suggerimenti tra cui scegliere:
1170
+
1171
+ $ git co<tab><tab>
1172
+ commit config
1173
+
1174
+ In questo caso, scrivendo `git co` e premendo poi due volte il tasto Tab, compaiono i suggerimenti commit e config. Aggiungendo `m<tab>` automaticamente si completa `git commit`.
1175
+
1176
+ Questo funziona anche con le opzioni, che probabilmente è molto più utile. Se per esempio stai eseguendo `git log` e non ricordi un'opzione, puoi premere il tasto Tab per vedere quelle disponibili:
1177
+
1178
+ $ git log --s<tab><tab>
1179
+ --shortstat --sparse
1180
+ --simplify-by-decoration --src-prefix=
1181
+ --simplify-merges --stat
1182
+ --since= --summary
1183
+
1184
+ Questo è un trucco davvero utile e permette di risparmiare molto tempo e evitarti la lettura della documentazione.
1185
+
1186
+ ### Alias di Git ###
1187
+
1188
+ Git non indovina il tuo comando se ne digiti solo una parte. Se non vuoi vuole scrivere tutto il testo di un qualsiasi comando Git puoi configurare facilmente un alias per ogni comando usando `git config`. Di seguito ci sono alcuni esempi che potresti voler usare:
1189
+
1190
+ $ git config --global alias.co checkout
1191
+ $ git config --global alias.br branch
1192
+ $ git config --global alias.ci commit
1193
+ $ git config --global alias.st status
1194
+
1195
+ Questo significa che, per esempio, invece di digitare `git commit`, dovrai scrivere solo `git ci`. Andando avanti con l'uso di Git userai alcuni comandi con maggiore frequenza: e in questi casi non esitare a creare nuovi alias.
1196
+
1197
+ Questa tecnica può essere anche molto utile per creare comandi che ritieni dovrebbero esistere. Per esempio, per correggere un problema comune in cui si incorre quando si vuole rimuovere un file dall'area di stage, puoi aggiungere il tuo alias `unstage` in Git:
1198
+
1199
+ $ git config --global alias.unstage 'reset HEAD --'
1200
+
1201
+ Questo rende equivalenti i due comandi seguenti:
1202
+
1203
+ $ git unstage fileA
1204
+ $ git reset HEAD fileA
1205
+
1206
+ Questo sembra più pulito. É anche comodo aggiungere il comando `last`, così:
1207
+
1208
+ $ git config --global alias.last 'log -1 HEAD'
1209
+
1210
+ In questo modo puoi vedere facilmente l'ultima commit:
1211
+
1212
+ $ git last
1213
+ commit 66938dae3329c7aebe598c2246a8e6af90d04646
1214
+ Author: Josh Goebel <dreamer3@example.com>
1215
+ Date: Tue Aug 26 19:48:51 2008 +0800
1216
+
1217
+ test for current head
1218
+
1219
+ Signed-off-by: Scott Chacon <schacon@example.com>
1220
+
1221
+ Come immaginerai, Git semplicemente sostituisce il nuovo comando con qualsiasi cosa corrisponda all'alias. Potresti anche voler eseguire un comando esterno, piuttosto che uno di Git. In questo caso devi iniziare il comando con un "!". Questo è utile se stai scrivendo degli strumenti di lavoro tuoi per lavorare con un repository Git. Vediamolo praticamente creando l'alias `git visual` per eseguire `gitk`:
1222
+
1223
+ $ git config --global alias.visual '!gitk'
1224
+
1225
+ ## Sommario ##
1226
+
1227
+ A questo punto, sei in grado di eseguire tutte le operazioni di base di Git in locale: creare o clonare un repository, fare delle modifiche, mettere nello `stage` e inviare queste modifiche, vedere la cronologia delle modifiche fatte al repository. Nel prossimo capitolo, vedremo la caratteristica vincente di Git: il suo modello di ramificazione.