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,260 @@
1
+ # 使い始める #
2
+
3
+ この章は、Gitを使い始めることについてのものです。まずはバージョン管理システムの背景に触れ、次にGitをあなたのシステムで動かす方法、最後にGitで作業を始めるための設定方法について説明します。この章を読み終えるころには、なぜGitがあるのか、なぜGitを使うべきなのかを理解し、また使い始めるための準備が全て整っていることと思います。
4
+
5
+ ## バージョン管理に関して ##
6
+
7
+ バージョン管理とは何でしょうか。また、なぜそれを気にする必要があるのでしょうか。バージョン管理とは、一つのファイルやファイルの集合に対して時間とともに加えられていく変更を記録するシステムで、後で特定バージョンを呼び出すことができるようにするためのものです。本書の例では、バージョン管理されるファイルとしてソフトウェアのソースコードを示していますが、実際にはコンピューター上のあらゆる種類のファイルをバージョン管理のもとに置くことができます。
8
+
9
+ もしあなたがグラフィックス・デザイナーやウェブ・デザイナーで、画像やレイアウトの全てのバージョンを保存しておきたいとすると(きっとそうしたいですよね)、バージョン管理システム(VCS)を使うというのはいい考えです。VCSを使うことで、ファイルを以前の状態まで戻したり、プロジェクト丸ごとを以前の状態に戻したり、過去の変更履歴を見直したり、問題が起こっているかもしれないものを誰が最後に修正したか、誰がいつ問題点を混入させたかを確認したりといった様々なことができるようになります。また、VCSを使うと、やっていることがめちゃくちゃになってしまったり、ファイルを失ったりしても、普通は簡単に復活させることができるようになります。それに、これらのことにかかるオーバーヘッドは僅かなものです。
10
+
11
+ ### ローカル・バージョン管理システム ###
12
+
13
+ 多くの人々が使っているバージョン管理手法は、他のディレクトリ(気の利いた人であれば、日時のついたディレクトリ)にファイルをコピーするというものです。このアプローチはとても単純なので非常に一般的ですが、信じられないほど間違いが起こりやすいものです。どのディレクトリにいるのか忘れやすく、うっかり間違ったファイルに書き込んだり、上書きするつもりのないファイルを上書きしてしまったりします。
14
+
15
+ この問題を扱うため、はるか昔のプログラマは、ローカルのVCSを開発しました。それは、バージョン管理下のファイルに対する全ての変更を保持するシンプルなデータベースによるものでした(図1-1参照)。
16
+
17
+ Insert 18333fig0101.png
18
+ 図1-1. ローカル・バージョン管理図解
19
+
20
+ もっとも有名なVCSツールの一つは、RCSと呼ばれるシステムでした。今日でも、依然として多くのコンピューターに入っています。人気のMac OS Xオペレーティング・システムでも、開発者ツールをインストールするとrcsコマンドが入っています。このツールは基本的に、リビジョン間のパッチ(ファイル間の差分)の集合を特殊なフォーマットでディスク上に保持するという仕組みで動いています。こうすることで、任意のファイルについて、それが過去の任意の時点でどういうものだったかということを、パッチを重ね上げていくことで再現することができます。
21
+
22
+ ### 集中バージョン管理システム ###
23
+
24
+ 次に人々が遭遇した大きな問題は、他のシステムを使う開発者と共同作業をする必要があるということです。この問題に対処するために、集中バージョン管理システム(CVCSs)が開発されました。このようなシステムにはCVS、Subversion、Perforceなどがありますが、それらはバージョン管理されたファイルを全て持つ一つのサーバーと、その中心点からファイルをチェックアウトする多数のクライアントからなっています。長年の間、これはバージョン管理の標準でした(図1-2参照)。
25
+
26
+ Insert 18333fig0102.png
27
+ 図1-2. 集中バージョン管理図解
28
+
29
+ この構成には、特にローカルVCSと比べると、多くの利点があります。例えば、プロジェクトの他のみんなが何をしているのか、全員がある程度わかります。管理者は、誰が何をできるのかについて、きめ細かくコントロールできます。それに、一つのCVCSを管理するのは、全てのクライアントのローカル・データベースを取り扱うより、ずっと簡単です。
30
+
31
+ しかし、この構成には深刻なマイナス面もあります。もっとも明白なのは、中央サーバーという単一障害点です。そのサーバーが1時間の間停止すると、その1時間の間は全員が、共同作業も全くできず、作業中のものにバージョンをつけて保存をすることもできなくなります。もし中央データベースのあるハードディスクが破損し、適切なバックアップが保持されていなければ、完全に全てを失ってしまいます。プロジェクトの全ての履歴は失われ、残るのは個人のローカル・マシンにたまたまあった幾らかの単一スナップショット(訳者注:ある時点のファイル、ディレクトリなどの編集対象の状態)ぐらいです。ローカルVCSシステムも、これと同じ問題があります。つまり、一つの場所にプロジェクトの全体の履歴を持っていると、全てを失うリスクが常にあります。
32
+
33
+ ### 分散バージョン管理システム ###
34
+
35
+ ここで分散バージョン管理システム(DVCSs)の出番になります。DVCS(Git、Mercurial、Bazaar、Darcsのようなもの)では、クライアントはファイルの最新スナップショットをチェックアウト(訳者注:バージョン管理システムから、作業ディレクトリにファイルやディレクトリをコピーすること)するだけではありません。リポジトリ(訳者注:バージョン管理の対象になるファイル、ディレクトリ、更新履歴などの一群)全体をミラーリングするのです。そのため、あるサーバーが故障して、DVCSがそのサーバーを介して連携していたとしても、どれでもいいのでクライアント・リポジトリの一つをサーバーにコピーすれば修復できます。チェックアウトは全て、実際は全データの完全バックアップなのです(図1-3を参照)。
36
+
37
+ Insert 18333fig0103.png
38
+ 図1-3. 分散バージョン管理システムの図解
39
+
40
+ さらに、これらのDVCSの多くは、複数のリモート・リポジトリで作業をするということがうまく扱えるようになっているので、異なった方法で異なる人々のグループと同時に同じプロジェクト内で共同作業することができます。このため、階層モデルなどの、集中システムでは不可能な幾つかのワークフローが構築できるようになっています。
41
+
42
+ ## Git略史 ##
43
+
44
+ 人生における多くの素晴らしい出来事のように、Gitはわずかな創造的破壊と熱烈な論争から始まりました。Linuxカーネルは、非常に巨大な範囲のオープンソース・ソフトウェア・プロジェクトの一つです。Linuxカーネル保守の大部分の期間(1991-2002)の間は、このソフトウェアに対する変更は、パッチとアーカイブしたファイルとして次々にまわされていました。2002年に、Linuxカーネル・プロジェクトはプロプライエタリのDVCSであるBitKeeperを使い始めました。
45
+
46
+ 2005年に、Linuxカーネルを開発していたコミュニティと、BitKeeperを開発していた営利企業との間の協力関係が崩壊して、課金無しの状態が取り消されました。これは、Linux開発コミュニティ(と、特にLinuxの作者のLinus Torvalds)に、BitKeeperを利用している間に学んだ幾つかの教訓を元に、彼ら独自のツールの開発を促しました。新しいシステムの目標の幾つかは、次の通りでした:
47
+
48
+ * スピード
49
+ * シンプルな設計
50
+ * ノンリニア開発(数千の並列ブランチ)への強力なサポート
51
+ * 完全な分散
52
+ * Linux カーネルのような大規模プロジェクトを(スピードとデータサイズで)効率的に取り扱い可能
53
+
54
+ 2005年のその誕生から、Gitは使いやすく発展・成熟してきており、さらにその初期の品質を維持しています。とても高速で、巨大プロジェクトではとても効率的で、ノンリニア開発のためのすごい分岐システム(branching system)を備えています(第3章参照)。
55
+
56
+ ## Gitの基本 ##
57
+
58
+ では、要するにGitとは何なのでしょうか。これは、Gitを吸収するには重要な節です。なぜならば、もしGitが何かを理解し、Gitがどうやって稼動しているかの根本を理解できれば、Gitを効果的に使う事が恐らくとても容易になるからです。
59
+ Gitを学ぶときは、SubversionやPerforceのような他のVCSsに関してあなたが恐らく知っていることは、意識しないでください。このツールを使うときに、ちょっとした混乱を回避することに役立ちます。ユーザー・インターフェイスがよく似ているにも関わらず、Gitの情報の格納の仕方や情報についての考え方は、それら他のシステムとは大きく異なっています。これらの相違を理解する事は、Gitを扱っている間の混乱を、防いでくれるでしょう。
60
+
61
+ ### スナップショットで、差分ではない ###
62
+
63
+ Gitと他のVCS (Subversionとその類を含む)の主要な相違は、Gitのデータについての考え方です。概念的には、他のシステムのほとんどは、情報をファイルを基本とした変更のリストとして格納します。これらのシステム(CVS、Subversion、Perforce、Bazaar等々)は、図1-4に描かれているように、システムが保持しているファイルの集合と、時間を通じてそれぞれのファイルに加えられた変更の情報を考えます。
64
+
65
+ Insert 18333fig0104.png
66
+ 図1-4. 他のシステムは、データをそれぞれのファイルの基本バージョンへの変更として格納する傾向があります。
67
+
68
+ Gitは、この方法ではデータを考えたり、格納しません。代わりに、Gitはデータをミニ・ファイルシステムのスナップショットの集合のように考えます。Gitで全てのコミット(訳注:commitとは変更を記録・保存するGitの操作。詳細は後の章を参照)をするとき、もしくはプロジェクトの状態を保存するとき、Gitは基本的に、その時の全てのファイルの状態のスナップショットを撮り(訳者注:意訳)、そのスナップショットへの参照を格納するのです。効率化のため、ファイルに変更が無い場合は、Gitはファイルを再格納せず、既に格納してある、以前の同一のファイルへのリンクを格納します。Gitは、むしろデータを図1-5のように考えます。
69
+
70
+ Insert 18333fig0105.png
71
+ 図1-5. Gitは時間を通じたプロジェクトのスナップショットとしてデータを格納します。
72
+
73
+ これが、Gitと類似の全ての他のVCSsとの間の重要な違いです。ほとんどの他のシステムが以前の世代から真似してきた、ほとんど全てのバージョン管理のやり方(訳者注:aspectを意訳)を、Gitに見直させます。これは、Gitを、単純にVCSと言うより、その上に組み込まれた幾つかの途方も無くパワフルなツールを備えたミニ・ファイルシステムにしています。このやり方でデータを考えることで得られる利益の幾つかを、第3章のGit branchingを扱ったときに探求します。
74
+
75
+ ### ほとんど全ての操作がローカル ###
76
+
77
+ Gitのほとんどの操作は、ローカル・ファイルと操作する資源だけ必要とします。大体はネットワークの他のコンピューターからの情報は必要ではありません。ほとんどの操作がネットワーク遅延損失を伴うCVCSに慣れているのであれば、もっさりとしたCVCSに慣れているのであれば、このGitの速度は神業のように感じるでしょう(訳者注:直訳は「このGitの側面はスピードの神様がこの世のものとは思えない力でGitを祝福したと考えさせるでしょう」)。プロジェクトの履歴は丸ごとすぐそこのローカル・ディスクに保持しているので、大概の操作はほぼ瞬時のように見えます。
78
+
79
+ 例えば、プロジェクトの履歴を閲覧するために、Gitはサーバーに履歴を取得しに行って表示する必要がありません。直接にローカル・データベースからそれを読むだけです。これは、プロジェクトの履歴をほとんど即座に知るということです。もし、あるファイルの現在のバージョンと、そのファイルの1ヶ月前の間に導入された変更点を知りたいのであれば、Gitは、遠隔のサーバーに差分を計算するように問い合わせたり、ローカルで差分を計算するために遠隔サーバーからファイルの古いバージョンを持ってくる代わりに、1か月前のファイルを調べてローカルで差分の計算を行なえます。
80
+
81
+ これはまた、オフラインであるか、VPNから切り離されていたとしても、出来ない事は非常に少ないことを意味します。もし、飛行機もしくは列車に乗ってちょっとした仕事をしたいとしても、アップロードするためにネットワーク接続し始めるまで、楽しくコミットできます。もし、帰宅してVPNクライアントを適切に作動させられないとしても、さらに作業ができます。多くの他のシステムでは、それらを行なう事は、不可能であるか苦痛です。例えばPerforceにおいては、サーバーに接続できないときは、多くの事が行なえません。SubversionとCVSにおいては、ファイルの編集はできますが、データベースに変更をコミットできません(なぜならば、データベースがオフラインだからです)。このことは巨大な問題に思えないでしょうが、実に大きな違いを生じうることに驚くでしょう。
82
+
83
+ ### Gitは完全性を持つ ###
84
+
85
+ Gitの全てのものは、格納される前にチェックサムが取られ、その後、そのチェックサムで照合されます。これは、Gitがそれに関して感知することなしに、あらゆるファイルの内容を変更することが不可能であることを意味します。この機能は、Gitの最下層に組み込まれ、またGitの哲学に不可欠です。Gitがそれを感知できない状態で、転送中に情報を失う、もしくは壊れたファイルを取得することはありません。
86
+
87
+ Gitがチェックサム生成に用いる機構は、SHA-1ハッシュと呼ばれます。これは、16進数の文字(0-9とa-f)で構成された40文字の文字列で、ファイルの内容もしくはGit内のディレクトリ構造を元に計算されます。SHA-1ハッシュは、このようなもののように見えます:
88
+
89
+ 24b9da6552252987aa493b52f8696cd6d3b00373
90
+
91
+ Gitはハッシュ値を大変よく利用するので、Gitのいたるところで、これらのハッシュ値を見ることでしょう。事実、Gitはファイル名ではなく、ファイル内容のハッシュ値によってアドレスが呼び出されるGitデータベースの中に全てを格納しています。
92
+
93
+ ### Gitは通常はデータを追加するだけ ###
94
+
95
+ Gitで行動するとき、ほとんど全てはGitデータベースにデータを追加するだけです。システムにいかなる方法でも、UNDO不可能なこと、もしくはデータを消させることをさせるのは、大変難しいです。あらゆるVCSと同様に、まだコミットしていない変更は失ったり、台無しにできたりします。しかし、スナップショットをGitにコミットした後は、特にもし定期的にデータベースを他のリポジトリにプッシュ(訳注:pushはGitで管理するあるリポジトリのデータを、他のリポジトリに転送する操作。詳細は後の章を参照)していれば、変更を失うことは大変難しくなります。
96
+
97
+ 激しく物事をもみくちゃにする危険なしに試行錯誤を行なえるため、これはGitの利用を喜びに変えます。Gitがデータをどのように格納しているのかと失われたように思えるデータをどうやって回復できるのかについての、より詳細な解説に関しては、第9章を参照してください。
98
+
99
+ ### 三つの状態 ###
100
+
101
+ 今、注意してください。もし学習プロセスの残りをスムーズに進めたいのであれば、これはGitに関して覚えておく主要な事です。Gitは、ファイルが帰属する、コミット済、修正済、ステージ済の、三つの主要な状態を持ちます。コミット済は、ローカル・データベースにデータが安全に格納されていることを意味します。修正済は、ファイルに変更を加えていますが、データベースにそれがまだコミットされていないことを意味します。ステージ済は、次のスナップショットのコミットに加えるために、現在のバージョンの修正されたファイルに印をつけている状態を意味します。
102
+
103
+ このことは、Gitプロジェクト(訳者注:ディレクトリ内)の、Gitディレクトリ、作業ディレクトリ、ステージング・エリアの三つの主要な部分(訳者注:の理解)に導きます。
104
+
105
+ Insert 18333fig0106.png
106
+ 図1-6. 作業ディレクトリ、ステージング・エリア、Gitディレクトリ
107
+
108
+ Gitディレクトリは、プロジェクトのためのメタデータ(訳者注:Gitが管理するファイルやディレクトリなどのオブジェクトの要約)とオブジェクトのデータベースがあるところです。これは、Gitの最も重要な部分で、他のコンピューターからリポジトリをクローン(訳者注:コピー元の情報を記録した状態で、Gitリポジトリをコピーすること)したときに、コピーされるものです。
109
+
110
+ 作業ディレクトリは、プロジェクトの一つのバージョンの単一チェックアウトです。これらのファイルはGitディレクトリの圧縮されたデータベースから引き出されて、利用するか修正するためにディスクに配置されます。
111
+
112
+ ステージング・エリアは、普通はGitディレクトリに含まれる、次のコミットに何が含まれるかに関しての情報を蓄えた一つの単純なファイルです。ときどきインデックスのように引き合いにだされますが、ステージング・エリアとして呼ばれることが基本になりつつあります。
113
+
114
+ 基本的なGitのワークフローは、このような風に進みます:
115
+
116
+ 1. 作業ディレクトリのファイルを修正します。
117
+ 2. 修正されたファイルのスナップショットをステージング・エリアに追加して、ファイルをステージします。
118
+ 3. コミットします。(訳者注:Gitでは)これは、ステージング・エリアにあるファイルを取得し、永久不変に保持するスナップショットとしてGitディレクトリに格納することです。
119
+
120
+ もしファイルの特定のバージョンがGitディレクトリの中にあるとしたら、コミット済だと見なされます。もし修正されていて、ステージング・エリアに加えられていれば、ステージ済です。そして、チェックアウトされてから変更されましたが、ステージされていないとするなら、修正済です。第2章では、これらの状態と、どうやってこれらを利用をするか、もしくは完全にステージ化部分を省略するかに関してより詳しく学習します。
121
+
122
+ ## Gitのインストール ##
123
+
124
+ 少しGitを使う事に入りましょう。何よりも最初に、Gitをインストールしなければなりません。幾つもの経路で入手することができ、主要な二つの方法のうちの一つはソースからインストールすることで、もう一つはプラットフォームに応じて存在するパッケージをインストールすることです。
125
+
126
+ ### ソースからのインストール ###
127
+
128
+ もし可能であれば、もっとも最新のバージョンを入手できるので、一般的にソースからGitをインストールするのが便利です。Gitのそれぞれのバージョンは、実用的なユーザー・インターフェイスの向上が含まれており、もしソースからソフトウェアをコンパイルすることに違和感を感じないのであれば、最新バージョンを入手することは、大抵は最も良い経路になります。また、多くのLinuxディストリビューションがとても古いパッケージを収録している事は良くあることであり、最新のディストリビューションを使っているか、バックポート(訳者注:最新のパッケージを古いディストリビューションで使えるようにする事)をしていない限りは、ソースからのインストールがベストな選択になるでしょう。
129
+
130
+ Gitをインストールするためには、Gitが依存するライブラリーである、curl、zlib、openssl、expat、libiconvを入手する必要があります。例えば、もし(Fedoraなどで)yumか(Debianベースのシステムなどで)apt-getが入ったシステムを使っているのであれば、これらのコマンドの一つを依存対象の全てをインストールするのに使う事ができます:
131
+
132
+ $ yum install curl-devel expat-devel gettext-devel \
133
+ openssl-devel zlib-devel
134
+
135
+ $ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
136
+ libz-dev libssl-dev
137
+
138
+ 全ての必要な依存対象を持っているのであれば、先に進んでGitのウェブサイトから最新版のスナップショットを持ってくる事ができます:
139
+
140
+ http://git-scm.com/download
141
+
142
+ そして、コンパイルしてインストールします:
143
+
144
+ $ tar -zxf git-1.7.2.2.tar.gz
145
+ $ cd git-1.7.2.2
146
+ $ make prefix=/usr/local all
147
+ $ sudo make prefix=/usr/local install
148
+
149
+ また、Gitのインストール後、アップデートでGitを通して最新版のGitを得ることができます。
150
+
151
+ $ git clone git://git.kernel.org/pub/scm/git/git.git
152
+
153
+ ### Linuxにインストール ###
154
+
155
+ バイナリのインストーラーを通じてLinux上にGitをインストールしたいのであれば、大抵はディストリビューションに付属する基本的なパッケージ・マネジメント・ツールを使って、それを行なう事ができます。もしFedoraを使っているのであれば、yumを使う事が出来ます:
156
+
157
+ $ yum install git
158
+
159
+ もしくは、もしUbuntuのようなDebianベースのディストリュビューションを使っているのであれば、apt-getをやってみましょう:
160
+
161
+ $ apt-get install git
162
+
163
+ ### Macにインストール ###
164
+
165
+ MacにGitをインストールするには2つの簡単な方法があります。もっとも簡単な方法は、グラフィカルなGitインストーラーを使うことで、このGitインストーラーはSourceForgeのページ(図1-7参照)からダウンロードすることができます:
166
+
167
+ http://sourceforge.net/projects/git-osx-installer/
168
+
169
+ Insert 18333fig0107.png
170
+ 図 1-7. Git OS X installer
171
+
172
+ もう一つの主要な方法は、MacPorts (`http://www.macports.org`) からGitをインストールすることです。MacPortsをインストールした状態であれば、Gitを以下のようにインストールできます。
173
+
174
+ $ sudo port install git-core +svn +doc +bash_completion +gitweb
175
+
176
+ 全てのvariantsを追加する必要はありませんが、SubversionのリポジトリでGitを使う必要がまだあるなら、恐らく+svnを含めないといけないでしょう(第8章参照)。
177
+
178
+ ### Windowsにインストール ###
179
+
180
+ WindowsにGitをインストールするのはとても簡単です。msysGitプロジェクトは、より簡単なインストール手続きの一つを備えています。GitHubのページから、単純にインストーラーのexeファイルをダウンロードをし、実行してください:
181
+
182
+ http://msysgit.github.com/
183
+
184
+ インストール後、コマンドライン版(後で役に立つSSHクライアントを含む)とスタンダードGUI版の両方を使う事ができます。
185
+
186
+ Windows利用時の注意点: この本で紹介されている複雑なコマンドを使えるので、GitはmsysGit shell(Unixスタイル)で使うようにしましょう。Windowsのシェル/コマンドラインコンソールを使わざるを得ない場合、空白を含むパラメーターを囲むための記号はダブルクオーテーション(シングルクォーテーションは使えない)を使用する必要があります。同様に、サーカムフレックス記号(^)が行末に来る場合はダブルクオーテーションで囲まなければなりません。同記号はWindowsにおいて「次行に続く」を意味する記号だからです。
187
+
188
+ ## 最初のGitの構成 ##
189
+
190
+ 今や、Gitがシステムにあります。Git環境をカスタマイズするためにしたい事が少しはあることでしょう。アップグレードの度についてまわるので、たった一度でそれらを終わらすべきでしょう。またそれらは、またコマンドを実行することによっていつでも変更することができます。
191
+
192
+ Gitには、`git config`と呼ばれるツールが付属します。これで、どのようにGitが見えて機能するかの全ての面を制御できる設定変数を取得し、設定することができます。これらの変数は三つの異なる場所に格納されうります:
193
+
194
+ * `/etc/gitconfig` file: システム上の全てのユーザーと全てのリポジトリに対する設定値を保持します。もし`--system`オプションを`git config`に指定すると、明確にこのファイルに読み書きを行ないます。
195
+ * `~/.gitconfig` file: 特定のユーザーに対する設定値を保持します. `--global`オプションを指定することで、Gitに、明確にこのファイルに読み書きを行なわせることができます。
196
+ * 現在使っている、あらゆるリポジトリのGitディレクトリの設定ファイル(`.git/config`のことです): 特定の単一リポジトリに対する設定値を保持します。それぞれのレベルの値は以前のレベルの値を上書きするため、`.git/config`の中の設定値は`/etc/gitconfig`の設定値に優先されます。
197
+
198
+ Windows環境下では、Gitは`$HOME`ディレクトリ(環境変数`USERPROFILE`で指定)の中の`.gitconfig`ファイルを検索に行きます。`$HOME`ディレクトリはほとんどの場合 `C:\Documents and Settings\$USER` か `C:\Users\$USER` のいずれかです($USERは環境変数`USERNAME`で指定)。また、インストーラー時にWindowsシステムにGitをインストールすると決めたところにある、MSysのルートとの相対位置であったとしても、 /etc/gitconfigも見に行きます。
199
+
200
+ ### 個人の識別情報 ###
201
+
202
+ Gitをインストールしたときに最初にすべきことは、ユーザー名とE-mailアドレスを設定することです。全てのGitのコミットはこの情報を用いるため、これは重要で、次々とまわすコミットに永続的に焼き付けられます:
203
+
204
+ $ git config --global user.name "John Doe"
205
+ $ git config --global user.email johndoe@example.com
206
+
207
+ また、もし`--global`オプションを指定するのであれば、Gitはその後、そのシステム上で行なう(訳者注:あるユーザーの)全ての操作に対して常にこの情報を使うようになるため、この操作を行なう必要はたった一度だけです。もし、違う名前とE-mailアドレスを特定のプロジェクトで上書きしたいのであれば、そのプロジェクトの(訳者注:Gitディレクトリの)中で、`--global`オプション無しでこのコマンドを実行することができます。
208
+
209
+ ### エディター ###
210
+
211
+ 今や、個人の識別情報が設定され、Gitがメッセージのタイプをさせる必要があるときに使う、標準のテキストエディターを設定できます。標準では、Gitはシステムのデフォルト・エディターを使います。これは大抵の場合、ViかVimです。Emacsのような違うテキスト・エディターを使いたい場合は、次のようにします:
212
+
213
+ $ git config --global core.editor emacs
214
+
215
+ ### diffツール ###
216
+
217
+ 設定したいと思われる、その他の便利なオプションは、マージ(訳者注:複数のリポジトリを併合すること)時の衝突を解決するために使う、標準のdiffツールです。vimdiffを使いたいとします:
218
+
219
+ $ git config --global merge.tool vimdiff
220
+
221
+ Gitはkdiff3、tkdiff、meld、xxdiff、emerge、vimdiff、gvimdiff、ecmerge、opendiffを確かなマージ・ツールとして扱えます。カスタム・ツールもまた設定できますが、これをする事に関しての詳細な情報は第7章を参照してください。
222
+
223
+ ### 設定の確認 ###
224
+
225
+ 設定を確認したい場合は、その時点でGitが見つけられる全ての設定を一覧するコマンドである`git config --list`を使う事ができます:
226
+
227
+ $ git config --list
228
+ user.name=Scott Chacon
229
+ user.email=schacon@gmail.com
230
+ color.status=auto
231
+ color.branch=auto
232
+ color.interactive=auto
233
+ color.diff=auto
234
+ ...
235
+
236
+ Gitは異なったファイル(例えば`/etc/gitconfig`と`~/.gitconfig`)から同一のキーを読み込むため、同一のキーを1度以上見ることになるでしょう。この場合、Gitは見つけたそれぞれ同一のキーに対して最後の値を用います。
237
+
238
+ また、Gitに設定されている特定のキーの値を、`git config {key}`をタイプすることで確認することができます:
239
+
240
+ $ git config user.name
241
+ Scott Chacon
242
+
243
+ ## ヘルプを見る ##
244
+
245
+ もし、Gitを使っている間は助けがいつも必要なら、あらゆるGitコマンドのヘルプのマニュアル・ページ(manpage)を参照する3種類の方法があります。
246
+
247
+ $ git help <verb>
248
+ $ git <verb> --help
249
+ $ man git-<verb>
250
+
251
+ 例えば、configコマンドのヘルプのmanpageを次のコマンドを走らせることで見ることができます。
252
+
253
+ $ git help config
254
+
255
+ これらのコマンドは、オフラインのときでさえ、どこでも見る事ができるので、すばらしいです。
256
+ もしmanpageとこの本が十分でなく、人の助けが必要であれば、フリーノードIRCサーバー(irc.freenode.net)の`#git`もしくは`#github`チャンネルにアクセスしてみてください。これらのチャンネルはいつも、全員がGitに関してとても知識があり、よく助けてくれようとする数百人の人々でいっぱいです。
257
+
258
+ ## まとめ ##
259
+
260
+ Gitとは何か、どのように今まで使われてきた他のCVCSと異なるのかについて、基本的な理解ができたはずです。また、今や個人情報の設定ができた、システムに稼動するバージョンのGitがあるはずです。今や、本格的にGitの基本を学習するときです。
@@ -0,0 +1,1221 @@
1
+ # Git の基本 #
2
+
3
+ Git を使い始めるにあたってどれかひとつの章だけしか読めないとしたら、読むべきは本章です。この章では、あなたが実際に Git を使う際に必要となる基本コマンドをすべて取り上げています。本章を最後まで読めば、リポジトリの設定や初期化、ファイルの追跡、そして変更内容のステージやコミットなどができるようになるでしょう。また、Git で特定のファイル (あるいは特定のファイルパターン) を無視させる方法やミスを簡単に取り消す方法、プロジェクトの歴史や各コミットの変更内容を見る方法、リモートリポジトリとの間でのプッシュやプルを行う方法についても説明します。
4
+
5
+ ## Git リポジトリの取得 ##
6
+
7
+ Git プロジェクトを取得するには、大きく二通りの方法があります。ひとつは既存のプロジェクトやディレクトリを Git にインポートする方法、そしてもうひとつは既存の Git リポジトリを別のサーバーからクローンする方法です。
8
+
9
+ ### 既存のディレクトリでのリポジトリの初期化 ###
10
+
11
+ 既存のプロジェクトを Git で管理し始めるときは、そのプロジェクトのディレクトリに移動して次のように打ち込みます。
12
+
13
+ $ git init
14
+
15
+ これを実行すると `.git` という名前の新しいサブディレクトリが作られ、リポジトリに必要なすべてのファイル (Git リポジトリのスケルトン) がその中に格納されます。この時点では、まだプロジェクト内のファイルは一切管理対象になっていません (今作った `.git` ディレクトリに実際のところどんなファイルが含まれているのかについての詳細な情報は、*第 9 章* を参照ください)。
16
+
17
+ 空のディレクトリではなくすでに存在するファイルのバージョン管理を始めたい場合は、まずそのファイルを監視対象に追加してから最初のコミットをすることになります。この場合は、追加したいファイルについて `git add` コマンドを実行したあとでコミットを行います。
18
+
19
+ $ git add *.c
20
+ $ git add README
21
+ $ git commit -m 'initial project version'
22
+
23
+ これが実際のところどういう意味なのかについては後で説明します。ひとまずこの時点で、監視対象のファイルを持つ Git リポジトリができあがり最初のコミットまで済んだことになります。
24
+
25
+ ### 既存のリポジトリのクローン ###
26
+
27
+ 既存の Git リポジトリ (何か協力したいと思っているプロジェクトなど) のコピーを取得したい場合に使うコマンドが、`git clone` です。Subversion などの他の VCS を使っている人なら「`checkout` じゃなくて `clone` なのか」と気になることでしょう。これは重要な違いです。Git は、サーバーが保持しているデータをほぼすべてコピーするのです。そのプロジェクトのすべてのファイルのすべての歴史が、`git clone` で手元にやってきます。実際、もし仮にサーバーのディスクが壊れてしまったとしても、どこかのクライアントに残っているクローンをサーバーに戻せばクローンした時点まで復元することができます (サーバーサイドのフックなど一部の情報は失われてしまいますが、これまでのバージョン管理履歴はすべてそこに残っています。*第 4 章* で詳しく説明します)。
28
+
29
+ リポジトリをクローンするには `git clone [url]` とします。たとえば、Ruby の Git ライブラリである Grit をクローンする場合は次のようになります。
30
+
31
+ $ git clone git://github.com/schacon/grit.git
32
+
33
+ これは、まず `grit` というディレクトリを作成してその中で `.git` ディレクトリを初期化し、リポジトリのすべてのデータを引き出し、そして最新バージョンの作業コピーをチェックアウトします。新しくできた `grit` ディレクトリに入ると、プロジェクトのファイルをごらんいただけます。もし grit ではない別の名前のディレクトリにクローンしたいのなら、コマンドラインオプションでディレクトリ名を指定します。
34
+
35
+ $ git clone git://github.com/schacon/grit.git mygrit
36
+
37
+ このコマンドは先ほどと同じ処理をしますが、ディレクトリ名は `mygrit` となります。
38
+
39
+ Git では、さまざまな転送プロトコルを使用することができます。先ほどの例では `git://` プロトコルを使用しましたが、`http(s)://` や `user@server:/path.git` といった形式を使うこともできます。これらは SSH プロトコルを使用します。*第 4 章* で、サーバー側で準備できるすべてのアクセス方式についての利点と欠点を説明します。
40
+
41
+ ## 変更内容のリポジトリへの記録 ##
42
+
43
+ これで、れっきとした Git リポジトリを準備して、そのプロジェクト内のファイルの作業コピーを取得することができました。次は、そのコピーに対して何らかの変更を行い、適当な時点で変更内容のスナップショットをリポジトリにコミットすることになります。
44
+
45
+ 作業コピー内の各ファイルには *追跡されている(tracked)* ものと *追跡されてない(untracked)* ものの二通りがあることを知っておきましょう。*追跡されている* ファイルとは、直近のスナップショットに存在したファイルのことです。これらのファイルについては変更されていない(unmodified)」「変更されている(modified)」「ステージされている(staged)」の三つの状態があります。追跡されていないファイルは、そのどれでもありません。直近のスナップショットには存在せず、ステージングエリアにも存在しないファイルのことです。最初にプロジェクトをクローンした時点では、すべてのファイルは「追跡されている」かつ「変更されていない」状態となります。チェックアウトしただけで何も編集していない状態だからです。
46
+
47
+ ファイルを編集すると、Git はそれを「変更された」とみなします。直近のコミットの後で変更が加えられたからです。変更されたファイルを *ステージ* し、それをコミットする。この繰り返しです。ここまでの流れを図 2-1 にまとめました。
48
+
49
+ Insert 18333fig0201.png
50
+ 図 2-1. ファイルの状態の流れ
51
+
52
+ ### ファイルの状態の確認 ###
53
+
54
+ どのファイルがどの状態にあるのかを知るために主に使うツールが `git status` コマンドです。このコマンドをクローン直後に実行すると、このような結果となるでしょう。
55
+
56
+ $ git status
57
+ On branch master
58
+ nothing to commit, working directory clean
59
+
60
+ これは、クリーンな作業コピーである (つまり、追跡されているファイルの中に変更されているものがない) ことを意味します。また、追跡されていないファイルも存在しません (もし追跡されていないファイルがあれば、Git はそれを表示します)。最後に、このコマンドを実行するとあなたが今どのブランチにいるのかを知ることができます。現時点では常に `master` となります。これはデフォルトであり、ここでは特に気にする必要はありません。ブランチについては次の章で詳しく説明します。
61
+
62
+ ではここで、新しいファイルをプロジェクトに追加してみましょう。シンプルに、`README` ファイルを追加してみます。それ以前に README ファイルがなかった場合、`git status` を実行すると次のように表示されます。
63
+
64
+ $ vim README
65
+ $ git status
66
+ On branch master
67
+ Untracked files:
68
+ (use "git add <file>..." to include in what will be committed)
69
+
70
+ README
71
+
72
+ nothing added to commit but untracked files present (use "git add" to track)
73
+
74
+ 出力結果の “Untracked files” 欄に `README` ファイルがあることから、このファイルが追跡されていないということがわかります。これは、Git が「前回のスナップショット (コミット) にはこのファイルが存在しなかった」とみなしたということです。明示的に指示しない限り、Git はコミット時にこのファイルを含めることはありません。自動生成されたバイナリファイルなど、コミットしたくないファイルを間違えてコミットしてしまう心配はないということです。今回は README をコミットに含めたいわけですから、まずファイルを追跡対象に含めるようにしましょう。
75
+
76
+ ### 新しいファイルの追跡 ###
77
+
78
+ 新しいファイルの追跡を開始するには `git add` コマンドを使用します。`README` ファイルの追跡を開始する場合はこのようになります。
79
+
80
+ $ git add README
81
+
82
+ 再び status コマンドを実行すると、`README` ファイルが追跡対象となり、ステージされていることがわかるでしょう。
83
+
84
+ $ git status
85
+ On branch master
86
+ Changes to be committed:
87
+ (use "git reset HEAD <file>..." to unstage)
88
+
89
+ new file: README
90
+
91
+
92
+ ステージされていると判断できるのは、“Changes to be committed” 欄に表示されているからです。ここでコミットを行うと、`git add` した時点の状態のファイルがスナップショットとして歴史に書き込まれます。先ほど `git init` をしたときに、ディレクトリ内のファイルを追跡するためにその後 `git add (ファイル)` としたことを思い出すことでしょう。`git add` コマンドには、ファイルあるいはディレクトリのパスを指定します。ディレクトリを指定した場合は、そのディレクトリ以下にあるすべてのファイルを再帰的に追加します。
93
+
94
+ ### 変更したファイルのステージング ###
95
+
96
+ すでに追跡対象となっているファイルを変更してみましょう。たとえば、すでに追跡対象となっているファイル `benchmarks.rb` を変更して `status` コマンドを実行すると、結果はこのようになります。
97
+
98
+ $ git status
99
+ On branch master
100
+ Changes to be committed:
101
+ (use "git reset HEAD <file>..." to unstage)
102
+
103
+ new file: README
104
+
105
+ Changes not staged for commit:
106
+ (use "git add <file>..." to update what will be committed)
107
+ (use "git checkout -- <file>..." to discard changes in working directory)
108
+
109
+ modified: benchmarks.rb
110
+
111
+
112
+ `benchmarks.rb` ファイルは “Changes not staged for commit” という欄に表示されます。これは、追跡対象のファイルが作業ディレクトリ内で変更されたけれどもまだステージされていないという意味です。ステージするには `git add` コマンドを実行します (このコマンドにはいろんな意味合いがあり、新しいファイルの追跡開始・ファイルのステージング・マージ時に衝突が発生したファイルに対する「解決済み」マーク付けなどで使用します)。では、`git add` で `benchmarks.rb` をステージしてもういちど `git status` を実行してみましょう。
113
+
114
+ $ git add benchmarks.rb
115
+ $ git status
116
+ On branch master
117
+ Changes to be committed:
118
+ (use "git reset HEAD <file>..." to unstage)
119
+
120
+ new file: README
121
+ modified: benchmarks.rb
122
+
123
+
124
+ 両方のファイルがステージされました。これで、次回のコミットに両方のファイルが含まれるようになります。ここで、さらに `benchmarks.rb` にちょっとした変更を加えてからコミットしたくなったとしましょう。ファイルを開いて変更を終え、コミットの準備が整いました。しかし、`git status` を実行してみると何か変です。
125
+
126
+ $ vim benchmarks.rb
127
+ $ git status
128
+ On branch master
129
+ Changes to be committed:
130
+ (use "git reset HEAD <file>..." to unstage)
131
+
132
+ new file: README
133
+ modified: benchmarks.rb
134
+
135
+ Changes not staged for commit:
136
+ (use "git add <file>..." to update what will be committed)
137
+ (use "git checkout -- <file>..." to discard changes in working directory)
138
+
139
+ modified: benchmarks.rb
140
+
141
+
142
+ これはどういうことでしょう? `benchmarks.rb` が、ステージされているほうにもステージされていないほうにも登場しています。こんなことってありえるんでしょうか? 要するに、Git は「`git add` コマンドを実行した時点の状態のファイル」をステージするということです。ここでコミットをすると、実際にコミットされるのは `git add` を実行した時点の `benchmarks.rb` であり、`git commit` した時点の作業ディレクトリにある内容とは違うものになります。`git add` した後にファイルを変更した場合に、最新版のファイルをステージしなおすにはもう一度 `git add` を実行します。
143
+
144
+ $ git add benchmarks.rb
145
+ $ git status
146
+ On branch master
147
+ Changes to be committed:
148
+ (use "git reset HEAD <file>..." to unstage)
149
+
150
+ new file: README
151
+ modified: benchmarks.rb
152
+
153
+
154
+ ### ファイルの無視 ###
155
+
156
+ ある種のファイルについては、Git で自動的に追加してほしくないしそもそも「追跡されていない」と表示されるのも気になる。そんなことがよくあります。たとえば、ログファイルやビルドシステムが生成するファイルなどの自動生成されるファイルがそれにあたるでしょう。そんな場合は、無視させたいファイルのパターンを並べた `.gitignore` というファイルを作成します。`.gitignore` ファイルは、たとえばこのようになります。
157
+
158
+ $ cat .gitignore
159
+ *.[oa]
160
+ *~
161
+
162
+ 最初の行は `.o` あるいは `.a` で終わる名前のファイル (コードをビルドする際にできるであろうオブジェクトファイルとアーカイブファイル) を無視するよう Git に伝えています。次の行で Git に無視させているのは、チルダ (`~`) で終わる名前のファイルです。Emacs をはじめとする多くのエディタが、この形式の一時ファイルを作成します。これ以外には、たとえば `log`、`tmp`、`pid` といった名前のディレクトリや自動生成されるドキュメントなどもここに含めることになるでしょう。実際に作業を始める前に `.gitignore` ファイルを準備しておくことをお勧めします。そうすれば、予期せぬファイルを間違って Git リポジトリにコミットしてしまう事故を防げます。
163
+
164
+ `.gitignore` ファイルに記述するパターンの規則は、次のようになります。
165
+
166
+ * 空行あるいは `#` で始まる行は無視される
167
+ * 標準の glob パターンを使用可能
168
+ * ディレクトリを指定するには、パターンの最後にスラッシュ (`/`) をつける
169
+ * パターンを逆転させるには、最初に感嘆符 (`!`) をつける
170
+
171
+ glob パターンとは、シェルで用いる簡易正規表現のようなものです。アスタリスク (`*`) は、ゼロ個以上の文字にマッチします。`[abc]` は、角括弧内の任意の文字 (この場合は `a`、`b` あるいは `c`) にマッチします。疑問符 (`?`) は一文字にマッチします。また、ハイフン区切りの文字を角括弧で囲んだ形式 (`[0-9]`) は、ふたつの文字の間の任意の文字 (この場合は 0 から 9 までの間の文字) にマッチします。
172
+
173
+ では、`.gitignore` ファイルの例をもうひとつ見てみましょう。
174
+
175
+ # コメント。これは無視されます
176
+ # .a ファイルは無視
177
+ *.a
178
+ # しかし、lib.a ファイルだけは .a であっても追跡対象とします
179
+ !lib.a
180
+ # ルートディレクトリの TODO ファイルだけを無視し、サブディレクトリの TODO は無視しません
181
+ /TODO
182
+ # build/ ディレクトリのすべてのファイルを無視します
183
+ build/
184
+ # doc/notes.txt は無視しますが、doc/server/arch.txt は無視しません
185
+ doc/*.txt
186
+ # doc/ ディレクトリの .txt ファイル全てを無視します
187
+ doc/**/*.txt
188
+
189
+ `**/` 形式は 1.8.2 以降のGitで利用可能です。
190
+
191
+ ### ステージされている変更 / されていない変更の閲覧 ###
192
+
193
+ `git status` コマンドだけではよくわからない (どのファイルが変更されたのかだけではなく、実際にどのように変わったのかが知りたい) という場合は `git diff` コマンドを使用します。`git diff` コマンドについては後で詳しく解説します。おそらく、最もよく使う場面としては次の二つの問いに答えるときになるでしょう。「変更したけどまだステージしていない変更は?」「コミット対象としてステージした変更は?」もちろん `git status` でもこれらの質問に対するおおまかな答えは得られますが、`git diff` の場合は追加したり削除したりした正確な行をパッチ形式で表示します。
194
+
195
+ 先ほどの続きで、ふたたび `README` ファイルを編集してステージし、一方 `benchmarks.rb` ファイルは編集だけしてステージしない状態にあると仮定しましょう。ここで `status` コマンドを実行すると、次のような結果となります。
196
+
197
+ $ git status
198
+ On branch master
199
+ Changes to be committed:
200
+ (use "git reset HEAD <file>..." to unstage)
201
+
202
+ new file: README
203
+
204
+ Changes not staged for commit:
205
+ (use "git add <file>..." to update what will be committed)
206
+ (use "git checkout -- <file>..." to discard changes in working directory)
207
+
208
+ modified: benchmarks.rb
209
+
210
+
211
+ 変更したけれどもまだステージしていない内容を見るには、引数なしで `git diff` を実行します。
212
+
213
+ $ git diff
214
+ diff --git a/benchmarks.rb b/benchmarks.rb
215
+ index 3cb747f..da65585 100644
216
+ --- a/benchmarks.rb
217
+ +++ b/benchmarks.rb
218
+ @@ -36,6 +36,10 @@ def main
219
+ @commit.parents[0].parents[0].parents[0]
220
+ end
221
+
222
+ + run_code(x, 'commits 1') do
223
+ + git.commits.size
224
+ + end
225
+ +
226
+ run_code(x, 'commits 2') do
227
+ log = git.commits('master', 15)
228
+ log.size
229
+
230
+ このコマンドは、作業ディレクトリの内容とステージングエリアの内容を比較します。この結果を見れば、あなたが変更した内容のうちまだステージされていないものを知ることができます。
231
+
232
+ 次のコミットに含めるべくステージされた内容を知りたい場合は、`git diff --cached` を使用します (Git バージョン 1.6.1 以降では `git diff --staged` も使えます。こちらのほうが覚えやすいでしょう)。このコマンドは、ステージされている変更と直近のコミットの内容を比較します。
233
+
234
+ $ git diff --cached
235
+ diff --git a/README b/README
236
+ new file mode 100644
237
+ index 0000000..03902a1
238
+ --- /dev/null
239
+ +++ b/README2
240
+ @@ -0,0 +1,5 @@
241
+ +grit
242
+ + by Tom Preston-Werner, Chris Wanstrath
243
+ + http://github.com/mojombo/grit
244
+ +
245
+ +Grit is a Ruby library for extracting information from a Git repository
246
+
247
+ `git diff` 自体は、直近のコミット以降のすべての変更を表示するわけではないことに注意しましょう。あくまでもステージされていない変更だけの表示となります。これにはすこし戸惑うかもしれません。変更内容をすべてステージしてしまえば `git diff` は何も出力しなくなるわけですから。
248
+
249
+ もうひとつの例を見てみましょう。benchmarks.rb ファイルをいったんステージした後に編集してみましょう。`git diff` を使用すると、ステージされたファイルの変更とまだステージされていないファイルの変更を見ることができます。
250
+
251
+ $ git add benchmarks.rb
252
+ $ echo '# test line' >> benchmarks.rb
253
+ $ git status
254
+ On branch master
255
+ Changes to be committed:
256
+ (use "git reset HEAD <file>..." to unstage)
257
+
258
+ modified: benchmarks.rb
259
+
260
+ Changes not staged for commit:
261
+ (use "git add <file>..." to update what will be committed)
262
+ (use "git checkout -- <file>..." to discard changes in working directory)
263
+
264
+ modified: benchmarks.rb
265
+
266
+
267
+ ここで `git diff` を使うと、まだステージされていない内容を知ることができます。
268
+
269
+ $ git diff
270
+ diff --git a/benchmarks.rb b/benchmarks.rb
271
+ index e445e28..86b2f7c 100644
272
+ --- a/benchmarks.rb
273
+ +++ b/benchmarks.rb
274
+ @@ -127,3 +127,4 @@ end
275
+ main()
276
+
277
+ ##pp Grit::GitRuby.cache_client.stats
278
+ +# test line
279
+
280
+ そして `git diff --cached` を使うと、これまでにステージした内容を知ることができます。
281
+
282
+ $ git diff --cached
283
+ diff --git a/benchmarks.rb b/benchmarks.rb
284
+ index 3cb747f..e445e28 100644
285
+ --- a/benchmarks.rb
286
+ +++ b/benchmarks.rb
287
+ @@ -36,6 +36,10 @@ def main
288
+ @commit.parents[0].parents[0].parents[0]
289
+ end
290
+
291
+ + run_code(x, 'commits 1') do
292
+ + git.commits.size
293
+ + end
294
+ +
295
+ run_code(x, 'commits 2') do
296
+ log = git.commits('master', 15)
297
+ log.size
298
+
299
+ ### 変更のコミット ###
300
+
301
+ ステージングエリアの準備ができたら、変更内容をコミットすることができます。コミットの対象となるのはステージされたものだけ、つまり追加したり変更したりしただけでまだ `git add` を実行していないファイルはコミットされないことを覚えておきましょう。そういったファイルは、変更されたままの状態でディスク上に残ります。今回の場合は、最後に `git status` を実行したときにすべてがステージされていることを確認しています。つまり、変更をコミットする準備ができた状態です。コミットするための最もシンプルな方法は `git commit` と打ち込むことです。
302
+
303
+ $ git commit
304
+
305
+ これを実行すると、指定したエディタが立ち上がります (シェルの `$EDITOR` 環境変数で設定されているエディタ。通常は vim あるいは emacs でしょう。しかし、それ以外にも *第 1 章* で説明した `git config --global core.editor` コマンドでお好みのエディタを指定することもできます)。
306
+
307
+ エディタには次のようなテキストが表示されています (これは Vim の画面の例です)。
308
+
309
+ # Please enter the commit message for your changes. Lines starting
310
+ # with '#' will be ignored, and an empty message aborts the commit.
311
+ # On branch master
312
+ # Changes to be committed:
313
+ # new file: README
314
+ # modified: benchmarks.rb
315
+ #
316
+ ~
317
+ ~
318
+ ~
319
+ ".git/COMMIT_EDITMSG" 10L, 283C
320
+
321
+ デフォルトのコミットメッセージとして、直近の `git status` コマンドの結果がコメントアウトして表示され、先頭に空行があることがわかるでしょう。このコメントを消して自分でコミットメッセージを書き入れていくこともできますし、何をコミットしようとしているのかの確認のためにそのまま残しておいてもかまいません (何を変更したのかをより明確に知りたい場合は、`git commit` に `-v` オプションを指定します。そうすると、diff の内容がエディタに表示されるので何を行ったのかが正確にわかるようになります)。エディタを終了させると、Git はそのメッセージつきのコミットを作成します (コメントおよび diff は削除されます)。
322
+
323
+ あるいは、コミットメッセージをインラインで記述することもできます。その場合は、`commit` コマンドの後で `-m` フラグに続けて次のように記述します。
324
+
325
+ $ git commit -m "Story 182: Fix benchmarks for speed"
326
+ [master 463dc4f] Story 182: Fix benchmarks for speed
327
+ 2 files changed, 3 insertions(+)
328
+ create mode 100644 README
329
+
330
+ これではじめてのコミットができました! 今回のコミットについて、「どのブランチにコミットしたのか (`master`)」「そのコミットの SHA-1 チェックサム (`463dc4f`)」「変更されたファイルの数」「そのコミットで追加されたり削除されたりした行数」といった情報が表示されているのがわかるでしょう。
331
+
332
+ コミットが記録するのは、ステージングエリアのスナップショットであることを覚えておきましょう。ステージしていない情報については変更された状態のまま残っています。別のコミットで歴史にそれを書き加えるには、改めて add する必要があります。コミットするたびにプロジェクトのスナップショットが記録され、あとからそれを取り消したり参照したりできるようになります。
333
+
334
+ ### ステージングエリアの省略 ###
335
+
336
+ コミットの内容を思い通りに作り上げることができるという点でステージングエリアは非常に便利なのですが、普段の作業においては必要以上に複雑に感じられることもあるでしょう。ステージングエリアを省略したい場合のために、Git ではシンプルなショートカットを用意しています。`git commit` コマンドに `-a` オプションを指定すると、追跡対象となっているファイルを自動的にステージしてからコミットを行います。つまり `git add` を省略できるというわけです。
337
+
338
+ $ git status
339
+ On branch master
340
+ Changes not staged for commit:
341
+ (use "git add <file>..." to update what will be committed)
342
+ (use "git checkout -- <file>..." to discard changes in working directory)
343
+
344
+ modified: benchmarks.rb
345
+
346
+ no changes added to commit (use "git add" and/or "git commit -a")
347
+ $ git commit -a -m 'added new benchmarks'
348
+ [master 83e38c7] added new benchmarks
349
+ 1 files changed, 5 insertions(+)
350
+
351
+ この場合、コミットする前に `benchmarks.rb` を `git add` する必要がないことに注意しましょう。
352
+
353
+ ### ファイルの削除 ###
354
+
355
+ ファイルを Git から削除するには、追跡対象からはずし (より正確に言うとステージングエリアから削除し)、そしてコミットします。`git rm` コマンドは、この作業を行い、そして作業ディレクトリからファイルを削除します。つまり、追跡されていないファイルとして残り続けることはありません。
356
+
357
+ 単に作業ディレクトリからファイルを削除しただけの場合は、`git status` の出力の中では “Changes not staged for commit” (つまり _ステージされていない_) 欄に表示されます。
358
+
359
+ $ rm grit.gemspec
360
+ $ git status
361
+ On branch master
362
+ Changes not staged for commit:
363
+ (use "git add/rm <file>..." to update what will be committed)
364
+ (use "git checkout -- <file>..." to discard changes in working directory)
365
+
366
+ deleted: grit.gemspec
367
+
368
+ no changes added to commit (use "git add" and/or "git commit -a")
369
+
370
+ `git rm` を実行すると、ファイルの削除がステージされます。
371
+
372
+ $ git rm grit.gemspec
373
+ rm 'grit.gemspec'
374
+ $ git status
375
+ On branch master
376
+ Changes to be committed:
377
+ (use "git reset HEAD <file>..." to unstage)
378
+
379
+ deleted: grit.gemspec
380
+
381
+
382
+ 次にコミットするときにファイルが削除され、追跡対象外となります。変更したファイルをすでにステージしている場合は、`-f` オプションで強制的に削除しなければなりません。まだスナップショットに記録されていないファイルを誤って削除してしまうと Git で復旧することができなくなってしまうので、それを防ぐための安全装置です。
383
+
384
+ ほかに「こんなことできたらいいな」と思われるであろう機能として、ファイル自体は作業ツリーに残しつつステージングエリアからの削除だけを行うこともできます。つまり、ハードディスク上にはファイルを残しておきたいけれど、もう Git では追跡させたくないというような場合のことです。これが特に便利なのは、`.gitignore` ファイルに書き足すのを忘れたために巨大なログファイルや大量の `.a` ファイルがステージされてしまったなどというときです。そんな場合は `--cached` オプションを使用します。
385
+
386
+ $ git rm --cached readme.txt
387
+
388
+ ファイル名やディレクトリ名、そしてファイル glob パターンを `git rm` コマンドに渡すことができます。つまり、このようなこともできるということです。
389
+
390
+ $ git rm log/\*.log
391
+
392
+ `*` の前にバックスラッシュ (`\`) があることに注意しましょう。これが必要なのは、シェルによるファイル名の展開だけでなく Git が自前でファイル名の展開を行うからです。ただしWindowsのコマンドプロンプトの場合は、バックスラッシュは取り除かなければなりません。このコマンドは、`log/` ディレクトリにある拡張子 `.log` のファイルをすべて削除します。あるいは、このような書き方もできます。
393
+
394
+ $ git rm \*~
395
+
396
+ このコマンドは、`~` で終わるファイル名のファイルをすべて削除します。
397
+
398
+ ### ファイルの移動 ###
399
+
400
+ 他の多くの VCS とは異なり、Git はファイルの移動を明示的に追跡することはありません。Git の中でファイル名を変更しても、「ファイル名を変更した」というメタデータは Git には保存されないのです。しかし Git は賢いので、ファイル名が変わったことを知ることができます。ファイルの移動を検出する仕組みについては後ほど説明します。
401
+
402
+ しかし Git には `mv` コマンドがあります。ちょっと混乱するかもしれませんね。Git の中でファイル名を変更したい場合は次のようなコマンドを実行します。
403
+
404
+ $ git mv file_from file_to
405
+
406
+ このようなコマンドを実行してから status を確認すると、Git はそれをファイル名が変更されたと解釈していることがわかるでしょう。
407
+
408
+ $ git mv README.txt README
409
+ $ git status
410
+ On branch master
411
+ Changes to be committed:
412
+ (use "git reset HEAD <file>..." to unstage)
413
+
414
+ renamed: README.txt -> README
415
+
416
+
417
+ しかし、実際のところこれは、次のようなコマンドを実行するのと同じ意味となります。
418
+
419
+ $ mv README.txt README
420
+ $ git rm README.txt
421
+ $ git add README
422
+
423
+ Git はこれが暗黙的なファイル名の変更であると理解するので、この方法であろうが `mv` コマンドを使おうがどちらでもかまいません。唯一の違いは、この方法だと 3 つのコマンドが必要になるかわりに `mv` だとひとつのコマンドだけで実行できるという点です。より重要なのは、ファイル名の変更は何でもお好みのツールで行えるということです。あとでコミットする前に add/rm を指示してやればいいのです。
424
+
425
+ ## コミット履歴の閲覧 ##
426
+
427
+ 何度かコミットを繰り返すと、あるいはコミット履歴つきの既存のリポジトリをクローンすると、過去に何が起こったのかを振り返りたくなることでしょう。そのために使用するもっとも基本的かつパワフルな道具が `git log` コマンドです。
428
+
429
+ ここからの例では、`simplegit` という非常にシンプルなプロジェクトを使用します。これは、私が説明用によく用いているプロジェクトで、次のようにして取得できます。
430
+
431
+ git clone git://github.com/schacon/simplegit-progit.git
432
+
433
+ このプロジェクトで `git log` を実行すると、このような結果が得られます。
434
+
435
+ $ git log
436
+ commit ca82a6dff817ec66f44342007202690a93763949
437
+ Author: Scott Chacon <schacon@gee-mail.com>
438
+ Date: Mon Mar 17 21:52:11 2008 -0700
439
+
440
+ changed the version number
441
+
442
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
443
+ Author: Scott Chacon <schacon@gee-mail.com>
444
+ Date: Sat Mar 15 16:40:33 2008 -0700
445
+
446
+ removed unnecessary test code
447
+
448
+ commit a11bef06a3f659402fe7563abf99ad00de2209e6
449
+ Author: Scott Chacon <schacon@gee-mail.com>
450
+ Date: Sat Mar 15 10:31:28 2008 -0700
451
+
452
+ first commit
453
+
454
+ デフォルトで引数を何も指定しなければ、`git log` はそのリポジトリでのコミットを新しい順に表示します。つまり、直近のコミットが最初に登場するということです。ごらんのとおり、このコマンドは各コミットについて SHA-1 チェックサム・作者の名前とメールアドレス・コミット日時・コミットメッセージを一覧表示します。
455
+
456
+ `git log` コマンドには数多くのバラエティに富んだオプションがあり、あなたが本当に見たいものを表示させることができます。ここでは、よく用いられるオプションのいくつかをご覧に入れましょう。
457
+
458
+ もっとも便利なオプションのひとつが `-p` で、これは各コミットの diff を表示します。また `-2` は、直近の 2 エントリだけを出力します。
459
+
460
+ $ git log -p -2
461
+ commit ca82a6dff817ec66f44342007202690a93763949
462
+ Author: Scott Chacon <schacon@gee-mail.com>
463
+ Date: Mon Mar 17 21:52:11 2008 -0700
464
+
465
+ changed the version number
466
+
467
+ diff --git a/Rakefile b/Rakefile
468
+ index a874b73..8f94139 100644
469
+ --- a/Rakefile
470
+ +++ b/Rakefile
471
+ @@ -5,5 +5,5 @@ require 'rake/gempackagetask'
472
+ spec = Gem::Specification.new do |s|
473
+ s.name = "simplegit"
474
+ - s.version = "0.1.0"
475
+ + s.version = "0.1.1"
476
+ s.author = "Scott Chacon"
477
+ s.email = "schacon@gee-mail.com
478
+
479
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
480
+ Author: Scott Chacon <schacon@gee-mail.com>
481
+ Date: Sat Mar 15 16:40:33 2008 -0700
482
+
483
+ removed unnecessary test code
484
+
485
+ diff --git a/lib/simplegit.rb b/lib/simplegit.rb
486
+ index a0a60ae..47c6340 100644
487
+ --- a/lib/simplegit.rb
488
+ +++ b/lib/simplegit.rb
489
+ @@ -18,8 +18,3 @@ class SimpleGit
490
+ end
491
+
492
+ end
493
+ -
494
+ -if $0 == __FILE__
495
+ - git = SimpleGit.new
496
+ - puts git.show
497
+ -end
498
+
499
+
500
+ このオプションは、先ほどと同じ情報を表示するとともに、各エントリの直後にその diff を表示します。これはコードレビューのときに非常に便利です。また、他のメンバーが一連のコミットで何を行ったのかをざっと眺めるのにも便利でしょう。
501
+
502
+ コードレビューの際、行単位ではなく単語単位でレビューするほうが容易な場合もあるでしょう。`git log -p` コマンドのオプション `--word-diff` を使えば、通常の行単位diffではなく、単語単位のdiffを表示させることができます。単語単位のdiffはソースコードのレビューに用いても役に立ちませんが、書籍や論文など、長文テキストファイルのレビューを行う際は便利です。こんな風に使用します。
503
+
504
+ $ git log -U1 --word-diff
505
+ commit ca82a6dff817ec66f44342007202690a93763949
506
+ Author: Scott Chacon <schacon@gee-mail.com>
507
+ Date: Mon Mar 17 21:52:11 2008 -0700
508
+
509
+ changed the version number
510
+
511
+ diff --git a/Rakefile b/Rakefile
512
+ index a874b73..8f94139 100644
513
+ --- a/Rakefile
514
+ +++ b/Rakefile
515
+ @@ -7,3 +7,3 @@ spec = Gem::Specification.new do |s|
516
+ s.name = "simplegit"
517
+ s.version = [-"0.1.0"-]{+"0.1.1"+}
518
+ s.author = "Scott Chacon"
519
+
520
+ ご覧のとおり、通常のdiffにある「追加行や削除行の表示」はありません。その代わりに、変更点はインラインで表示されることになります。追加された単語は `{+ +}` で、削除された単語は `[- -]` で囲まれます。また、着目すべき点が行ではなく単語なので、diffの出力を通常の「変更行前後3行ずつ」から「変更行前後1行ずつ」に減らしたほうがよいかもしれません。上記の例で使用した `-U1` オプションを使えば行数を減らせます。
521
+
522
+ また、`git log` では「まとめ」系のオプションを使うこともできます。たとえば、各コミットに関するちょっとした統計情報を見たい場合は `--stat` オプションを使用します。
523
+
524
+ $ git log --stat
525
+ commit ca82a6dff817ec66f44342007202690a93763949
526
+ Author: Scott Chacon <schacon@gee-mail.com>
527
+ Date: Mon Mar 17 21:52:11 2008 -0700
528
+
529
+ changed the version number
530
+
531
+ Rakefile | 2 +-
532
+ 1 file changed, 1 insertion(+), 1 deletion(-)
533
+
534
+ commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
535
+ Author: Scott Chacon <schacon@gee-mail.com>
536
+ Date: Sat Mar 15 16:40:33 2008 -0700
537
+
538
+ removed unnecessary test code
539
+
540
+ lib/simplegit.rb | 5 -----
541
+ 1 file changed, 5 deletions(-)
542
+
543
+ commit a11bef06a3f659402fe7563abf99ad00de2209e6
544
+ Author: Scott Chacon <schacon@gee-mail.com>
545
+ Date: Sat Mar 15 10:31:28 2008 -0700
546
+
547
+ first commit
548
+
549
+ README | 6 ++++++
550
+ Rakefile | 23 +++++++++++++++++++++++
551
+ lib/simplegit.rb | 25 +++++++++++++++++++++++++
552
+ 3 files changed, 54 insertions(+)
553
+
554
+ ごらんの通り `--stat` オプションは、各コミットエントリに続けて変更されたファイルの一覧と変更されたファイルの数、追加・削除された行数が表示されます。また、それらの情報のまとめを最後に出力します。もうひとつの便利なオプションが `--pretty` です。これは、ログをデフォルトの書式以外で出力します。あらかじめ用意されているいくつかのオプションを指定することができます。`oneline` オプションは、各コミットを一行で出力します。これは、大量のコミットを見る場合に便利です。さらに `short` や `full` そして `fuller` といったオプションもあり、これは標準とほぼ同じ書式だけれども情報量がそれぞれ少なめあるいは多めになります。
555
+
556
+ $ git log --pretty=oneline
557
+ ca82a6dff817ec66f44342007202690a93763949 changed the version number
558
+ 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
559
+ a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
560
+
561
+ もっとも興味深いオプションは `format` で、これは独自のログ出力フォーマットを指定することができます。これは、出力結果を機械にパースさせる際に非常に便利です。自分でフォーマットを指定しておけば、将来 Git をアップデートしても結果が変わらないようにできるからです。
562
+
563
+ $ git log --pretty=format:"%h - %an, %ar : %s"
564
+ ca82a6d - Scott Chacon, 11 months ago : changed the version number
565
+ 085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
566
+ a11bef0 - Scott Chacon, 11 months ago : first commit
567
+
568
+ 表 2-1 は、format で使用できる便利なオプションをまとめたものです。
569
+
570
+ <!-- Attention to translators: this is a table declaration.
571
+ The lines must be formatted as follows
572
+ <TAB><First column text><TAB><Second column text>
573
+ -->
574
+
575
+ オプション 出力される内容
576
+ %H コミットのハッシュ
577
+ %h コミットのハッシュ (短縮版)
578
+ %T ツリーのハッシュ
579
+ %t ツリーのハッシュ (短縮版)
580
+ %P 親のハッシュ
581
+ %p 親のハッシュ (短縮版)
582
+ %an Author の名前
583
+ %ae Author のメールアドレス
584
+ %ad Author の日付 (--date= オプションに従った形式)
585
+ %ar Author の相対日付
586
+ %cn Committer の名前
587
+ %ce Committer のメールアドレス
588
+ %cd Committer の日付
589
+ %cr Committer の相対日付
590
+ %s 件名
591
+
592
+ _author_ と _committer_ は何が違うのか気になる方もいるでしょう。_author_ とはその作業をもともと行った人、_committer_ とはその作業を適用した人のことを指します。あなたがとあるプロジェクトにパッチを送り、コアメンバーのだれかがそのパッチを適用したとしましょう。この場合、両方がクレジットされます (あなたが author、コアメンバーが committer です)。この区別については *第 5 章* でもう少し詳しく説明します。
593
+
594
+ oneline オプションおよび format オプションは、`log` のもうひとつのオプションである `--graph` と組み合わせるとさらに便利です。このオプションは、ちょっといい感じのアスキーグラフでブランチやマージの歴史を表示します。Grit プロジェクトのリポジトリならこのようになります。
595
+
596
+ $ git log --pretty=format:"%h %s" --graph
597
+ * 2d3acf9 ignore errors from SIGCHLD on trap
598
+ * 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
599
+ |\
600
+ | * 420eac9 Added a method for getting the current branch.
601
+ * | 30e367c timeout code and tests
602
+ * | 5a09431 add timeout protection to grit
603
+ * | e1193f8 support for heads with slashes in them
604
+ |/
605
+ * d6016bc require time for xmlschema
606
+ * 11d191e Merge branch 'defunkt' into local
607
+
608
+ これらは `git log` の出力フォーマット指定のほんの一部でしかありません。まだまだオプションはあります。表 2-2 に、今まで取り上げたオプションとそれ以外によく使われるオプション、そしてそれぞれが`log`の出力をどのように変えるのかをまとめました。
609
+
610
+ <!-- Attention to translators: this is a table declaration.
611
+ The lines must be formatted as follows
612
+ <TAB><First column text><TAB><Second column text>
613
+ -->
614
+
615
+ オプション 説明
616
+ -p 各コミットのパッチを表示する
617
+ --word-diff 変更点を単語単位で表示する
618
+ --stat 各コミットで変更されたファイルの統計情報を表示する
619
+ --shortstat --stat コマンドのうち、変更/追加/削除 の行だけを表示する
620
+ --name-only コミット情報の後に変更されたファイルの一覧を表示する
621
+ --name-status 変更されたファイルと 追加/修正/削除 情報を表示する
622
+ --abbrev-commit SHA-1 チェックサムの全体 (40文字) ではなく最初の数文字のみを表示する
623
+ --relative-date 完全な日付フォーマットではなく、相対フォーマット (“2 weeks ago” など) で日付を表示する
624
+ --graph ブランチやマージの歴史を、ログ出力とともにアスキーグラフで表示する
625
+ --pretty コミットを別のフォーマットで表示する。オプションとして oneline, short, full, fuller そして format (独自フォーマットを設定する) を指定可能
626
+ --oneline `--pretty=oneline --abbrev-commit`と同じ意味の便利なオプション
627
+
628
+ ### ログ出力の制限 ###
629
+
630
+ 出力のフォーマット用オプションだけでなく、 `git log` にはログの制限用の便利なオプションもあります。コミットの一部だけを表示するようなオプションのことです。既にひとつだけ紹介していますね。`-2` オプション、これは直近のふたつのコミットだけを表示するものです。実は `-<n>` の `n` には任意の整数値を指定することができ、直近の `n` 件のコミットだけを表示させることができます。ただ、実際のところはこれを使うことはあまりないでしょう。というのも、Git はデフォルトですべての出力をページャにパイプするので、ログを一度に 1 ページだけ見ることになるからです。
631
+
632
+ しかし `--since` や `--until` のような時間制限のオプションは非常に便利です。たとえばこのコマンドは、過去二週間のコミットの一覧を取得します。
633
+
634
+ $ git log --since=2.weeks
635
+
636
+ このコマンドはさまざまな書式で動作します。特定の日を指定する (“2008-01-15”) こともできますし、相対日付を“2 years 1 day 3 minutes ago”のように指定することも可能です。
637
+
638
+ コミット一覧から検索条件にマッチするものだけを取り出すこともできます。`--author` オプションは特定の author のみを抜き出し、`--grep` オプションはコミットメッセージの中のキーワードを検索します (author と grep を両方指定すると、両方にマッチするものだけが対象になります)。
639
+
640
+ grep を複数指定したい場合は、`--all-match` を追加しないといけません。そうしないと、どちらか一方にだけマッチするものも対象になってしまいます。
641
+
642
+ 最後に紹介する `git log` のフィルタリング用オプションは、パスです。ディレクトリ名あるいはファイル名を指定すると、それを変更したコミットのみが対象となります。このオプションは常に最後に指定し、一般にダブルダッシュ (`--`) の後に記述します。このダブルダッシュが他のオプションとパスの区切りとなります。
643
+
644
+ 表 2-3 に、これらのオプションとその他の一般的なオプションをまとめました。
645
+
646
+ <!-- Attention to translators: this is a table declaration.
647
+ The lines must be formatted as follows
648
+ <TAB><First column text><TAB><Second column text>
649
+ -->
650
+
651
+ オプション 説明
652
+ -(n) 直近の n 件のコミットのみを表示する
653
+ --since, --after 指定した日付/時刻以降のCommitDateのコミットのみに制限する
654
+ --until, --before 指定した日付/時刻以前のCommitDateのコミットのみに制限する
655
+ --author エントリが指定した文字列にマッチするコミットのみを表示する
656
+ --committer エントリが指定した文字列にマッチするコミットのみを表示する
657
+
658
+ ### 日時にもとづくログ出力の制限 ###
659
+
660
+ Git のリポジトリ(git://git.kernel.org/pub/scm/git/git.git)からCommitDateを使ってコミットを検索してみましょう。パソコンに設定されたタイムゾーンにおける2014/04/29のコミットを検索するには、以下のコマンドを実行します。
661
+
662
+ $ git log --after="2014-04-29 00:00:00" --before="2014-04-29 23:59:59" \
663
+ --pretty=fuller
664
+
665
+ この場合、コマンドの結果はパソコンのタイムゾーン設定ごとに異なってしまいます。それを避けるには、タイムゾーンを含むISO 8601フォーマットのような日時を `--after` や `--before` の引数に指定するといいでしょう。そうすれば、上述のケースのようにコマンド実行結果が異なる可能性がなくなります。
666
+
667
+ 特定日時(例として、中央ヨーロッパ時間で2013/04/29 17:07:22)を指定してコミットを検索するには、以下のコマンドを使います。
668
+
669
+ $ git log --after="2013-04-29T17:07:22+0200" \
670
+ --before="2013-04-29T17:07:22+0200" --pretty=fuller
671
+
672
+ commit de7c201a10857e5d424dbd8db880a6f24ba250f9
673
+ Author: Ramkumar Ramachandra <artagnon@gmail.com>
674
+ AuthorDate: Mon Apr 29 18:19:37 2013 +0530
675
+ Commit: Junio C Hamano <gitster@pobox.com>
676
+ CommitDate: Mon Apr 29 08:07:22 2013 -0700
677
+
678
+ git-completion.bash: lexical sorting for diff.statGraphWidth
679
+
680
+ df44483a (diff --stat: add config option to limit graph width,
681
+ 2012-03-01) added the option diff.startGraphWidth to the list of
682
+ configuration variables in git-completion.bash, but failed to notice
683
+ that the list is sorted alphabetically. Move it to its rightful place
684
+ in the list.
685
+
686
+ Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
687
+ Signed-off-by: Junio C Hamano <gitster@pobox.com>
688
+
689
+ これらの日時(`AuthorDate` と `CommitDate`)はGitのデフォルトフォーマット(`--date=default` オプション相当)です。作者とコミッター、それぞれのタイムゾーン情報を表示します。
690
+
691
+ 日時フォーマットの指定は他にも `--date=iso` (ISO 8601)、`--date=rfc` (RFC 2822)、`--date=raw` (Unix時間)、`--date=local` (端末のタイムゾーン)、`--date=relative`("2 hours ago"のように相対的な指定)などがあります。
692
+
693
+ また、 `git log` 実行時に日時指定を省略すると、パソコンの時計をもとにコマンド実行日時を指定日時として使用します(協定標準時からの時差も同一になります)。
694
+
695
+ 具体的には、仮にパソコンの時計が09:00を指していて、かつタイムゾーン設定が協定標準時プラス3時間の場合、以下の `git log` コマンドの日時指定は同一として扱われます。
696
+
697
+ $ git log --after=2008-06-01 --before=2008-07-01
698
+ $ git log --after="2008-06-01T09:00:00+0300" \
699
+ --before="2008-07-01T09:00:00+0300"
700
+
701
+ もう一つ例を挙げておきましょう。Git ソースツリーのテストファイルに対する変更があったコミットのうち、Junio Hamano がコミットしたもの (マージは除く) で 2008 年 10 月(ニューヨークのタイムゾーン)に行われたものを知りたければ次のように指定します。
702
+
703
+ $ git log --pretty="%h - %s" --author=gitster \
704
+ --after="2008-10-01T00:00:00-0400" \
705
+ --before="2008-10-31T23:59:59-0400" --no-merges -- t/
706
+ 5610e3b - Fix testcase failure when extended attribute
707
+ acd3b9e - Enhance hold_lock_file_for_{update,append}()
708
+ f563754 - demonstrate breakage of detached checkout wi
709
+ d1a43f2 - reset --hard/read-tree --reset -u: remove un
710
+ 51a94af - Fix "checkout --track -b newbranch" on detac
711
+ b0ad11e - pull: allow "git pull origin $something:$cur
712
+
713
+ 約 36,000 件におよぶ Git ソースコードのコミットの歴史の中で、このコマンドの条件にマッチするのは 6 件となります。
714
+
715
+ ### GUI による歴史の可視化 ###
716
+
717
+ もう少しグラフィカルなツールでコミットの歴史を見たい場合は、Tcl/Tk のプログラムである `gitk` を見てみましょう。これは Git に同梱されています。gitk は、簡単に言うとビジュアルな `git log` ツールです。`git log` で使えるフィルタリングオプションにはほぼすべて対応しています。プロジェクトのコマンドラインで `gitk` と打ち込むと、図 2-2 のような画面があらわれるでしょう。
718
+
719
+ Insert 18333fig0202.png
720
+ 図 2-2. gitk history visualizer
721
+
722
+ ウィンドウの上半分に、コミットの歴史がきれいな家系図とともに表示されます。ウィンドウの下半分には diff ビューアがあり、任意のコミットをクリックしてその変更内容を確認することができます。
723
+
724
+ ## 作業のやり直し ##
725
+
726
+ どんな場面であっても、何かをやり直したくなることはあります。ここでは、行った変更を取り消すための基本的なツールについて説明します。注意点は、ここで扱う内容の中には「やり直しの取り消し」ができないものもあるということです。Git で何か間違えたときに作業内容を失ってしまう数少ない例がここにあります。
727
+
728
+ ### 直近のコミットの変更 ###
729
+
730
+ やり直しを行う場面としてもっともよくあるのは、「コミットを早まりすぎて追加すべきファイルを忘れてしまった」「コミットメッセージが変になってしまった」などです。そのコミットをもう一度やりなおす場合は、`--amend` オプションをつけてもう一度コミットします。
731
+
732
+ $ git commit --amend
733
+
734
+ このコマンドは、ステージングエリアの内容をコミットに使用します。直近のコミット以降に何も変更をしていない場合 (たとえば、コミットの直後にこのコマンドを実行したような場合)、スナップショットの内容はまったく同じでありコミットメッセージを変更することになります。
735
+
736
+ コミットメッセージのエディタが同じように立ち上がりますが、既に前回のコミット時のメッセージが書き込まれた状態になっています。ふだんと同様にメッセージを編集できますが、前回のコミット時のメッセージがその内容で上書きされます。
737
+
738
+ たとえば、いったんコミットした後、何かのファイルをステージするのを忘れていたのに気づいたとしましょう。そんな場合はこのようにします。
739
+
740
+ $ git commit -m '初期コミット'
741
+ $ git add 忘れてたファイル
742
+ $ git commit --amend
743
+
744
+ これら 3 つのコマンドの実行後、最終的にできあがるのはひとつのコミットです。二番目のコミットが、最初のコミットの結果を上書きするのです。
745
+
746
+ ### ステージしたファイルの取り消し ###
747
+
748
+ 続くふたつのセクションでは、ステージングエリアと作業ディレクトリの変更に関する作業を扱います。すばらしいことに、これらふたつの場所の状態を表示するコマンドを使用すると、変更内容を取り消す方法も同時に表示されます。たとえば、ふたつのファイルを変更し、それぞれを別のコミットとするつもりだったのに間違えて `git add *` と打ち込んでしまったときのことを考えましょう。ファイルが両方ともステージされてしまいました。ふたつのうちの一方だけのステージを解除するにはどうすればいいでしょう? `git status` コマンドが教えてくれます。
749
+
750
+ $ git add .
751
+ $ git status
752
+ On branch master
753
+ Changes to be committed:
754
+ (use "git reset HEAD <file>..." to unstage)
755
+
756
+ modified: README.txt
757
+ modified: benchmarks.rb
758
+
759
+
760
+ “Changes to be committed” の直後に、"use `git reset HEAD <file>...` to unstage" と書かれています。では、アドバイスに従って `benchmarks.rb` ファイルのステージを解除してみましょう。
761
+
762
+ $ git reset HEAD benchmarks.rb
763
+ Unstaged changes after reset:
764
+ M benchmarks.rb
765
+ $ git status
766
+ On branch master
767
+ Changes to be committed:
768
+ (use "git reset HEAD <file>..." to unstage)
769
+
770
+ modified: README.txt
771
+
772
+ Changes not staged for commit:
773
+ (use "git add <file>..." to update what will be committed)
774
+ (use "git checkout -- <file>..." to discard changes in working directory)
775
+
776
+ modified: benchmarks.rb
777
+
778
+
779
+ ちょっと奇妙に見えるコマンドですが、きちんと動作します。`benchmarks.rb` ファイルは、変更されたもののステージされていない状態に戻りました。
780
+
781
+ ### ファイルへの変更の取り消し ###
782
+
783
+ `benchmarks.rb` に加えた変更が、実は不要なものだったとしたらどうしますか? 変更を取り消す (直近のコミット時点の状態、あるいは最初にクローンしたり最初に作業ディレクトリに取得したときの状態に戻す) 最も簡単な方法は? 幸いなことに、またもや `git status` がその方法を教えてくれます。先ほどの例の出力結果で、ステージされていないファイル一覧の部分を見てみましょう。
784
+
785
+ Changes not staged for commit:
786
+ (use "git add <file>..." to update what will be committed)
787
+ (use "git checkout -- <file>..." to discard changes in working directory)
788
+
789
+ modified: benchmarks.rb
790
+
791
+
792
+ とても明確に、変更を取り消す方法が書かれています (少なくとも、バージョン 1.6.1 以降の新しい Git ではこのようになります。もし古いバージョンを使用しているのなら、アップグレードしてこのすばらしい機能を活用することをおすすめします)。ではそのとおりにしてみましょう。
793
+
794
+ $ git checkout -- benchmarks.rb
795
+ $ git status
796
+ On branch master
797
+ Changes to be committed:
798
+ (use "git reset HEAD <file>..." to unstage)
799
+
800
+ modified: README.txt
801
+
802
+
803
+ 変更が取り消されたことがわかります。また、これが危険なコマンドであることも知っておかねばなりません。あなたがファイルに加えた変更はすべて消えてしまいます。変更した内容を、別のファイルで上書きしたのと同じことになります。そのファイルが不要であることが確実にわかっているとき以外は、このコマンドを使わないようにしましょう。単にファイルを片付けたいだけなら、次の章で説明する stash やブランチを調べてみましょう。一般にこちらのほうがおすすめの方法です。
804
+
805
+ Git にコミットした内容のすべては、ほぼ常に取り消しが可能であることを覚えておきましょう。削除したブランチへのコミットや `--amend` コミットで上書きされた元のコミットでさえも復旧することができます (データの復元方法については *第 9 章* を参照ください)。しかし、まだコミットしていない内容を失ってしまうと、それは二度と取り戻せません。
806
+
807
+ ## リモートでの作業 ##
808
+
809
+ Git を使ったプロジェクトで共同作業を進めていくには、リモートリポジトリの扱い方を知る必要があります。リモートリポジトリとは、インターネット上あるいはその他ネットワーク上のどこかに存在するプロジェクトのことです。複数のリモートリポジトリを持つこともできますし、それぞれを読み込み専用にしたり読み書き可能にしたりすることもできます。他のメンバーと共同作業を進めていくにあたっては、これらのリモートリポジトリを管理し、必要に応じてデータのプル・プッシュを行うことで作業を分担していくことになります。リモートリポジトリの管理には「リモートリポジトリの追加」「不要になったリモートリポジトリの削除」「リモートブランチの管理や追跡対象/追跡対象外の設定」などさまざまな作業が含まれます。このセクションでは、これらの作業について説明します。
810
+
811
+ ### リモートの表示 ###
812
+
813
+ 今までにどのリモートサーバーを設定したのかを知るには `git remote` コマンドを実行します。これは、今までに設定したリモートハンドルの名前を一覧表示します。リポジトリをクローンしたのなら、少なくとも *origin* という名前が見えるはずです。これは、クローン元のサーバーに対して Git がデフォルトでつける名前です。
814
+
815
+ $ git clone git://github.com/schacon/ticgit.git
816
+ Cloning into 'ticgit'...
817
+ remote: Reusing existing pack: 1857, done.
818
+ remote: Total 1857 (delta 0), reused 0 (delta 0)
819
+ Receiving objects: 100% (1857/1857), 374.35 KiB | 193.00 KiB/s, done.
820
+ Resolving deltas: 100% (772/772), done.
821
+ Checking connectivity... done.
822
+ $ cd ticgit
823
+ $ git remote
824
+ origin
825
+
826
+ `-v` を指定すると、その名前に対応する URL を表示します。
827
+
828
+ $ git remote -v
829
+ origin git://github.com/schacon/ticgit.git (fetch)
830
+ origin git://github.com/schacon/ticgit.git (push)
831
+
832
+ 複数のリモートを設定している場合は、このコマンドはそれをすべて表示します。たとえば、私の Grit リポジトリの場合はこのようになっています。
833
+
834
+ $ cd grit
835
+ $ git remote -v
836
+ bakkdoor git://github.com/bakkdoor/grit.git
837
+ cho45 git://github.com/cho45/grit.git
838
+ defunkt git://github.com/defunkt/grit.git
839
+ koke git://github.com/koke/grit.git
840
+ origin git@github.com:mojombo/grit.git
841
+
842
+ つまり、これらのユーザーによる変更を容易にプルして取り込めるということです。ここで、origin リモートだけが SSH の URL であることに注目しましょう。私がプッシュできるのは origin だけだということになります (なぜそうなるのかについては *第 4 章* で説明します)。
843
+
844
+ ### リモートリポジトリの追加 ###
845
+
846
+ これまでのセクションでも何度かリモートリポジトリの追加を行ってきましたが、ここで改めてその方法をきちんと説明しておきます。新しいリモート Git リポジトリにアクセスしやすいような名前をつけて追加するには、`git remote add [shortname] [url]` を実行します。
847
+
848
+ $ git remote
849
+ origin
850
+ $ git remote add pb git://github.com/paulboone/ticgit.git
851
+ $ git remote -v
852
+ origin git://github.com/schacon/ticgit.git
853
+ pb git://github.com/paulboone/ticgit.git
854
+
855
+ これで、コマンドラインに URL を全部打ち込むかわりに `pb` という文字列を指定するだけでよくなりました。たとえば、Paul が持つ情報の中で自分のリポジトリにまだ存在しないものをすべて取得するには、`git fetch pb` を実行すればよいのです。
856
+
857
+ $ git fetch pb
858
+ remote: Counting objects: 58, done.
859
+ remote: Compressing objects: 100% (41/41), done.
860
+ remote: Total 44 (delta 24), reused 1 (delta 0)
861
+ Unpacking objects: 100% (44/44), done.
862
+ From git://github.com/paulboone/ticgit
863
+ * [new branch] master -> pb/master
864
+ * [new branch] ticgit -> pb/ticgit
865
+
866
+ Paul の master ブランチは、ローカルでは `pb/master` としてアクセスできます。これを自分のブランチにマージしたり、ローカルブランチとしてチェックアウトして中身を調べたりといったことが可能となります。
867
+
868
+ ### リモートからのフェッチ、そしてプル ###
869
+
870
+ ごらんいただいたように、データをリモートリポジトリから取得するには次のコマンドを実行します。
871
+
872
+ $ git fetch [remote-name]
873
+
874
+ このコマンドは、リモートプロジェクトのすべてのデータの中からまだあなたが持っていないものを引き出します。実行後は、リモートにあるすべてのブランチを参照できるようになり、いつでもそれをマージしたり中身を調べたりすることが可能となります (ブランチとは何なのか、どのように使うのかについては、*第 3 章* でより詳しく説明します)。
875
+
876
+ リポジトリをクローンしたときには、リモートリポジトリに対して自動的に *origin* という名前がつけられます。つまり、`git fetch origin` とすると、クローンしたとき (あるいは直近でフェッチを実行したとき) 以降にサーバーにプッシュされた変更をすべて取得することができます。ひとつ注意すべき点は、`fetch` コマンドはデータをローカルリポジトリに引き出すだけだということです。ローカルの環境にマージされたり作業中の内容を書き換えたりすることはありません。したがって、必要に応じて自分でマージをする必要があります。
877
+
878
+ リモートブランチを追跡するためのブランチを作成すれば (次のセクションと *第 3 章* で詳しく説明します)、`git pull` コマンドを使うことができます。これは、自動的にフェッチを行い、リモートブランチの内容を現在のブランチにマージします。おそらくこのほうが、よりお手軽で使いやすいことでしょう。またデフォルトで、`git clone` コマンドはローカルの master ブランチが (取得元サーバー上の) リモートの master ブランチを追跡するよう自動設定します (リモートに master ブランチが存在することを前提としています)。`git pull` を実行すると、通常は最初にクローンしたサーバーからデータを取得し、現在作業中のコードへのマージを試みます。
879
+
880
+ ### リモートへのプッシュ ###
881
+
882
+ あなたのプロジェクトがみんなと共有できる状態に達したら、それを上流にプッシュしなければなりません。そのためのコマンドが `git push [remote-name] [branch-name]` です。master ブランチの内容を `origin` サーバー (何度も言いますが、クローンした時点でこのブランチ名とサーバー名が自動設定されます) にプッシュしたい場合は、このように実行します。
883
+
884
+ $ git push origin master
885
+
886
+ このコマンドが動作するのは、自分が書き込みアクセス権を持つサーバーからクローンし、かつその後だれもそのサーバーにプッシュしていない場合のみです。あなた以外の誰かが同じサーバーからクローンし、誰かが上流にプッシュした後で自分がプッシュしようとすると、それは拒否されます。拒否された場合は、まず誰かがプッシュした作業内容を引き出してきてローカル環境で調整してからでないとプッシュできません。リモートサーバーへのプッシュ方法の詳細については *第 3 章* を参照ください。
887
+
888
+ ### リモートの調査 ###
889
+
890
+ 特定のリモートの情報をより詳しく知りたい場合は `git remote show [remote-name]` コマンドを実行します。たとえば `origin` のように名前を指定すると、このような結果が得られます。
891
+
892
+ $ git remote show origin
893
+ * remote origin
894
+ URL: git://github.com/schacon/ticgit.git
895
+ Remote branch merged with 'git pull' while on branch master
896
+ master
897
+ Tracked remote branches
898
+ master
899
+ ticgit
900
+
901
+ リモートリポジトリの URL と、追跡対象になっているブランチの情報が表示されます。また、ご丁寧にも「master ブランチ上で `git pull` すると、リモートの情報を取得した後で自動的にリモートの master ブランチの内容をマージする」という説明があります。また、引き出してきたすべてのリモート情報も一覧表示されます。
902
+
903
+ Git をもっと使い込むようになると、`git remote show` で得られる情報はどんどん増えていきます。たとえば次のような結果を得ることになるかもしれません。
904
+
905
+ $ git remote show origin
906
+ * remote origin
907
+ URL: git@github.com:defunkt/github.git
908
+ Remote branch merged with 'git pull' while on branch issues
909
+ issues
910
+ Remote branch merged with 'git pull' while on branch master
911
+ master
912
+ New remote branches (next fetch will store in remotes/origin)
913
+ caching
914
+ Stale tracking branches (use 'git remote prune')
915
+ libwalker
916
+ walker2
917
+ Tracked remote branches
918
+ acl
919
+ apiv2
920
+ dashboard2
921
+ issues
922
+ master
923
+ postgres
924
+ Local branch pushed with 'git push'
925
+ master:master
926
+
927
+ このコマンドは、特定のブランチ上で `git push` したときにどのブランチに自動プッシュされるのかを表示しています。また、サーバー上のリモートブランチのうちまだ手元に持っていないもの、手元にあるブランチのうちすでにサーバー上では削除されているもの、`git pull` を実行したときに自動的にマージされるブランチなども表示されています。
928
+
929
+ ### リモートの削除・リネーム ###
930
+
931
+ リモートを参照する名前を変更したい場合、新しいバージョンの Git では `git remote rename` を使うことができます。たとえば `pb` を `paul` に変更したい場合は `git remote rename` をこのように実行します。
932
+
933
+ $ git remote rename pb paul
934
+ $ git remote
935
+ origin
936
+ paul
937
+
938
+ これは、リモートブランチ名も変更することを付け加えておきましょう。これまで `pb/master` として参照していたブランチは、これからは `paul/master` となります。
939
+
940
+ 何らかの理由でリモートの参照を削除したい場合 (サーバーを移動したとか特定のミラーを使わなくなったとか、あるいはプロジェクトからメンバーが抜けたとかいった場合) は `git remote rm` を使用します。
941
+
942
+ $ git remote rm paul
943
+ $ git remote
944
+ origin
945
+
946
+ ## タグ ##
947
+
948
+ 多くの VCS と同様に Git にもタグ機能があり、歴史上の重要なポイントに印をつけることができます。一般に、この機能は (`v 1.0` など) リリースポイントとして使われています。このセクションでは、既存のタグ一覧の取得や新しいタグの作成、さまざまなタグの形式などについて扱います。
949
+
950
+ ### タグの一覧表示 ###
951
+
952
+ Git で既存のタグの一覧を表示するのは簡単で、単に `git tag` と打ち込むだけです。
953
+
954
+ $ git tag
955
+ v0.1
956
+ v1.3
957
+
958
+ このコマンドは、タグをアルファベット順に表示します。この表示順に深い意味はありません。
959
+
960
+ パターンを指定してタグを検索することもできます。Git のソースリポジトリを例にとると、240 以上のタグが登録されています。その中で 1.4.2 系のタグのみを見たい場合は、このようにします。
961
+
962
+ $ git tag -l 'v1.4.2.*'
963
+ v1.4.2.1
964
+ v1.4.2.2
965
+ v1.4.2.3
966
+ v1.4.2.4
967
+
968
+ ### タグの作成 ###
969
+
970
+ Git のタグには、軽量 (lightweight) 版と注釈付き (annotated) 版の二通りがあります。軽量版のタグは、変更のないブランチのようなものです。特定のコミットに対する単なるポインタでしかありません。しかし注釈付きのタグは、Git データベース内に完全なオブジェクトとして格納されます。チェックサムが付き、タグを作成した人の名前・メールアドレス・作成日時・タグ付け時のメッセージなども含まれます。また、署名をつけて GNU Privacy Guard (GPG) で検証することもできます。一般的には、これらの情報を含められる注釈付きのタグを使うことをおすすめします。しかし、一時的に使うだけのタグである場合や何らかの理由で情報を含めたくない場合は、軽量版のタグも使用可能です。
971
+
972
+ ### 注釈付きのタグ ###
973
+
974
+ Git では、注釈付きのタグをシンプルな方法で作成できます。もっとも簡単な方法は、`tag` コマンドの実行時に `-a` を指定することです。
975
+
976
+ $ git tag -a v1.4 -m 'my version 1.4'
977
+ $ git tag
978
+ v0.1
979
+ v1.3
980
+ v1.4
981
+
982
+ `-m` で、タグ付け時のメッセージを指定します。これはタグとともに格納されます。注釈付きタグの作成時にメッセージを省略すると、エディタが立ち上がるのでそこでメッセージを記入します。
983
+
984
+ タグのデータとそれに関連づけられたコミットを見るには `git show` コマンドを使用します。
985
+
986
+ $ git show v1.4
987
+ tag v1.4
988
+ Tagger: Scott Chacon <schacon@gee-mail.com>
989
+ Date: Mon Feb 9 14:45:11 2009 -0800
990
+
991
+ my version 1.4
992
+
993
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
994
+ Merge: 4a447f7... a6b4c97...
995
+ Author: Scott Chacon <schacon@gee-mail.com>
996
+ Date: Sun Feb 8 19:02:46 2009 -0800
997
+
998
+ Merge branch 'experiment'
999
+
1000
+ タグ付けした人の情報とその日時、そして注釈メッセージを表示したあとにコミットの情報が続きます。
1001
+
1002
+ ### 署名付きのタグ ###
1003
+
1004
+ GPG 秘密鍵を持っていれば、タグに署名をすることができます。その場合は `-a` の代わりに `-s` を指定すればいいだけです。
1005
+
1006
+ $ git tag -s v1.5 -m 'my signed 1.5 tag'
1007
+ You need a passphrase to unlock the secret key for
1008
+ user: "Scott Chacon <schacon@gee-mail.com>"
1009
+ 1024-bit DSA key, ID F721C45A, created 2009-02-09
1010
+
1011
+ このタグに対して `git show` を実行すると、あなたの GPG 署名が表示されます。
1012
+
1013
+ $ git show v1.5
1014
+ tag v1.5
1015
+ Tagger: Scott Chacon <schacon@gee-mail.com>
1016
+ Date: Mon Feb 9 15:22:20 2009 -0800
1017
+
1018
+ my signed 1.5 tag
1019
+ -----BEGIN PGP SIGNATURE-----
1020
+ Version: GnuPG v1.4.8 (Darwin)
1021
+
1022
+ iEYEABECAAYFAkmQurIACgkQON3DxfchxFr5cACeIMN+ZxLKggJQf0QYiQBwgySN
1023
+ Ki0An2JeAVUCAiJ7Ox6ZEtK+NvZAj82/
1024
+ =WryJ
1025
+ -----END PGP SIGNATURE-----
1026
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
1027
+ Merge: 4a447f7... a6b4c97...
1028
+ Author: Scott Chacon <schacon@gee-mail.com>
1029
+ Date: Sun Feb 8 19:02:46 2009 -0800
1030
+
1031
+ Merge branch 'experiment'
1032
+
1033
+ タグの署名を検証する方法については後ほど説明します。
1034
+
1035
+ ### 軽量版のタグ ###
1036
+
1037
+ コミットにタグをつけるもうひとつの方法が、軽量版のタグです。これは基本的に、コミットのチェックサムだけを保持するもので、それ以外の情報は含まれません。軽量版のタグを作成するには `-a`、`-s` あるいは `-m` といったオプションをつけずにコマンドを実行します。
1038
+
1039
+ $ git tag v1.4-lw
1040
+ $ git tag
1041
+ v0.1
1042
+ v1.3
1043
+ v1.4
1044
+ v1.4-lw
1045
+ v1.5
1046
+
1047
+ このタグに対して `git show` を実行しても、先ほどのような追加情報は表示されません。単に、対応するコミットの情報を表示するだけです。
1048
+
1049
+ $ git show v1.4-lw
1050
+ commit 15027957951b64cf874c3557a0f3547bd83b3ff6
1051
+ Merge: 4a447f7... a6b4c97...
1052
+ Author: Scott Chacon <schacon@gee-mail.com>
1053
+ Date: Sun Feb 8 19:02:46 2009 -0800
1054
+
1055
+ Merge branch 'experiment'
1056
+
1057
+ ### タグの検証 ###
1058
+
1059
+ 署名付きのタグを検証するには `git tag -v [tag-name]` を使用します。このコマンドは、GPG を使って署名を検証します。これを正しく実行するには、署名者の公開鍵があなたの鍵リングに含まれている必要があります。
1060
+
1061
+ $ git tag -v v1.4.2.1
1062
+ object 883653babd8ee7ea23e6a5c392bb739348b1eb61
1063
+ type commit
1064
+ tag v1.4.2.1
1065
+ tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700
1066
+
1067
+ GIT 1.4.2.1
1068
+
1069
+ Minor fixes since 1.4.2, including git-mv and git-http with alternates.
1070
+ gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
1071
+ gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
1072
+ gpg: aka "[jpeg image of size 1513]"
1073
+ Primary key fingerprint: 3565 2A26 2040 E066 C9A7 4A7D C0C6 D9A4 F311 9B9A
1074
+
1075
+ 署名者の公開鍵を持っていない場合は、このようなメッセージが表示されます。
1076
+
1077
+ gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
1078
+ gpg: Can't check signature: public key not found
1079
+ error: could not verify the tag 'v1.4.2.1'
1080
+
1081
+ ### 後からのタグ付け ###
1082
+
1083
+ 過去にさかのぼってコミットにタグ付けすることもできます。仮にあなたのコミットの歴史が次のようなものであったとしましょう。
1084
+
1085
+ $ git log --pretty=oneline
1086
+ 15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
1087
+ a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
1088
+ 0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
1089
+ 6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
1090
+ 0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
1091
+ 4682c3261057305bdd616e23b64b0857d832627b added a todo file
1092
+ 166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
1093
+ 9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
1094
+ 964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
1095
+ 8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
1096
+
1097
+ 今になって、このプロジェクトに `v1.2` のタグをつけるのを忘れていたことに気づきました。本来なら "updated rakefile" のコミットにつけておくべきだったものです。しかし今からでも遅くありません。特定のコミットにタグをつけるには、そのコミットのチェックサム (あるいはその一部) をコマンドの最後に指定します。
1098
+
1099
+ $ git tag -a v1.2 -m 'version 1.2' 9fceb02
1100
+
1101
+ これで、そのコミットにタグがつけられたことが確認できます。
1102
+
1103
+ $ git tag
1104
+ v0.1
1105
+ v1.2
1106
+ v1.3
1107
+ v1.4
1108
+ v1.4-lw
1109
+ v1.5
1110
+
1111
+ $ git show v1.2
1112
+ tag v1.2
1113
+ Tagger: Scott Chacon <schacon@gee-mail.com>
1114
+ Date: Mon Feb 9 15:32:16 2009 -0800
1115
+
1116
+ version 1.2
1117
+ commit 9fceb02d0ae598e95dc970b74767f19372d61af8
1118
+ Author: Magnus Chacon <mchacon@gee-mail.com>
1119
+ Date: Sun Apr 27 20:43:35 2008 -0700
1120
+
1121
+ updated rakefile
1122
+ ...
1123
+
1124
+ ### タグの共有 ###
1125
+
1126
+ デフォルトでは、`git push` コマンドはタグ情報をリモートに送りません。タグを作ったら、タグをリモートサーバーにプッシュするよう明示する必要があります。その方法は、リモートブランチを共有するときと似ています。`git push origin [tagname]` を実行するのです。
1127
+
1128
+ $ git push origin v1.5
1129
+ Counting objects: 50, done.
1130
+ Compressing objects: 100% (38/38), done.
1131
+ Writing objects: 100% (44/44), 4.56 KiB, done.
1132
+ Total 44 (delta 18), reused 8 (delta 1)
1133
+ To git@github.com:schacon/simplegit.git
1134
+ * [new tag] v1.5 -> v1.5
1135
+
1136
+ 多くのタグを一度にプッシュしたい場合は、`git push` コマンドのオプション `--tags` を使用します。これは、手元にあるタグのうちまだリモートサーバーに存在しないものをすべて転送します。
1137
+
1138
+ $ git push origin --tags
1139
+ Counting objects: 50, done.
1140
+ Compressing objects: 100% (38/38), done.
1141
+ Writing objects: 100% (44/44), 4.56 KiB, done.
1142
+ Total 44 (delta 18), reused 8 (delta 1)
1143
+ To git@github.com:schacon/simplegit.git
1144
+ * [new tag] v0.1 -> v0.1
1145
+ * [new tag] v1.2 -> v1.2
1146
+ * [new tag] v1.4 -> v1.4
1147
+ * [new tag] v1.4-lw -> v1.4-lw
1148
+ * [new tag] v1.5 -> v1.5
1149
+
1150
+ これで、誰か他の人がリポジトリのクローンやプルを行ったときにすべてのタグを取得できるようになりました。
1151
+
1152
+ ## ヒントと裏技 ##
1153
+
1154
+ Git の基本を説明した本章を終える前に、ほんの少しだけヒントと裏技を披露しましょう。これを知っておけば、Git をよりシンプルかつお手軽に使えるようになり、Git になじみやすくなることでしょう。ほとんどの人はこれらのことを知らずに Git を使っています。別にどうでもいいことですし本書の後半でこれらの技を使うわけでもないのですが、その方法ぐらいは知っておいたほうがよいでしょう。
1155
+
1156
+ ### 自動補完 ###
1157
+
1158
+ Bash シェルを使っているのなら、Git にはよくできた自動補完スクリプトが付属しています。Git のソースコードをダウンロードし、`contrib/completion` ディレクトリを見てみましょう。`git-completion.bash` というファイルがあるはずです。このファイルをホームディレクトリにコピーし、それを `.bashrc` ファイルに追加しましょう。
1159
+
1160
+ source ~/.git-completion.bash
1161
+
1162
+ すべてのユーザーに対して Git 用の Bash シェル補完を使わせたい場合は、Mac なら `/opt/local/etc/bash_completion.d` ディレクトリ、Linux 系なら `/etc/bash_completion.d/` ディレクトリにこのスクリプトをコピーします。Bash は、これらのディレクトリにあるスクリプトを自動的に読み込んでシェル補完を行います。
1163
+
1164
+ Windows で Git Bash を使用している人は、msysGit で Windows 版 Git をインストールした際にデフォルトでこの機能が有効になっています。
1165
+
1166
+ Git コマンドの入力中にタブキーを押せば、補完候補があらわれて選択できるようになります。
1167
+
1168
+ $ git co<tab><tab>
1169
+ commit config
1170
+
1171
+ ここでは、`git co` と打ち込んだ後にタブキーを二度押してみました。すると commit と config という候補があらわれました。さらに `m<tab>` と入力すると、自動的に `git commit` と補完されます。
1172
+
1173
+ これは、コマンドのオプションに対しても機能します。おそらくこっちのほうがより有用でしょう。たとえば、`git log` を実行しようとしてそのオプションを思い出せなかった場合、タブキーを押せばどんなオプションを使えるのかがわかります。
1174
+
1175
+ $ git log --s<tab>
1176
+ --shortstat --since= --src-prefix= --stat --summary
1177
+
1178
+ この裏技を使えば、ドキュメントを調べる時間を節約できることでしょう。
1179
+
1180
+ ### Git エイリアス ###
1181
+
1182
+ Git は、コマンドの一部だけが入力された状態でそのコマンドを推測することはありません。Git の各コマンドをいちいち全部入力するのがいやなら、`git config` でコマンドのエイリアスを設定することができます。たとえばこんなふうに設定すると便利かもしれません。
1183
+
1184
+ $ git config --global alias.co checkout
1185
+ $ git config --global alias.br branch
1186
+ $ git config --global alias.ci commit
1187
+ $ git config --global alias.st status
1188
+
1189
+ こうすると、たとえば `git commit` と同じことが単に `git ci` と入力するだけでできるようになります。Git を使い続けるにつれて、よく使うコマンドがさらに増えてくることでしょう。そんな場合は、きにせずどんどん新しいエイリアスを作りましょう。
1190
+
1191
+ このテクニックは、「こんなことできたらいいな」というコマンドを作る際にも便利です。たとえば、ステージを解除するときにどうしたらいいかいつも迷うという人なら、こんなふうに自分で unstage エイリアスを追加してしまえばいいのです。
1192
+
1193
+ $ git config --global alias.unstage 'reset HEAD --'
1194
+
1195
+ こうすれば、次のふたつのコマンドが同じ意味となります。
1196
+
1197
+ $ git unstage fileA
1198
+ $ git reset HEAD fileA
1199
+
1200
+ 少しはわかりやすくなりましたね。あるいは、こんなふうに `last` コマンドを追加することもできます。
1201
+
1202
+ $ git config --global alias.last 'log -1 HEAD'
1203
+
1204
+ こうすれば、直近のコミットの情報を見ることができます。
1205
+
1206
+ $ git last
1207
+ commit 66938dae3329c7aebe598c2246a8e6af90d04646
1208
+ Author: Josh Goebel <dreamer3@example.com>
1209
+ Date: Tue Aug 26 19:48:51 2008 +0800
1210
+
1211
+ test for current head
1212
+
1213
+ Signed-off-by: Scott Chacon <schacon@example.com>
1214
+
1215
+ Git が単に新しいコマンドをエイリアスで置き換えていることがわかります。しかし、時には Git のサブコマンドではなく外部コマンドを実行したくなることもあるでしょう。そんな場合は、コマンドの先頭に `!` をつけます。これは、Git リポジトリ上で動作する自作のツールを書くときに便利です。例として、`git visual` で `gitk` が起動するようにしてみましょう。
1216
+
1217
+ $ git config --global alias.visual '!gitk'
1218
+
1219
+ ## まとめ ##
1220
+
1221
+ これで、ローカルでの Git の基本的な操作がこなせるようになりました。リポジトリの作成やクローン、リポジトリへの変更・ステージ・コミット、リポジトリのこれまでの変更履歴の閲覧などです。次は、Git の強力な機能であるブランチモデルについて説明しましょう。