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.
- checksums.yaml +4 -4
- data/Gemfile +3 -2
- data/README.md +67 -42
- data/Rakefile +22 -2
- data/commonmarker.gemspec +13 -9
- data/ext/commonmarker/cmark/api_test/main.c +35 -0
- data/ext/commonmarker/cmark/build/CMakeFiles/CMakeError.log +12 -12
- data/ext/commonmarker/cmark/build/CMakeFiles/CMakeOutput.log +141 -141
- data/ext/commonmarker/cmark/build/api_test/CMakeFiles/api_test.dir/main.c.o +0 -0
- data/ext/commonmarker/cmark/build/api_test/api_test +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/houdini_html_u.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/cmark.dir/iterator.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/houdini_html_u.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark.dir/iterator.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/houdini_html_u.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/CMakeFiles/libcmark_static.dir/iterator.c.o +0 -0
- data/ext/commonmarker/cmark/build/src/cmark +0 -0
- data/ext/commonmarker/cmark/build/src/libcmark.0.19.0.dylib +0 -0
- data/ext/commonmarker/cmark/build/src/libcmark.a +0 -0
- data/ext/commonmarker/cmark/build/src/libcmark.dylib +0 -0
- data/ext/commonmarker/cmark/src/houdini_html_u.c +26 -13
- data/ext/commonmarker/cmark/src/iterator.c +2 -2
- data/ext/commonmarker/cmark/test/__pycache__/cmark.cpython-34.pyc +0 -0
- data/ext/commonmarker/cmark/test/__pycache__/normalize.cpython-34.pyc +0 -0
- data/ext/commonmarker/cmark/test/cmark.pyc +0 -0
- data/ext/commonmarker/cmark/test/normalize.pyc +0 -0
- data/ext/commonmarker/commonmarker.c +276 -3
- data/ext/commonmarker/extconf.rb +3 -1
- data/lib/commonmarker.rb +70 -360
- data/lib/commonmarker/config.rb +1 -1
- data/lib/commonmarker/renderer.rb +91 -0
- data/lib/commonmarker/renderer/html_renderer.rb +149 -0
- data/lib/commonmarker/version.rb +1 -1
- data/test/benchinput.md +148414 -0
- data/test/benchmark.rb +13 -9
- data/test/progit/Gemfile +5 -0
- data/test/progit/README.md +9 -0
- data/test/progit/README.original.md +70 -0
- data/test/progit/Rakefile +285 -0
- data/test/progit/ar/01-introduction/01-chapter1.markdown +264 -0
- data/test/progit/ar/02-git-basics/01-chapter2.markdown +1124 -0
- data/test/progit/ar/NOTES +18 -0
- data/test/progit/ar/README +14 -0
- data/test/progit/az/01-introduction/01-chapter1.markdown +257 -0
- data/test/progit/az/02-git-basics/01-chapter2.markdown +1127 -0
- data/test/progit/az/03-git-branching/01-chapter3.markdown +598 -0
- data/test/progit/az/04-git-server/01-chapter4.markdown +861 -0
- data/test/progit/az/05-distributed-git/01-chapter5.markdown +897 -0
- data/test/progit/az/06-git-tools/01-chapter6.markdown +1126 -0
- data/test/progit/az/07-customizing-git/01-chapter7.markdown +937 -0
- data/test/progit/az/08-git-and-other-scms/01-chapter8.markdown +690 -0
- data/test/progit/az/09-git-internals/01-chapter9.markdown +977 -0
- data/test/progit/be/01-introduction/01-chapter1.markdown +257 -0
- data/test/progit/be/02-git-basics/01-chapter2.markdown +1126 -0
- data/test/progit/ca/01-introduction/01-chapter1.markdown +257 -0
- data/test/progit/ca/README.txt +1 -0
- data/test/progit/couchapp/Makefile +41 -0
- data/test/progit/couchapp/Readme.md +17 -0
- data/test/progit/couchapp/_id +1 -0
- data/test/progit/couchapp/shows/chapter.js +14 -0
- data/test/progit/couchapp/templates/foot.html +7 -0
- data/test/progit/couchapp/templates/head.html +51 -0
- data/test/progit/couchapp/vendor/markdown/showdown.js +420 -0
- data/test/progit/couchapp/vendor/mustache.js/mustache.js +302 -0
- data/test/progit/cs/01-introduction/01-chapter1.markdown +259 -0
- data/test/progit/cs/02-git-basics/01-chapter2.markdown +1225 -0
- data/test/progit/cs/03-git-branching/01-chapter3.markdown +606 -0
- data/test/progit/cs/04-git-server/01-chapter4.markdown +871 -0
- data/test/progit/cs/05-distributed-git/01-chapter5.markdown +914 -0
- data/test/progit/cs/06-git-tools/01-chapter6.markdown +1167 -0
- data/test/progit/cs/07-customizing-git/01-chapter7.markdown +940 -0
- data/test/progit/cs/08-git-and-other-scms/01-chapter8.markdown +700 -0
- data/test/progit/cs/09-git-internals/01-chapter9.markdown +1014 -0
- data/test/progit/de/01-introduction/01-chapter1.markdown +445 -0
- data/test/progit/de/02-git-basics/01-chapter2.markdown +1589 -0
- data/test/progit/de/03-git-branching/01-chapter3.markdown +964 -0
- data/test/progit/de/04-git-server/01-chapter4.markdown +1337 -0
- data/test/progit/de/05-distributed-git/01-chapter5.markdown +1329 -0
- data/test/progit/de/06-git-tools/01-chapter6.markdown +1502 -0
- data/test/progit/de/07-customizing-git/01-chapter7.markdown +1361 -0
- data/test/progit/de/08-git-and-other-scms/01-chapter8.markdown +919 -0
- data/test/progit/de/09-git-internals/01-chapter9.markdown +1361 -0
- data/test/progit/de/README.md +626 -0
- data/test/progit/ebooks/cover.png +0 -0
- data/test/progit/en/01-introduction/01-chapter1.markdown +263 -0
- data/test/progit/en/02-git-basics/01-chapter2.markdown +1228 -0
- data/test/progit/en/03-git-branching/01-chapter3.markdown +606 -0
- data/test/progit/en/04-git-server/01-chapter4.markdown +871 -0
- data/test/progit/en/05-distributed-git/01-chapter5.markdown +914 -0
- data/test/progit/en/06-git-tools/01-chapter6.markdown +1150 -0
- data/test/progit/en/07-customizing-git/01-chapter7.markdown +940 -0
- data/test/progit/en/08-git-and-other-scms/01-chapter8.markdown +700 -0
- data/test/progit/en/09-git-internals/01-chapter9.markdown +983 -0
- data/test/progit/eo/01-introduction/01-chapter1.markdown +257 -0
- data/test/progit/eo/02-git-basics/01-chapter2.markdown +1171 -0
- data/test/progit/epub/ProGit.css +28 -0
- data/test/progit/epub/title.png +0 -0
- data/test/progit/es-ni/01-introduction/01-chapter1.markdown +257 -0
- data/test/progit/es-ni/02-git-basics/01-chapter2.markdown +1127 -0
- data/test/progit/es/01-introduction/01-chapter1.markdown +262 -0
- data/test/progit/es/02-git-basics/01-chapter2.markdown +1165 -0
- data/test/progit/es/03-git-branching/01-chapter3.markdown +598 -0
- data/test/progit/es/04-git-server/01-chapter4.markdown +707 -0
- data/test/progit/es/05-distributed-git/01-chapter5.markdown +890 -0
- data/test/progit/es/06-git-tools/01-chapter6.markdown +1113 -0
- data/test/progit/es/07-customizing-git/01-chapter7.markdown +875 -0
- data/test/progit/es/08-git-and-other-scms/01-chapter8.markdown +686 -0
- data/test/progit/es/09-git-internals/01-chapter9.markdown +976 -0
- data/test/progit/es/NOTES +29 -0
- data/test/progit/es/README +3 -0
- data/test/progit/es/glosario-Benzirpi.txt +27 -0
- data/test/progit/es/omegat-Benzirpi.tmx +29075 -0
- data/test/progit/fa/01-introduction/01-chapter1.markdown +262 -0
- data/test/progit/fa/03-git-branching/01-chapter3.markdown +608 -0
- data/test/progit/fa/04-git-server/01-chapter4.markdown +872 -0
- data/test/progit/fa/NOTES.en-fa.md +143 -0
- data/test/progit/fa/README.md +7 -0
- data/test/progit/fi/01-introduction/01-chapter1.markdown +259 -0
- data/test/progit/fi/02-git-basics/01-chapter2.markdown +1171 -0
- data/test/progit/fi/NOTES +5 -0
- data/test/progit/figures-dia/fig0101.dia +617 -0
- data/test/progit/figures-dia/fig0102.dia +921 -0
- data/test/progit/figures-dia/fig0103.dia +1468 -0
- data/test/progit/figures-dia/fig0104.dia +1432 -0
- data/test/progit/figures-dia/fig0105.dia +1924 -0
- data/test/progit/figures-dia/fig0106.dia +562 -0
- data/test/progit/figures-dia/fig0201.dia +774 -0
- data/test/progit/figures-dia/fig0301.dia +2006 -0
- data/test/progit/figures-dia/fig0302.dia +2148 -0
- data/test/progit/figures-dia/fig0303.dia +719 -0
- data/test/progit/figures-dia/fig0304.dia +525 -0
- data/test/progit/figures-dia/fig0305.dia +622 -0
- data/test/progit/figures-dia/fig0306.dia +622 -0
- data/test/progit/figures-dia/fig0307.dia +719 -0
- data/test/progit/figures-dia/fig0308.dia +734 -0
- data/test/progit/figures-dia/fig0309.dia +831 -0
- data/test/progit/figures-dia/fig0310.dia +412 -0
- data/test/progit/figures-dia/fig0311.dia +493 -0
- data/test/progit/figures-dia/fig0312.dia +596 -0
- data/test/progit/figures-dia/fig0313.dia +774 -0
- data/test/progit/figures-dia/fig0314.dia +846 -0
- data/test/progit/figures-dia/fig0315.dia +787 -0
- data/test/progit/figures-dia/fig0316.dia +1078 -0
- data/test/progit/figures-dia/fig0317.dia +881 -0
- data/test/progit/figures-dia/fig0318.dia +968 -0
- data/test/progit/figures-dia/fig0319.dia +957 -0
- data/test/progit/figures-dia/fig0320.dia +1637 -0
- data/test/progit/figures-dia/fig0321.dia +1494 -0
- data/test/progit/figures-dia/fig0322.dia +1142 -0
- data/test/progit/figures-dia/fig0323.dia +1377 -0
- data/test/progit/figures-dia/fig0324.dia +1603 -0
- data/test/progit/figures-dia/fig0325.dia +2003 -0
- data/test/progit/figures-dia/fig0326.dia +2013 -0
- data/test/progit/figures-dia/fig0327.dia +687 -0
- data/test/progit/figures-dia/fig0328.dia +814 -0
- data/test/progit/figures-dia/fig0329.dia +793 -0
- data/test/progit/figures-dia/fig0330.dia +693 -0
- data/test/progit/figures-dia/fig0331.dia +1159 -0
- data/test/progit/figures-dia/fig0332.dia +1362 -0
- data/test/progit/figures-dia/fig0333.dia +1165 -0
- data/test/progit/figures-dia/fig0334.dia +1450 -0
- data/test/progit/figures-dia/fig0335.dia +994 -0
- data/test/progit/figures-dia/fig0336.dia +786 -0
- data/test/progit/figures-dia/fig0337.dia +1546 -0
- data/test/progit/figures-dia/fig0338.dia +1755 -0
- data/test/progit/figures-dia/fig0339.dia +1882 -0
- data/test/progit/figures-dia/fig0501.dia +456 -0
- data/test/progit/figures-dia/fig0502.dia +956 -0
- data/test/progit/figures-dia/fig0503.dia +915 -0
- data/test/progit/figures-dia/fig0504.dia +620 -0
- data/test/progit/figures-dia/fig0505.dia +744 -0
- data/test/progit/figures-dia/fig0506.dia +747 -0
- data/test/progit/figures-dia/fig0507.dia +895 -0
- data/test/progit/figures-dia/fig0508.dia +1122 -0
- data/test/progit/figures-dia/fig0509.dia +1243 -0
- data/test/progit/figures-dia/fig0510.dia +1240 -0
- data/test/progit/figures-dia/fig0511.dia +1201 -0
- data/test/progit/figures-dia/fig0512.dia +801 -0
- data/test/progit/figures-dia/fig0513.dia +1387 -0
- data/test/progit/figures-dia/fig0514.dia +1568 -0
- data/test/progit/figures-dia/fig0515.dia +1721 -0
- data/test/progit/figures-dia/fig0516.dia +997 -0
- data/test/progit/figures-dia/fig0517.dia +994 -0
- data/test/progit/figures-dia/fig0518.dia +1145 -0
- data/test/progit/figures-dia/fig0519.dia +992 -0
- data/test/progit/figures-dia/fig0520.dia +1240 -0
- data/test/progit/figures-dia/fig0521.dia +801 -0
- data/test/progit/figures-dia/fig0522.dia +922 -0
- data/test/progit/figures-dia/fig0523.dia +922 -0
- data/test/progit/figures-dia/fig0524.dia +1828 -0
- data/test/progit/figures-dia/fig0525.dia +2685 -0
- data/test/progit/figures-dia/fig0526.dia +717 -0
- data/test/progit/figures-dia/fig0527.dia +856 -0
- data/test/progit/figures-dia/fig0601.dia +790 -0
- data/test/progit/figures-dia/fig0702.dia +795 -0
- data/test/progit/figures-dia/fig0703.dia +795 -0
- data/test/progit/figures-dia/fig0901.dia +669 -0
- data/test/progit/figures-dia/fig0902.dia +834 -0
- data/test/progit/figures-dia/fig0903.dia +1483 -0
- data/test/progit/figures-dia/fig0904.dia +1728 -0
- data/test/progit/figures-dia/makeimages +25 -0
- data/test/progit/figures-source/progit.graffle +123108 -0
- data/test/progit/figures/18333fig0101-tn.png +0 -0
- data/test/progit/figures/18333fig0102-tn.png +0 -0
- data/test/progit/figures/18333fig0103-tn.png +0 -0
- data/test/progit/figures/18333fig0104-tn.png +0 -0
- data/test/progit/figures/18333fig0105-tn.png +0 -0
- data/test/progit/figures/18333fig0106-tn.png +0 -0
- data/test/progit/figures/18333fig0107-tn.png +0 -0
- data/test/progit/figures/18333fig0201-tn.png +0 -0
- data/test/progit/figures/18333fig0202-tn.png +0 -0
- data/test/progit/figures/18333fig0301-tn.png +0 -0
- data/test/progit/figures/18333fig0302-tn.png +0 -0
- data/test/progit/figures/18333fig0303-tn.png +0 -0
- data/test/progit/figures/18333fig0304-tn.png +0 -0
- data/test/progit/figures/18333fig0305-tn.png +0 -0
- data/test/progit/figures/18333fig0306-tn.png +0 -0
- data/test/progit/figures/18333fig0307-tn.png +0 -0
- data/test/progit/figures/18333fig0308-tn.png +0 -0
- data/test/progit/figures/18333fig0309-tn.png +0 -0
- data/test/progit/figures/18333fig0310-tn.png +0 -0
- data/test/progit/figures/18333fig0311-tn.png +0 -0
- data/test/progit/figures/18333fig0312-tn.png +0 -0
- data/test/progit/figures/18333fig0313-tn.png +0 -0
- data/test/progit/figures/18333fig0314-tn.png +0 -0
- data/test/progit/figures/18333fig0315-tn.png +0 -0
- data/test/progit/figures/18333fig0316-tn.png +0 -0
- data/test/progit/figures/18333fig0317-tn.png +0 -0
- data/test/progit/figures/18333fig0318-tn.png +0 -0
- data/test/progit/figures/18333fig0319-tn.png +0 -0
- data/test/progit/figures/18333fig0320-tn.png +0 -0
- data/test/progit/figures/18333fig0321-tn.png +0 -0
- data/test/progit/figures/18333fig0322-tn.png +0 -0
- data/test/progit/figures/18333fig0323-tn.png +0 -0
- data/test/progit/figures/18333fig0324-tn.png +0 -0
- data/test/progit/figures/18333fig0325-tn.png +0 -0
- data/test/progit/figures/18333fig0326-tn.png +0 -0
- data/test/progit/figures/18333fig0327-tn.png +0 -0
- data/test/progit/figures/18333fig0328-tn.png +0 -0
- data/test/progit/figures/18333fig0329-tn.png +0 -0
- data/test/progit/figures/18333fig0330-tn.png +0 -0
- data/test/progit/figures/18333fig0331-tn.png +0 -0
- data/test/progit/figures/18333fig0332-tn.png +0 -0
- data/test/progit/figures/18333fig0333-tn.png +0 -0
- data/test/progit/figures/18333fig0334-tn.png +0 -0
- data/test/progit/figures/18333fig0335-tn.png +0 -0
- data/test/progit/figures/18333fig0336-tn.png +0 -0
- data/test/progit/figures/18333fig0337-tn.png +0 -0
- data/test/progit/figures/18333fig0338-tn.png +0 -0
- data/test/progit/figures/18333fig0339-tn.png +0 -0
- data/test/progit/figures/18333fig0401-tn.png +0 -0
- data/test/progit/figures/18333fig0402-tn.png +0 -0
- data/test/progit/figures/18333fig0403-tn.png +0 -0
- data/test/progit/figures/18333fig0404-tn.png +0 -0
- data/test/progit/figures/18333fig0405-tn.png +0 -0
- data/test/progit/figures/18333fig0406-tn.png +0 -0
- data/test/progit/figures/18333fig0407-tn.png +0 -0
- data/test/progit/figures/18333fig0408-tn.png +0 -0
- data/test/progit/figures/18333fig0409-tn.png +0 -0
- data/test/progit/figures/18333fig0410-tn.png +0 -0
- data/test/progit/figures/18333fig0411-tn.png +0 -0
- data/test/progit/figures/18333fig0412-tn.png +0 -0
- data/test/progit/figures/18333fig0413-tn.png +0 -0
- data/test/progit/figures/18333fig0414-tn.png +0 -0
- data/test/progit/figures/18333fig0415-tn.png +0 -0
- data/test/progit/figures/18333fig0501-tn.png +0 -0
- data/test/progit/figures/18333fig0502-tn.png +0 -0
- data/test/progit/figures/18333fig0503-tn.png +0 -0
- data/test/progit/figures/18333fig0504-tn.png +0 -0
- data/test/progit/figures/18333fig0505-tn.png +0 -0
- data/test/progit/figures/18333fig0506-tn.png +0 -0
- data/test/progit/figures/18333fig0507-tn.png +0 -0
- data/test/progit/figures/18333fig0508-tn.png +0 -0
- data/test/progit/figures/18333fig0509-tn.png +0 -0
- data/test/progit/figures/18333fig0510-tn.png +0 -0
- data/test/progit/figures/18333fig0511-tn.png +0 -0
- data/test/progit/figures/18333fig0512-tn.png +0 -0
- data/test/progit/figures/18333fig0513-tn.png +0 -0
- data/test/progit/figures/18333fig0514-tn.png +0 -0
- data/test/progit/figures/18333fig0515-tn.png +0 -0
- data/test/progit/figures/18333fig0516-tn.png +0 -0
- data/test/progit/figures/18333fig0517-tn.png +0 -0
- data/test/progit/figures/18333fig0518-tn.png +0 -0
- data/test/progit/figures/18333fig0519-tn.png +0 -0
- data/test/progit/figures/18333fig0520-tn.png +0 -0
- data/test/progit/figures/18333fig0521-tn.png +0 -0
- data/test/progit/figures/18333fig0522-tn.png +0 -0
- data/test/progit/figures/18333fig0523-tn.png +0 -0
- data/test/progit/figures/18333fig0524-tn.png +0 -0
- data/test/progit/figures/18333fig0525-tn.png +0 -0
- data/test/progit/figures/18333fig0526-tn.png +0 -0
- data/test/progit/figures/18333fig0527-tn.png +0 -0
- data/test/progit/figures/18333fig0601-tn.png +0 -0
- data/test/progit/figures/18333fig0701-tn.png +0 -0
- data/test/progit/figures/18333fig0702-tn.png +0 -0
- data/test/progit/figures/18333fig0703-tn.png +0 -0
- data/test/progit/figures/18333fig0901-tn.png +0 -0
- data/test/progit/figures/18333fig0902-tn.png +0 -0
- data/test/progit/figures/18333fig0903-tn.png +0 -0
- data/test/progit/figures/18333fig0904-tn.png +0 -0
- data/test/progit/fr/01-introduction/01-chapter1.markdown +371 -0
- data/test/progit/fr/02-git-basics/01-chapter2.markdown +1378 -0
- data/test/progit/fr/03-git-branching/01-chapter3.markdown +781 -0
- data/test/progit/fr/04-git-server/01-chapter4.markdown +1141 -0
- data/test/progit/fr/05-distributed-git/01-chapter5.markdown +1163 -0
- data/test/progit/fr/06-git-tools/01-chapter6.markdown +1356 -0
- data/test/progit/fr/07-customizing-git/01-chapter7.markdown +1200 -0
- data/test/progit/fr/08-git-and-other-scms/01-chapter8.markdown +832 -0
- data/test/progit/fr/09-git-internals/01-chapter9.markdown +1228 -0
- data/test/progit/fr/NOTES.fr-fr.markdown +1 -0
- data/test/progit/fr/NOTES.fr-fr.md +127 -0
- data/test/progit/fr/README.md +43 -0
- data/test/progit/fr/glossaire-git.adoc +108 -0
- data/test/progit/hi/01-introduction/01-chapter1.markdown +7 -0
- data/test/progit/hu/01-introduction/01-chapter1.markdown +257 -0
- data/test/progit/id/01-introduction/01-chapter1.markdown +257 -0
- data/test/progit/id/02-git-basics/01-chapter2.markdown +1127 -0
- data/test/progit/id/03-git-branching/01-chapter3.markdown +598 -0
- data/test/progit/it/01-introduction/01-chapter1.markdown +263 -0
- data/test/progit/it/02-git-basics/01-chapter2.markdown +1227 -0
- data/test/progit/it/03-git-branching/01-chapter3.markdown +598 -0
- data/test/progit/it/04-git-server/01-chapter4.markdown +864 -0
- data/test/progit/it/05-distributed-git/01-chapter5.markdown +897 -0
- data/test/progit/it/06-git-tools/01-chapter6.markdown +1144 -0
- data/test/progit/it/07-customizing-git/01-chapter7.markdown +606 -0
- data/test/progit/it/08-git-and-other-scms/01-chapter8.markdown +707 -0
- data/test/progit/it/09-git-internals/01-chapter9.markdown +1000 -0
- data/test/progit/ja/01-introduction/01-chapter1.markdown +260 -0
- data/test/progit/ja/02-git-basics/01-chapter2.markdown +1221 -0
- data/test/progit/ja/03-git-branching/01-chapter3.markdown +604 -0
- data/test/progit/ja/04-git-server/01-chapter4.markdown +863 -0
- data/test/progit/ja/05-distributed-git/01-chapter5.markdown +908 -0
- data/test/progit/ja/06-git-tools/01-chapter6.markdown +1133 -0
- data/test/progit/ja/07-customizing-git/01-chapter7.markdown +936 -0
- data/test/progit/ja/08-git-and-other-scms/01-chapter8.markdown +690 -0
- data/test/progit/ja/09-git-internals/01-chapter9.markdown +984 -0
- data/test/progit/ja/README.md +58 -0
- data/test/progit/ja/translation glossaries.txt +33 -0
- data/test/progit/ko/01-introduction/01-chapter1.markdown +258 -0
- data/test/progit/ko/02-git-basics/01-chapter2.markdown +1181 -0
- data/test/progit/ko/03-git-branching/01-chapter3.markdown +612 -0
- data/test/progit/ko/04-git-server/01-chapter4.markdown +867 -0
- data/test/progit/ko/05-distributed-git/01-chapter5.markdown +913 -0
- data/test/progit/ko/06-git-tools/01-chapter6.markdown +1142 -0
- data/test/progit/ko/07-customizing-git/01-chapter7.markdown +935 -0
- data/test/progit/ko/08-git-and-other-scms/01-chapter8.markdown +688 -0
- data/test/progit/ko/09-git-internals/01-chapter9.markdown +976 -0
- data/test/progit/ko/README.md +75 -0
- data/test/progit/ko/translation_guide.txt +65 -0
- data/test/progit/latex/README +27 -0
- data/test/progit/latex/config.yml +144 -0
- data/test/progit/latex/makepdf +207 -0
- data/test/progit/latex/template.tex +155 -0
- data/test/progit/makeebooks +125 -0
- data/test/progit/makepdfs +47 -0
- data/test/progit/mk/01-introduction/01-chapter1.markdown +258 -0
- data/test/progit/mk/02-git-basics/01-chapter2.markdown +1125 -0
- data/test/progit/mk/03-git-branching/01-chapter3.markdown +598 -0
- data/test/progit/mk/05-distributed-git/01-chapter5.markdown +897 -0
- data/test/progit/nl/01-introduction/01-chapter1.markdown +296 -0
- data/test/progit/nl/02-git-basics/01-chapter2.markdown +1253 -0
- data/test/progit/nl/03-git-branching/01-chapter3.markdown +642 -0
- data/test/progit/nl/04-git-server/01-chapter4.markdown +902 -0
- data/test/progit/nl/05-distributed-git/01-chapter5.markdown +953 -0
- data/test/progit/nl/06-git-tools/01-chapter6.markdown +1177 -0
- data/test/progit/nl/07-customizing-git/01-chapter7.markdown +974 -0
- data/test/progit/nl/08-git-and-other-scms/01-chapter8.markdown +725 -0
- data/test/progit/nl/09-git-internals/01-chapter9.markdown +1013 -0
- data/test/progit/no-nb/01-introduction/01-chapter1.markdown +261 -0
- data/test/progit/no-nb/02-git-basics/01-chapter2.markdown +1225 -0
- data/test/progit/no-nb/03-git-branching/01-chapter3.markdown +606 -0
- data/test/progit/no-nb/04-git-server/01-chapter4.markdown +867 -0
- data/test/progit/no-nb/05-distributed-git/01-chapter5.markdown +914 -0
- data/test/progit/no-nb/06-git-tools/01-chapter6.markdown +1144 -0
- data/test/progit/no-nb/07-customizing-git/01-chapter7.markdown +936 -0
- data/test/progit/no-nb/08-git-and-other-scms/01-chapter8.markdown +689 -0
- data/test/progit/no-nb/09-git-internals/01-chapter9.markdown +977 -0
- data/test/progit/no-nb/README +2 -0
- data/test/progit/pl/01-introduction/01-chapter1.markdown +257 -0
- data/test/progit/pl/02-git-basics/02-chapter2.markdown +1128 -0
- data/test/progit/pl/03-git-branching/01-chapter3.markdown +598 -0
- data/test/progit/pl/04-git-server/01-chapter4.markdown +897 -0
- data/test/progit/pl/05-distributed-git/01-chapter5.markdown +1278 -0
- data/test/progit/pl/06-git-tools/01-chapter6.markdown +1550 -0
- data/test/progit/pl/07-customizing-git/01-chapter7.markdown +1058 -0
- data/test/progit/pl/08-git-and-other-scms/01-chapter8.markdown +948 -0
- data/test/progit/pl/09-git-internals/01-chapter9.markdown +1382 -0
- data/test/progit/pl/translation-guidelines.txt +70 -0
- data/test/progit/pt-br/01-introduction/01-chapter1.markdown +256 -0
- data/test/progit/pt-br/02-git-basics/01-chapter2.markdown +1127 -0
- data/test/progit/pt-br/03-git-branching/01-chapter3.markdown +596 -0
- data/test/progit/pt-br/04-git-server/01-chapter4.markdown +888 -0
- data/test/progit/pt-br/05-distributed-git/01-chapter5.markdown +896 -0
- data/test/progit/pt-br/06-git-tools/01-chapter6.markdown +1122 -0
- data/test/progit/pt-br/07-customizing-git/01-chapter7.markdown +932 -0
- data/test/progit/pt-br/08-git-and-other-scms/01-chapter8.markdown +691 -0
- data/test/progit/pt-br/09-git-internals/01-chapter9.markdown +978 -0
- data/test/progit/pt-br/figures-dia/fig0101.dia +617 -0
- data/test/progit/pt-br/figures-dia/fig0102.dia +921 -0
- data/test/progit/pt-br/figures-dia/fig0103.dia +1468 -0
- data/test/progit/pt-br/figures-dia/fig0104.dia +1432 -0
- data/test/progit/pt-br/figures-dia/fig0105.dia +1924 -0
- data/test/progit/pt-br/figures-dia/fig0106.dia +562 -0
- data/test/progit/pt-br/figures-dia/fig0201.dia +776 -0
- data/test/progit/pt-br/figures-dia/fig0301.dia +2006 -0
- data/test/progit/pt-br/figures-dia/fig0302.dia +2148 -0
- data/test/progit/pt-br/figures-dia/fig0316.dia +1079 -0
- data/test/progit/pt-br/figures-dia/fig0322.dia +1142 -0
- data/test/progit/pt-br/figures-dia/fig0323.dia +1407 -0
- data/test/progit/pt-br/figures-dia/fig0324.dia +1603 -0
- data/test/progit/pt-br/figures-dia/fig0325.dia +2003 -0
- data/test/progit/pt-br/figures-dia/fig0326.dia +2013 -0
- data/test/progit/pt-br/figures-dia/fig0336.dia +786 -0
- data/test/progit/pt-br/figures-dia/fig0337.dia +1546 -0
- data/test/progit/pt-br/figures-dia/fig0338.dia +1755 -0
- data/test/progit/pt-br/figures-dia/fig0339.dia +1882 -0
- data/test/progit/pt-br/figures-dia/fig0501.dia +456 -0
- data/test/progit/pt-br/figures-dia/fig0502.dia +965 -0
- data/test/progit/pt-br/figures-dia/fig0503.dia +914 -0
- data/test/progit/pt-br/figures-dia/fig0511.dia +1201 -0
- data/test/progit/pt-br/figures-dia/fig0515.dia +1721 -0
- data/test/progit/pt-br/figures-dia/fig0702.dia +795 -0
- data/test/progit/pt-br/figures-dia/fig0703.dia +795 -0
- data/test/progit/pt-br/figures-dia/fig0901.dia +669 -0
- data/test/progit/pt-br/figures-dia/fig0902.dia +834 -0
- data/test/progit/pt-br/figures-dia/fig0903.dia +1483 -0
- data/test/progit/pt-br/figures-dia/fig0904.dia +1728 -0
- data/test/progit/ro/01-introduction/01-chapter1.markdown +257 -0
- data/test/progit/ru/01-introduction/01-chapter1.markdown +259 -0
- data/test/progit/ru/02-git-basics/01-chapter2.markdown +1155 -0
- data/test/progit/ru/03-git-branching/01-chapter3.markdown +598 -0
- data/test/progit/ru/04-git-server/01-chapter4.markdown +854 -0
- data/test/progit/ru/05-distributed-git/01-chapter5.markdown +897 -0
- data/test/progit/ru/06-git-tools/01-chapter6.markdown +1126 -0
- data/test/progit/ru/07-customizing-git/01-chapter7.markdown +938 -0
- data/test/progit/ru/08-git-and-other-scms/01-chapter8.markdown +691 -0
- data/test/progit/ru/09-git-internals/01-chapter9.markdown +977 -0
- data/test/progit/ru/Glossary +38 -0
- data/test/progit/ru/README +12 -0
- data/test/progit/ru/figures-dia/fig0101.dia +647 -0
- data/test/progit/ru/figures-dia/fig0102.dia +1009 -0
- data/test/progit/ru/figures-dia/fig0103.dia +1468 -0
- data/test/progit/ru/figures-dia/fig0104.dia +1432 -0
- data/test/progit/ru/figures-dia/fig0105.dia +1924 -0
- data/test/progit/ru/figures-dia/fig0106.dia +561 -0
- data/test/progit/ru/figures-dia/fig0201.dia +774 -0
- data/test/progit/ru/figures-dia/fig0322.dia +1182 -0
- data/test/progit/ru/figures-dia/fig0323.dia +1457 -0
- data/test/progit/ru/figures-dia/fig0324.dia +1698 -0
- data/test/progit/ru/figures-dia/fig0325.dia +2101 -0
- data/test/progit/ru/figures-dia/fig0326.dia +2111 -0
- data/test/progit/ru/figures-dia/fig0336.dia +786 -0
- data/test/progit/ru/figures-dia/fig0337.dia +1546 -0
- data/test/progit/ru/figures-dia/fig0338.dia +1755 -0
- data/test/progit/ru/figures-dia/fig0339.dia +1882 -0
- data/test/progit/ru/figures-dia/fig0501.dia +477 -0
- data/test/progit/ru/figures-dia/fig0502.dia +1063 -0
- data/test/progit/ru/figures-dia/fig0503.dia +915 -0
- data/test/progit/ru/figures-dia/fig0511.dia +1201 -0
- data/test/progit/ru/figures-dia/fig0515.dia +1741 -0
- data/test/progit/ru/figures-dia/fig0702.dia +851 -0
- data/test/progit/ru/figures-dia/fig0703.dia +851 -0
- data/test/progit/sr/01-introduction/01-chapter1.markdown +257 -0
- data/test/progit/summary.rb +29 -0
- data/test/progit/th/01-introduction/01-chapter1.markdown +257 -0
- data/test/progit/th/02-git-basics/01-chapter2.markdown +1126 -0
- data/test/progit/th/README.md +47 -0
- data/test/progit/tr/01-introduction/01-chapter1.markdown +258 -0
- data/test/progit/tr/02-git-basics/01-chapter2.markdown +1129 -0
- data/test/progit/tr/03-git-branching/01-chapter3.markdown +598 -0
- data/test/progit/tr/04-git-server/01-chapter4.markdown +73 -0
- data/test/progit/tr/05-distributed-git/01-chapter5.markdown +215 -0
- data/test/progit/uk/01-introduction/01-chapter1.markdown +522 -0
- data/test/progit/vi/01-introduction/01-chapter1.markdown +259 -0
- data/test/progit/vi/02-git-basics/01-chapter2.markdown +1172 -0
- data/test/progit/vi/03-git-branching/01-chapter3.markdown +598 -0
- data/test/progit/zh-tw/01-introduction/01-chapter1.markdown +259 -0
- data/test/progit/zh-tw/02-git-basics/01-chapter2.markdown +1183 -0
- data/test/progit/zh-tw/03-git-branching/01-chapter3.markdown +604 -0
- data/test/progit/zh-tw/04-git-server/01-chapter4.markdown +866 -0
- data/test/progit/zh-tw/05-distributed-git/01-chapter5.markdown +912 -0
- data/test/progit/zh-tw/06-git-tools/01-chapter6.markdown +1139 -0
- data/test/progit/zh-tw/07-customizing-git/01-chapter7.markdown +932 -0
- data/test/progit/zh-tw/08-git-and-other-scms/01-chapter8.markdown +689 -0
- data/test/progit/zh-tw/09-git-internals/01-chapter9.markdown +977 -0
- data/test/progit/zh/01-introduction/01-chapter1.markdown +259 -0
- data/test/progit/zh/02-git-basics/01-chapter2.markdown +1177 -0
- data/test/progit/zh/03-git-branching/01-chapter3.markdown +604 -0
- data/test/progit/zh/04-git-server/01-chapter4.markdown +866 -0
- data/test/progit/zh/05-distributed-git/01-chapter5.markdown +912 -0
- data/test/progit/zh/06-git-tools/01-chapter6.markdown +1125 -0
- data/test/progit/zh/07-customizing-git/01-chapter7.markdown +935 -0
- data/test/progit/zh/08-git-and-other-scms/01-chapter8.markdown +689 -0
- data/test/progit/zh/09-git-internals/01-chapter9.markdown +976 -0
- data/test/spec_tests.json +4382 -4070
- data/test/test_basics.rb +1 -1
- data/test/test_helper.rb +1 -0
- data/test/test_maliciousness.rb +4 -2
- data/test/test_pathological_inputs.rb +31 -30
- data/test/test_spec.rb +5 -4
- metadata +972 -4
@@ -0,0 +1,1225 @@
|
|
1
|
+
# Základy práce se systémem Git #
|
2
|
+
|
3
|
+
Pokud jste ochotni přečíst si o systému Git jen jednu kapitolu, měla by to být právě tahle. Tato kapitola popíše všechny základní příkazy, jejichž prováděním strávíte při práci se systémem Git drtivou většinu času. Po přečtení kapitoly byste měli být schopni nakonfigurovat a inicializovat repozitář, spustit a ukončit sledování souborů, připravovat soubory a zapisovat revize. Ukážeme si také, jak nastavit Git, aby ignoroval určité soubory a masky souborů, jak rychle a jednoduše vrátit nežádoucí změny, jak procházet historii projektu a zobrazit změny mezi jednotlivými revizemi a jak posílat soubory do vzdálených repozitářů a naopak z nich soubory zase stahovat.
|
4
|
+
|
5
|
+
## Získání repozitáře Git ##
|
6
|
+
|
7
|
+
Projekt v systému Git lze získat dvěma základními způsoby. První způsob spočívá v tom, že vezmeme existující projekt nebo adresář a importujeme ho do systému Git. Druhý způsob spočívá v naklonování již existujícího repozitáře Git z jiného serveru.
|
8
|
+
|
9
|
+
### Inicializace repozitáře v existujícím adresáři ###
|
10
|
+
|
11
|
+
Chcete-li zahájit sledování existujícího projektu v systému Git, přejděte do adresáře projektu a zadejte příkaz:
|
12
|
+
|
13
|
+
$ git init
|
14
|
+
|
15
|
+
Příkaz vytvoří nový podadresář s názvem `.git`, který bude obsahovat všechny soubory nezbytné pro repozitář, tzv. kostru repozitáře Git. V tomto okamžiku se z vašeho projektu ještě nic nesleduje. (Více informací o tom, jaké soubory obsahuje právě vytvořený adresář `.git`, naleznete v *kapitole 9*.)
|
16
|
+
|
17
|
+
Chcete-li spustit verzování existujících souborů (a ne jen prázdného adresáře), měli byste pravděpodobně zahájit sledování (tracking) těchto souborů a provést první revizi (commit). Můžete tak učinit pomocí několika příkazů `git add`, jimiž určíte soubory, které chcete sledovat, a provedete revizi:
|
18
|
+
|
19
|
+
$ git add *.c
|
20
|
+
$ git add README
|
21
|
+
$ git commit -m 'initial project version'
|
22
|
+
|
23
|
+
K tomu, co přesně tyto příkazy provedou, se dostaneme za okamžik. V této chvíli máte vytvořen repozitář Git se sledovanými soubory a úvodní revizí.
|
24
|
+
|
25
|
+
### Klonování existujícího repozitáře ###
|
26
|
+
|
27
|
+
Chcete-li vytvořit kopii existujícího repozitáře Git (například u projektu, do nějž chcete začít přispívat), pak příkazem, který hledáte, je `git clone`. Pokud jste zvyklí pracovat s jinými systémy pro správu verzí, jako je například Subversion, jistě jste si všimli, že příkaz zní `clone`, a nikoli `checkout`. Souvisí to s jedním podstatným rozdílem: Git získá kopii téměř všech dat na serveru. Po spuštění příkazu `git clone` budou k historii projektu staženy všechny verze všech souborů. Pokud by někdy poté došlo k poruše disku serveru, lze použít libovolný z těchto klonů na kterémkoli klientovi a obnovit pomocí něj server zpět do stavu, v němž byl v okamžiku klonování (může dojít ke ztrátě některých zásuvných modulů na straně serveru a podobných věcí, ale všechna verzovaná data budou obnovena. Další podrobnosti naleznete v *kapitole 4*).
|
28
|
+
|
29
|
+
Repozitář naklonujete příkazem `git clone [url]`. Pokud například chcete naklonovat knihovnu Ruby Git nazvanou Grit, můžete to provést následovně:
|
30
|
+
|
31
|
+
$ git clone git://github.com/schacon/grit.git
|
32
|
+
|
33
|
+
Tímto příkazem se vytvoří adresář s názvem `grit`, inicializuje se v něm adresář `.git`, stáhnou se všechna data pro tento repozitář a vytvoří se pracovní kopie nejnovější verze. Přejdete-li do nového adresáře `grit`, uvidíte v něm soubory projektu připravené ke zpracování nebo jinému použití. Pokud chcete naklonovat repozitář do adresáře pojmenovaného jinak než grit, můžete název zadat jako další parametr na příkazovém řádku:
|
34
|
+
|
35
|
+
$ git clone git://github.com/schacon/grit.git mygrit
|
36
|
+
|
37
|
+
Tento příkaz učiní totéž co příkaz předchozí, ale cílový adresář se bude jmenovat `mygrit`.
|
38
|
+
|
39
|
+
Git nabízí celou řadu různých přenosových protokolů. Předchozí příklad využívá protokol `git://`, můžete se ale setkat také s protokolem `http(s)://` nebo `user@server:/path.git`, který používá přenosový protokol SSH. V *kapitole 4* budou představeny všechny dostupné možnosti, které mohou být pro přístup do repozitáře Git na serveru nastaveny, včetně jejich předností a nevýhod.
|
40
|
+
|
41
|
+
## Nahrávání změn do repozitáře ##
|
42
|
+
|
43
|
+
Nyní máte vytvořen opravdový gitový repozitář a pracovní kopii souborů k projektu (checkout). Řekněme, že potřebujete udělat pár změn a zapsat snímky těchto změn do svého repozitáře pokaždé, kdy se projekt dostane do stavu, který chcete zaznamenat.
|
44
|
+
|
45
|
+
Nezapomeňte, že každý soubor ve vašem pracovním adresáři může být ve dvou různých stavech: *sledován* (tracked) a *nesledován* (untracked). Za *sledované* jsou označovány soubory, které byly součástí posledního snímku. Mohou být ve stavu *změněn* (modified), *nezměněn* (unmodified) nebo *připraven k zapsání* (staged). *Nesledované* soubory jsou všechny ostatní, tedy veškeré soubory ve vašem pracovním adresáři, které nebyly obsaženy ve vašem posledním snímku a nejsou v oblasti připravených změn. Po úvodním klonování repozitáře budou všechny vaše soubory sledované a nezměněné, protože jste právě provedli jejich checkout a dosud jste neudělali žádné změny.
|
46
|
+
|
47
|
+
Jakmile začnete soubory upravovat, Git je bude považovat za změněné, protože jste v nich od poslední revize provedli změny. Poté všechny tyto změněné soubory *připravíte k zapsání* (stage) a následně všechny připravené změny zapíšete (commit). A celý cyklus se opakuje. Pracovní cyklus je znázorněn na obrázku 2-1.
|
48
|
+
|
49
|
+
Insert 18333fig0201.png
|
50
|
+
Obrázek 2-1. Cyklus stavů vašich souborů
|
51
|
+
|
52
|
+
### Kontrola stavu souborů ###
|
53
|
+
|
54
|
+
Hlavním nástrojem na zjišťování stavu jednotlivých souborů je příkaz `git status`. Spustíte-li tento příkaz bezprostředně po klonování, objeví se zhruba následující:
|
55
|
+
|
56
|
+
$ git status
|
57
|
+
On branch master
|
58
|
+
nothing to commit, working directory clean
|
59
|
+
|
60
|
+
To znamená, že žádné soubory nejsou připraveny k zapsání a pracovní adresář je čistý. Jinými slovy, žádné sledované soubory nebyly změněny. Git také neví o žádných nesledovaných souborech, jinak by byly ve výčtu uvedeny. Příkaz vám dále sděluje, na jaké větvi (branch) se nacházíte. Pro tuto chvíli nebudeme situaci komplikovat a výchozí bude vždy hlavní větev (`master` branch). Větve a reference budou podrobně popsány v následující kapitole.
|
61
|
+
|
62
|
+
Řekněme, že nyní přidáte do projektu nový soubor, například soubor `README`. Pokud soubor dříve neexistoval a vy spustíte příkaz `git status`, bude nesledovaný soubor uveden takto:
|
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
|
+
Vidíte, že nový soubor `README` není sledován, protože je ve výpisu stavů uveden v části „Untracked files“. Není-li soubor sledován, obecně to znamená, že Git ví o souboru, který nebyl v předchozím snímku (v předchozí revizi), a nezařadí ho ani do dalších snímků, dokud mu k tomu nedáte výslovný příkaz. Díky tomu se nemůže stát, že budou do revizí nedopatřením zahrnuty vygenerované binární soubory nebo jiné soubory, které si nepřejete zahrnout. Vy si ale přejete soubor README zahrnout, a proto ho začněme sledovat.
|
75
|
+
|
76
|
+
### Sledování nových souborů ###
|
77
|
+
|
78
|
+
K zahájení sledování nových souborů se používá příkaz `git add`. Chcete-li zahájit sledování souboru `README`, můžete zadat příkaz:
|
79
|
+
|
80
|
+
$ git add README
|
81
|
+
|
82
|
+
Když nyní znovu provedete příkaz k výpisu stavů (git status), uvidíte, že je nyní soubor `README` sledován a připraven k zapsání:
|
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
|
+
Můžeme říci, že je připraven k zapsání, protože je uveden v části „Changes to be committed“, tedy „Změny k zapsání“. Pokud v tomto okamžiku zapíšete revizi, v historickém snímku bude verze souboru z okamžiku, kdy jste spustili příkaz `git add`. Možná si vzpomínáte, že když jste před časem spustili příkaz `git init`, provedli jste potom příkaz `git add (soubory)`. Příkaz jste zadávali kvůli zahájení sledování souborů ve vašem adresáři. Příkaz `git add` je doplněn uvedením cesty buď k souboru, nebo k adresáři. Pokud se jedná o adresář, příkaz přidá rekurzivně všechny soubory v tomto adresáři.
|
93
|
+
|
94
|
+
### Příprava změněných souborů k zapsání ###
|
95
|
+
|
96
|
+
Nyní provedeme změny v souboru, který už byl sledován. Pokud změníte už dříve sledovaný soubor s názvem `benchmarks.rb` a poté znovu spustíte příkaz `status`, zobrazí se něco takového:
|
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
|
+
Soubor `benchmarks.rb` je uveden v části „Changes not staged for commit“ (změny, které nejsou připraveny k zapsání). Znamená to, že soubor, který je sledován, byl v pracovním adresáři změněn, avšak ještě nebyl připraven k zapsání (staged). Chcete-li ho připravit k zapsání, spusťte příkaz `git add` (jedná se o víceúčelový příkaz – používá se k zahájení sledování nových souborů i k dalším operacím, jako je například označení vyřešených případů kolize souborů při slučování). Spusťme nyní příkaz `git add`, abychom soubor `benchmarks.rb` připravili k zapsání, a potom znovu zadejme příkaz `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
|
+
Oba soubory jsou nyní připraveny k zapsání a budou zahrnuty do příští revize. Nyní předpokládejme, že jste si vzpomněli na jednu malou změnu, kterou chcete ještě před zapsáním revize provést v souboru `benchmarks.rb`. Soubor znovu otevřete, provedete změnu a chcete jej zapsat. Spusťme však ještě jednou příkaz `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
|
+
Co to má být? Soubor `benchmarks.rb` je nyní uveden jak v části připraveno k zapsání (Changes to be committed), tak v části nepřipraveno k zapsání (Changes not staged for commit). Jak je tohle možné? Věc se má tak, že Git po spuštění příkazu `git add` připraví soubor k zapsání přesně ve tvaru, v jakém se nachází v daném okamžiku. Pokud nyní revizi zapíšete, bude obsahovat soubor `benchmarks.rb` tak, jak vypadal, když jste naposledy spustili příkaz `git add`, nikoli v té podobě, kterou měl v pracovním adresáři v okamžiku, když jste spustili příkaz `git commit`. Pokud upravíte soubor po provedení příkazu `git add`, je třeba spustit `git add` ještě jednou, aby byla připravena aktuální verze souboru:
|
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
|
+
### Ignorované soubory ###
|
155
|
+
|
156
|
+
Ve vašem adresáři se často vyskytne skupina souborů, u nichž nebudete chtít, aby je Git automaticky přidával nebo aby je vůbec uváděl jako nesledované. Jedná se většinou o automaticky vygenerované soubory, jako soubory log nebo soubory vytvořené při překladu. V takových případech můžete vytvořit soubor `.gitignore` se seznamem masek pro ignorované soubory. Tady je malý příklad souboru `.gitignore`:
|
157
|
+
|
158
|
+
$ cat .gitignore
|
159
|
+
*.[oa]
|
160
|
+
*~
|
161
|
+
|
162
|
+
První řádek říká systému Git, že má ignorovat všechny soubory končící na `.o` nebo `.a` – *objekty* a *archivní* soubory, které mohou být výsledkem překladu. Druhý řádek systému Git říká, aby ignoroval všechny soubory končící vlnovkou (`~`), kterou mnoho textových editorů (např. Emacs) používá k označení dočasných souborů. Můžete rovněž přidat adresář `log`, `tmp` nebo `pid`, automaticky vygenerovanou dokumentaci a podobné. Vytvoření a naplnění souboru `.gitignore` ještě dříve než se pustíte do práce bývá většinou dobrý nápad. Alespoň se vám nestane, že byste nedopatřením zapsali také soubory, o které v repozitáři Git nestojíte.
|
163
|
+
|
164
|
+
Pravidla pro masky, které můžete použít v souboru `.gitignore`, jsou následující:
|
165
|
+
|
166
|
+
* Prázdné řádky nebo řádky začínající znakem `#` budou ignorovány.
|
167
|
+
* Standardní masky souborů (glob patterns).
|
168
|
+
* Chcete-li označit adresář, můžete masku zakončit lomítkem (`/`).
|
169
|
+
* Pokud řádek začíná vykřičníkem (`!`), maska na něm je negována.
|
170
|
+
|
171
|
+
Masky souborů jsou jako zjednodušené regulární výrazy, které používá shell. Hvězdička (`*`) označuje žádný nebo více znaků; `[abc]` označuje jakýkoli znak uvedený v závorkách (v tomto případě `a`, `b` nebo `c`); otazník (`?`) označuje jeden znak; znaky v závorkách oddělené pomlčkou (`[0-9]`) označují jakýkoli znak v daném rozmezí (v našem případě 0 až 9).
|
172
|
+
|
173
|
+
Tady je další příklad souboru `.gitignore`:
|
174
|
+
|
175
|
+
# komentář – ignoruje se
|
176
|
+
# žádné soubory s příponou .a
|
177
|
+
*.a
|
178
|
+
# ale sleduj soubor lib.a, přestože máš ignorovat soubory s příponou .a
|
179
|
+
!lib.a
|
180
|
+
# ignoruj soubor TODO pouze v kořenovém adresáři, ne v podadresářích
|
181
|
+
/TODO
|
182
|
+
# ignoruj všechny soubory v adresáři build/
|
183
|
+
build/
|
184
|
+
# ignoruj doc/notes.txt, ale nikoli doc/server/arch.txt
|
185
|
+
doc/*.txt
|
186
|
+
# ignoruj všechny .txt soubory v adresáři doc/
|
187
|
+
doc/**/*.txt
|
188
|
+
|
189
|
+
Část masky `**/` je v Gitu dostupná od verze 1.8.2.
|
190
|
+
|
191
|
+
### Zobrazení připravených a nepřipravených změn ###
|
192
|
+
|
193
|
+
Je-li pro vaše potřeby příkaz `git status` příliš neurčitý – chcete přesně vědět, co jste změnili, nejen které soubory – můžete použít příkaz `git diff`. Podrobněji se budeme příkazu `git diff` věnovat později. Vy ho však nejspíš budete nejčastěji využívat k zodpovězení těchto dvou otázek: Co jste změnili, ale ještě nepřipravili k zapsání? A co jste připravili a nyní může být zapsáno? Zatímco příkaz `git status` vám tyto otázky zodpoví velmi obecně, příkaz `git diff` přesně zobrazí přidané a odstraněné řádky – tedy samotnou záplatu.
|
194
|
+
|
195
|
+
Řekněme, že znovu upravíte a připravíte soubor `README` a poté bez připravení upravíte soubor `benchmarks.rb`. Po spuštění příkazu `status` se zobrazí zhruba toto:
|
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
|
+
Chcete-li vidět, co jste změnili, avšak ještě nepřipravili k zapsání, zadejte příkaz `git diff` bez dalších parametrů:
|
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
|
+
Tento příkaz srovná obsah vašeho pracovního adresáře a oblasti připravených změn. Výsledek vám ukáže provedené změny, které jste dosud nepřipravili k zapsání.
|
231
|
+
|
232
|
+
Chcete-li vidět, co jste připravili a co bude součástí příští revize, použijte příkaz `git diff --cached`. (Ve verzích Git 1.6.1 a novějších můžete použít také příkaz `git diff --staged`, který se možná snáze pamatuje.) Tento příkaz srovná připravené změny (staged changes) s poslední revizí:
|
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
|
+
K tomu je třeba poznamenat, že příkaz `git diff` sám o sobě nezobrazí všechny změny provedené od poslední revize, ale jen změny, které zatím nejsou připraveny. To může být občas matoucí, protože pokud jste připravili všechny provedené změny, bude výstup příkazu `git diff` prázdný.
|
248
|
+
|
249
|
+
V dalším příkladu ukážeme situaci, kdy jste připravili soubor `benchmarks.rb` a poté ho znovu upravili. Příkaz `git diff` můžete nyní použít k zobrazení změn v souboru, které byly připraveny, a změn, které nejsou připraveny:
|
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
|
+
Příkaz `git diff` nyní můžete použít k zobrazení změn, které dosud nejsou připraveny:
|
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
|
+
A příkaz `git diff --cached` ukáže změny, které už připraveny jsou:
|
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
|
+
### Zapisování změn ###
|
300
|
+
|
301
|
+
Nyní, když jste seznam připravených změn nastavili podle svých představ, můžete začít zapisovat změny. Nezapomeňte, že všechno, co dosud nebylo připraveno k zapsání – všechny soubory, které jste vytvořili nebo změnili a na které jste po úpravách nepoužili příkaz `git add` –, nebudou do revize zahrnuty. Zůstanou na vašem disku jako změněné soubory.
|
302
|
+
Když jste v našem případě naposledy spustili příkaz `git status`, viděli jste, že všechny soubory byly připraveny k zapsání. Takže jste připraveni k samotnému zapsání změn. Nejjednodušší způsob zapsání změn spočívá v použití příkazu `git commit`:
|
303
|
+
|
304
|
+
$ git commit
|
305
|
+
|
306
|
+
Po zadání příkazu se otevře vámi zvolený editor. (Ten je nastaven proměnnou prostředí `$EDITOR` vašeho shellu. Většinou se bude jednat o editor vim nebo emacs, ale pomocí příkazu `git config --global core.editor` můžete nastavit i jakýkoli jiný – viz *kapitola 1*.)
|
307
|
+
|
308
|
+
Editor zobrazí následující text (tento příklad je z editoru Vim):
|
309
|
+
|
310
|
+
# Please enter the commit message for your changes. Lines starting
|
311
|
+
# with '#' will be ignored, and an empty message aborts the commit.
|
312
|
+
# On branch master
|
313
|
+
# Changes to be committed:
|
314
|
+
# new file: README
|
315
|
+
# modified: benchmarks.rb
|
316
|
+
#
|
317
|
+
~
|
318
|
+
~
|
319
|
+
~
|
320
|
+
".git/COMMIT_EDITMSG" 10L, 283C
|
321
|
+
|
322
|
+
Jak vidíte, výchozí zpráva k revizi (commit message) obsahuje zakomentovaný aktuální výstup příkazu `git status` a nahoře jeden prázdný řádek. Tyto komentáře můžete odstranit a napsat vlastní zprávu k revizi, nebo je můžete v souboru ponechat, abyste si lépe vzpomněli, co bylo obsahem dané revize. (Chcete-li zařadit ještě podrobnější informace o tom, co jste měnili, můžete k příkazu `git commit` přidat parametr `-v`. V editoru se pak zobrazí také výstup rozdílů (diff) ke konkrétním změnám a vy přesně uvidíte, co bylo změněno.) Jakmile editor zavřete, Git vytvoří revizi se zprávou, kterou jste napsali (s odstraněnými komentáři a rozdíly).
|
323
|
+
|
324
|
+
Zprávu k revizi můžete rovněž napsat do řádku k příkazu `commit`. Jako zprávu ji označíte tak, že před ni vložíte příznak `-m`:
|
325
|
+
|
326
|
+
$ git commit -m "Story 182: Fix benchmarks for speed"
|
327
|
+
[master 463dc4f] Story 182: Fix benchmarks for speed
|
328
|
+
2 files changed, 3 insertions(+)
|
329
|
+
create mode 100644 README
|
330
|
+
|
331
|
+
Nyní jste vytvořili svou první revizi! Vidíte, že se po zapsání revize zobrazil výpis s informacemi: do jaké větve jste revizi zapsali (`master`), jaký je kontrolní součet SHA-1 revize (`463dc4f`), kolik souborů bylo změněno a statistiku přidaných a odstraněných řádků revize.
|
332
|
+
|
333
|
+
Nezapomeňte, že revize zaznamená snímek projektu, jak je obsažen v oblasti připravených změn. Vše, co jste nepřipravili k zapsání, zůstane ve stavu změněno na vašem disku. Chcete-li i tyto soubory přidat do své historie, zapište další revizi. Pokaždé, když zapíšete revizi, nahrajete snímek svého projektu, k němuž se můžete později vrátit nebo ho můžete použít k srovnání.
|
334
|
+
|
335
|
+
### Přeskočení oblasti připravených změn ###
|
336
|
+
|
337
|
+
Přestože může být oblast připravených změn opravdu užitečným nástrojem pro přesné vytváření revizí, je někdy při daném pracovním postupu zbytečným mezikrokem. Chcete-li oblast připravených změn úplně přeskočit, nabízí Git jednoduchou zkratku. Přidáte-li k příkazu `git commit` parametr `-a`, Git do revize automaticky zahrne každý soubor, který je sledován. Odpadá potřeba zadávat příkaz `git add`:
|
338
|
+
|
339
|
+
$ git status
|
340
|
+
On branch master
|
341
|
+
Changes not staged for commit:
|
342
|
+
(use "git add <file>..." to update what will be committed)
|
343
|
+
(use "git checkout -- <file>..." to discard changes in working directory)
|
344
|
+
|
345
|
+
modified: benchmarks.rb
|
346
|
+
|
347
|
+
no changes added to commit (use "git add" and/or "git commit -a")
|
348
|
+
$ git commit -a -m 'added new benchmarks'
|
349
|
+
[master 83e38c7] added new benchmarks
|
350
|
+
1 files changed, 5 insertions(+)
|
351
|
+
|
352
|
+
Povšimněte si, že kvůli souboru `benchmarks.rb` v tomto případě nemusíte před zapsáním revize provádět příkaz `git add`.
|
353
|
+
|
354
|
+
### Odstraňování souborů ###
|
355
|
+
|
356
|
+
Chcete-li odstranit soubor ze systému Git, musíte ho odstranit ze sledovaných souborů (přesněji řečeno odstranit z oblasti připravených změn) a zapsat revizi. Odstranění provedete příkazem `git rm`, který odstraní soubor zároveň z vašeho pracovního adresáře, a proto ho už příště neuvidíte mezi nesledovanými soubory.
|
357
|
+
|
358
|
+
Pokud soubor jednoduše odstraníte z pracovního adresáře, zobrazí se ve výpisu `git status` v části „Changes not staged for commit“ (tedy *nepřipraveno*):
|
359
|
+
|
360
|
+
$ rm grit.gemspec
|
361
|
+
$ git status
|
362
|
+
On branch master
|
363
|
+
Changes not staged for commit:
|
364
|
+
(use "git add/rm <file>..." to update what will be committed)
|
365
|
+
(use "git checkout -- <file>..." to discard changes in working directory)
|
366
|
+
|
367
|
+
deleted: grit.gemspec
|
368
|
+
|
369
|
+
no changes added to commit (use "git add" and/or "git commit -a")
|
370
|
+
|
371
|
+
Pokud nyní provedete příkaz `git rm`, bude k zapsání připraveno odstranění souboru:
|
372
|
+
|
373
|
+
$ git rm grit.gemspec
|
374
|
+
rm 'grit.gemspec'
|
375
|
+
$ git status
|
376
|
+
On branch master
|
377
|
+
Changes to be committed:
|
378
|
+
(use "git reset HEAD <file>..." to unstage)
|
379
|
+
|
380
|
+
deleted: grit.gemspec
|
381
|
+
|
382
|
+
|
383
|
+
Po příštím zapsání revize soubor zmizí a přestane být sledován. Pokud už jste soubor upravili a přidali do indexu, musíte odstranění provést pomocí parametru `-f`. Jedná se o bezpečnostní funkci, jež má zabránit nechtěnému odstranění dat, která ještě nebyla nahrána do snímku, a nemohou proto být ze systému Git obnovena.
|
384
|
+
|
385
|
+
Další užitečnou možností, která se vám může hodit, je zachování souboru v pracovním stromě a odstranění z oblasti připravených změn. Soubor tak ponecháte na svém pevném disku, ale ukončíte jeho sledování systémem Git. To může být užitečné zejména v situaci, kdy něco zapomenete přidat do souboru `.gitignore`, a omylem to tak zahrnete do revize, např. velký log soubor nebo pár zkompilovaných souborů s příponou `.a`. V takovém případě použijte parametr `--cached`:
|
386
|
+
|
387
|
+
$ git rm --cached readme.txt
|
388
|
+
|
389
|
+
Příkaz `git rm` lze používat v kombinaci se soubory, adresáři a maskami souborů. Můžete tak zadat například příkaz ve tvaru:
|
390
|
+
|
391
|
+
$ git rm log/\*.log
|
392
|
+
|
393
|
+
Všimněte si tu zpětného lomítka (`\`) před znakem `*`. Je tu proto, že Git provádí své vlastní nahrazování masek souborů nad to, které provádí váš shell. Tímto příkazem odstraníte všechny soubory s příponou `.log` z adresáře `log/`. Provést můžete také tento příkaz:
|
394
|
+
|
395
|
+
$ git rm \*~
|
396
|
+
|
397
|
+
Tento příkaz odstraní všechny soubory, které končí vlnovkou (`~`).
|
398
|
+
|
399
|
+
### Přesouvání souborů ###
|
400
|
+
|
401
|
+
Na rozdíl od ostatních systémů pro správu verzí nesleduje Git explicitně přesouvání souborů. Pokud soubor v systému Git přejmenujete, neuloží se žádná metadata s informací, že jste soubor přejmenovali. Git však používá jinou fintu, aby zjistil, že byl soubor přejmenován. Na ni se podíváme později.
|
402
|
+
|
403
|
+
Může se zdát zvláštní, že Git přesto používá příkaz `mv`. Chcete-li v systému Git přejmenovat soubor, můžete spustit třeba příkaz
|
404
|
+
|
405
|
+
$ git mv původní_název nový_název
|
406
|
+
|
407
|
+
a vše funguje na výbornou. A skutečně, pokud takový příkaz provedete a podíváte se na stav souboru, uvidíte, že ho Git považuje za přejmenovaný (renamed):
|
408
|
+
|
409
|
+
$ git mv README README.txt
|
410
|
+
$ git status
|
411
|
+
On branch master
|
412
|
+
Changes to be committed:
|
413
|
+
(use "git reset HEAD <file>..." to unstage)
|
414
|
+
|
415
|
+
renamed: README -> README.txt
|
416
|
+
|
417
|
+
|
418
|
+
Výsledek je však stejný, jako byste provedli následující:
|
419
|
+
|
420
|
+
$ mv README README.txt
|
421
|
+
$ git rm README
|
422
|
+
$ git add README.txt
|
423
|
+
|
424
|
+
Git implicitně zjistí, že se jedná o přejmenování, a proto nehraje roli, zda přejmenujete soubor tímto způsobem, nebo pomocí příkazu `mv`. Jediným skutečným rozdílem je, že `mv` je jediný příkaz, zatímco u druhého způsobu potřebujete příkazy tři — příkaz `mv` je pouze zjednodušením. Důležitější je, že můžete použít jakýkoli způsob přejmenování a příkaz add/rm provést později, před zapsáním revize.
|
425
|
+
|
426
|
+
## Zobrazení historie revizí ##
|
427
|
+
|
428
|
+
Až vytvoříte několik revizí nebo pokud naklonujete repozitář s existující historií revizí, možná budete chtít nahlédnout do historie projektu. Nejzákladnějším a nejmocnějším nástrojem je v tomto případě příkaz `git log`.
|
429
|
+
|
430
|
+
Následující příklady ukazují velmi jednoduchý projekt pojmenovaný `simplegit`, který pro názornost často používám. Chcete-li si projekt naklonovat, zadejte:
|
431
|
+
|
432
|
+
git clone git://github.com/schacon/simplegit-progit.git
|
433
|
+
|
434
|
+
Po zadání příkazu `git log` v tomto projektu byste měli dostat výstup, který vypadá zhruba takto:
|
435
|
+
|
436
|
+
$ git log
|
437
|
+
commit ca82a6dff817ec66f44342007202690a93763949
|
438
|
+
Author: Scott Chacon <schacon@gee-mail.com>
|
439
|
+
Date: Mon Mar 17 21:52:11 2008 -0700
|
440
|
+
|
441
|
+
changed the version number
|
442
|
+
|
443
|
+
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
|
444
|
+
Author: Scott Chacon <schacon@gee-mail.com>
|
445
|
+
Date: Sat Mar 15 16:40:33 2008 -0700
|
446
|
+
|
447
|
+
removed unnecessary test code
|
448
|
+
|
449
|
+
commit a11bef06a3f659402fe7563abf99ad00de2209e6
|
450
|
+
Author: Scott Chacon <schacon@gee-mail.com>
|
451
|
+
Date: Sat Mar 15 10:31:28 2008 -0700
|
452
|
+
|
453
|
+
first commit
|
454
|
+
|
455
|
+
Ve výchozím nastavení a bez dalších parametrů vypíše příkaz `git log` revize provedené v daném repozitáři v obráceném chronologickém pořadí. Nejnovější revize tak budou uvedeny nahoře. Jak vidíte, tento příkaz vypíše všechny revize s jejich kontrolním součtem SHA-1, jménem a e-mailem autora, datem zápisu a zprávou o revizi.
|
456
|
+
|
457
|
+
K příkazu `git log` je k dispozici velké množství nejrůznějších parametrů, díky nimž můžete zobrazit přesně to, co potřebujete. Ukážeme si některé z nejpoužívanějších možností.
|
458
|
+
|
459
|
+
Jedním z nejužitečnějších je parametr `-p`, který zobrazí rozdíly (diff) provedené v každé revizi. Můžete také použít parametr `-2`, který omezí výpis pouze na dva poslední záznamy:
|
460
|
+
|
461
|
+
$ git log -p -2
|
462
|
+
commit ca82a6dff817ec66f44342007202690a93763949
|
463
|
+
Author: Scott Chacon <schacon@gee-mail.com>
|
464
|
+
Date: Mon Mar 17 21:52:11 2008 -0700
|
465
|
+
|
466
|
+
changed the version number
|
467
|
+
|
468
|
+
diff --git a/Rakefile b/Rakefile
|
469
|
+
index a874b73..8f94139 100644
|
470
|
+
--- a/Rakefile
|
471
|
+
+++ b/Rakefile
|
472
|
+
@@ -5,5 +5,5 @@ require 'rake/gempackagetask'
|
473
|
+
spec = Gem::Specification.new do |s|
|
474
|
+
s.name = "simplegit"
|
475
|
+
- s.version = "0.1.0"
|
476
|
+
+ s.version = "0.1.1"
|
477
|
+
s.author = "Scott Chacon"
|
478
|
+
s.email = "schacon@gee-mail.com
|
479
|
+
|
480
|
+
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
|
481
|
+
Author: Scott Chacon <schacon@gee-mail.com>
|
482
|
+
Date: Sat Mar 15 16:40:33 2008 -0700
|
483
|
+
|
484
|
+
removed unnecessary test code
|
485
|
+
|
486
|
+
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
|
487
|
+
index a0a60ae..47c6340 100644
|
488
|
+
--- a/lib/simplegit.rb
|
489
|
+
+++ b/lib/simplegit.rb
|
490
|
+
@@ -18,8 +18,3 @@ class SimpleGit
|
491
|
+
end
|
492
|
+
|
493
|
+
end
|
494
|
+
-
|
495
|
+
-if $0 == __FILE__
|
496
|
+
- git = SimpleGit.new
|
497
|
+
- puts git.show
|
498
|
+
-end
|
499
|
+
|
500
|
+
|
501
|
+
Tento parametr zobrazí tytéž informace, ale za každým záznamem následuje informace o rozdílech. Tato funkce je velmi užitečná při kontrole kódu nebo k rychlému zjištění, co bylo obsahem série revizí, které přidal váš spolupracovník.
|
502
|
+
|
503
|
+
Někdy se změny kontrolují snadněji na úrovni slov než na úrovni řádků. Git nabízí parametr `--word-diff`, který můžeme přidat za příkaz `git log -p`. Místo obvyklé detekce rozdílů po řádcích získáme rozdíly po slovech. Zjišťování rozdílů po slovech je u zdrojového kódu celkem k ničemu, ale pokud porovnáváme velké textové soubory -- jako například knihy nebo vaši disertační práci --, pak se tato možnost hodí. Tady máme příklad:
|
504
|
+
|
505
|
+
$ git log -U1 --word-diff
|
506
|
+
commit ca82a6dff817ec66f44342007202690a93763949
|
507
|
+
Author: Scott Chacon <schacon@gee-mail.com>
|
508
|
+
Date: Mon Mar 17 21:52:11 2008 -0700
|
509
|
+
|
510
|
+
changed the version number
|
511
|
+
|
512
|
+
diff --git a/Rakefile b/Rakefile
|
513
|
+
index a874b73..8f94139 100644
|
514
|
+
--- a/Rakefile
|
515
|
+
+++ b/Rakefile
|
516
|
+
@@ -7,3 +7,3 @@ spec = Gem::Specification.new do |s|
|
517
|
+
s.name = "simplegit"
|
518
|
+
s.version = [-"0.1.0"-]{+"0.1.1"+}
|
519
|
+
s.author = "Scott Chacon"
|
520
|
+
|
521
|
+
Jak vidíte, výstup neobsahuje žádné přidané a odstraněné řádky, jak tomu bývá u běžného zobrazení rozdílů (diff). Místo toho se změny zobrazují uvnitř textu. Přidaná slova jsou uzavřena mezi značkami `{+ +}` a odstraněná jsou uzavřena v `[- -]`. Možná byste také rádi zredukovali obvyklé třířádkové okolí změny na pouhý jeden řádek, protože chcete znát okolí slova a ne okolí řádku. Můžeme toho dosáhnout zadáním parametru `-U1`, jako ve výše uvedeném příkladu.
|
522
|
+
|
523
|
+
Ve spojení s příkazem `git log` můžete použít také celou řadu shrnujících parametrů. Pokud například chcete zobrazit některé stručné statistiky pro každou revizi, použijte parametr `--stat`:
|
524
|
+
|
525
|
+
$ git log --stat
|
526
|
+
commit ca82a6dff817ec66f44342007202690a93763949
|
527
|
+
Author: Scott Chacon <schacon@gee-mail.com>
|
528
|
+
Date: Mon Mar 17 21:52:11 2008 -0700
|
529
|
+
|
530
|
+
changed the version number
|
531
|
+
|
532
|
+
Rakefile | 2 +-
|
533
|
+
1 file changed, 1 insertion(+), 1 deletion(-)
|
534
|
+
|
535
|
+
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
|
536
|
+
Author: Scott Chacon <schacon@gee-mail.com>
|
537
|
+
Date: Sat Mar 15 16:40:33 2008 -0700
|
538
|
+
|
539
|
+
removed unnecessary test code
|
540
|
+
|
541
|
+
lib/simplegit.rb | 5 -----
|
542
|
+
1 file changed, 5 deletions(-)
|
543
|
+
|
544
|
+
commit a11bef06a3f659402fe7563abf99ad00de2209e6
|
545
|
+
Author: Scott Chacon <schacon@gee-mail.com>
|
546
|
+
Date: Sat Mar 15 10:31:28 2008 -0700
|
547
|
+
|
548
|
+
first commit
|
549
|
+
|
550
|
+
README | 6 ++++++
|
551
|
+
Rakefile | 23 +++++++++++++++++++++++
|
552
|
+
lib/simplegit.rb | 25 +++++++++++++++++++++++++
|
553
|
+
3 files changed, 54 insertions(+)
|
554
|
+
|
555
|
+
Jak vidíte, parametr `--stat` vypíše pod každým záznamem revize seznam změněných souborů, kolik souborů bylo změněno (changed) a kolik řádků bylo v těchto souborech vloženo (insertions) a smazáno (deletions). Zároveň vloží na konec výpisu shrnutí těchto informací.
|
556
|
+
Další opravdu užitečnou možností je parametr `--pretty`. Tento parametr změní výstup logu na jiný než výchozí formát. K dispozici máte několik přednastavených možností. Parametr `oneline` vypíše všechny revize na jednom řádku. Tuto možnost oceníte při velkém množství revizí. Dále se nabízejí parametry `short`, `full` a `fuller` (zkrácený, plný, úplný). Zobrazují výstup přibližně ve stejném formátu, avšak s více či méně podrobnými informacemi:
|
557
|
+
|
558
|
+
$ git log --pretty=oneline
|
559
|
+
ca82a6dff817ec66f44342007202690a93763949 changed the version number
|
560
|
+
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
|
561
|
+
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
|
562
|
+
|
563
|
+
Nejzajímavějším parametrem je pak `format`, který umožňuje definovat vlastní formát výstupu logu. Tato možnost je užitečná zejména v situaci, kdy vytváříte výpis pro strojovou analýzu. Jelikož specifikujete formát explicitně, máte jistotu, že se s aktualizací systému Git nezmění:
|
564
|
+
|
565
|
+
$ git log --pretty=format:"%h - %an, %ar : %s"
|
566
|
+
ca82a6d - Scott Chacon, 11 months ago : changed the version number
|
567
|
+
085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
|
568
|
+
a11bef0 - Scott Chacon, 11 months ago : first commit
|
569
|
+
|
570
|
+
Tabulka 2-1 uvádí některé užitečné parametry, které format akceptuje.
|
571
|
+
|
572
|
+
<!-- Poznámka pro překladatele: toto je zápis tabulky.
|
573
|
+
Řádky musí být formátovány následovně
|
574
|
+
<TAB><Text prvního sloupce><TAB><Text druhého sloupce>
|
575
|
+
-->
|
576
|
+
|
577
|
+
Parametr Popis výstupu
|
578
|
+
%H Otisk (hash) revize
|
579
|
+
%h Zkrácený otisk revize
|
580
|
+
%T Otisk stromu
|
581
|
+
%t Zkrácený otisk stromu
|
582
|
+
%P Otisky rodičovských revizí
|
583
|
+
%p Zkrácené otisky rodičovských revizí
|
584
|
+
%an Jméno autora
|
585
|
+
%ae E-mail autora
|
586
|
+
%ad Datum autora (formát je možné nastavit parametrem --date)
|
587
|
+
%ar Datum autora, relativní
|
588
|
+
%cn Jméno autora revize
|
589
|
+
%ce E-mail autora revize
|
590
|
+
%cd Datum autora revize
|
591
|
+
%cr Datum autora revize, relativní
|
592
|
+
%s Předmět
|
593
|
+
|
594
|
+
Možná se ptáte, jaký je rozdíl mezi *autorem* a *autorem revize*. *Autor* (author) je osoba, která práci původně napsala, zatímco *autor revize* (committer) je osoba, která práci zapsala do repozitáře. Pokud tedy pošlete záplatu k projektu a některý z ústředních členů (core members) ji použije, do výpisu se dostanete oba – vy jako autor a core member jako autor revize. K tomuto rozlišení se blíže dostaneme v *kapitole 5*.
|
595
|
+
|
596
|
+
Parametry `oneline` a `format` jsou zvlášť užitečné ve spojení s další možností `log`u – parametrem `--graph`. Tento parametr vloží pěkný malý ASCII graf, znázorňující historii vaší větve a slučování, kterou si ukážeme na naší kopii repozitáře projektu Grit:
|
597
|
+
|
598
|
+
$ git log --pretty=format:"%h %s" --graph
|
599
|
+
* 2d3acf9 ignore errors from SIGCHLD on trap
|
600
|
+
* 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|
601
|
+
|\
|
602
|
+
| * 420eac9 Added a method for getting the current branch.
|
603
|
+
* | 30e367c timeout code and tests
|
604
|
+
* | 5a09431 add timeout protection to grit
|
605
|
+
* | e1193f8 support for heads with slashes in them
|
606
|
+
|/
|
607
|
+
* d6016bc require time for xmlschema
|
608
|
+
* 11d191e Merge branch 'defunkt' into local
|
609
|
+
|
610
|
+
To je jen několik základních parametrů k formátování výstupu pro příkaz `git log`, celkově jich je mnohem více. Tabulka 2-2 uvádí parametry, které jsme už zmínili, a některé další běžné parametry formátování, které mohou být užitečné. Pravý sloupec popisuje, jak který parametr změní výstup `log`u.
|
611
|
+
|
612
|
+
<!-- Poznámka pro překladatele: toto je zápis tabulky.
|
613
|
+
Řádky musí být formátovány následovně
|
614
|
+
<TAB><Text prvního sloupce><TAB><Text druhého sloupce>
|
615
|
+
-->
|
616
|
+
|
617
|
+
Parametr Popis
|
618
|
+
-p Zobrazí záplatu vytvořenou s každou revizí.
|
619
|
+
--word-diff Zobrazí záplatu ve tvaru rozdílu po slovech.
|
620
|
+
--stat Zobrazí statistiku pro změněné soubory v každé revizi.
|
621
|
+
--shortstat Zobrazí pouze řádek změněno/vloženo/smazáno z příkazu --stat.
|
622
|
+
--name-only Za informacemi o revizi zobrazí seznam změněných souborů.
|
623
|
+
--name-status Zobrazí seznam dotčených souborů spolu s informací přidáno/změněno/smazáno.
|
624
|
+
--abbrev-commit Zobrazí pouze prvních několik znaků kontrolního součtu SHA-1 místo všech 40.
|
625
|
+
--relative-date Zobrazí datum v relativním formátu (např. "2 weeks ago", tj. před 2 týdny) místo formátu s úplným datem.
|
626
|
+
--graph Zobrazí vedle výstupu logu ASCII graf k historii větve a slučování.
|
627
|
+
--pretty Zobrazí revize v alternativním formátu. Parametry příkazu jsou oneline, short, full, fuller a format (ve kterém uvedete svůj vlastní formát).
|
628
|
+
--oneline Užitečná zkratka pro `--pretty=oneline --abbrev-commit`.
|
629
|
+
|
630
|
+
### Omezení výstupu logu ###
|
631
|
+
|
632
|
+
Kromě parametrů k formátování výstupu lze pro `git log` použít také celou řadu omezujících parametrů, tj. takových, které zobrazí jen definovanou podmnožinu revizí. My už jsme se s jedním takovým parametrem setkali. Byl to parametr `-2`, který zobrazí pouze dvě poslední revize. Obecně lze tedy říci, že můžete zadat parametr `-<n>`, kde `n` je libovolné celé číslo pro zobrazení posledních `n` revizí. Je však třeba dodat, že tuto funkci asi nebudete využívat příliš často. Git totiž standardně redukuje všechny výpisy stránkovačem, a proto se vždy najednou zobrazí pouze jedna stránka logu.
|
633
|
+
|
634
|
+
Velmi užitečné jsou naproti tomu časově omezující parametry, jako `--since` a `--until` („od“ a „do“). Například tento příkaz zobrazí seznam všech revizí pořízených za poslední dva týdny (2 weeks):
|
635
|
+
|
636
|
+
$ git log --since=2.weeks
|
637
|
+
|
638
|
+
Tento příkaz pracuje s velkým množstvím formátů. Můžete zadat konkrétní datum („2008-01-15“) nebo relativní datum, např. „2 years 1 day 3 minutes ago“ (před 2 roky, 1 dnem a 3 minutami).
|
639
|
+
|
640
|
+
Z výpisu rovněž můžete filtrovat pouze revize, které odpovídají určitým kritériím. Parametr `--author` umožňuje filtrovat výpisy podle konkrétního autora, pomocí parametru `--grep` můžete ve zprávách k revizím vyhledávat klíčová slova. (Všimněte si, že pokud použijete současně parametry author a grep, bude příkaz vyhledávat záznamy splňující obojí.)
|
641
|
+
|
642
|
+
Pokud chcete zadat více parametrů grep, musíte přidat výraz `--all-match`, jinak se bude hledat kterýkoli z nich.
|
643
|
+
|
644
|
+
Posledním opravdu užitečným parametrem, který lze přidat k příkazu `git log` , je zadání cesty. Jestliže zadáte název adresáře nebo souboru, výstup logu tím omezíte na revize, které provedly změnu v těchto souborech. Cesta je vždy posledním parametrem a většinou jí předcházejí dvě pomlčky (`--`) , jimiž je oddělena od ostatních parametrů.
|
645
|
+
|
646
|
+
Tabulka 2-3 uvádí pro přehlednost zmíněné parametry a několik málo dalších. Tabulka 2.2
|
647
|
+
|
648
|
+
<!-- Poznámka pro překladatele: toto je zápis tabulky.
|
649
|
+
Řádky musí být formátovány následovně
|
650
|
+
<TAB><Text prvního sloupce><TAB><Text druhého sloupce>
|
651
|
+
-->
|
652
|
+
|
653
|
+
Parametr Popis
|
654
|
+
-(n) Zobrazí pouze posledních n revizí.
|
655
|
+
--since, --after Omezí výpis na revize provedené po zadaném datu.
|
656
|
+
--until, --before Omezí výpis na revize provedené před zadaným datem.
|
657
|
+
--author Zobrazí pouze revize, v nichž autor odpovídá zadanému řetězci.
|
658
|
+
--committer Zobrazí pouze revize, v nichž autor revize odpovídá zadanému řetězci.
|
659
|
+
|
660
|
+
|
661
|
+
### Omezení výstupního logu na určité datum nebo čas ###
|
662
|
+
|
663
|
+
Pokud chcete zjistit, které revize (commit) v repozitáři se zdrojovým kódem Git (git://git.kernel.org/pub/scm/git/git.git) mají datum zápisu (CommitDate) 2014-04-29 -- relativně k vašemu lokálnímu časovému pásmu (takovému, jaké je nastaveno na vašem počítači), použijte příkaz
|
664
|
+
|
665
|
+
$ git log --after="2014-04-29 00:00:00" --before="2014-04-29 23:59:59" \
|
666
|
+
--pretty=fuller
|
667
|
+
|
668
|
+
Protože se výstup bude lišit podle časového pásma v místě spuštění, doporučuje se v argumentech `--after` a `--before` vždy používat absolutní čas (například ve formátu ISO 8601, který obsahuje i informaci o časovém pásmu). Činíme tak proto, aby každý, kdo stejný příkaz spustí, obdržel stejné, opakovatelné výsledky.
|
669
|
+
|
670
|
+
Pokud chceme získat zápisy z určitého časového okamžiku (například z 29. dubna 2013 v 17:07:22 středoevropského času), můžeme použít příkaz
|
671
|
+
|
672
|
+
$ git log --after="2013-04-29T17:07:22+0200" \
|
673
|
+
--before="2013-04-29T17:07:22+0200" --pretty=fuller
|
674
|
+
|
675
|
+
commit de7c201a10857e5d424dbd8db880a6f24ba250f9
|
676
|
+
Author: Ramkumar Ramachandra <artagnon@gmail.com>
|
677
|
+
AuthorDate: Mon Apr 29 18:19:37 2013 +0530
|
678
|
+
Commit: Junio C Hamano <gitster@pobox.com>
|
679
|
+
CommitDate: Mon Apr 29 08:07:22 2013 -0700
|
680
|
+
|
681
|
+
git-completion.bash: lexical sorting for diff.statGraphWidth
|
682
|
+
|
683
|
+
df44483a (diff --stat: add config option to limit graph width,
|
684
|
+
2012-03-01) added the option diff.startGraphWidth to the list of
|
685
|
+
configuration variables in git-completion.bash, but failed to notice
|
686
|
+
that the list is sorted alphabetically. Move it to its rightful place
|
687
|
+
in the list.
|
688
|
+
|
689
|
+
Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
|
690
|
+
Signed-off-by: Junio C Hamano <gitster@pobox.com>
|
691
|
+
|
692
|
+
Výše uvedené časy (`AuthorDate`, `CommitDate`) se zobrazují v základním tvaru (`--date=default`), který zobrazuje informaci o časovém pásmu autora nebo přispěvatele.
|
693
|
+
|
694
|
+
K dalším užitečným formátům patří `--date=iso` (ISO 8601), `--date=rfc` (RFC 2822), `--date=raw` (sekundy od počátku (epoch; 1970-01-01 UTC)), `--date=local` (časy ve vašem lokálním časovém pásmu) a také `--date=relative` (jako například "2 hours ago", tj. před dvěma hodinami).
|
695
|
+
|
696
|
+
Pokud použijete příkaz `git log` bez určení času, uvažuje se čas odpovídající okamžiku spuštění na vašem počítači (používá stejný posun vůči UTC).
|
697
|
+
|
698
|
+
Pokud například na vašem počítači spustíte `git log` v 09:00 a vaše časové pásmo je vůči greenwichskému času posunuto o tři hodiny vpřed, pak se výsledek následujících dvou příkazů shoduje:
|
699
|
+
|
700
|
+
$ git log --after=2008-06-01 --before=2008-07-01
|
701
|
+
$ git log --after="2008-06-01T09:00:00+0300" \
|
702
|
+
--before="2008-07-01T09:00:00+0300"
|
703
|
+
|
704
|
+
A poslední příklad. Pokud chcete zjistit, které revize upravující testovací soubory ve zdrojovém kódu Git zapsal Junio Hamano v říjnu 2008 (relativě k časové zóně New Yorku) a které přitom nebyly sloučením (merge), můžete zadat následující příkaz:
|
705
|
+
|
706
|
+
$ git log --pretty="%h - %s" --author=gitster \
|
707
|
+
--after="2008-10-01T00:00:00-0400" \
|
708
|
+
--before="2008-10-31T23:59:59-0400" --no-merges -- t/
|
709
|
+
5610e3b - Fix testcase failure when extended attribute
|
710
|
+
acd3b9e - Enhance hold_lock_file_for_{update,append}()
|
711
|
+
f563754 - demonstrate breakage of detached checkout wi
|
712
|
+
d1a43f2 - reset --hard/read-tree --reset -u: remove un
|
713
|
+
51a94af - Fix "checkout --track -b newbranch" on detac
|
714
|
+
b0ad11e - pull: allow "git pull origin $something:$cur
|
715
|
+
|
716
|
+
Z více než 36 tisíc revizí v historii zdrojového kódu Git zobrazí tento příkaz 6 záznamů, které odpovídají zadaným kritériím.
|
717
|
+
|
718
|
+
### Grafické uživatelské rozhraní pro procházení historie ###
|
719
|
+
|
720
|
+
Chcete-li použít graficky výrazněji zpracovaný nástroj k procházení historie revizí, možná oceníte Tcl/Tk program nazvaný `gitk`, který je distribuován spolu se systémem Git. Gitk je v zásadě grafická verze příkazu `git log` a umožňuje téměř všechny možnosti filtrování jako `git log`. Pokud do příkazového řádku ve svém projektu zadáte příkaz `gitk`, otevře se okno podobné jako na obrázku 2-2.
|
721
|
+
|
722
|
+
Insert 18333fig0202.png
|
723
|
+
Obrázek 2-2. Graficky zpracovaná historie v nástroji „gitk“
|
724
|
+
|
725
|
+
V horní polovině okna vidíte historii revizí, doplněnou názorným hierarchickým grafem. Prohlížeč rozdílů v dolní polovině okna zobrazuje změny provedené v každé revizi, na niž kliknete.
|
726
|
+
|
727
|
+
## Rušení změn ##
|
728
|
+
|
729
|
+
Kdykoli se může stát, že byste nějakou úpravu chtěli vrátit do původního stavu.. Podívejme se proto, jaké základní nástroje se nám tu nabízejí. Ale buďte opatrní! Ne všechny zrušené změny se dají vrátit. Je to jedna z mála oblastí v systému Git, kdy při neuváženém postupu riskujete, že přijdete o část své práce.
|
730
|
+
|
731
|
+
### Změna poslední revize ###
|
732
|
+
|
733
|
+
Jedním z nejčastějších důvodů pro rušení úprav je situace, kdy zapíšete revizi příliš brzy a ještě jste například zapomněli přidat některé soubory, nebo byste rádi změnili zprávu k revizi. Chcete-li opravit poslední revizi, můžete spustit příkaz commit s parametrem `--amend`:
|
734
|
+
|
735
|
+
$ git commit --amend
|
736
|
+
|
737
|
+
Tento příkaz vezme vaši oblast připravených změn a použije ji k vytvoření revize. Pokud jste od poslední revize neprovedli žádné změny (například spustíte tento příkaz bezprostředně po předchozí revizi), bude snímek vypadat úplně stejně a jediné, co změníte, je zpráva k revizi.
|
738
|
+
|
739
|
+
Spustí se stejný editor pro editaci zpráv k revizím, ale tentokrát už obsahuje zprávu z vaší předchozí revize. Zprávu můžete editovat stejným způsobem jako vždy. Zpráva přepíše předchozí revizi.
|
740
|
+
|
741
|
+
Pokud například zapíšete revizi a potom si uvědomíte, že jste zapomněli připravit k zapsání změny v souboru, který jste chtěli do této revize přidat, můžete provést následující:
|
742
|
+
|
743
|
+
$ git commit -m 'initial commit'
|
744
|
+
$ git add forgotten_file
|
745
|
+
$ git commit --amend
|
746
|
+
|
747
|
+
Provedení uvedených tří příkazů zůstane jediná revize – druhý příkaz `commit` nahradí výsledky prvního.
|
748
|
+
|
749
|
+
### Odstranění souboru z oblasti připravených změn ###
|
750
|
+
|
751
|
+
Následující dvě části popisují, jak se poprat s oblastí připravených změn a se změnami v pracovním adresáři. Je příjemné, že příkaz, jímž se zjišťuje stav těchto dvou oblastí, zároveň připomíná, jak v nich nežádoucí změny zrušit. Řekněme například, že jste změnili dva soubory a chcete je zapsat jako dvě oddělené změny. Jenže omylem jste zadali příkaz `git add *` a oba soubory jste tím připravili k zapsání. Jak lze tyto dva soubory vrátit z oblasti připravených změn? Připomene vám to příkaz `git status`:
|
752
|
+
|
753
|
+
$ git add .
|
754
|
+
$ git status
|
755
|
+
On branch master
|
756
|
+
Changes to be committed:
|
757
|
+
(use "git reset HEAD <file>..." to unstage)
|
758
|
+
|
759
|
+
modified: README.txt
|
760
|
+
modified: benchmarks.rb
|
761
|
+
|
762
|
+
|
763
|
+
Přímo pod nadpisem „Changes to be committed“ (Změny k zapsání) se říká: pro návrat z oblasti připravených změn použijte příkaz `git reset HEAD <soubor>...` Budeme se tedy řídit touto radou a vrátíme soubor `benchmarks.rb` z oblasti připravených změn:
|
764
|
+
|
765
|
+
$ git reset HEAD benchmarks.rb
|
766
|
+
Unstaged changes after reset:
|
767
|
+
M benchmarks.rb
|
768
|
+
$ git status
|
769
|
+
On branch master
|
770
|
+
Changes to be committed:
|
771
|
+
(use "git reset HEAD <file>..." to unstage)
|
772
|
+
|
773
|
+
modified: README.txt
|
774
|
+
|
775
|
+
Changes not staged for commit:
|
776
|
+
(use "git add <file>..." to update what will be committed)
|
777
|
+
(use "git checkout -- <file>..." to discard changes in working directory)
|
778
|
+
|
779
|
+
modified: benchmarks.rb
|
780
|
+
|
781
|
+
|
782
|
+
Příkaz je sice trochu zvláštní, ale funguje. Soubor `benchmarks.rb` má stav „změněn“, ale už se nenachází v oblasti připravených změn.
|
783
|
+
|
784
|
+
### Rušení změn ve změněných souborech ###
|
785
|
+
|
786
|
+
A co když zjistíte, že nechcete zachovat změny, které jste provedli v souboru `benchmarks.rb`? Jak je můžete snadno zrušit a vrátit soubor zpět do podoby při poslední revizi (nebo při prvním klonování nebo v jakémkoli okamžiku, kdy jste ho zaznamenali v pracovním adresáři)? Příkaz `git status` vám naštěstí řekne, co dělat. U posledního příkladu vypadá oblast připravených změn takto:
|
787
|
+
|
788
|
+
Changes not staged for commit:
|
789
|
+
(use "git add <file>..." to update what will be committed)
|
790
|
+
(use "git checkout -- <file>..." to discard changes in working directory)
|
791
|
+
|
792
|
+
modified: benchmarks.rb
|
793
|
+
|
794
|
+
|
795
|
+
Výpis vám sděluje, jak zahodit změny (discard changes), které jste provedli (přinejmenším tak činí novější verze systému Git, od verze 1.6.1; pokud máte starší verzi, doporučujeme ji aktualizovat, čímž získáte některé z těchto vylepšených funkcí). Uděláme, co nám výpis radí:
|
796
|
+
|
797
|
+
$ git checkout -- benchmarks.rb
|
798
|
+
$ git status
|
799
|
+
On branch master
|
800
|
+
Changes to be committed:
|
801
|
+
(use "git reset HEAD <file>..." to unstage)
|
802
|
+
|
803
|
+
modified: README.txt
|
804
|
+
|
805
|
+
|
806
|
+
Jak vidíte, změny byly zahozeny. Všimněte si také, že se jedná o nebezpečný příkaz. Veškeré změny, které jste v souboru provedli, jsou ztraceny, soubor jste právě překopírovali jiným souborem. Nikdy tento příkaz nepoužívejte, pokud si nejste zcela jisti, že už daný soubor nebudete potřebovat. Pokud potřebujete pouze odstranit soubor z cesty, podívejte se na odkládání (stashing) a větvení v následující kapitole. Tyto postupy většinou bývají vhodnější.
|
807
|
+
|
808
|
+
Zapamatujte si, že vše, co je zapsáno v systému Git, lze téměř vždy obnovit. Obnovit lze dokonce i revize na odstraněných větvích nebo revize, které byly přepsány revizí `--amend` (o obnovování dat viz *kapitola 9*). Pokud však dojde ke ztrátě dat, která dosud nebyla součástí žádné revize, bude tato ztráta patrně nevratná.
|
809
|
+
|
810
|
+
## Práce se vzdálenými repozitáři ##
|
811
|
+
|
812
|
+
Abyste mohli spolupracovat na projektech v systému Git, je třeba vědět, jak manipulovat se vzdálenými repozitáři (remote repositories). Vzdálené repozitáře jsou verze vašeho projektu umístěné na Internetu nebo kdekoli v síti. Vzdálených repozitářů můžete mít hned několik, každý pro vás přitom bude buď pouze ke čtení (read-only) nebo ke čtení a zápisu (read write). Spolupráce s ostatními uživateli zahrnuje také správu těchto vzdálených repozitářů. Při sdílení práce musíte do těchto repozitářů data odesílat (push) a zase je z nich stahovat (pull).
|
813
|
+
Při správě vzdálených repozitářů musíte vědět, jak lze přidat vzdálený repozitář, jak odstranit vzdálený repozitář, který už není platný, jak spravovat různé vzdálené větve, jak je definovat jako sledované či nesledované a další věci. V této části se zaměříme právě na správu vzdálených repozitářů.
|
814
|
+
|
815
|
+
### Zobrazení vzdálených serverů ###
|
816
|
+
|
817
|
+
Chcete-li zjistit, jaké vzdálené servery máte nakonfigurovány, můžete použít příkaz `git remote`. Systém vypíše krátké názvy, přes které se se vzdálenými repozitáři manipuluje, a které jste dříve určili. Pokud byl váš repozitář vytvořen klonováním, měli byste vidět přinejmenším server *origin*. Jde o výchozí název, který Git dává serveru, z nějž jste repozitář klonovali.
|
818
|
+
|
819
|
+
$ git clone git://github.com/schacon/ticgit.git
|
820
|
+
Cloning into 'ticgit'...
|
821
|
+
remote: Reusing existing pack: 1857, done.
|
822
|
+
remote: Total 1857 (delta 0), reused 0 (delta 0)
|
823
|
+
Receiving objects: 100% (1857/1857), 374.35 KiB | 193.00 KiB/s, done.
|
824
|
+
Resolving deltas: 100% (772/772), done.
|
825
|
+
Checking connectivity... done.
|
826
|
+
$ cd ticgit
|
827
|
+
$ git remote
|
828
|
+
origin
|
829
|
+
|
830
|
+
Můžete rovněž zadat parametr `-v`, jenž zobrazí adresu URL, kterou má Git uloženou pro zkrácený název, který si přejete rozepsat.
|
831
|
+
|
832
|
+
$ git remote -v
|
833
|
+
origin git://github.com/schacon/ticgit.git (fetch)
|
834
|
+
origin git://github.com/schacon/ticgit.git (push)
|
835
|
+
|
836
|
+
Pokud používáte více než jeden vzdálený repozitář, příkaz je vypíše všechny. Například můj repozitář Grit vypadá takto:
|
837
|
+
|
838
|
+
$ cd grit
|
839
|
+
$ git remote -v
|
840
|
+
bakkdoor git://github.com/bakkdoor/grit.git
|
841
|
+
cho45 git://github.com/cho45/grit.git
|
842
|
+
defunkt git://github.com/defunkt/grit.git
|
843
|
+
koke git://github.com/koke/grit.git
|
844
|
+
origin git@github.com:mojombo/grit.git
|
845
|
+
|
846
|
+
To znamená, že mohu velmi snadno stáhnout příspěvky od kteréhokoli z těchto uživatelů. Ale všimněte si, že pouze vzdálený server origin je SSH URL, a je tedy jediným repozitářem, kam lze soubory odesílat (push; důvod objasníme v *kapitole 4*).
|
847
|
+
|
848
|
+
### Přidávání vzdálených repozitářů ###
|
849
|
+
|
850
|
+
V předchozích částech už jsem se letmo dotkl přidávání vzdálených repozitářů. V této části se dostávám k tomu, jak přesně při přidávání postupovat. Chcete-li přidat nový vzdálený repozitář Git a zadat zkrácený název, přes který se můžete snadno odkazovat, spusťte příkaz `git remote add [zkrácený název] [url]`:
|
851
|
+
|
852
|
+
$ git remote
|
853
|
+
origin
|
854
|
+
$ git remote add pb git://github.com/paulboone/ticgit.git
|
855
|
+
$ git remote -v
|
856
|
+
origin git://github.com/schacon/ticgit.git
|
857
|
+
pb git://github.com/paulboone/ticgit.git
|
858
|
+
|
859
|
+
Řetězec `pb` nyní můžete používat na příkazovém řádku místo kompletní adresy URL. Pokud například chcete vyzvednout (fetch) všechny informace, které má Paul, ale vy je ještě nemáte ve svém repozitáři, můžete spustit příkaz `git fetch pb`:
|
860
|
+
|
861
|
+
$ git fetch pb
|
862
|
+
remote: Counting objects: 58, done.
|
863
|
+
remote: Compressing objects: 100% (41/41), done.
|
864
|
+
remote: Total 44 (delta 24), reused 1 (delta 0)
|
865
|
+
Unpacking objects: 100% (44/44), done.
|
866
|
+
From git://github.com/paulboone/ticgit
|
867
|
+
* [new branch] master -> pb/master
|
868
|
+
* [new branch] ticgit -> pb/ticgit
|
869
|
+
|
870
|
+
Paulova hlavní větev (master branch) je teď lokálně dostupná jako `pb/master`. Můžete ji začlenit (merge) do některé ze svých větví, nebo ji můžete zpřístupnit jako lokální větev (check out), jestliže si ji chcete prohlédnout.
|
871
|
+
|
872
|
+
### Vyzvedávání a stahování ze vzdálených repozitářů ###
|
873
|
+
|
874
|
+
Jak jste právě viděli, data ze vzdálených projektů můžete získat pomocí příkazu:
|
875
|
+
|
876
|
+
$ git fetch [název vzdáleného repozitáře]
|
877
|
+
|
878
|
+
Příkaz zamíří do vzdáleného projektu a stáhne z něj všechna data, která ještě nemáte u sebe. Poté byste měli mít k dispozici odkazy na všechny větve tohoto vzdáleného projektu. Od toho okamžiku je můžete kdykoli slučovat nebo prohlížet. (Podrobněji se budeme větvím a jejich použití věnovat v *kapitole 3*.)
|
879
|
+
|
880
|
+
Pokud jste naklonovali repozitář, příkaz automaticky přidá tento vzdálený repozitář pod názvem *origin*. Takže příkaz `git fetch origin` vyzvedne veškerou novou práci, která byla na uvedený server poslána (push) od okamžiku, kdy jste odtud klonovali (nebo kdy jste odtud naposledy vyzvedávali práci). Měli bychom zmínit, že příkaz `fetch` stáhne data do vašeho lokálního repozitáře. V žádném případě ale data automaticky nesloučí s vaší prací ani jinak nezmění nic z toho, na čem právě pracujete. Sloučení s vaší prací musíte udělat ručně, až to uznáte za vhodné.
|
881
|
+
|
882
|
+
Pokud máte větev nastavenou ke sledování vzdálené větve (více informací naleznete v následující části a v *kapitole 3*), můžete použít příkaz `git pull`, který automaticky vyzvedne (fetch) a poté začlení (merge) vzdálenou větev do vaší aktuální větve. Tento postup pro vás může být snazší a pohodlnější. Standardně přitom příkaz `git clone` automaticky nastaví vaši lokální hlavní větev, aby sledovala vzdálenou hlavní větev na serveru, z kterého jste klonovali (za předpokladu, že má vzdálený server hlavní větev). Příkaz `git pull` většinou vyzvedne data ze serveru, z něhož jste původně klonovali, a automaticky se pokusí začlenit je do kódu, na němž právě pracujete.
|
883
|
+
|
884
|
+
### Odesílání do vzdálených repozitářů ###
|
885
|
+
|
886
|
+
Pokud se váš projekt nachází ve stavu, kdy ho chcete sdílet s ostatními, můžete ho odeslat (push) na vzdálený server. Příkaz pro tuto akci je jednoduchý: `git push [název vzdáleného repozitáře] [název větve]`. Pokud chcete poslat svou hlavní větev na server `origin` (i tady platí, že proces klonování vám nastaví názvy `master` i `origin` automaticky), můžete k odeslání své práce na server použít tento příkaz:
|
887
|
+
|
888
|
+
$ git push origin master
|
889
|
+
|
890
|
+
Tento příkaz bude funkční, pouze pokud jste klonovali ze serveru, k němuž máte oprávnění pro zápis, a pokud sem od vašeho klonování nikdo neposílal svou práci. Pokud spolu s vámi provádí současně klonování ještě někdo další a ten poté svou práci odešle na server, vaše později odesílaná práce bude oprávněně odmítnuta. Nejprve musíte stáhnout práci ostatních a začlenit ji do své, teprve potom vám server umožní odeslání. Více informací o odesílání na vzdálené servery najdete v *kapitole 3*.
|
891
|
+
|
892
|
+
### Prohlížení vzdálených repozitářů ###
|
893
|
+
|
894
|
+
Jestliže chcete získat více informací o konkrétním vzdáleném repozitáři, můžete použít příkaz `git remote show [název vzdáleného repozitáře]`. Pokud použijete tento příkaz v kombinaci s konkrétním zkráceným názvem (např. `origin`), bude výstup vypadat zhruba následovně:
|
895
|
+
|
896
|
+
$ git remote show origin
|
897
|
+
* remote origin
|
898
|
+
URL: git://github.com/schacon/ticgit.git
|
899
|
+
Remote branch merged with 'git pull' while on branch master
|
900
|
+
master
|
901
|
+
Tracked remote branches
|
902
|
+
master
|
903
|
+
ticgit
|
904
|
+
|
905
|
+
Bude obsahovat adresu URL vzdáleného repozitáře a informace ke sledování větví. Příkaz vám mimo jiné sděluje, že pokud se nacházíte na hlavní větvi (branch `master`) a spustíte příkaz `git pull`, pak se po vyzvednutí všech vzdálených referencí (fetch) práce z hlavní větve na vzdáleném serveru automaticky začlení (merge). Součástí výpisu jsou také všechny vzdálené reference, které příkaz stáhl.
|
906
|
+
|
907
|
+
S uvedeným jednoduchým případem se pravděpodobně setkáte. Pokud však Git používáte na intenzivněji, může vám příkaz `git remote show` zobrazit mnohem více informací:
|
908
|
+
|
909
|
+
$ git remote show origin
|
910
|
+
* remote origin
|
911
|
+
URL: git@github.com:defunkt/github.git
|
912
|
+
Remote branch merged with 'git pull' while on branch issues
|
913
|
+
issues
|
914
|
+
Remote branch merged with 'git pull' while on branch master
|
915
|
+
master
|
916
|
+
New remote branches (next fetch will store in remotes/origin)
|
917
|
+
caching
|
918
|
+
Stale tracking branches (use 'git remote prune')
|
919
|
+
libwalker
|
920
|
+
walker2
|
921
|
+
Tracked remote branches
|
922
|
+
acl
|
923
|
+
apiv2
|
924
|
+
dashboard2
|
925
|
+
issues
|
926
|
+
master
|
927
|
+
postgres
|
928
|
+
Local branch pushed with 'git push'
|
929
|
+
master:master
|
930
|
+
|
931
|
+
Tento příkaz ukazuje, která větev bude automaticky odeslána, pokud spustíte příkaz `git push` na určitých větvích. Příkaz vám také oznámí, které vzdálené větve na serveru ještě nemáte, které vzdálené větve máte, ale ze serveru už byly odstraněny, a několik větví, které budou automaticky sloučeny, jestliže spustíte příkaz `git pull`.
|
932
|
+
|
933
|
+
### Odstraňování a přejmenovávání vzdálených repozitářů ###
|
934
|
+
|
935
|
+
Chcete-li změnit zkrácené jméno vzdáleného repozitáře, můžete v novějších verzích systému Git spustit příkaz `git remote rename`. Pokud například chcete přejmenovat repozitář z `pb` na `paul`, můžete tak učinit příkazem `git remote rename`:
|
936
|
+
|
937
|
+
$ git remote rename pb paul
|
938
|
+
$ git remote
|
939
|
+
origin
|
940
|
+
paul
|
941
|
+
|
942
|
+
Za zmínku stojí, že tímto příkazem změníte zároveň i názvy vzdálených větví. Z původní reference `pb/master` se tak nyní stává `paul/master`.
|
943
|
+
|
944
|
+
Chcete-li, ať už z jakéhokoli důvodu, odstranit referenci (přesunuli jste například server nebo už nepoužíváte dané zrcadlo, nebo třeba přispěvatel přestal přispívat), můžete využít příkaz `git remote rm`:
|
945
|
+
|
946
|
+
$ git remote rm paul
|
947
|
+
$ git remote
|
948
|
+
origin
|
949
|
+
|
950
|
+
## Značky ##
|
951
|
+
|
952
|
+
Stejně jako většina systémů VCS nabízí i Git možnost označovat v historii určitá místa, jež považujete za důležitá. Tato funkce se nejčastěji používá k označení jednotlivých vydání (například `v1.0`). V této části vysvětlíme, jak pořídíte výpis všech dostupných značek, jak lze vytvářet značky nové a jaké typy značek se vám nabízejí.
|
953
|
+
|
954
|
+
### Výpis značek ###
|
955
|
+
|
956
|
+
Pořízení výpisu dostupných značek (tags) je v systému Git jednoduché. Stačí zadat příkaz `git tag`:
|
957
|
+
|
958
|
+
$ git tag
|
959
|
+
v0.1
|
960
|
+
v1.3
|
961
|
+
|
962
|
+
Tento příkaz vypíše značky v abecedním pořadí. Pořadí, v němž se značky vyskytují, není relevantní.
|
963
|
+
|
964
|
+
Značky lze vyhledávat také pomocí konkrétní masky. Například zdrojový kód Git „repo“ obsahuje více než 240 značek. Pokud vás však zajímá pouze verze 1.4.2., můžete zadat:
|
965
|
+
|
966
|
+
$ git tag -l 'v1.4.2.*'
|
967
|
+
v1.4.2.1
|
968
|
+
v1.4.2.2
|
969
|
+
v1.4.2.3
|
970
|
+
v1.4.2.4
|
971
|
+
|
972
|
+
### Vytváření značek ###
|
973
|
+
|
974
|
+
Git používá dva hlavní druhy značek: prosté (lightweight) a anotované (annotated). Prostá značka se velmi podobá větvi, která se nemění – je to pouze ukazatel na konkrétní revizi. Naproti tomu anotované značky jsou ukládány jako plné objekty v databázi Git. U anotovaných značek se provádí kontrolní součet. Obsahují jméno autora značky (tagger), e-mail a datum, nesou vlastní zprávu (tagging message) a mohou být podepsány (signed) a ověřeny (verified) v programu GNU Privacy Guard (GPG). Obecně se doporučuje používat v zájmu úplnosti informací spíše anotované značky. Pokud však vytváříte pouze dočasnou značku nebo z nějakého důvodu nechcete zadávat podrobnější informace, můžete využívat i prosté značky.
|
975
|
+
|
976
|
+
### Anotované značky ###
|
977
|
+
|
978
|
+
Vytvoření anotované značky v systému Git je jednoduché. Nejjednodušším způsobem je zadat k příkazu `tag` parametr `-a`:
|
979
|
+
|
980
|
+
$ git tag -a v1.4 -m 'my version 1.4'
|
981
|
+
$ git tag
|
982
|
+
v0.1
|
983
|
+
v1.3
|
984
|
+
v1.4
|
985
|
+
|
986
|
+
Parametr `-m` udává zprávu značky, která bude uložena spolu se značkou. Pokud u anotované značky nezadáte žádnou zprávu, Git spustí textový editor, v němž zprávu zadáte.
|
987
|
+
|
988
|
+
Informace značky se zobrazí spolu s revizí, kterou značka označuje, po zadání příkazu `git show`:
|
989
|
+
|
990
|
+
$ git show v1.4
|
991
|
+
tag v1.4
|
992
|
+
Tagger: Scott Chacon <schacon@gee-mail.com>
|
993
|
+
Date: Mon Feb 9 14:45:11 2009 -0800
|
994
|
+
|
995
|
+
my version 1.4
|
996
|
+
|
997
|
+
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
|
998
|
+
Merge: 4a447f7... a6b4c97...
|
999
|
+
Author: Scott Chacon <schacon@gee-mail.com>
|
1000
|
+
Date: Sun Feb 8 19:02:46 2009 -0800
|
1001
|
+
|
1002
|
+
Merge branch 'experiment'
|
1003
|
+
|
1004
|
+
Příkaz zobrazí ještě před informacemi o revizi informace o autorovi značky, datu, kdy byla revize označena, a zprávu značky.
|
1005
|
+
|
1006
|
+
### Podepsané značky ###
|
1007
|
+
|
1008
|
+
Máte-li soukromý klíč, lze značky rovněž podepsat v programu GPG. Jediné, co pro to musíte udělat, je zadat místo parametru `-a` parametr `-s`:
|
1009
|
+
|
1010
|
+
$ git tag -s v1.5 -m 'my signed 1.5 tag'
|
1011
|
+
You need a passphrase to unlock the secret key for
|
1012
|
+
user: "Scott Chacon <schacon@gee-mail.com>"
|
1013
|
+
1024-bit DSA key, ID F721C45A, created 2009-02-09
|
1014
|
+
|
1015
|
+
Pokud pro tuto značku spustíte příkaz `git show`, uvidíte k ní připojen svůj podpis GPG:
|
1016
|
+
|
1017
|
+
$ git show v1.5
|
1018
|
+
tag v1.5
|
1019
|
+
Tagger: Scott Chacon <schacon@gee-mail.com>
|
1020
|
+
Date: Mon Feb 9 15:22:20 2009 -0800
|
1021
|
+
|
1022
|
+
my signed 1.5 tag
|
1023
|
+
-----BEGIN PGP SIGNATURE-----
|
1024
|
+
Version: GnuPG v1.4.8 (Darwin)
|
1025
|
+
|
1026
|
+
iEYEABECAAYFAkmQurIACgkQON3DxfchxFr5cACeIMN+ZxLKggJQf0QYiQBwgySN
|
1027
|
+
Ki0An2JeAVUCAiJ7Ox6ZEtK+NvZAj82/
|
1028
|
+
=WryJ
|
1029
|
+
-----END PGP SIGNATURE-----
|
1030
|
+
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
|
1031
|
+
Merge: 4a447f7... a6b4c97...
|
1032
|
+
Author: Scott Chacon <schacon@gee-mail.com>
|
1033
|
+
Date: Sun Feb 8 19:02:46 2009 -0800
|
1034
|
+
|
1035
|
+
Merge branch 'experiment'
|
1036
|
+
|
1037
|
+
V dalších částech se naučíte, jak podepsané značky ověřovat.
|
1038
|
+
|
1039
|
+
### Prosté značky ###
|
1040
|
+
|
1041
|
+
Další možností, jak označit revizi, je prostá značka. Prostá značka je v podstatě kontrolní součet revize uložený v souboru, žádné další informace neobsahuje. Chcete-li vytvořit prostou značku, nezadávejte ani jeden z parametrů `-a`, `-s` nebo `-m`:
|
1042
|
+
|
1043
|
+
$ git tag v1.4-lw
|
1044
|
+
$ git tag
|
1045
|
+
v0.1
|
1046
|
+
v1.3
|
1047
|
+
v1.4
|
1048
|
+
v1.4-lw
|
1049
|
+
v1.5
|
1050
|
+
|
1051
|
+
Pokud spustíte pro značku příkaz `git show` tentokrát, nezobrazí se k ní žádné další informace. Příkaz zobrazí pouze samotnou revizi:
|
1052
|
+
|
1053
|
+
$ git show v1.4-lw
|
1054
|
+
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
|
1055
|
+
Merge: 4a447f7... a6b4c97...
|
1056
|
+
Author: Scott Chacon <schacon@gee-mail.com>
|
1057
|
+
Date: Sun Feb 8 19:02:46 2009 -0800
|
1058
|
+
|
1059
|
+
Merge branch 'experiment'
|
1060
|
+
|
1061
|
+
### Ověřování značek ###
|
1062
|
+
|
1063
|
+
Chcete-li ověřit podepsanou značku, použijte příkaz `git tag -v [název značky]`. Tento příkaz využívá k ověření podpisu program GPG. Aby příkaz správně fungoval, musíte mít ve své klíčence veřejný klíč podepisujícího (signer).
|
1064
|
+
|
1065
|
+
$ git tag -v v1.4.2.1
|
1066
|
+
object 883653babd8ee7ea23e6a5c392bb739348b1eb61
|
1067
|
+
type commit
|
1068
|
+
tag v1.4.2.1
|
1069
|
+
tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700
|
1070
|
+
|
1071
|
+
GIT 1.4.2.1
|
1072
|
+
|
1073
|
+
Minor fixes since 1.4.2, including git-mv and git-http with alternates.
|
1074
|
+
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
|
1075
|
+
gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
|
1076
|
+
gpg: aka "[jpeg image of size 1513]"
|
1077
|
+
Primary key fingerprint: 3565 2A26 2040 E066 C9A7 4A7D C0C6 D9A4 F311 9B9A
|
1078
|
+
|
1079
|
+
Pokud veřejný klíč podepisujícího nemáte, výstup bude vypadat následovně:
|
1080
|
+
|
1081
|
+
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
|
1082
|
+
gpg: Can't check signature: public key not found
|
1083
|
+
error: could not verify the tag 'v1.4.2.1'
|
1084
|
+
|
1085
|
+
### Dodatečné označení ###
|
1086
|
+
|
1087
|
+
Revizi lze označit značkou i poté, co jste ji už opustili. Předpokládejme, že vaše historie revizí vypadá takto:
|
1088
|
+
|
1089
|
+
$ git log --pretty=oneline
|
1090
|
+
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
|
1091
|
+
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
|
1092
|
+
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
|
1093
|
+
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
|
1094
|
+
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
|
1095
|
+
4682c3261057305bdd616e23b64b0857d832627b added a todo file
|
1096
|
+
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
|
1097
|
+
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
|
1098
|
+
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
|
1099
|
+
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
|
1100
|
+
|
1101
|
+
Nyní předpokládejme, že jste projektu zapomněli přidělit značku `v1.2`, která byla obsažena v revizi označené jako „updated rakefile“. Značku můžete přidat dodatečně. Pro označení revize značkou zadejte na konec příkazu kontrolní součet revize (nebo jeho část):
|
1102
|
+
|
1103
|
+
$ git tag -a v1.2 -m 'version 1.2' 9fceb02
|
1104
|
+
|
1105
|
+
Můžete se podívat, že jste revizi označil:
|
1106
|
+
|
1107
|
+
$ git tag
|
1108
|
+
v0.1
|
1109
|
+
v1.2
|
1110
|
+
v1.3
|
1111
|
+
v1.4
|
1112
|
+
v1.4-lw
|
1113
|
+
v1.5
|
1114
|
+
|
1115
|
+
$ git show v1.2
|
1116
|
+
tag v1.2
|
1117
|
+
Tagger: Scott Chacon <schacon@gee-mail.com>
|
1118
|
+
Date: Mon Feb 9 15:32:16 2009 -0800
|
1119
|
+
|
1120
|
+
version 1.2
|
1121
|
+
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
|
1122
|
+
Author: Magnus Chacon <mchacon@gee-mail.com>
|
1123
|
+
Date: Sun Apr 27 20:43:35 2008 -0700
|
1124
|
+
|
1125
|
+
updated rakefile
|
1126
|
+
...
|
1127
|
+
|
1128
|
+
### Sdílení značek ###
|
1129
|
+
|
1130
|
+
Příkaz `git push` nepřenáší značky na vzdálené servery automaticky. Pokud jste vytvořili značku, budete ji muset na sdílený server poslat explicitně. Tento proces je stejný jako sdílení vzdálených větví. Spusťte příkaz `git push origin [název značky]`.
|
1131
|
+
|
1132
|
+
$ git push origin v1.5
|
1133
|
+
Counting objects: 50, done.
|
1134
|
+
Compressing objects: 100% (38/38), done.
|
1135
|
+
Writing objects: 100% (44/44), 4.56 KiB, done.
|
1136
|
+
Total 44 (delta 18), reused 8 (delta 1)
|
1137
|
+
To git@github.com:schacon/simplegit.git
|
1138
|
+
* [new tag] v1.5 -> v1.5
|
1139
|
+
|
1140
|
+
Máte-li značek více a chcete je odeslat všechny najednou, můžete použít také parametr `--tags`, který se přidává k příkazu `git push`. Tento příkaz přenese na vzdálený server všechny vaše značky, které tam ještě nejsou.
|
1141
|
+
|
1142
|
+
$ git push origin --tags
|
1143
|
+
Counting objects: 50, done.
|
1144
|
+
Compressing objects: 100% (38/38), done.
|
1145
|
+
Writing objects: 100% (44/44), 4.56 KiB, done.
|
1146
|
+
Total 44 (delta 18), reused 8 (delta 1)
|
1147
|
+
To git@github.com:schacon/simplegit.git
|
1148
|
+
* [new tag] v0.1 -> v0.1
|
1149
|
+
* [new tag] v1.2 -> v1.2
|
1150
|
+
* [new tag] v1.4 -> v1.4
|
1151
|
+
* [new tag] v1.4-lw -> v1.4-lw
|
1152
|
+
* [new tag] v1.5 -> v1.5
|
1153
|
+
|
1154
|
+
Pokud nyní někdo bude klonovat nebo stahovat z vašeho repozitáře, stáhne rovněž všechny vaše značky.
|
1155
|
+
|
1156
|
+
## Tipy a triky ##
|
1157
|
+
|
1158
|
+
Než ukončíme tuto kapitolu věnovanou základům práce se systémem Git, přidáme ještě pár tipů a triků, které vám mohou usnadnit či zpříjemnit práci. Mnoho uživatelů pracuje se systémem Git, aniž by tyto triky znali a používali. V dalších částech knihy se už o nich nebudeme zmiňovat ani nebudeme předpokládat, že je používáte. Přesto pro vás mohou být užitečné.
|
1159
|
+
|
1160
|
+
### Automatické dokončování ###
|
1161
|
+
|
1162
|
+
Jestliže používáte shell Bash, nabízí vám Git možnost zapnout si skript pro automatické dokončování. Stáhněte si jej ze zdrojových textů systému Git z https://github.com/git/git/blob/master/contrib/completion/git-completion.bash. Soubor nakopírujte tento do vašeho domovského adresáře a do souboru `.bashrc` přidejte:
|
1163
|
+
|
1164
|
+
source ~/git-completion.bash
|
1165
|
+
|
1166
|
+
Chcete-li nastavit Git tak, aby měl automaticky dokončování pro shell Bash pro všechny uživatele, zkopírujte u systému Mac tento skript do adresáře `/opt/local/etc/bash_completion.d`, nebo u systémů Linux do adresáře `/etc/bash_completion.d/`. Jde o adresář skriptů, ze kterého si Bash automaticky načítá podporu pro shellové dokončování.
|
1167
|
+
|
1168
|
+
Pokud používáte Git Bash v systému Windows (Git Bash je pro instalaci msysGit pod Windows výchozím programem), mělo by být automatické dokončování přednastaveno.
|
1169
|
+
|
1170
|
+
Při zadávání příkazu Git stiskněte klávesu Tab a měla by se objevit nabídka, z níž můžete zvolit příslušné dokončení:
|
1171
|
+
|
1172
|
+
$ git co<tab><tab>
|
1173
|
+
commit config
|
1174
|
+
|
1175
|
+
Pokud zadáte – stejně jako v našem příkladu nahoře – `git co` a dvakrát stisknete klávesu Tab, systém vám navrhne „commit“ a „config“. Doplníte-li ještě `m<tab>`, skript automaticky dokončí příkaz na `git commit`.
|
1176
|
+
|
1177
|
+
Automatické dokončování pravděpodobně více využijete v případě parametrů. Pokud například zadáváte příkaz `git log` a nemůžete si vzpomenout na některý z parametrů, můžete zadat jeho začátek, stisknout klávesu Tab a podívat se, co by to mohlo přesně být:
|
1178
|
+
|
1179
|
+
$ git log --s<tab>
|
1180
|
+
--shortstat --since= --src-prefix= --stat --summary
|
1181
|
+
|
1182
|
+
Jedná se o užitečný trik, který vám může ušetřit čas a pročítání dokumentace.
|
1183
|
+
|
1184
|
+
### Aliasy Git ###
|
1185
|
+
|
1186
|
+
Jestliže zadáte systému Git neúplný příkaz, systém ho neakceptuje. Pokud nechcete zadávat celý text příkazů Git, můžete pomocí `git config` jednoduše nastavit pro každý příkaz tzv. alias. Uveďme několik příkladů možného nastavení:
|
1187
|
+
|
1188
|
+
$ git config --global alias.co checkout
|
1189
|
+
$ git config --global alias.br branch
|
1190
|
+
$ git config --global alias.ci commit
|
1191
|
+
$ git config --global alias.st status
|
1192
|
+
|
1193
|
+
To znamená, že například místo kompletního příkazu `git commit` stačí zadat pouze zkrácené `git ci`. Budete-li pracovat v systému Git častěji, pravděpodobně budete hojně využívat i jiné příkazy. V takovém případě neváhejte a vytvořte si nové aliasy.
|
1194
|
+
|
1195
|
+
Tato metoda může být velmi užitečná také k vytváření příkazů, které by podle vás měly existovat. Pokud jste například narazili na problém s používáním příkazu pro vrácení souboru z oblasti připravených změn, můžete ho vyřešit zadáním vlastního aliasu:
|
1196
|
+
|
1197
|
+
$ git config --global alias.unstage 'reset HEAD --'
|
1198
|
+
|
1199
|
+
Po zadání takového příkazu budete mít k dispozici dva ekvivalentní příkazy:
|
1200
|
+
|
1201
|
+
$ git unstage fileA
|
1202
|
+
$ git reset HEAD fileA
|
1203
|
+
|
1204
|
+
Příkaz unstage je o něco jasnější. Běžně se také přidává příkaz `last`:
|
1205
|
+
|
1206
|
+
$ git config --global alias.last 'log -1 HEAD'
|
1207
|
+
|
1208
|
+
Tímto způsobem snadno zobrazíte poslední revizi:
|
1209
|
+
|
1210
|
+
$ git last
|
1211
|
+
commit 66938dae3329c7aebe598c2246a8e6af90d04646
|
1212
|
+
Author: Josh Goebel <dreamer3@example.com>
|
1213
|
+
Date: Tue Aug 26 19:48:51 2008 +0800
|
1214
|
+
|
1215
|
+
test for current head
|
1216
|
+
|
1217
|
+
Signed-off-by: Scott Chacon <schacon@example.com>
|
1218
|
+
|
1219
|
+
Chtělo by se tedy říci, že Git jednoduše nahradí nový příkaz jakýmkoli aliasem, který vytvoříte. Může se však stát, že budete chtít spustit externí příkaz, a ne dílčí příkaz Git. V takovém případě zadejte na začátek příkazu znak `!`. Tuto možnost využijete, pokud si píšete své vlastní nástroje, které fungují s repozitářem Git. Jako příklad můžeme uvést situaci, kdy nahradíte příkaz `git visual` aliasem `gitk`:
|
1220
|
+
|
1221
|
+
$ git config --global alias.visual '!gitk'
|
1222
|
+
|
1223
|
+
## Shrnutí ##
|
1224
|
+
|
1225
|
+
V tomto okamžiku už tedy umíte v systému Git provádět všechny základní lokální operace: vytvářet a klonovat repozitáře, provádět změny, připravit je k zapsání i zapisovat nebo třeba zobrazit historii všech změn, které prošly repozitářem. V další kapitole se podíváme na exkluzivní funkci systému Git – na model větvení.
|