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,70 @@
1
+
2
+ Here's a list of agreed translation of the main concepts. Every concepts has
3
+ several translations sorted by accuracy. Generally prefer the first
4
+ translations.
5
+
6
+
7
+ version control system - system kontroli wersji
8
+
9
+ revision control - śledzenie plików, śledzenie zmian
10
+
11
+ snapshot - migawka, wersja plików
12
+
13
+ workflow - schemat pracy, przepływ pracy
14
+
15
+ commit - commit, zatwierdzenie
16
+
17
+ staging area - przechowalnia
18
+
19
+ staged - w przechowalni, śledzony
20
+
21
+ unstage - usunąć z przechowalni
22
+
23
+ contributor - współpracownik, współautor, uczestnik
24
+
25
+ contribute - wgrać
26
+
27
+ integrator - integrator
28
+
29
+ maintainer - opiekun
30
+
31
+ rebase - zmiana bazy
32
+
33
+ dictator - dyktator
34
+
35
+ lieutenant - porucznik
36
+
37
+ commit message - komentarz do zmiany
38
+
39
+ changeset - zestaw zmian
40
+
41
+ fork - rozwidlenie
42
+
43
+ cherry pick - pobrać część zmian, wybiórcze pobranie zmian
44
+
45
+ namespace - przestrzeń nazw
46
+
47
+ merge - scalenie, łączenie
48
+
49
+ fast-forward - przesunięcie
50
+
51
+ checkout - pobranie
52
+
53
+ blob - obiekt binarny
54
+
55
+ build - kompilacja, wersja
56
+
57
+ reflog - reflog
58
+
59
+ stash - schowek
60
+
61
+ dirty state - zmieniony stan, zmodyfikowany stan
62
+
63
+ submodule - moduł zależny, moduł zdalny, podmoduł
64
+
65
+ subproject - podprojekt
66
+
67
+ plumbing command - komenda potokowa
68
+
69
+
70
+
@@ -0,0 +1,256 @@
1
+ # Primeiros passos #
2
+
3
+ Esse capítulo trata dos primeiros passos usando o Git. Inicialmente explicaremos alguns fundamentos sobre ferramentas de controle de versão, passaremos ao tópico de como instalar o Git no seu sistema e finalmente como configurá-lo para começar a trabalhar. Ao final do capítulo você entenderá porque o Git é muito utilizado, porque usá-lo e como usá-lo.
4
+
5
+ ## Sobre Controle de Versão ##
6
+
7
+ O que é controle de versão, e por que você deve se importar? O controle de versão é um sistema que registra as mudanças feitas em um arquivo ou um conjunto de arquivos ao longo do tempo de forma que você possa recuperar versões específicas. Mesmo que os exemplos desse livro mostrem arquivos de código fonte sob controle de versão, você pode usá-lo com praticamente qualquer tipo de arquivo em um computador.
8
+
9
+ Se você é um designer gráfico ou um web designer e quer manter todas as versões de uma imagem ou layout (o que você certamente gostaria), usar um Sistema de Controle de Versão (Version Control System ou VCS) é uma decisão sábia. Ele permite reverter arquivos para um estado anterior, reverter um projeto inteiro para um estado anterior, comparar mudanças feitas ao decorrer do tempo, ver quem foi o último a modificar algo que pode estar causando problemas, quem introduziu um bug e quando, e muito mais. Usar um VCS normalmente significa que se você estragou algo ou perdeu arquivos, poderá facilmente reavê-los. Além disso, você pode controlar tudo sem maiores esforços.
10
+
11
+ ### Sistemas de Controle de Versão Locais ###
12
+
13
+ O método preferido de controle de versão por muitas pessoas é copiar arquivos em outro diretório (talvez um diretório com data e hora, se forem espertos). Esta abordagem é muito comum por ser tão simples, mas é também muito suscetível a erros. É fácil esquecer em qual diretório você está e gravar acidentalmente no arquivo errado ou sobrescrever arquivos sem querer.
14
+
15
+ Para lidar com esse problema, alguns programadores desenvolveram há muito tempo VCSs locais que armazenavam todas as alterações dos arquivos sob controle de revisão (ver Figura 1-1).
16
+
17
+ Insert 18333fig0101.png
18
+ Figura 1-1. Diagrama de controle de versão local.
19
+
20
+ Uma das ferramentas de VCS mais populares foi um sistema chamado rcs, que ainda é distribuído em muitos computadores até hoje. Até o popular Mac OS X inclui o comando rcs quando se instala o kit de ferramentas para desenvolvedores. Basicamente, essa ferramenta mantém conjuntos de patches (ou seja, as diferenças entre os arquivos) entre cada mudança em um formato especial; a partir daí qualquer arquivo em qualquer ponto na linha do tempo pode ser recriado ao juntar-se todos os patches.
21
+
22
+ ### Sistemas de Controle de Versão Centralizados ###
23
+
24
+ Outro grande problema que as pessoas encontram estava na necessidade de trabalhar em conjunto com outros desenvolvedores, que usam outros sistemas. Para lidar com isso, foram desenvolvidos Sistemas de Controle de Versão Centralizados (Centralized Version Control System ou CVCS). Esses sistemas, como por exemplo o CVS, Subversion e Perforce, possuem um único servidor central que contém todos os arquivos versionados e vários clientes que podem resgatar (check out) os arquivos do servidor. Por muitos anos, esse foi o modelo padrão para controle de versão.
25
+
26
+ Insert 18333fig0102.png
27
+ Figura 1-2. Diagrama de Controle de Versão Centralizado.
28
+
29
+ Tal arranjo oferece muitas vantagens, especialmente sobre VCSs locais. Por exemplo, todo mundo pode ter conhecimento razoável sobre o que os outros desenvolvedores estão fazendo no projeto. Administradores têm controle específico sobre quem faz o quê; sem falar que é bem mais fácil administrar um CVCS do que lidar com bancos de dados locais em cada cliente.
30
+
31
+ Entretanto, esse arranjo também possui grandes desvantagens. O mais óbvio é que o servidor central é um ponto único de falha. Se o servidor ficar fora do ar por uma hora, ninguém pode trabalhar em conjunto ou salvar novas versões dos arquivos durante esse período. Se o disco do servidor do banco de dados for corrompido e não existir um backup adequado, perde-se tudo — todo o histórico de mudanças no projeto, exceto pelas únicas cópias que os desenvolvedores possuem em suas máquinas locais. VCSs locais também sofrem desse problema — sempre que se tem o histórico em um único local, corre-se o risco de perder tudo.
32
+
33
+ ### Sistemas de Controle de Versão Distribuídos ###
34
+
35
+ É aí que surgem os Sistemas de Controle de Versão Distribuídos (Distributed Version Control System ou DVCS). Em um DVCS (tais como Git, Mercurial, Bazaar ou Darcs), os clientes não apenas fazem cópias das últimas versões dos arquivos: eles são cópias completas do repositório. Assim, se um servidor falha, qualquer um dos repositórios dos clientes pode ser copiado de volta para o servidor para restaurá-lo. Cada checkout (resgate) é na prática um backup completo de todos os dados (veja Figura 1-3).
36
+
37
+ Insert 18333fig0103.png
38
+ Figura 1-3. Diagrama de Controle de Versão Distribuído.
39
+
40
+ Além disso, muitos desses sistemas lidam muito bem com o aspecto de ter vários repositórios remotos com os quais eles podem colaborar, permitindo que você trabalhe em conjunto com diferentes grupos de pessoas, de diversas maneiras, simultaneamente no mesmo projeto. Isso permite que você estabeleça diferentes tipos de workflow (fluxo de trabalho) que não são possíveis em sistemas centralizados, como por exemplo o uso de modelos hierárquicos.
41
+
42
+ ## Uma Breve História do Git ##
43
+
44
+ Assim como muitas coisas boas na vida, o Git começou com um tanto de destruição criativa e controvérsia acirrada. O kernel (núcleo) do Linux é um projeto de software de código aberto de escopo razoavelmente grande. Durante a maior parte do período de manutenção do kernel do Linux (1991-2002), as mudanças no software eram repassadas como patches e arquivos compactados. Em 2002, o projeto do kernel do Linux começou a usar um sistema DVCS proprietário chamado BitKeeper.
45
+
46
+ Em 2005, o relacionamento entre a comunidade que desenvolvia o kernel e a empresa que desenvolvia comercialmente o BitKeeper se desfez, e o status de isento-de-pagamento da ferramenta foi revogado. Isso levou a comunidade de desenvolvedores do Linux (em particular Linus Torvalds, o criador do Linux) a desenvolver sua própria ferramenta baseada nas lições que eles aprenderam ao usar o BitKeeper. Alguns dos objetivos do novo sistema eram:
47
+
48
+ * Velocidade
49
+ * Design simples
50
+ * Suporte robusto a desenvolvimento não linear (milhares de branches paralelos)
51
+ * Totalmente distribuído
52
+ * Capaz de lidar eficientemente com grandes projetos como o kernel do Linux (velocidade e volume de dados)
53
+
54
+ Desde sua concepção em 2005, o Git evoluiu e amadureceu a ponto de ser um sistema fácil de usar e ainda assim mantém essas qualidades iniciais. É incrivelmente rápido, bastante eficiente com grandes projetos e possui um sistema impressionante de branching para desenvolvimento não-linear (Veja no Capítulo 3).
55
+
56
+ ## Noções Básicas de Git ##
57
+
58
+ Enfim, em poucas palavras, o que é Git? Essa é uma seção importante para assimilar, pois se você entender o que é Git e os fundamentos de como ele funciona, será muito mais fácil utilizá-lo de forma efetiva. À medida que você aprende a usar o Git, tente não pensar no que você já sabe sobre outros VCSs como Subversion e Perforce; assim você consegue escapar de pequenas confusões que podem surgir ao usar a ferramenta. Apesar de possuir uma interface parecida, o Git armazena e pensa sobre informação de uma forma totalmente diferente desses outros sistemas; entender essas diferenças lhe ajudará a não ficar confuso ao utilizá-lo.
59
+
60
+ ### Snapshots, E Não Diferenças ###
61
+
62
+ A maior diferença entre Git e qualquer outro VCS (Subversion e similares inclusos) está na forma que o Git trata os dados. Conceitualmente, a maior parte dos outros sistemas armazena informação como uma lista de mudanças por arquivo. Esses sistemas (CVS, Subversion, Perforce, Bazaar, etc.) tratam a informação que mantém como um conjunto de arquivos e as mudanças feitas a cada arquivo ao longo do tempo, conforme ilustrado na Figura 1.4.
63
+
64
+ Insert 18333fig0104.png
65
+ Figura 1-4. Outros sistemas costumam armazenar dados como mudanças em uma versão inicial de cada arquivo.
66
+
67
+ Git não pensa ou armazena sua informação dessa forma. Ao invés disso, o Git considera que os dados são como um conjunto de snapshots (captura de algo em um determinado instante, como em uma foto) de um mini-sistema de arquivos. Cada vez que você salva ou consolida (commit) o estado do seu projeto no Git, é como se ele tirasse uma foto de todos os seus arquivos naquele momento e armazenasse uma referência para essa captura. Para ser eficiente, se nenhum arquivo foi alterado, a informação não é armazenada novamente - apenas um link para o arquivo idêntico anterior que já foi armazenado. A figura 1-5 mostra melhor como o Git lida com seus dados.
68
+
69
+ Insert 18333fig0105.png
70
+ Figura 1-5. Git armazena dados como snapshots do projeto ao longo do tempo.
71
+
72
+ Essa é uma distinção importante entre Git e quase todos os outros VCSs. Isso leva o Git a reconsiderar quase todos os aspectos de controle de versão que os outros sistemas copiaram da geração anterior. Também faz com que o Git se comporte mais como um mini-sistema de arquivos com algumas poderosas ferramentas construídas em cima dele, ao invés de simplesmente um VCS. Nós vamos explorar alguns dos benefícios que você tem ao lidar com dados dessa forma, quando tratarmos do assunto de branching no Capítulo 3.
73
+
74
+ ### Quase Todas Operações São Locais ###
75
+
76
+ A maior parte das operações no Git precisam apenas de recursos e arquivos locais para operar — geralmente nenhuma outra informação é necessária de outro computador na sua rede. Se você está acostumado a um CVCS onde a maior parte das operações possui latência por conta de comunicação com a rede, esse aspecto do Git fará com que você pense que os deuses da velocidade abençoaram o Git com poderes sobrenaturais. Uma vez que você tem todo o histórico do projeto no seu disco local, a maior parte das operações parece ser quase instantânea.
77
+
78
+ Por exemplo, para navegar no histórico do projeto, o Git não precisa requisitar ao servidor o histórico para que possa apresentar a você — ele simplesmente lê diretamente de seu banco de dados local. Isso significa que você vê o histórico do projeto quase instantaneamente. Se você quiser ver todas as mudanças introduzidas entre a versão atual de um arquivo e a versão de um mês atrás, o Git pode buscar o arquivo de um mês atrás e calcular as diferenças localmente, ao invés de ter que requisitar ao servidor que faça o cálculo, ou puxar uma versão antiga do arquivo no servidor remoto para que o cálculo possa ser feito localmente.
79
+
80
+ Isso também significa que há poucas coisas que você não possa fazer caso esteja offline ou sem acesso a uma VPN. Se você entrar em um avião ou trem e quiser trabalhar, você pode fazer commits livre de preocupações até ter acesso a rede novamente para fazer upload. Se você estiver indo para casa e seu cliente de VPN não estiver funcionando, você ainda pode trabalhar. Em outros sistemas, fazer isso é impossível ou muito trabalhoso. No Perforce, por exemplo, você não pode fazer muita coisa quando não está conectado ao servidor; e no Subversion e CVS, você pode até editar os arquivos, mas não pode fazer commits das mudanças já que sua base de dados está offline. Pode até parecer que não é grande coisa, mas você pode se surpreender com a grande diferença que pode fazer.
81
+
82
+ ### Git Tem Integridade ###
83
+
84
+ Tudo no Git tem seu checksum (valor para verificação de integridade) calculado antes que seja armazenado e então passa a ser referenciado pelo checksum. Isso significa que é impossível mudar o conteúdo de qualquer arquivo ou diretório sem que o Git tenha conhecimento. Essa funcionalidade é parte fundamental do Git e é integral à sua filosofia. Você não pode perder informação em trânsito ou ter arquivos corrompidos sem que o Git seja capaz de detectar.
85
+
86
+ O mecanismo que o Git usa para fazer o checksum é chamado de hash SHA-1, uma string de 40 caracteres composta de caracteres hexadecimais (0-9 e a-f) que é calculado a partir do conteúdo de um arquivo ou estrutura de um diretório no Git. Um hash SHA-1 parece com algo mais ou menos assim:
87
+
88
+ 24b9da6552252987aa493b52f8696cd6d3b00373
89
+
90
+ Você vai encontrar esses hashes em todo canto, uma vez que Git os utiliza tanto. Na verdade, tudo que o Git armazena é identificado não por nome do arquivo mas pelo valor do hash do seu conteúdo.
91
+
92
+ ### Git Geralmente Só Adiciona Dados ###
93
+
94
+ Dentre as ações que você pode realizar no Git, quase todas apenas acrescentam dados à base do Git. É muito difícil fazer qualquer coisa no sistema que não seja reversível ou remover dados de qualquer forma. Assim como em qualquer VCS, você pode perder ou bagunçar mudanças que ainda não commitou; mas depois de fazer um commit de um snapshot no Git, é muito difícil que você o perca, especialmente se você frequentemente joga suas mudanças para outro repositório.
95
+
96
+ Isso faz com que o uso do Git seja uma alegria no sentido de permitir que façamos experiências sem o perigo de causar danos sérios. Para uma análise mais detalhada de como o Git armazena seus dados e de como você pode recuperar dados que parecem ter sido perdidos, veja o Capítulo 9.
97
+
98
+ ### Os Três Estados ###
99
+
100
+ Agora preste atenção. Essa é a coisa mais importante pra se lembrar sobre Git se você quiser que o resto do seu aprendizado seja tranquilo. Git faz com que seus arquivos sempre estejam em um dos três estados fundamentais: consolidado (committed), modificado (modified) e preparado (staged). Dados são ditos consolidados quando estão seguramente armazenados em sua base de dados local. Modificado trata de um arquivo que sofreu mudanças mas que ainda não foi consolidado na base de dados. Um arquivo é tido como preparado quando você marca um arquivo modificado em sua versão corrente para que ele faça parte do snapshot do próximo commit (consolidação).
101
+
102
+ Isso nos traz para as três seções principais de um projeto do Git: o diretório do Git (git directory, repository), o diretório de trabalho (working directory), e a área de preparação (staging area).
103
+
104
+ Insert 18333fig0106.png
105
+ Figura 1-6. Diretório de trabalho, área de preparação, e o diretório do Git.
106
+
107
+ O diretório do Git é o local onde o Git armazena os metadados e o banco de objetos de seu projeto. Esta é a parte mais importante do Git, e é a parte copiada quando você clona um repositório de outro computador.
108
+
109
+ O diretório de trabalho é um único checkout de uma versão do projeto. Estes arquivos são obtidos a partir da base de dados comprimida no diretório do Git e colocados em disco para que você possa utilizar ou modificar.
110
+
111
+ A área de preparação é um simples arquivo, geralmente contido no seu diretório Git, que armazena informações sobre o que irá em seu próximo commit. É bastante conhecido como índice (index), mas está se tornando padrão chamá-lo de área de preparação.
112
+
113
+ O workflow básico do Git pode ser descrito assim:
114
+
115
+ 1. Você modifica arquivos no seu diretório de trabalho.
116
+ 2. Você seleciona os arquivos, adicionando snapshots deles para sua área de preparação.
117
+ 3. Você faz um commit, que leva os arquivos como eles estão na sua área de preparação e os armazena permanentemente no seu diretório Git.
118
+
119
+ Se uma versão particular de um arquivo está no diretório Git, é considerada consolidada. Caso seja modificada mas foi adicionada à área de preparação, está preparada. E se foi alterada desde que foi obtida mas não foi preparada, está modificada. No Capítulo 2, você aprenderá mais sobre estes estados e como se aproveitar deles ou pular toda a parte de preparação.
120
+
121
+ ## Instalando Git ##
122
+
123
+ Vamos entender como utilizar o Git. Primeiramente você deve instalá-lo. Você pode obtê-lo de diversas formas; as duas mais comuns são instalá-lo a partir do fonte ou instalar um package (pacote) existente para sua plataforma.
124
+
125
+ ### Instalando a Partir do Fonte ###
126
+
127
+ Caso você possa, é geralmente útil instalar o Git a partir do fonte, porque será obtida a versão mais recente. Cada versão do Git tende a incluir melhoras na UI, sendo assim, obter a última versão é geralmente o melhor caminho caso você sinta-se confortável em compilar o software a partir do fonte. Também acontece que diversas distribuições Linux contêm pacotes muito antigos; sendo assim, a não ser que você tenha uma distro (distribuição) muito atualizada ou está utilizando backports, instalar a partir do fonte pode ser a melhor aposta.
128
+
129
+ Para instalar o Git, você precisa ter as seguintes bibliotecas que o Git depende: curl, zlib, openssl, expat e libiconv. Por exemplo, se você usa um sistema que tem yum (tal como o Fedora) ou apt-get (tais como os sistemas baseados no Debian), você pode utilizar um desses comandos para instalar todas as dependências:
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 libssl-dev
136
+
137
+ Quando você tiver todas as dependências necessárias, você pode continuar e baixar o snapshot mais recente a partir do web site do Git:
138
+
139
+ http://git-scm.com/download
140
+
141
+ Então, compilá-lo e instalá-lo:
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
+ Após a conclusão, você também pode obter o Git via o próprio Git para atualizações:
149
+
150
+ $ git clone git://git.kernel.org/pub/scm/git/git.git
151
+
152
+ ### Instalando no Linux ###
153
+
154
+ Se você quiser instalar o Git no Linux via um instalador binário, você pode fazê-lo com a ferramenta de gerenciamento de pacotes (packages) disponível na sua distribuição. Caso você esteja no Fedora, você pode usar o yum:
155
+
156
+ $ yum install git-core
157
+
158
+ Ou se você estiver em uma distribuição baseada no Debian, como o Ubuntu, use o apt-get:
159
+
160
+ $ apt-get install git
161
+
162
+ ### Instalando no Mac ###
163
+
164
+ Existem duas formas fáceis de se instalar Git em um Mac. A mais fácil delas é usar o instalador gráfico do Git, que você pode baixar da página do SourceForge (veja Figura 1-7):
165
+
166
+ http://sourceforge.net/projects/git-osx-installer/
167
+
168
+ Insert 18333fig0107.png
169
+ Figura 1-7. Instalador Git OS X.
170
+
171
+ A outra forma comum é instalar o Git via MacPorts (`http://www.macports.org`). Se você tem o MacPOrts instalado, instale o Git via
172
+
173
+ $ sudo port install git-core +svn +doc +bash_completion +gitweb
174
+
175
+ Você não precisa adicionar todos os extras, mas você provavelmente irá querer incluir o +svn caso você tenha que usar o Git com repositórios Subversion (veja Capítulo 8).
176
+
177
+ ### Instalando no Windows ###
178
+
179
+ Instalar o Git no Windows é muito fácil. O projeto msysgit tem um dos procedimentos mais simples de instalação. Simplesmente baixe o arquivo exe do instalador a partir da página do GitHub e execute-o:
180
+
181
+ http://msysgit.github.com
182
+
183
+ Após concluir a instalação, você terá tanto uma versão command line (linha de comando, incluindo um cliente SSH que será útil depois) e uma GUI padrão.
184
+
185
+ ## Configuração Inicial do Git ##
186
+
187
+ Agora que você tem o Git em seu sistema, você pode querer fazer algumas coisas para customizar seu ambiente Git. Você só precisa fazer uma vez; as configurações serão mantidas entre atualizações. Você também poderá alterá-las a qualquer momento executando os comandos novamente.
188
+
189
+ Git vem com uma ferramenta chamada git config que permite a você ler e definir variáveis de configuração que controlam todos os aspectos de como o Git parece e opera. Essas variáveis podem ser armazenadas em três lugares diferentes:
190
+
191
+ * arquivo `/etc/gitconfig`: Contém valores para todos usuários do sistema e todos os seus repositórios. Se você passar a opção `--system` para `git config`, ele lerá e escreverá a partir deste arquivo especificamente.
192
+ * arquivo `~/.gitconfig`: É específico para seu usuário. Você pode fazer o Git ler e escrever a partir deste arquivo especificamente passando a opção `--global`.
193
+ * arquivo de configuração no diretório git (ou seja, `.git/config`) de qualquer repositório que você está utilizando no momento: Específico para aquele único repositório. Cada nível sobrepõem o valor do nível anterior, sendo assim valores em `.git/config` sobrepõem aqueles em `/etc/gitconfig`.
194
+
195
+ Em sistemas Windows, Git procura pelo arquivo `.gitconfig` no diretório `$HOME` (`C:\Documents and Settins\$USER` para a maioria das pessoas). Também procura por /etc/gitconfig, apesar de que é relativo à raiz de MSys, que é o local onde você escolheu instalar o Git no seu sistema Windows quando executou o instalador.
196
+
197
+ ### Sua Identidade ###
198
+
199
+ A primeira coisa que você deve fazer quando instalar o Git é definir o seu nome de usuário e endereço de e-mail. Isso é importante porque todos os commits no Git utilizam essas informações, e está imutavelmente anexado nos commits que você realiza:
200
+
201
+ $ git config --global user.name "John Doe"
202
+ $ git config --global user.email johndoe@example.com
203
+
204
+ Relembrando, você só precisará fazer isso uma vez caso passe a opção `--global`, pois o Git sempre usará essa informação para qualquer coisa que você faça nesse sistema. Caso você queira sobrepor estas com um nome ou endereço de e-mail diferentes para projetos específicos, você pode executar o comando sem a opção `--global` quando estiver no próprio projeto.
205
+
206
+ ### Seu Editor ###
207
+
208
+ Agora que sua identidade está configurada, você pode configurar o editor de texto padrão que será utilizado quando o Git precisar que você digite uma mensagem. Por padrão, Git usa o editor padrão do sistema, que é geralmente Vi ou Vim. Caso você queira utilizar um editor diferente, tal como o Emacs, você pode executar o seguinte:
209
+
210
+ $ git config --global core.editor emacs
211
+
212
+ ### Sua Ferramenta de Diff ###
213
+
214
+ Outra opção útil que você pode querer configurar é a ferramente padrão de diff utilizada para resolver conflitos de merge (fusão). Digamos que você queira utilizar o vimdiff:
215
+
216
+ $ git config --global merge.tool vimdiff
217
+
218
+ Git aceita kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge e opendiff como ferramentas válidas para merge. Você também pode configurar uma ferramenta personalizada; veja o Capítulo 7 para maiores informações em como fazê-lo.
219
+
220
+ ### Verificando Suas Configurações ###
221
+
222
+ Caso você queira verificar suas configurações, você pode utilizar o comando `git config --list` para listar todas as configurações que o Git encontrar naquele momento:
223
+
224
+ $ git config --list
225
+ user.name=Scott Chacon
226
+ user.email=schacon@gmail.com
227
+ color.status=auto
228
+ color.branch=auto
229
+ color.interactive=auto
230
+ color.diff=auto
231
+ ...
232
+
233
+ Você pode ver algumas chaves mais de uma vez, porque o Git lê as mesmas chaves em diferentes arquivos (`/etc/gitconfig` e `~/.gitconfig`, por exemplo). Neste caso, Git usa o último valor para cada chave única que é obtida.
234
+
235
+ Você também pode verificar qual o valor que uma determinada chave tem para o Git digitando `git config {key}`:
236
+
237
+ $ git config user.name
238
+ Scott Chacon
239
+
240
+ ## Obtendo Ajuda ##
241
+
242
+ Caso você precise de ajuda usando o Git, exitem três formas de se obter ajuda das páginas de manual (manpage) para quaisquer comandos do Git:
243
+
244
+ $ git help <verb>
245
+ $ git <verb> --help
246
+ $ man git-<verb>
247
+
248
+ Por exemplo, você pode obter a manpage para o comando config executando
249
+
250
+ $ git help config
251
+
252
+ Estes comandos são bons porque você pode acessá-los em qualquer lugar, mesmo offline. Caso as manpages e este livro não sejam suficientes e você precise de ajuda pessoalmente, tente os canais `#git` ou `#github` no servidor IRC do Freenode (irc.freenode.net). Esses canais estão regularmente repletos com centenas de pessoas que possuem grande conhecimento sobre Git e geralmente dispostos a ajudar.
253
+
254
+ ## Resumo ##
255
+
256
+ Você deve ter um entendimento básico do que é Git e suas diferenças em relação ao CVCS que você tem utilizado. Além disso, você deve ter uma versão do Git funcionando em seu sistema que está configurada com sua identidade pessoal. Agora é hora de aprender algumas noções básicas do Git.
@@ -0,0 +1,1127 @@
1
+ # Git Essencial #
2
+
3
+ Se você só puder ler um capítulo para continuar a usar o Git, leia esse. Esse capítulo cobre todos os comandos básicos que você precisa para realizar a maioria das atividades que eventualmente você fará no Git. Ao final desse capítulo você deverá ser capaz de configurar e inicializar um repositório, começar e parar o monitoramento de arquivos, além de selecionar e consolidar (fazer commit) alterações. Também vamos mostrar a você como configurar o Git para ignorar certos tipos de arquivos e padrões de arquivos, como desfazer enganos de forma rápida e fácil, como pesquisar o histórico do seu projeto e visualizar alterações entre commits e como enviar e obter arquivos a partir de repositórios remotos.
4
+
5
+ ## Obtendo um Repositório Git ##
6
+
7
+ Você pode obter um projeto Git utilizando duas formas principais. A primeira faz uso de um projeto ou diretório existente e o importa para o Git. A segunda clona um repositório Git existente a partir de outro servidor.
8
+
9
+ ### Inicializando um Repositório em um Diretório Existente ###
10
+
11
+ Caso você esteja iniciando o monitoramento de um projeto existente com Git, você precisa ir para o diretório do projeto e digitar
12
+
13
+ $ git init
14
+
15
+ Isso cria um novo subdiretório chamado `.git` que contem todos os arquivos necessários de seu repositório — um esqueleto de repositório Git. Neste ponto, nada em seu projeto é monitorado. (Veja o *Capítulo 9* para maiores informações sobre quais arquivos estão contidos no diretório `.git` que foi criado.)
16
+
17
+ Caso você queira começar a controlar o versionamento dos arquivos existentes (diferente de um diretório vazio), você provavelmente deve começar a monitorar esses arquivos e fazer um commit inicial. Você pode realizar isso com poucos comandos `git add` que especificam quais arquivos você quer monitorar, seguido de um commit:
18
+
19
+ $ git add *.c
20
+ $ git add README
21
+ $ git commit -m 'initial project version'
22
+
23
+ Bem, nós iremos repassar esses comandos em um momento. Neste ponto, você tem um repositório Git com arquivos monitorados e um commit inicial.
24
+
25
+ ### Clonando um Repositório Existente ###
26
+
27
+ Caso você queira copiar um repositório Git já existente — por exemplo, um projeto que você queira contribuir — o comando necessário é `git clone`. Caso você esteja familiarizado com outros sistemas VCS, tais como Subversion, você perceberá que o comando é `clone` e não `checkout`. Essa é uma diferença importante — Git recebe uma cópia de quase todos os dados que o servidor possui. Cada versão de cada arquivo no histórico do projeto é obtida quando você roda `git clone`. De fato, se o disco do servidor ficar corrompido, é possível utilizar um dos clones em qualquer cliente para reaver o servidor no estado em que estava quando foi clonado (você pode perder algumas características do servidor, mas todos os dados versionados estarão lá — veja o *Capítulo 4* para maiores detalhes).
28
+
29
+ Você clona um repositório com `git clone [url]`. Por exemplo, caso você queria clonar a biblioteca Git do Ruby chamada Grit, você pode fazê-lo da seguinte forma:
30
+
31
+ $ git clone git://github.com/schacon/grit.git
32
+
33
+ Isso cria um diretório chamado `grit`, inicializa um diretório `.git`dentro deste, obtém todos os dados do repositório e verifica a cópia atual da última versão. Se você entrar no novo diretório `grit`, você verá todos os arquivos do projeto nele, pronto para serem editados ou utilizados. Caso você queira clonar o repositório em um diretório diferente de grit, é possível especificar esse diretório utilizando a opção abaixo:
34
+
35
+ $ git clone git://github.com/schacon/grit.git mygrit
36
+
37
+ Este comando faz exatamente a mesma coisa que o anterior, mas o diretório alvo será chamado `mygrit`.
38
+
39
+ O Git possui diversos protocolos de transferência que você pode utilizar. O exemplo anterior utiliza o protocolo `git://`, mas você também pode ver `http(s)://` ou `user@server:/path.git`, que utilizam o protocolo de transferência SSH. No *Capítulo 4*, introduziremos todas as opções disponíveis com as quais o servidor pode ser configurado para acessar o seu repositório Git, e os prós e contras de cada uma.
40
+
41
+ ## Gravando Alterações no Repositório ##
42
+
43
+ Você tem um repositório Git e um checkout ou cópia funcional dos arquivos para esse projeto. Você precisa fazer algumas mudanças e fazer o commit das partes destas mudanças em seu repositório cada vez que o projeto atinge um estado no qual você queira gravar.
44
+
45
+ Lembre-se que cada arquivo em seu diretório de trabalho pode estar em um de dois estados: *monitorado* ou *não monitorado*. Arquivos *monitorados* são arquivos que estavam no último snapshot; podendo estar *inalterados*, *modificados* ou *selecionados*. Arquivos *não monitorados* são todo o restante — qualquer arquivo em seu diretório de trabalho que não estava no último snapshot e também não estão em sua área de seleção. Quando um repositório é inicialmente clonado, todos os seus arquivos estarão monitorados e inalterados porque você simplesmente os obteve e ainda não os editou.
46
+
47
+ Conforme você edita esses arquivos, o Git passa a vê-los como modificados, porque você os alterou desde seu último commit. Você *seleciona* esses arquivos modificados e então faz o commit de todas as alterações selecionadas e o ciclo se repete. Este ciclo é apresentado na Figura 2-1.
48
+
49
+ Insert 18333fig0201.png
50
+ Figura 2-1. O ciclo de vida dos status de seus arquivos.
51
+
52
+ ### Verificando o Status de Seus Arquivos ###
53
+
54
+ A principal ferramenta utilizada para determinar quais arquivos estão em quais estados é o comando `git status`. Se você executar este comando diretamente após uma clonagem, você deverá ver algo similar a isso:
55
+
56
+ $ git status
57
+ # On branch master
58
+ nothing to commit, working directory clean
59
+
60
+ Isso significa que você tem um diretório de trabalho limpo — em outras palavras, não existem arquivos monitorados e modificados. Git também não encontrou qualquer arquivo não monitorado, caso contrário eles seriam listados aqui. Por fim, o comando lhe mostra em qual branch você se encontra. Por enquanto, esse sempre é o `master`, que é o padrão; você não deve se preocupar com isso. No próximo capítulo nós vamos falar sobre branches e referências em detalhes.
61
+
62
+ Vamos dizer que você adicione um novo arquivo em seu projeto, um simples arquivo `README`. Caso o arquivo não exista e você execute `git status`, você verá o arquivo não monitorado dessa forma:
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
+ nothing added to commit but untracked files present (use "git add" to track)
72
+
73
+ Você pode ver que o seu novo arquivo `README` não está sendo monitorado, pois está listado sob o cabeçalho "Untracked files" na saída do comando status. Não monitorado significa basicamente que o Git está vendo um arquivo que não existia na última captura (commit); o Git não vai incluí-lo nas suas capturas de commit até que você o diga explicitamente que assim o faça. Ele faz isso para que você não inclua acidentalmente arquivos binários gerados, ou outros arquivos que você não têm a intenção de incluir. Digamos, que você queira incluir o arquivo README, portanto vamos começar a monitorar este arquivo.
74
+
75
+ ### Monitorando Novos Arquivos ###
76
+
77
+ Para passar a monitorar um novo arquivo, use o comando `git add`. Para monitorar o arquivo `README`, você pode rodar isso:
78
+
79
+ $ git add README
80
+
81
+ Se você rodar o comando status novamente, você pode ver que o seu arquivo `README` agora está sendo monitorado e está selecionado:
82
+
83
+ $ git status
84
+ # On branch master
85
+ # Changes to be committed:
86
+ # (use "git reset HEAD <file>..." to unstage)
87
+ #
88
+ # new file: README
89
+ #
90
+
91
+ Você pode dizer que ele está selecionado pois está sob o cabeçalho “Changes to be committed”. Se você commitar neste ponto, a versão do arquivo no momento em que você rodou o comando `git add` é a que estará na captura (snapshot) do histórico. Você deve se lembrar que quando rodou o comando `git init` anteriormente, logo em seguida rodou o comando `git add (arquivos)` — fez isso para passar a monitorar os arquivos em seu diretório. O comando `git add` recebe um caminho de um arquivo ou diretório; se é de um diretório, o comando adiciona todos os arquivos do diretório recursivamente.
92
+
93
+ ### Selecionando Arquivos Modificados ###
94
+
95
+ Vamos alterar um arquivo que já está sendo monitorado. Se você alterar um aquivo previamente monitorado chamado `benchmarks.rb` e então rodar o comando `status` novamente, você terá algo semelhante a:
96
+
97
+ $ git status
98
+ # On branch master
99
+ # Changes to be committed:
100
+ # (use "git reset HEAD <file>..." to unstage)
101
+ #
102
+ # new file: README
103
+ #
104
+ # Changes not staged for commit:
105
+ # (use "git add <file>..." to update what will be committed)
106
+ #
107
+ # modified: benchmarks.rb
108
+ #
109
+
110
+ O arquivo `benchmarks.rb` aparece sob a seção chamada “Changes not staged for commit” — que significa que um arquivo monitorado foi modificado no diretório de trabalho, mas ainda não foi selecionado (staged). Para selecioná-lo, utilize o comando `git add` (é um comando com várias funções — você o utiliza para monitorar novos arquivos, selecionar arquivos, e para fazer outras coisas como marcar como resolvido aquivos com conflito). Agora vamos rodar o comando `git add` para selecionar o arquivo `benchmarks.rb`, e então rodar `git status` novamente:
111
+
112
+ $ git add benchmarks.rb
113
+ $ git status
114
+ # On branch master
115
+ # Changes to be committed:
116
+ # (use "git reset HEAD <file>..." to unstage)
117
+ #
118
+ # new file: README
119
+ # modified: benchmarks.rb
120
+ #
121
+
122
+ Ambos os arquivos estão selecionados e serão consolidados no seu próximo commit. Neste momento, vamos supor que você lembrou de uma mudança que queria fazer no arquivo `benchmarks.rb` antes de commitá-lo. Você o abre novamente e faz a mudança, e então está pronto para commitar. No entanto, vamos rodar `git status` mais uma vez:
123
+
124
+ $ vim benchmarks.rb
125
+ $ git status
126
+ # On branch master
127
+ # Changes to be committed:
128
+ # (use "git reset HEAD <file>..." to unstage)
129
+ #
130
+ # new file: README
131
+ # modified: benchmarks.rb
132
+ #
133
+ # Changes not staged for commit:
134
+ # (use "git add <file>..." to update what will be committed)
135
+ #
136
+ # modified: benchmarks.rb
137
+ #
138
+
139
+ Que diabos? Agora o arquivo `benchmarks.rb` aparece listado como selecionado e não selecionado. Como isso é possível? Acontece que o Git seleciona um arquivo exatamente como ele era quando o comando `git add` foi executado. Se você fizer o commit agora, a versão do `benchmarks.rb` como estava na última vez que você rodou o comando git add é que será incluída no commit, não a versão do arquivo que estará no seu diretório de trabalho quando rodar o comando `git commit`. Se você modificar um arquivo depois que rodou o comando `git add`, terá de rodar o `git add` de novo para selecionar a última versão do arquivo:
140
+
141
+ $ git add benchmarks.rb
142
+ $ git status
143
+ # On branch master
144
+ # Changes to be committed:
145
+ # (use "git reset HEAD <file>..." to unstage)
146
+ #
147
+ # new file: README
148
+ # modified: benchmarks.rb
149
+ #
150
+
151
+ ### Ignorando Arquivos ###
152
+
153
+ Muitas vezes, você terá uma classe de arquivos que não quer que o Git automaticamente adicione ou mostre como arquivos não monitorados. Normalmente estes arquivos são gerados automaticamente como arquivos de log ou produzidos pelo seu sistema de build. Nestes casos, você pode criar um arquivo contendo uma lista de padrões a serem checados chamado `.gitignore`. Eis um exemplo de arquivo `.gitignore`:
154
+
155
+ $ cat .gitignore
156
+ *.[oa]
157
+ *~
158
+
159
+ A primeira linha fala para o Git ignorar qualquer arquivo finalizado em `.o` ou `.a` — arquivos *objetos* e *archive* (compactados) que devem ter produto da construção (build) de seu código. A segunda linha fala para o Git ignorar todos os arquivos que terminam com um til (`~`), os quais são utilizados por muitos editores de texto como o Emacs para marcar arquivos temporários. Você também pode incluir um diretório `log`, `tmp` ou `pid`; documentação gerada automaticamente; e assim por diante. Configurar um arquivo `.gitignore` antes de começar a trabalhar, normalmente é uma boa ideia, pois evita que você commite acidentalmente arquivos que não deveriam ir para o seu repositório Git.
160
+
161
+ As regras para os padrões que você pode pôr no arquivo `.gitignore` são as seguintes:
162
+
163
+ * Linhas em branco ou iniciando com `#` são ignoradas.
164
+ * Padrões glob comuns funcionam.
165
+ * Você pode terminar os padrões com uma barra (`/`) para especificar diretórios.
166
+ * Você pode negar um padrão ao iniciá-lo com um ponto de exclamação (`!`).
167
+
168
+ Padrões glob são como expressões regulares simples que os shells usam. Um asterísco (`*`) significa zero ou mais caracteres; `[abc]` condiz com qualquer um dos caracteres de dentro dos colchetes (nesse caso, a, b, ou c); um ponto de interrogação (`?`) condiz com um único caractere; e os caracteres separados por hífen dentro de colchetes (`[0-9]`) condizem à qualquer um dos caracteres entre eles (neste caso, de 0 à 9).
169
+
170
+ Segue um outro exemplo de arquivo `.gitignore`:
171
+
172
+ # um comentário - isto é ignorado
173
+ # sem arquivos terminados em .a
174
+ *.a
175
+ # mas rastreie lib.a, mesmo que você tenha ignorado arquivos terminados em .a acima
176
+ !lib.a
177
+ # apenas ignore o arquivo TODO na raiz, não o subdiretório TODO
178
+ /TODO
179
+ # ignore todos os arquivos no diretório build/
180
+ build/
181
+ # ignore doc/notes.txt mas, não ignore doc/server/arch.txt
182
+ doc/*.txt
183
+
184
+ ### Visualizando Suas Mudanças Selecionadas e Não Selecionadas ###
185
+
186
+ Se o comando `git status` for muito vago — você quer saber exatamente o que você alterou, não apenas quais arquivos foram alterados — você pode utilizar o comando `git diff`. Nós trataremos o comando `git diff` em mais detalhes posteriormente; mas provavelmente você vai utilizá-lo com frequência para responder estas duas perguntas: O que você alterou, mas ainda não selecionou (stage)? E o que você selecionou, que está para ser commitado? Apesar do comando `git status` responder essas duas perguntas de maneira geral, o `git diff` mostra as linhas exatas que foram adicionadas e removidas — o patch, por assim dizer.
187
+
188
+ Vamos dizer que você edite e selecione o arquivo `README` de novo e então edite o arquivo `benchmarks.rb` sem selecioná-lo. Se você rodar o comando `status`, você novamente verá algo assim:
189
+
190
+ $ git status
191
+ # On branch master
192
+ # Changes to be committed:
193
+ # (use "git reset HEAD <file>..." to unstage)
194
+ #
195
+ # new file: README
196
+ #
197
+ # Changes not staged for commit:
198
+ # (use "git add <file>..." to update what will be committed)
199
+ #
200
+ # modified: benchmarks.rb
201
+ #
202
+
203
+ Para ver o que você alterou mas ainda não selecionou, digite o comando `git diff` sem nenhum argumento:
204
+
205
+ $ git diff
206
+ diff --git a/benchmarks.rb b/benchmarks.rb
207
+ index 3cb747f..da65585 100644
208
+ --- a/benchmarks.rb
209
+ +++ b/benchmarks.rb
210
+ @@ -36,6 +36,10 @@ def main
211
+ @commit.parents[0].parents[0].parents[0]
212
+ end
213
+
214
+ + run_code(x, 'commits 1') do
215
+ + git.commits.size
216
+ + end
217
+ +
218
+ run_code(x, 'commits 2') do
219
+ log = git.commits('master', 15)
220
+ log.size
221
+
222
+ Este comando compara o que está no seu diretório de trabalho com o que está na sua área de seleção (staging). O resultado te mostra as mudanças que você fez que ainda não foram selecionadas.
223
+
224
+ Se você quer ver o que selecionou que irá no seu próximo commit, pode utilizar `git diff --cached`. (Nas versões do Git 1.6.1 e superiores, você também pode utilizar `git diff --staged`, que deve ser mais fácil de lembrar.) Este comando compara as mudanças selecionadas com o seu último commit:
225
+
226
+ $ git diff --cached
227
+ diff --git a/README b/README
228
+ new file mode 100644
229
+ index 0000000..03902a1
230
+ --- /dev/null
231
+ +++ b/README2
232
+ @@ -0,0 +1,5 @@
233
+ +grit
234
+ + by Tom Preston-Werner, Chris Wanstrath
235
+ + http://github.com/mojombo/grit
236
+ +
237
+ +Grit is a Ruby library for extracting information from a Git repository
238
+
239
+ É importante notar que o `git diff` por si só não mostra todas as mudanças desde o último commit — apenas as mudanças que ainda não foram selecionadas. Isso pode ser confuso, pois se você selecionou todas as suas mudanças, `git diff` não te dará nenhum resultado.
240
+
241
+ Como um outro exemplo, se você selecionar o arquivo `benchmarks.rb` e então editá-lo, você pode utilizar o `git diff` para ver as mudanças no arquivo que estão selecionadas, e as mudanças que não estão:
242
+
243
+ $ git add benchmarks.rb
244
+ $ echo '# test line' >> benchmarks.rb
245
+ $ git status
246
+ # On branch master
247
+ #
248
+ # Changes to be committed:
249
+ #
250
+ # modified: benchmarks.rb
251
+ #
252
+ # Changes not staged for commit:
253
+ #
254
+ # modified: benchmarks.rb
255
+ #
256
+
257
+ Agora você pode utilizar o `git diff` para ver o que ainda não foi selecionado:
258
+
259
+ $ git diff
260
+ diff --git a/benchmarks.rb b/benchmarks.rb
261
+ index e445e28..86b2f7c 100644
262
+ --- a/benchmarks.rb
263
+ +++ b/benchmarks.rb
264
+ @@ -127,3 +127,4 @@ end
265
+ main()
266
+
267
+ ##pp Grit::GitRuby.cache_client.stats
268
+ +# test line
269
+
270
+ E executar `git diff --cached` para ver o que você já alterou para o estado staged até o momento:
271
+
272
+ $ git diff --cached
273
+ diff --git a/benchmarks.rb b/benchmarks.rb
274
+ index 3cb747f..e445e28 100644
275
+ --- a/benchmarks.rb
276
+ +++ b/benchmarks.rb
277
+ @@ -36,6 +36,10 @@ def main
278
+ @commit.parents[0].parents[0].parents[0]
279
+ end
280
+
281
+ + run_code(x, 'commits 1') do
282
+ + git.commits.size
283
+ + end
284
+ +
285
+ run_code(x, 'commits 2') do
286
+ log = git.commits('master', 15)
287
+ log.size
288
+
289
+ ### Fazendo Commit de Suas Mudanças ###
290
+
291
+ Agora que a sua área de seleção está do jeito que você quer, você pode fazer o commit de suas mudanças. Lembre-se que tudo aquilo que ainda não foi selecionado — qualquer arquivo que você criou ou modificou que você não tenha rodado o comando `git add` desde que editou — não fará parte deste commit. Estes arquivos permanecerão como arquivos modificados em seu disco.
292
+ Neste caso, a última vez que você rodou `git status`, viu que tudo estava selecionado, portanto você está pronto para fazer o commit de suas mudanças. O jeito mais simples é digitar `git commit`:
293
+
294
+ $ git commit
295
+
296
+ Ao fazer isso, seu editor de escolha é acionado. (Isto é configurado através da variável de ambiente `$EDITOR` de seu shell - normalmente vim ou emacs, apesar de poder ser configurado o que você quiser utilizando o comando `git config --global core.editor` como visto no *Capítulo 1*).
297
+
298
+ O editor mostra o seguinte texto (este é um exemplo da tela do Vim):
299
+
300
+ # Please enter the commit message for your changes. Lines starting
301
+ # with '#' will be ignored, and an empty message aborts the commit.
302
+ # On branch master
303
+ # Changes to be committed:
304
+ # (use "git reset HEAD <file>..." to unstage)
305
+ #
306
+ # new file: README
307
+ # modified: benchmarks.rb
308
+ ~
309
+ ~
310
+ ~
311
+ ".git/COMMIT_EDITMSG" 10L, 283C
312
+
313
+ Você pode ver que a mensagem default do commit contém a última saída do comando `git status` comentada e uma linha vazia no início. Você pode remover estes comentários e digitar sua mensagem de commit, ou pode deixá-los ai para ajudar a lembrar o que está commitando. (Para um lembrete ainda mais explícito do que foi modificado, você pode passar a opção `-v` para o `git commit`. Ao fazer isso, aparecerá a diferença (diff) da sua mudança no editor para que possa ver exatamente o que foi feito.) Quando você sair do editor, o Git criará o seu commit com a mensagem (com os comentários e o diff retirados).
314
+
315
+ Alternativamente, você pode digitar sua mensagem de commit junto ao comanto `commit` ao especificá-la após a flag `-m`, assim:
316
+
317
+ $ git commit -m "Story 182: Fix benchmarks for speed"
318
+ [master]: created 463dc4f: "Fix benchmarks for speed"
319
+ 2 files changed, 3 insertions(+), 0 deletions(-)
320
+ create mode 100644 README
321
+
322
+ Agora você acabou de criar o seu primeiro commit! Você pode ver que o commit te mostrou uma saída sobre ele mesmo: qual o branch que recebeu o commit (`master`), qual o checksum SHA-1 que o commit teve (`463dc4f`), quantos arquivos foram alterados, e estatísticas a respeito das linhas adicionadas e removidas no commit.
323
+
324
+ Lembre-se que o commit grava a captura da área de seleção. Qualquer coisa que não foi selecionada ainda permanece lá modificada; você pode fazer um outro commit para adicioná-la ao seu histórico. Toda vez que você faz um commit, está gravando a captura do seu projeto o qual poderá reverter ou comparar posteriormente.
325
+
326
+ ### Pulando a Área de Seleção ###
327
+
328
+ Embora possa ser extraordinariamente útil para a elaboração de commits exatamente como você deseja, a área de seleção às vezes é um pouco mais complexa do que você precisa no seu fluxo de trabalho. Se você quiser pular a área de seleção, o Git provê um atalho simples. Informar a opção `-a` ao comando `git commit` faz com que o Git selecione automaticamente cada arquivo que está sendo monitorado antes de realizar o commit, permitindo que você pule a parte do `git add`:
329
+
330
+ $ git status
331
+ # On branch master
332
+ #
333
+ # Changes not staged for commit:
334
+ #
335
+ # modified: benchmarks.rb
336
+ #
337
+ $ git commit -a -m 'added new benchmarks'
338
+ [master 83e38c7] added new benchmarks
339
+ 1 files changed, 5 insertions(+), 0 deletions(-)
340
+
341
+ Note que, neste caso, você não precisa rodar o `git add` no arquivo `benchmarks.rb` antes de fazer o commit.
342
+
343
+ ### Removendo Arquivos ###
344
+
345
+ Para remover um arquivo do Git, você tem que removê-lo dos arquivos que estão sendo monitorados (mais precisamente, removê-lo da sua área de seleção) e então fazer o commit. O comando `git rm` faz isso e também remove o arquivo do seu diretório para você não ver ele como arquivo não monitorado (untracked file) na próxima vez.
346
+
347
+ Se você simplesmente remover o arquivo do seu diretório, ele aparecerá em “Changes not staged for commit” (isto é, fora da sua área de seleção ou _unstaged_) na saida do seu `git status`:
348
+
349
+ $ rm grit.gemspec
350
+ $ git status
351
+ # On branch master
352
+ #
353
+ # Changes not staged for commit:
354
+ # (use "git add/rm <file>..." to update what will be committed)
355
+ #
356
+ # deleted: grit.gemspec
357
+ #
358
+
359
+ Em seguida, se você rodar `git rm`, a remoção do arquivo é colocada na área de seleção:
360
+
361
+ $ git rm grit.gemspec
362
+ rm 'grit.gemspec'
363
+ $ git status
364
+ # On branch master
365
+ #
366
+ # Changes to be committed:
367
+ # (use "git reset HEAD <file>..." to unstage)
368
+ #
369
+ # deleted: grit.gemspec
370
+ #
371
+
372
+ Na próxima vez que você fizer o commit, o arquivo sumirá e não será mais monitorado. Se você modificou o arquivo e já o adicionou na área de seleção, você deve forçar a remoção com a opção `-f`. Essa é uma funcionalidade de segurança para prevenir remoções acidentais de dados que ainda não foram gravados em um snapshot e não podem ser recuperados do Git.
373
+
374
+ Outra coisa útil que você pode querer fazer é manter o arquivo no seu diretório, mas apagá-lo da sua área de seleção. Em outras palavras, você quer manter o arquivo no seu disco rígido mas não quer que o Git o monitore mais. Isso é particularmente útil se você esqueceu de adicionar alguma coisa no seu arquivo `.gitignore` e acidentalmente o adicionou, como um grande arquivo de log ou muitos arquivos `.a` compilados. Para fazer isso, use a opção `--cached`:
375
+
376
+ $ git rm --cached readme.txt
377
+
378
+ Você pode passar arquivos, diretórios, e padrões de nomes de arquivos para o comando `git rm`. Isso significa que você pode fazer coisas como:
379
+
380
+ $ git rm log/\*.log
381
+
382
+ Note a barra invertida (`\`) na frente do `*`. Isso é necessário pois o Git faz sua própria expansão no nome do arquivo além da sua expansão no nome do arquivo no shell. Esse comando remove todos os arquivos que tem a extensão `.log` no diretório `log/`. Ou, você pode fazer algo como isso:
383
+
384
+ $ git rm \*~
385
+
386
+ Esse comando remove todos os arquivos que terminam com `~`.
387
+
388
+ ### Movendo Arquivos ###
389
+
390
+ Diferente de muitos sistemas VCS, o Git não monitora explicitamente arquivos movidos. Se você renomeia um arquivo, nenhum metadado é armazenado no Git que identifique que você renomeou o arquivo. No entanto, o Git é inteligente e tenta descobrir isso depois do fato — lidaremos com detecção de arquivos movidos um pouco mais tarde.
391
+
392
+ É um pouco confuso que o Git tenha um comando `mv`. Se você quiser renomear um arquivo no Git, você pode fazer isso com
393
+
394
+ $ git mv arquivo_origem arquivo_destino
395
+
396
+ e funciona. De fato, se você fizer algo desse tipo e consultar o status, você verá que o Git considera que o arquivo foi renomeado:
397
+
398
+ $ git mv README.txt README
399
+ $ git status
400
+ # On branch master
401
+ # Your branch is ahead of 'origin/master' by 1 commit.
402
+ #
403
+ # Changes to be committed:
404
+ # (use "git reset HEAD <file>..." to unstage)
405
+ #
406
+ # renamed: README.txt -> README
407
+ #
408
+
409
+ No entanto, isso é equivalente a rodar algo como:
410
+
411
+ $ mv README.txt README
412
+ $ git rm README.txt
413
+ $ git add README
414
+
415
+ O Git descobre que o arquivo foi renomeado implicitamente, então ele não se importa se você renomeou por este caminho ou com o comando `mv`. A única diferença real é que o comando `mv` é mais conveniente, executa três passos de uma vez. O mais importante, você pode usar qualquer ferramenta para renomear um arquivo, e usar add/rm depois, antes de consolidar com o commit.
416
+
417
+ ## Visualizando o Histórico de Commits ##
418
+
419
+ Depois que você tiver criado vários commits, ou se clonou um repositório com um histórico de commits existente, você provavelmente vai querer ver o que aconteceu. A ferramente mais básica e poderosa para fazer isso é o comando `git log`.
420
+
421
+ Estes exemplos usam um projeto muito simples chamado `simplegit`, que eu frequentemente uso para demonstrações. Para pegar o projeto, execute:
422
+
423
+ git clone git://github.com/schacon/simplegit-progit.git
424
+
425
+ Quando você executar `git log` neste projeto, você deve ter uma saída como esta:
426
+
427
+ $ git log
428
+ commit ca82a6dff817ec66f44342007202690a93763949
429
+ Author: Scott Chacon <schacon@gee-mail.com>
430
+ Date: Mon Mar 17 21:52:11 2008 -0700
431
+
432
+ changed the verison number
433
+
434
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
435
+ Author: Scott Chacon <schacon@gee-mail.com>
436
+ Date: Sat Mar 15 16:40:33 2008 -0700
437
+
438
+ removed unnecessary test code
439
+
440
+ commit a11bef06a3f659402fe7563abf99ad00de2209e6
441
+ Author: Scott Chacon <schacon@gee-mail.com>
442
+ Date: Sat Mar 15 10:31:28 2008 -0700
443
+
444
+ first commit
445
+
446
+ Por padrão, sem argumentos, `git log` lista os commits feitos naquele repositório em ordem cronológica reversa. Isto é, os commits mais recentes primeiro. Como você pode ver, este comando lista cada commit com seu checksum SHA-1, o nome e e-mail do autor, a data e a mensagem do commit.
447
+
448
+ Um grande número e variedade de opções para o comando `git log` estão disponíveis para mostrá-lo exatamente o que você quer ver. Aqui, nós mostraremos algumas das opções mais usadas.
449
+
450
+ Uma das opções mais úteis é `-p`, que mostra o diff introduzido em cada commit. Você pode ainda usar `-2`, que limita a saída somente às duas últimas entradas.
451
+
452
+ $ git log -p -2
453
+ commit ca82a6dff817ec66f44342007202690a93763949
454
+ Author: Scott Chacon <schacon@gee-mail.com>
455
+ Date: Mon Mar 17 21:52:11 2008 -0700
456
+
457
+ changed the verison number
458
+
459
+ diff --git a/Rakefile b/Rakefile
460
+ index a874b73..8f94139 100644
461
+ --- a/Rakefile
462
+ +++ b/Rakefile
463
+ @@ -5,7 +5,7 @@ require 'rake/gempackagetask'
464
+ spec = Gem::Specification.new do |s|
465
+ - s.version = "0.1.0"
466
+ + s.version = "0.1.1"
467
+ s.author = "Scott Chacon"
468
+
469
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
470
+ Author: Scott Chacon <schacon@gee-mail.com>
471
+ Date: Sat Mar 15 16:40:33 2008 -0700
472
+
473
+ removed unnecessary test code
474
+
475
+ diff --git a/lib/simplegit.rb b/lib/simplegit.rb
476
+ index a0a60ae..47c6340 100644
477
+ --- a/lib/simplegit.rb
478
+ +++ b/lib/simplegit.rb
479
+ @@ -18,8 +18,3 @@ class SimpleGit
480
+ end
481
+
482
+ end
483
+ -
484
+ -if $0 == __FILE__
485
+ - git = SimpleGit.new
486
+ - puts git.show
487
+ -end
488
+
489
+
490
+ Esta opção mostra a mesma informação, mas com um diff diretamente seguido de cada entrada. Isso é muito útil para revisão de código ou para navegar rapidamente e saber o que aconteceu durante uma série de commits que um colaborador adicionou.
491
+ Você pode ainda usar uma série de opções de sumarização com `git log`. Por exemplo, se você quiser ver algumas estatísticas abreviadas para cada commit, você pode usar a opção `--stat`
492
+
493
+ $ git log --stat
494
+ commit ca82a6dff817ec66f44342007202690a93763949
495
+ Author: Scott Chacon <schacon@gee-mail.com>
496
+ Date: Mon Mar 17 21:52:11 2008 -0700
497
+
498
+ changed the verison number
499
+
500
+ Rakefile | 2 +-
501
+ 1 files changed, 1 insertions(+), 1 deletions(-)
502
+
503
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
504
+ Author: Scott Chacon <schacon@gee-mail.com>
505
+ Date: Sat Mar 15 16:40:33 2008 -0700
506
+
507
+ removed unnecessary test code
508
+
509
+ lib/simplegit.rb | 5 -----
510
+ 1 files changed, 0 insertions(+), 5 deletions(-)
511
+
512
+ commit a11bef06a3f659402fe7563abf99ad00de2209e6
513
+ Author: Scott Chacon <schacon@gee-mail.com>
514
+ Date: Sat Mar 15 10:31:28 2008 -0700
515
+
516
+ first commit
517
+
518
+ README | 6 ++++++
519
+ Rakefile | 23 +++++++++++++++++++++++
520
+ lib/simplegit.rb | 25 +++++++++++++++++++++++++
521
+ 3 files changed, 54 insertions(+), 0 deletions(-)
522
+
523
+ Como você pode ver, a opção `--stat` imprime abaixo de cada commit uma lista de arquivos modificados, quantos arquivos foram modificados, e quantas linhas nestes arquivos foram adicionadas e removidas. Ele ainda mostra um resumo destas informações no final.
524
+ Outra opção realmente útil é `--pretty`. Esta opção muda a saída do log para outro formato que não o padrão. Algumas opções pré-construídas estão disponíveis para você usar. A opção `oneline` mostra cada commit em uma única linha, o que é útil se você está olhando muitos commits. Em adição, as opções `short`, `full` e `fuller` mostram a saída aproximadamente com o mesmo formato, mas com menos ou mais informações, respectivamente:
525
+
526
+ $ git log --pretty=oneline
527
+ ca82a6dff817ec66f44342007202690a93763949 changed the verison number
528
+ 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
529
+ a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
530
+
531
+ A opção mais interessante é `format`, que permite que você especifique seu próprio formato de saída do log. Isto é especialmente útil quando você está gerando saída para análise automatizada (parsing) — porque você especifica o formato explicitamente, você sabe que ele não vai mudar junto com as atualizações do Git:
532
+
533
+ $ git log --pretty=format:"%h - %an, %ar : %s"
534
+ ca82a6d - Scott Chacon, 11 months ago : changed the verison number
535
+ 085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
536
+ a11bef0 - Scott Chacon, 11 months ago : first commit
537
+
538
+ Tabela 2-1 lista algumas das opções mais importantes para formatação.
539
+
540
+ Opção Descrição da saída
541
+ %H Hash do commit
542
+ %h Hash do commit abreviado
543
+ %T Árvore hash
544
+ %t Árvore hash abreviada
545
+ %P Hashes pais
546
+ %p Hashes pais abreviados
547
+ %an Nome do autor
548
+ %ae Email do autor
549
+ %ad Data do autor (formato respeita a opção -date=)
550
+ %ar Data do autor, relativa
551
+ %cn Nome do committer
552
+ %ce Email do committer
553
+ %cd Data do committer
554
+ %cr Data do committer, relativa
555
+ %s Assunto
556
+
557
+ Você deve estar se perguntando qual a diferença entre _autor_ e _committer_. O _autor_ é a pessoa que originalmente escreveu o trabalho, enquanto o _commiter_ é a pessoa que por último aplicou o trabalho. Então, se você envia um patch para um projeto, e algum dos membros do núcleo o aplicam, ambos receberão créditos — você como o autor, e o membro do núcleo como o commiter. Nós cobriremos esta distinção um pouco mais no *Capítulo 5*.
558
+
559
+ As opções `oneline` e `format` são particularmente úteis com outra opção chamada `--graph`. Esta opção gera um agradável gráfico ASCII mostrando seu branch e histórico de merges, que nós podemos ver em nossa cópia do repositório do projeto Grit:
560
+
561
+ $ git log --pretty=format:"%h %s" --graph
562
+ * 2d3acf9 ignore errors from SIGCHLD on trap
563
+ * 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
564
+ |\
565
+ | * 420eac9 Added a method for getting the current branch.
566
+ * | 30e367c timeout code and tests
567
+ * | 5a09431 add timeout protection to grit
568
+ * | e1193f8 support for heads with slashes in them
569
+ |/
570
+ * d6016bc require time for xmlschema
571
+ * 11d191e Merge branch 'defunkt' into local
572
+
573
+ Estas são apenas algumas opções de formatação de saída do `git log` — há muito mais. A tabela 2-2 lista as opções que nós cobrimos e algumas outras comuns que podem ser úteis, junto com a descrição de como elas mudam a saída do comando `log`.
574
+
575
+ Opção Descrição
576
+ -p Mostra o patch introduzido com cada commit.
577
+ --stat Mostra estatísticas de arquivos modificados em cada commit.
578
+ --shortstat Mostra somente as linhas modificadas/inseridas/excluídas do comando --stat.
579
+ --name-only Mostra a lista de arquivos modificados depois das informações do commit.
580
+ --name-status Mostra a lista de arquivos afetados com informações sobre adição/modificação/exclusão dos mesmos.
581
+ --abbrev-commit Mostra somente os primeiros caracteres do checksum SHA-1 em vez de todos os 40.
582
+ --relative-date Mostra a data em um formato relativo (por exemplo, “2 semanas atrás”) em vez de usar o formato de data completo.
583
+ --graph Mostra um gráfico ASCII do branch e histórico de merges ao lado da saída de log.
584
+ --pretty Mostra os commits em um formato alternativo. Opções incluem oneline, short, full, fuller, e format (onde você especifica seu próprio formato).
585
+
586
+ ### Limitando a Saída de Log ###
587
+
588
+ Em adição às opções de formatação, `git log` tem inúmeras opções de limitações úteis — que são opções que lhe deixam mostrar somente um subconjunto de commits. Você já viu algumas — a opção `-2`, que mostra apenas os dois últimos commits. De fato, você pode fazer `-<n>`, onde `n` é qualquer inteiro para mostrar os últimos `n` commits. Na verdade, você provavelmente não usará isso frequentemente, porque por padrão o Git enfileira toda a saída em um paginador, e então você vê somente uma página da saída do log por vez.
589
+
590
+ No entanto, as opções de limites de tempo como `--since` e `--until` são muito úteis. Por exemplo, este comando pega a lista de commits feitos nas últimas duas semanas:
591
+
592
+ $ git log --since=2.weeks
593
+
594
+ Este comando funciona com vários formatos — você pode especificar uma data específica(“2008-01-15”) ou uma data relativa como “2 years 1 day 3 minutes ago”.
595
+
596
+ Você pode ainda filtrar a lista de commits que casam com alguns critérios de busca. A opção `--author` permite que você filtre por algum autor específico, e a opção `--grep` deixa você buscar por palavras chave nas mensagens dos commits. (Note que se você quiser especificar ambas as opções author e grep simultâneamente, você deve adicionar `--all-match`, ou o comando considerará commits que casam com qualquer um.)
597
+
598
+ A última opção realmente útil para passar para `git log` como um filtro, é o caminho. Se você especificar um diretório ou um nome de arquivo, você pode limitar a saída a commits que modificaram aqueles arquivos. Essa é sempre a última opção, e geralmente é precedida por dois traços (`--`) para separar caminhos das opções.
599
+
600
+ Na Tabela 2-3 nós listamos estas e outras opções comuns para sua referência.
601
+
602
+ Opção Descrição
603
+ -(n) Mostra somente os últimos n commits.
604
+ --since, --after Limita aos commits feitos depois da data especificada.
605
+ --until, --before Limita aos commits feitos antes da data especificada.
606
+ --author Somente mostra commits que o autor casa com a string especificada.
607
+ --committer Somente mostra os commits em que a entrada do commiter bate com a string especificada.
608
+
609
+ Por exemplo, se você quer ver quais commits modificaram arquivos de teste no histórico do código fonte do Git que foram commitados por Julio Hamano em Outubro de 2008, e não foram merges, você pode executar algo como:
610
+
611
+ $ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
612
+ --before="2008-11-01" --no-merges -- t/
613
+ 5610e3b - Fix testcase failure when extended attribute
614
+ acd3b9e - Enhance hold_lock_file_for_{update,append}()
615
+ f563754 - demonstrate breakage of detached checkout wi
616
+ d1a43f2 - reset --hard/read-tree --reset -u: remove un
617
+ 51a94af - Fix "checkout --track -b newbranch" on detac
618
+ b0ad11e - pull: allow "git pull origin $something:$cur
619
+
620
+ Dos 20.000 commits mais novos no histórico do código fonte do Git, este comando mostra os 6 que casam com aqueles critérios.
621
+
622
+ ### Usando Interface Gráfica para Visualizar o Histórico ###
623
+
624
+ Se você quiser usar uma ferramenta gráfica para visualizar seu histórico de commit, você pode querer dar uma olhada em um programa Tcl/Tk chamado `gitk` que é distribuído com o Git. Gitk é basicamente uma ferramenta visual para `git log`, e ele aceita aproximadamente todas as opções de filtros que `git log` aceita. Se você digitar `gitk` na linha de comando em seu projeto, você deve ver algo como a Figura 2-2.
625
+
626
+ Insert 18333fig0202.png
627
+ Figura 2-2. O visualizador de histórico gitk.
628
+
629
+ Você pode ver o histórico de commit na metade de cima da janela juntamente com um agradável gráfico. O visualizador de diff na metade de baixo da janela mostra a você as mudanças introduzidas em qualquer commit que você clicar.
630
+
631
+ ## Desfazendo Coisas ##
632
+
633
+ Em qualquer fase, você pode querer desfazer alguma coisa. Aqui, veremos algumas ferramentas básicas para desfazer modificações que você fez. Cuidado, porque você não pode desfazer algumas dessas mudanças. Essa é uma das poucas áreas no Git onde você pode perder algum trabalho se fizer errado.
634
+
635
+ ### Modificando Seu Último Commit ###
636
+
637
+ Uma das situações mais comuns para desfazer algo, acontece quando você faz o commit muito cedo e possivelmente esqueceu de adicionar alguns arquivos, ou você bagunçou sua mensagem de commit. Se você quiser tentar fazer novamente esse commit, você pode executá-lo com a opção `--amend`:
638
+
639
+ $ git commit --amend
640
+
641
+ Esse comando pega sua área de seleção e a utiliza no commit. Se você não fez nenhuma modificação desde seu último commit (por exemplo, você rodou esse comando imediatamente após seu commit anterior), seu snapshot será exatamente o mesmo e tudo que você mudou foi sua mensagem de commit.
642
+
643
+ O mesmo editor de mensagem de commits abre, mas ele já tem a mensagem do seu commit anterior. Você pode editar a mensagem como sempre, mas ela substituirá seu último commit.
644
+
645
+ Por exemplo, se você fez um commit e esqueceu de adicionar na área de seleção as modificações de um arquivo que gostaria de ter adicionado nesse commit, você pode fazer algo como isso:
646
+
647
+ $ git commit -m 'initial commit'
648
+ $ git add forgotten_file
649
+ $ git commit --amend
650
+
651
+ Depois desses três comandos você obterá um único commit — o segundo commit substitui os resultados do primeiro.
652
+
653
+ ### Tirando um arquivo da área de seleção ###
654
+
655
+ As duas próximas seções mostram como trabalhar nas suas modificações na área de seleção e diretório de trabalho. A parte boa é que o comando que você usa para ver a situação nessas duas áreas também lembra como desfazer suas alterações. Por exemplo, vamos dizer que você alterou dois arquivos e quer fazer o commit deles como duas modificações separadas, mas você acidentalmente digitou `git add *` e colocou os dois na área de seleção. Como você pode retirar um deles? O comando `git status` lembra você:
656
+
657
+ $ git add .
658
+ $ git status
659
+ # On branch master
660
+ # Changes to be committed:
661
+ # (use "git reset HEAD <file>..." to unstage)
662
+ #
663
+ # modified: README.txt
664
+ # modified: benchmarks.rb
665
+ #
666
+
667
+ Logo abaixo do texto “Changes to be committed”, ele diz `use git reset HEAD <file>... to unstage` ("use `git reset HEAD <file>...` para retirá-los do estado unstaged"). Então, vamos usar esse conselho para retirar o arquivo `benchmarks.rb`:
668
+
669
+ $ git reset HEAD benchmarks.rb
670
+ benchmarks.rb: locally modified
671
+ $ git status
672
+ # On branch master
673
+ # Changes to be committed:
674
+ # (use "git reset HEAD <file>..." to unstage)
675
+ #
676
+ # modified: README.txt
677
+ #
678
+ # Changes not staged for commit:
679
+ # (use "git add <file>..." to update what will be committed)
680
+ # (use "git checkout -- <file>..." to discard changes in working directory)
681
+ #
682
+ # modified: benchmarks.rb
683
+ #
684
+
685
+ O comando é um pouco estranho, mas funciona. O arquivo `benchmarks.rb` está modificado, mas, novamente fora da área de seleção.
686
+
687
+ ### Desfazendo um Arquivo Modificado ###
688
+
689
+ E se você perceber que não quer manter suas modificações no arquivo `benchmarks.rb`? Como você pode facilmente desfazer isso — revertê-lo para o que era antes de fazer o último commit (ou do inicio do clone, ou seja la como você o conseguiu no seu diretório de trabalho)? Felizmente, `git status` diz a você como fazer isso, também. Na saída do último exemplo, a área de trabalho se parecia com isto:
690
+
691
+ # Changes not staged for commit:
692
+ # (use "git add <file>..." to update what will be committed)
693
+ # (use "git checkout -- <file>..." to discard changes in working directory)
694
+ #
695
+ # modified: benchmarks.rb
696
+ #
697
+
698
+ Ele diz explicitamente como descartar as modificações que você fez (pelo menos, as novas versões do Git, 1.6.1 em diante, fazem isso — se você tem uma versão mais antiga, uma atualização é altamente recomendável para ter alguns desses bons recursos de usabilidade). Vamos fazer o que ele diz:
699
+
700
+ $ git checkout -- benchmarks.rb
701
+ $ git status
702
+ # On branch master
703
+ # Changes to be committed:
704
+ # (use "git reset HEAD <file>..." to unstage)
705
+ #
706
+ # modified: README.txt
707
+ #
708
+
709
+ Você pode ver que as alterações foram revertidas. Perceba também que esse comando é perigoso: qualquer alteração que você fez nesse arquivo foi desfeita — você acabou de copiar outro arquivo sobre ele. Nunca use esse comando a menos que você tenha certeza absoluta que não quer o arquivo. Se você só precisa tirá-lo do caminho, vamos falar sobre stash e branch no próximo capítulo; geralmente essas são maneiras melhores de agir.
710
+
711
+ Lembre-se, qualquer coisa que foi incluída com um commit no Git quase sempre pode ser recuperada. Até mesmo commits que estavam em branches que foram apagados ou commits que foram sobrescritos com um commit `--amend` podem ser recuperados (consulte o *Capítulo 9* para recuperação de dados). No entanto, qualquer coisa que você perder que nunca foi commitada, provavelmente nunca mais será vista novamente.
712
+
713
+ ## Trabalhando com Remotos ##
714
+
715
+ Para ser capaz de colaborar com qualquer projeto no Git, você precisa saber como gerenciar seus repositórios remotos. Repositórios remotos são versões do seu projeto que estão hospedados na Internet ou em uma rede em algum lugar. Você pode ter vários deles, geralmente cada um é somente leitura ou leitura/escrita pra você. Colaborar com outros envolve gerenciar esses repositórios remotos e fazer o push e pull de dados neles quando você precisa compartilhar trabalho.
716
+ Gerenciar repositórios remotos inclui saber como adicionar repositório remoto, remover remotos que não são mais válidos, gerenciar vários branches remotos e defini-los como monitorados ou não, e mais. Nesta seção, vamos cobrir essas habilidades de gerenciamento remoto.
717
+
718
+ ### Exibindo Seus Remotos ###
719
+
720
+ Para ver quais servidores remotos você configurou, você pode executar o comando `git remote`. Ele lista o nome de cada remoto que você especificou. Se você tiver clonado seu repositório, você deve pelo menos ver um chamado *origin* — esse é o nome padrão que o Git dá ao servidor de onde você fez o clone:
721
+
722
+ $ git clone git://github.com/schacon/ticgit.git
723
+ Initialized empty Git repository in /private/tmp/ticgit/.git/
724
+ remote: Counting objects: 595, done.
725
+ remote: Compressing objects: 100% (269/269), done.
726
+ remote: Total 595 (delta 255), reused 589 (delta 253)
727
+ Receiving objects: 100% (595/595), 73.31 KiB | 1 KiB/s, done.
728
+ Resolving deltas: 100% (255/255), done.
729
+ $ cd ticgit
730
+ $ git remote
731
+ origin
732
+
733
+ Você também pode especificar `-v`, que mostra a URL que o Git armazenou para o nome do remoto:
734
+
735
+ $ git remote -v
736
+ origin git://github.com/schacon/ticgit.git (fetch)
737
+ origin git://github.com/schacon/ticgit.git (push)
738
+
739
+ Se você tem mais de um remoto, o comando lista todos. Por exemplo, meu repositório Grit se parece com isso.
740
+
741
+ $ cd grit
742
+ $ git remote -v
743
+ bakkdoor git://github.com/bakkdoor/grit.git
744
+ cho45 git://github.com/cho45/grit.git
745
+ defunkt git://github.com/defunkt/grit.git
746
+ koke git://github.com/koke/grit.git
747
+ origin git@github.com:mojombo/grit.git
748
+
749
+ Isso significa que podemos puxar contribuições de qualquer um desses usuários muito facilmente. Mas note que somente o remoto origin é uma URL SSH, sendo o único pra onde eu posso fazer o push (vamos ver o motivo disso no *Capítulo 4*).
750
+
751
+ ### Adicionando Repositórios Remotos ###
752
+
753
+ Eu mencionei e dei algumas demonstrações de adição de repositórios remotos nas seções anteriores, mas aqui está como fazê-lo explicitamente. Para adicionar um novo repositório remoto no Git com um nome curto, para que você possa fazer referência facilmente, execute `git remote add [nomecurto] [url]`:
754
+
755
+ $ git remote
756
+ origin
757
+ $ git remote add pb git://github.com/paulboone/ticgit.git
758
+ $ git remote -v
759
+ origin git://github.com/schacon/ticgit.git
760
+ pb git://github.com/paulboone/ticgit.git
761
+
762
+ Agora você pode usar a string `pb` na linha de comando em lugar da URL completa. Por exemplo, se você quer fazer o fetch de todos os dados de Paul que você ainda não tem no seu repositório, você pode executar git fetch pb:
763
+
764
+ $ git fetch pb
765
+ remote: Counting objects: 58, done.
766
+ remote: Compressing objects: 100% (41/41), done.
767
+ remote: Total 44 (delta 24), reused 1 (delta 0)
768
+ Unpacking objects: 100% (44/44), done.
769
+ From git://github.com/paulboone/ticgit
770
+ * [new branch] master -> pb/master
771
+ * [new branch] ticgit -> pb/ticgit
772
+
773
+ O branch master de Paul é localmente acessível como `pb/master` — você pode fazer o merge dele em um de seus branches, ou fazer o check out de um branch local a partir deste ponto se você quiser inspecioná-lo.
774
+
775
+ ### Fazendo o Fetch e Pull de Seus Remotos ###
776
+
777
+ Como você acabou de ver, para pegar dados dos seus projetos remotos, você pode executar:
778
+
779
+ $ git fetch [nome-remoto]
780
+
781
+ Esse comando vai até o projeto remoto e pega todos os dados que você ainda não tem. Depois de fazer isso, você deve ter referências para todos os branches desse remoto, onde você pode fazer o merge ou inspecionar a qualquer momento. (Vamos ver o que são branches e como usá-los mais detalhadamente no *Capítulo 3*.)
782
+
783
+ Se você clonar um repositório, o comando automaticamente adiciona o remoto com o nome *origin*. Então, `git fetch origin` busca qualquer novo trabalho que foi enviado para esse servidor desde que você o clonou (ou fez a última busca). É importante notar que o comando `fetch` traz os dados para o seu repositório local — ele não faz o merge automaticamente com o seus dados ou modifica o que você está trabalhando atualmente. Você terá que fazer o merge manualmente no seu trabalho quando estiver pronto.
784
+
785
+ Se você tem um branch configurado para acompanhar um branch remoto (veja a próxima seção e o *Capítulo 3* para mais informações), você pode usar o comando `git pull` para automaticamente fazer o fetch e o merge de um branch remoto no seu branch atual. Essa pode ser uma maneira mais fácil ou confortável pra você; e por padrão, o comando `git clone` automaticamente configura seu branch local master para acompanhar o branch remoto master do servidor de onde você clonou (desde que o remoto tenha um branch master). Executar `git pull` geralmente busca os dados do servidor de onde você fez o clone originalmente e automaticamente tenta fazer o merge dele no código que você está trabalhando atualmente.
786
+
787
+ ### Pushing Para Seus Remotos ###
788
+
789
+ Quando o seu projeto estiver pronto para ser compartilhado, você tem que enviá-lo para a fonte. O comando para isso é simples: `git push [nome-remoto] [branch]`. Se você quer enviar o seu branch master para o servidor `origin` (novamente, clonando normalmente define estes dois nomes para você automaticamente), então você pode rodar o comando abaixo para enviar o seu trabalho para o sevidor:
790
+
791
+ $ git push origin master
792
+
793
+ Este comando funciona apenas se você clonou de um servidor que você têm permissão para escrita, e se mais ninguém enviou dados no meio tempo. Se você e mais alguém clonarem ao mesmo tempo, e você enviar suas modificações após a pessoa ter enviado as dela, o seu push será rejeitado. Antes, você terá que fazer um pull das modificações deste outro alguém, e incorporá-las às suas para que você tenha permissão para enviá-las. Veja o *Capítulo 3* para mais detalhes sobre como enviar suas modificações para servidores remotos.
794
+
795
+ ### Inspecionando um Remoto ###
796
+
797
+ Se você quer ver mais informação sobre algum remoto em particular, você pode usar o comando `git remote show [nome-remoto]`. Se você rodar este comando com um nome específico, como `origin`, você verá algo assim:
798
+
799
+ $ git remote show origin
800
+ * remote origin
801
+ URL: git://github.com/schacon/ticgit.git
802
+ Remote branch merged with 'git pull' while on branch master
803
+ master
804
+ Tracked remote branches
805
+ master
806
+ ticgit
807
+
808
+ Ele lista a URL do repositório remoto assim como as branches sendo rastreadas. O resultado deste comando lhe diz que se você está na branch master e rodar `git pull`, ele automaticamente fará um merge na branch master no remoto depois que ele fizer o fetch de todas as referências remotas. Ele também lista todas as referências remotas que foram puxadas.
809
+
810
+ Este é um simples exemplo que você talvez encontre por aí. Entretanto, quando se usa o Git pra valer, você pode ver muito mais informação vindo de `git remote show`:
811
+
812
+ $ git remote show origin
813
+ * remote origin
814
+ URL: git@github.com:defunkt/github.git
815
+ Remote branch merged with 'git pull' while on branch issues
816
+ issues
817
+ Remote branch merged with 'git pull' while on branch master
818
+ master
819
+ New remote branches (next fetch will store in remotes/origin)
820
+ caching
821
+ Stale tracking branches (use 'git remote prune')
822
+ libwalker
823
+ walker2
824
+ Tracked remote branches
825
+ acl
826
+ apiv2
827
+ dashboard2
828
+ issues
829
+ master
830
+ postgres
831
+ Local branch pushed with 'git push'
832
+ master:master
833
+
834
+ Este comando mostra qual branch é automaticamente enviado (pushed) quando você roda `git push` em determinados branches. Ele também mostra quais branches remotos que estão no servidor e você não tem, quais branches remotos você tem e que foram removidos do servidor, e múltiplos branches que são automaticamente mesclados (merged) quando você roda `git pull`.
835
+
836
+ ### Removendo e Renomeando Remotos ###
837
+
838
+ Se você quiser renomear uma referência, em versões novas do Git você pode rodar `git remote rename` para modificar um apelido de um remoto. Por exemplo, se você quiser renomear `pb` para `paul`, você pode com `git remote rename`:
839
+
840
+ $ git remote rename pb paul
841
+ $ git remote
842
+ origin
843
+ paul
844
+
845
+ É válido mencionar que isso modifica também os nomes dos branches no servidor remoto. O que costumava ser referenciado como `pb/master` agora é `paul/master`.
846
+
847
+ Se você quiser remover uma referência por qualquer razão — você moveu o servidor ou não está mais usando um mirror específico, ou talvez um contribuidor não está mais contribuindo — você usa `git remote rm`:
848
+
849
+ $ git remote rm paul
850
+ $ git remote
851
+ origin
852
+
853
+ ## Tagging ##
854
+
855
+ Assim como a maioria dos VCS's, Git tem a habilidade de criar tags em pontos específicos na história do código como pontos importantes. Geralmente as pessoas usam esta funcionalidade para marcar pontos de release (`v1.0`, e por aí vai). Nesta seção, você aprenderá como listar as tags disponíveis, como criar novas tags, e quais são os tipos diferentes de tags.
856
+
857
+ ### Listando Suas Tags ###
858
+
859
+ Listar as tags disponíveis em Git é fácil. Apenas execute o comando `git tag`:
860
+
861
+ $ git tag
862
+ v0.1
863
+ v1.3
864
+
865
+ Este comando lista as tags em ordem alfabética; a ordem que elas aparecem não tem importância.
866
+
867
+ Você também pode procurar por tags com uma nomenclatura particular. O repositório de código do Git, por exemplo, contém mais de 240 tags. Se você está interessado em olhar apenas na série 1.4.2, você pode executar o seguinte:
868
+
869
+ $ git tag -l 'v1.4.2.*'
870
+ v1.4.2.1
871
+ v1.4.2.2
872
+ v1.4.2.3
873
+ v1.4.2.4
874
+
875
+ ### Criando Tags ###
876
+
877
+ Git têm dois tipos principais de tags: leve e anotada. Um tag leve é muito similar a uma branch que não muda — é um ponteiro para um commit específico. Tags anotadas, entretanto, são armazenadas como objetos inteiros no banco de dados do Git. Eles possuem uma chave de verificação; o nome da pessoa que criou a tag, email e data; uma mensagem relativa à tag; e podem ser assinadas e verificadas com o GNU Privacy Guard (GPG). É geralmente recomendado que você crie tags anotadas para que você tenha toda essa informação; mas se você quiser uma tag temporária ou por algum motivo você não queira armazenar toda essa informação, tags leves também estão disponíveis.
878
+
879
+ ### Tags Anotadas ###
880
+
881
+ Criando uma tag anotada em Git é simples. O jeito mais fácil é especificar `-a` quando você executar o comando `tag`:
882
+
883
+ $ git tag -a v1.4 -m 'my version 1.4'
884
+ $ git tag
885
+ v0.1
886
+ v1.3
887
+ v1.4
888
+
889
+ O parâmetro `-m` define uma mensagem, que é armazenada com a tag. Se você não especificar uma mensagem para uma tag anotada, o Git vai rodar seu editor de texto para você digitar alguma coisa.
890
+
891
+ Você pode ver os dados da tag junto com o commit que foi taggeado usando o comando `git show`:
892
+
893
+ $ git show v1.4
894
+ tag v1.4
895
+ Tagger: Scott Chacon <schacon@gee-mail.com>
896
+ Date: Mon Feb 9 14:45:11 2009 -0800
897
+
898
+ my version 1.4
899
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
900
+ Merge: 4a447f7... a6b4c97...
901
+ Author: Scott Chacon <schacon@gee-mail.com>
902
+ Date: Sun Feb 8 19:02:46 2009 -0800
903
+
904
+ Merge branch 'experiment'
905
+
906
+ O comando mostra a informação da pessoa que criou a tag, a data de quando o commit foi taggeado, e a mensagem antes de mostrar a informação do commit.
907
+
908
+ ### Tags Assinadas ###
909
+
910
+ Você também pode assinar suas tags com GPG, assumindo que você tenha uma chave privada. Tudo o que você precisa fazer é usar o parâmetro `-s` ao invés de `-a`:
911
+
912
+ $ git tag -s v1.5 -m 'my signed 1.5 tag'
913
+ You need a passphrase to unlock the secret key for
914
+ user: "Scott Chacon <schacon@gee-mail.com>"
915
+ 1024-bit DSA key, ID F721C45A, created 2009-02-09
916
+
917
+ Se você rodar `git show` na tag, você poderá ver a sua assinatura GPG anexada:
918
+
919
+ $ git show v1.5
920
+ tag v1.5
921
+ Tagger: Scott Chacon <schacon@gee-mail.com>
922
+ Date: Mon Feb 9 15:22:20 2009 -0800
923
+
924
+ my signed 1.5 tag
925
+ -----BEGIN PGP SIGNATURE-----
926
+ Version: GnuPG v1.4.8 (Darwin)
927
+
928
+ iEYEABECAAYFAkmQurIACgkQON3DxfchxFr5cACeIMN+ZxLKggJQf0QYiQBwgySN
929
+ Ki0An2JeAVUCAiJ7Ox6ZEtK+NvZAj82/
930
+ =WryJ
931
+ -----END PGP SIGNATURE-----
932
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
933
+ Merge: 4a447f7... a6b4c97...
934
+ Author: Scott Chacon <schacon@gee-mail.com>
935
+ Date: Sun Feb 8 19:02:46 2009 -0800
936
+
937
+ Merge branch 'experiment'
938
+
939
+ Um pouco mais pra frente você aprenderá como verificar tags assinadas.
940
+
941
+ ### Tags Leves ###
942
+
943
+ Outro jeito para taggear commits é com a tag leve. Esta é basicamente a chave de verificação armazenada num arquivo — nenhuma outra informação é armazenada. Para criar uma tag leve, não informe os parâmetros `-a`, `-s`, ou `-m`:
944
+
945
+ $ git tag v1.4-lw
946
+ $ git tag
947
+ v0.1
948
+ v1.3
949
+ v1.4
950
+ v1.4-lw
951
+ v1.5
952
+
953
+ Desta vez, se você executar `git show` na tag, você não verá nenhuma informação extra. O comando apenas mostra o commit:
954
+
955
+ $ git show v1.4-lw
956
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
957
+ Merge: 4a447f7... a6b4c97...
958
+ Author: Scott Chacon <schacon@gee-mail.com>
959
+ Date: Sun Feb 8 19:02:46 2009 -0800
960
+
961
+ Merge branch 'experiment'
962
+
963
+ ### Verificando Tags ###
964
+
965
+ Para verificar uma tag assinada, você usa `git tag -v [nome-tag]`. Este comando usa GPG para verificar a sua assinatura. Você precisa da chave pública do assinador no seu chaveiro para este comando funcionar corretamente:
966
+
967
+ $ git tag -v v1.4.2.1
968
+ object 883653babd8ee7ea23e6a5c392bb739348b1eb61
969
+ type commit
970
+ tag v1.4.2.1
971
+ tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700
972
+
973
+ GIT 1.4.2.1
974
+
975
+ Minor fixes since 1.4.2, including git-mv and git-http with alternates.
976
+ gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
977
+ gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
978
+ gpg: aka "[jpeg image of size 1513]"
979
+ Primary key fingerprint: 3565 2A26 2040 E066 C9A7 4A7D C0C6 D9A4 F311 9B9A
980
+
981
+ Se você não tiver a chave pública, você receberá algo parecido com a resposta abaixo:
982
+
983
+ gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
984
+ gpg: Can't check signature: public key not found
985
+ error: could not verify the tag 'v1.4.2.1'
986
+
987
+ ### Taggeando Mais Tarde ###
988
+
989
+ Você também pode taggear commits mais tarde. Vamos assumir que o seu histórico de commits seja assim:
990
+
991
+ $ git log --pretty=oneline
992
+ 15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
993
+ a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
994
+ 0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
995
+ 6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
996
+ 0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
997
+ 4682c3261057305bdd616e23b64b0857d832627b added a todo file
998
+ 166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
999
+ 9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
1000
+ 964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
1001
+ 8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
1002
+
1003
+ Agora, assuma que você esqueceu de criar uma tag para o seu projeto na versão 1.2 (`v1.2`), que foi no commit "updated rakefile". Você pode adicioná-la depois. Para criar a tag no commit, você especifica a chave de verificação (ou parte dela) no final do comando:
1004
+
1005
+ $ git tag -a v1.2 9fceb02
1006
+
1007
+ Você pode confirmar que você criou uma tag para o seu commit:
1008
+
1009
+ $ git tag
1010
+ v0.1
1011
+ v1.2
1012
+ v1.3
1013
+ v1.4
1014
+ v1.4-lw
1015
+ v1.5
1016
+
1017
+ $ git show v1.2
1018
+ tag v1.2
1019
+ Tagger: Scott Chacon <schacon@gee-mail.com>
1020
+ Date: Mon Feb 9 15:32:16 2009 -0800
1021
+
1022
+ version 1.2
1023
+ commit 9fceb02d0ae598e95dc970b74767f19372d61af8
1024
+ Author: Magnus Chacon <mchacon@gee-mail.com>
1025
+ Date: Sun Apr 27 20:43:35 2008 -0700
1026
+
1027
+ updated rakefile
1028
+ ...
1029
+
1030
+ ### Compartilhando Tags ###
1031
+
1032
+ Por padrão, o comando `git push` não transfere tags para os servidores remotos. Você deve enviar as tags explicitamente para um servidor compartilhado após tê-las criado. Este processo é igual ao compartilhamento de branches remotos – você executa `git push origin [nome-tag]`.
1033
+
1034
+ $ git push origin v1.5
1035
+ Counting objects: 50, done.
1036
+ Compressing objects: 100% (38/38), done.
1037
+ Writing objects: 100% (44/44), 4.56 KiB, done.
1038
+ Total 44 (delta 18), reused 8 (delta 1)
1039
+ To git@github.com:schacon/simplegit.git
1040
+ * [new tag] v1.5 -> v1.5
1041
+
1042
+ Se você tem muitas tags que você deseja enviar ao mesmo tempo, você pode usar a opção `--tags` no comando `git push`. Ele irá transferir todas as suas tags que ainda não estão no servidor remoto.
1043
+
1044
+ $ git push origin --tags
1045
+ Counting objects: 50, done.
1046
+ Compressing objects: 100% (38/38), done.
1047
+ Writing objects: 100% (44/44), 4.56 KiB, done.
1048
+ Total 44 (delta 18), reused 8 (delta 1)
1049
+ To git@github.com:schacon/simplegit.git
1050
+ * [new tag] v0.1 -> v0.1
1051
+ * [new tag] v1.2 -> v1.2
1052
+ * [new tag] v1.4 -> v1.4
1053
+ * [new tag] v1.4-lw -> v1.4-lw
1054
+ * [new tag] v1.5 -> v1.5
1055
+
1056
+ Agora, quando alguém clonar ou fizer um pull do seu repositório, eles irão ter todas as suas tags também.
1057
+
1058
+ ## Dicas e Truques ##
1059
+
1060
+ Antes de terminarmos este capítulo em Git Essencial, algumas dicas e truques podem tornar a sua experiência com Git um pouco mais simples, fácil e familiar. Muitas pessoas usam Git sem nenhuma dessas dicas, e não iremos referir à elas ou assumir que você as usou mais tarde no livro; mas você deve ao menos saber como executá-las.
1061
+
1062
+ ### Preenchimento Automático ###
1063
+
1064
+ Se você usa um shell Bash, você pode habilitar um script de preenchimento automático que vem com o Git. Faça download do código fonte, e olhe no diretório `contrib/completion`; lá deve existir um arquivo chamado `git-completion.bash`. Copie este arquivo para o seu diretório home, e adicione a linha abaixo ao seu arquivo `.bashrc`:
1065
+
1066
+ source ~/.git-completion.bash
1067
+
1068
+ Se você quiser configurar Git para automaticamente ter preenchimento automático para todos os usuários, copie o script para o diretório `/opt/local/etc/bash_completion.d` em Mac ou para o diretório `/etc/bash_completion.d/` em Linux. Este é o diretório de scripts que o Bash automaticamente carregará para prover o preenchimento automático.
1069
+
1070
+ Se você estiver usando Windows com Git Bash, que é o padrão quando instalando Git no Windows com msysGit, o preenchimento automático deve estar pré-configurado.
1071
+
1072
+ Pressiona a tecla Tab quando estiver escrevendo um comando Git, e ele deve retornar uma lista de sugestões para você escolher:
1073
+
1074
+ $ git co<tab><tab>
1075
+ commit config
1076
+
1077
+ Neste caso, escrevendo `git co` e pressionando a tecla Tab duas vezes, ele sugere commit e config. Adicionando `m<tab>` completa `git commit` automaticamente.
1078
+
1079
+ Isto também funciona com opções, o que é provavelmente mais útil. Por exemplo, se você estiver executando o comando `git log` e não consegue lembrar uma das opções, você pode começar a escrever e pressionar Tab para ver o que corresponde:
1080
+
1081
+ $ git log --s<tab>
1082
+ --shortstat --since= --src-prefix= --stat --summary
1083
+
1084
+ Este é um truque bem bacana e irá te poupar tempo e leitura de documentação.
1085
+
1086
+ ### Pseudônimos no Git ###
1087
+
1088
+ O Git não interfere em seu comando se você digitá-lo parcialmente. Se você não quiser digitar o texto todo de cada comando Git, você pode facilmente criar um pseudônimo para cada um usando `git config`. Abaixo alguns exemplos que você pode usar:
1089
+
1090
+ $ git config --global alias.co checkout
1091
+ $ git config --global alias.br branch
1092
+ $ git config --global alias.ci commit
1093
+ $ git config --global alias.st status
1094
+
1095
+ Isto significa que, por exemplo, ao invés de digitar `git commit`, você só precisa digitar `git ci`. Quanto mais você usar Git, você provavelmente usará outros comandos com frequência também; neste caso, não hesite em criar novos pseudônimos.
1096
+
1097
+ Esta técnica também pode ser útil para criar comandos que você acha que devem existir. Por exemplo, para corrigir o problema de usabilidade que você encontrou durante o unstanging de um arquivo, você pode adicionar o seu próprio pseudônimo unstage para o Git:
1098
+
1099
+ $ git config --global alias.unstage 'reset HEAD --'
1100
+
1101
+ Isto faz dos dois comandos abaixo equivalentes:
1102
+
1103
+ $ git unstage fileA
1104
+ $ git reset HEAD fileA
1105
+
1106
+ Parece mais claro. É também comum adicionar um comando `last`, assim:
1107
+
1108
+ $ git config --global alias.last 'log -1 HEAD'
1109
+
1110
+ Desse jeito, você pode ver o último comando mais facilmente:
1111
+
1112
+ $ git last
1113
+ commit 66938dae3329c7aebe598c2246a8e6af90d04646
1114
+ Author: Josh Goebel <dreamer3@example.com>
1115
+ Date: Tue Aug 26 19:48:51 2008 +0800
1116
+
1117
+ test for current head
1118
+
1119
+ Signed-off-by: Scott Chacon <schacon@example.com>
1120
+
1121
+ Como você pode ver, Git simplesmente substitui o novo comando com o pseudônimo que você deu à ele. Entretanto, talvez você queira rodar um comando externo ao invés de um sub comando do Git. Neste caso, você começa o comando com `!`. Isto é útil se você escreve suas próprias ferramentas que trabalham com um repositório Git. Podemos demonstrar criando o pseudônimo `git visual` para rodar `gitk`:
1122
+
1123
+ $ git config --global alias.visual '!gitk'
1124
+
1125
+ ## Sumário ##
1126
+
1127
+ Neste ponto, você pode executar todas as operações locais básicas do Git — criar ou clonar um repositório, efetuar mudanças, fazer o stage e commit de suas mudanças, e ver o histórico de todas as mudanças do repositório. A seguir, vamos cobrir a melhor característica do Git: o modelo de branching.