From 1f45707885b1f83f041d64277c1f095b649ef370 Mon Sep 17 00:00:00 2001 From: luhuadong Date: Wed, 8 May 2024 14:22:27 +0800 Subject: [PATCH 01/10] chore: move articles to src/guide --- .../images/005101_de0c032b_2027303.png" | Bin .../images/140747_66a7c384_7799079.png" | Bin .../images/145816_170e8c7e_3026149.png" | Bin .../images/184105_3963f1ac_5406987.jpeg" | Bin .../images/184138_28edf92b_5406987.jpeg" | Bin .../images/185019_43cb87e5_5406987.png" | Bin .../images/185648_79e99440_5406987.jpeg" | Bin .../images/185706_6c3d4653_5406987.jpeg" | Bin .../images/185728_2a4fd21a_5406987.jpeg" | Bin .../images/185744_24f8e47b_5406987.jpeg" | Bin .../images/185756_8c42cddf_5406987.jpeg" | Bin .../images/190041_d97025e2_5694891.png" | Bin .../images/223608_99ebf50e_1998139.jpeg" | Bin .../images/223852_ccf37eaa_1998139.jpeg" | Bin .../images/223937_2408e51a_1998139.jpeg" | Bin .../images/224104_42883a6d_1998139.jpeg" | Bin .../images/224307_aeb3bb91_1998139.jpeg" | Bin .../images/logo-OpenAtomFoundaton.svg" | Bin ...\271\210\346\230\257\345\274\200\346\272\220.md" | 0 ...\212\200\346\234\257\346\210\220\351\225\277.md" | 0 ...\230\257\345\274\200\346\272\220\347\232\204.md" | 0 ...\272\220\345\237\272\351\207\221\344\274\232.md" | 0 ...\270\270\350\247\201\350\257\257\345\214\272.md" | 0 ...\226\207\344\273\266\350\256\244\350\257\206.md" | 0 ...\234\213\345\276\205\345\274\200\346\272\220.md" | 0 ...\217\221\345\261\225\350\266\213\345\212\277.md" | 0 .../images/095504_32fddf55_1277510.png" | Bin .../images/095610_3fe4df54_1277510.png" | Bin .../images/095627_8b4fadf6_1277510.png" | Bin .../images/095655_074d520b_1277510.png" | Bin .../images/095715_67d435b1_1277510.png" | Bin .../images/121602_7f774b18_1277510.png" | Bin .../images/121656_f6ccd9c7_1277510.png" | Bin .../images/121732_dd5fd2c8_1277510.png" | Bin .../images/121827_6dd23a40_1277510.png" | Bin .../images/121905_7de2c1b7_1277510.png" | Bin .../images/121940_60a50a92_1277510.png" | Bin .../images/122018_2ef66098_1277510.png" | Bin .../images/122051_3d9f8f40_1277510.png" | Bin .../images/122123_f025a6a2_1277510.png" | Bin .../images/122205_fa7de81b_1277510.png" | Bin .../images/122231_61ed06f5_1277510.png" | Bin .../images/122301_aeea5b92_1277510.png" | Bin .../images/122341_7c087174_1277510.png" | Bin .../images/122400_f9648c84_1277510.png" | Bin .../images/150351_aaf54390_8456984.png" | Bin .../images/150408_a80b686f_8456984.png" | Bin .../images/150429_3f7cb023_8456984.png" | Bin .../images/150447_58b43a00_8456984.png" | Bin .../images/150501_421219a8_8456984.png" | Bin .../images/150531_69fb8ed9_8456984.gif" | Bin .../images/150546_b6c50179_8456984.png" | Bin .../images/150559_4e6f6afc_8456984.png" | Bin .../images/150610_4351a9ea_8456984.png" | Bin .../images/150637_0c8c1499_8456984.gif" | Bin .../images/150654_687717a7_8456984.png" | Bin .../images/150708_fe12dee3_8456984.png" | Bin .../images/150915_d55c2b70_8456984.png" | Bin .../images/150928_84fd4489_8456984.png" | Bin .../images/150946_953a2d7e_8456984.png" | Bin .../images/151115_93315a5e_1277510.png" | Bin .../images/151142_abdbc1da_1277510.png" | Bin .../images/151211_cfa06098_1277510.png" | Bin .../images/151238_25c34fd1_1277510.png" | Bin .../images/151304_d991149d_1277510.png" | Bin .../images/153011_d625f1ff_1899066.png" | Bin .../images/153021_0701f7f6_1899066.png" | Bin .../images/153036_247bbc53_1899066.png" | Bin .../images/155106_78a14137_8456984.png" | Bin .../images/160712_621d0351_8456984.png" | Bin .../images/160726_a311f8f8_8456984.png" | Bin .../images/160740_eff52230_8456984.gif" | Bin .../images/184559_3f5d281c_1277510.png" | Bin .../images/210726_a1f2fb20_8456984.png" | Bin .../images/210742_4cf5244b_8456984.png" | Bin .../images/210813_1923ef71_8456984.gif" | Bin .../images/210834_1996cb81_8456984.gif" | Bin .../images/210900_ec78c0a3_8456984.png" | Bin .../images/210912_81ab2e4b_8456984.png" | Bin .../images/211003_c2c14ec9_8456984.gif" | Bin .../images/211325_db7cf976_8456984.png" | Bin .../images/211338_5f0754d0_8456984.png" | Bin .../images/211356_5be9f12f_8456984.png" | Bin .../images/211415_eb747ed6_8456984.png" | Bin .../images/211618_853d205c_8456984.png" | Bin .../images/211746_ebc51069_8456984.png" | Bin .../images/211802_7f52d86e_8456984.png" | Bin .../images/211815_7a8e3dab_8456984.png" | Bin .../images/211832_21255b22_8456984.png" | Bin .../images/211849_884cb0ca_8456984.png" | Bin .../images/213111_8df051bf_8456984.gif" | Bin ...\270\215\345\220\214\350\247\222\350\211\262.md" | 0 ...\274\200\346\272\220\350\264\241\347\214\256.md" | 0 ...\217\202\344\270\216\345\274\200\346\272\220.md" | 0 ...\217\202\344\270\216\345\274\200\346\272\220.md" | 0 ...\277\233\350\241\214\350\264\241\347\214\256.md" | 0 ...44\347\254\254\344\270\200\344\270\252 Issue.md" | 0 ...254\254\344\270\200\344\270\252 Pull Request.md" | 0 ...\277\203\350\264\241\347\214\256\350\200\205.md" | 0 ...\214\256\350\200\205\345\205\254\347\272\246.md" | 0 .../images/102300_01aed884_5694891.png" | Bin .../images/104325_a52fecd7_5694891.png" | Bin .../images/104817_073e4ef5_5694891.png" | Bin .../images/134612_c1c80e44_5694891.png" | Bin .../images/134908_9d839d42_5694891.png" | Bin ...\274\200\346\272\220\351\241\271\347\233\256.md" | 0 ...\257\245\346\200\216\344\271\210\350\257\273.md" | 0 ...\272\220\350\256\270\345\217\257\350\257\201.md" | 0 ...\265\236\350\265\217\346\226\207\345\214\226.md" | 0 ...\274\200\346\272\220\351\241\271\347\233\256.md" | 0 ...\246\202\344\275\225\351\200\211\346\213\251.md" | 0 ...\274\200\346\272\220\347\244\276\345\214\272.md" | 0 ...\262\273\347\220\206\346\236\266\346\236\204.md" | 0 ...\207\240\344\270\252\350\246\201\347\202\271.md" | 0 ...\201\232\345\245\275\345\271\263\350\241\241.md" | 0 ...\232\204\345\225\206\344\270\232\345\214\226.md" | 0 .../images/100205_f14f796d_1277510.png" | Bin .../images/101008_b0b4e938_1277510.png" | Bin .../images/101035_77bd62dd_1277510.png" | Bin .../images/101056_0c9f2daa_1277510.png" | Bin ...\273\216\344\275\225\345\274\200\345\247\213.md" | 0 ...\245\275\347\232\204\345\237\272\347\241\200.md" | 0 ...\257\201\347\232\204\345\272\224\347\224\250.md" | 0 ...\264\241\347\214\256\345\207\206\345\210\231.md" | 0 ...\212\244\345\222\214\347\256\241\347\220\206.md" | 0 ...274\232CONTRIBUTING \347\274\226\345\206\231.md" | 0 126 files changed, 0 insertions(+), 0 deletions(-) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/005101_de0c032b_2027303.png" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/005101_de0c032b_2027303.png" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/140747_66a7c384_7799079.png" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/140747_66a7c384_7799079.png" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/145816_170e8c7e_3026149.png" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/145816_170e8c7e_3026149.png" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/184105_3963f1ac_5406987.jpeg" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/184105_3963f1ac_5406987.jpeg" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/184138_28edf92b_5406987.jpeg" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/184138_28edf92b_5406987.jpeg" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185019_43cb87e5_5406987.png" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185019_43cb87e5_5406987.png" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185648_79e99440_5406987.jpeg" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185648_79e99440_5406987.jpeg" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185706_6c3d4653_5406987.jpeg" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185706_6c3d4653_5406987.jpeg" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185728_2a4fd21a_5406987.jpeg" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185728_2a4fd21a_5406987.jpeg" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185744_24f8e47b_5406987.jpeg" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185744_24f8e47b_5406987.jpeg" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185756_8c42cddf_5406987.jpeg" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185756_8c42cddf_5406987.jpeg" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/190041_d97025e2_5694891.png" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/190041_d97025e2_5694891.png" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223608_99ebf50e_1998139.jpeg" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223608_99ebf50e_1998139.jpeg" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223852_ccf37eaa_1998139.jpeg" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223852_ccf37eaa_1998139.jpeg" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223937_2408e51a_1998139.jpeg" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223937_2408e51a_1998139.jpeg" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/224104_42883a6d_1998139.jpeg" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/224104_42883a6d_1998139.jpeg" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/224307_aeb3bb91_1998139.jpeg" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/224307_aeb3bb91_1998139.jpeg" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/logo-OpenAtomFoundaton.svg" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/logo-OpenAtomFoundaton.svg" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 1 \345\260\217\350\212\202\357\274\232\344\273\200\344\271\210\346\230\257\345\274\200\346\272\220.md" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 1 \345\260\217\350\212\202\357\274\232\344\273\200\344\271\210\346\230\257\345\274\200\346\272\220.md" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\344\270\216\344\270\252\344\272\272\346\212\200\346\234\257\346\210\220\351\225\277.md" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\344\270\216\344\270\252\344\272\272\346\212\200\346\234\257\346\210\220\351\225\277.md" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\345\210\244\346\226\255\344\270\200\344\270\252\351\241\271\347\233\256\346\230\257\345\220\246\346\230\257\345\274\200\346\272\220\347\232\204.md" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\345\210\244\346\226\255\344\270\200\344\270\252\351\241\271\347\233\256\346\230\257\345\220\246\346\230\257\345\274\200\346\272\220\347\232\204.md" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\205\263\344\272\216\345\274\200\346\272\220\345\237\272\351\207\221\344\274\232.md" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\205\263\344\272\216\345\274\200\346\272\220\345\237\272\351\207\221\344\274\232.md" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 5 \345\260\217\350\212\202\357\274\232\346\234\211\345\205\263\345\274\200\346\272\220\347\232\204\345\270\270\350\247\201\350\257\257\345\214\272.md" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 5 \345\260\217\350\212\202\357\274\232\346\234\211\345\205\263\345\274\200\346\272\220\347\232\204\345\270\270\350\247\201\350\257\257\345\214\272.md" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 6 \345\260\217\350\212\202\357\274\232\345\270\270\350\247\201\346\226\207\344\273\266\350\256\244\350\257\206.md" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 6 \345\260\217\350\212\202\357\274\232\345\270\270\350\247\201\346\226\207\344\273\266\350\256\244\350\257\206.md" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 7 \345\260\217\350\212\202\357\274\232\344\274\201\344\270\232\350\247\206\350\247\222\347\234\213\345\276\205\345\274\200\346\272\220.md" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 7 \345\260\217\350\212\202\357\274\232\344\274\201\344\270\232\350\247\206\350\247\222\347\234\213\345\276\205\345\274\200\346\272\220.md" (100%) rename "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 8 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\345\217\221\345\261\225\350\266\213\345\212\277.md" => "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 8 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\345\217\221\345\261\225\350\266\213\345\212\277.md" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095504_32fddf55_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095504_32fddf55_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095610_3fe4df54_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095610_3fe4df54_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095627_8b4fadf6_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095627_8b4fadf6_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095655_074d520b_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095655_074d520b_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095715_67d435b1_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095715_67d435b1_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121602_7f774b18_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121602_7f774b18_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121656_f6ccd9c7_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121656_f6ccd9c7_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121732_dd5fd2c8_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121732_dd5fd2c8_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121827_6dd23a40_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121827_6dd23a40_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121905_7de2c1b7_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121905_7de2c1b7_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121940_60a50a92_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121940_60a50a92_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122018_2ef66098_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122018_2ef66098_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122051_3d9f8f40_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122051_3d9f8f40_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122123_f025a6a2_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122123_f025a6a2_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122205_fa7de81b_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122205_fa7de81b_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122231_61ed06f5_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122231_61ed06f5_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122301_aeea5b92_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122301_aeea5b92_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122341_7c087174_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122341_7c087174_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122400_f9648c84_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122400_f9648c84_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150351_aaf54390_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150351_aaf54390_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150408_a80b686f_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150408_a80b686f_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150429_3f7cb023_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150429_3f7cb023_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150447_58b43a00_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150447_58b43a00_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150501_421219a8_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150501_421219a8_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150531_69fb8ed9_8456984.gif" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150531_69fb8ed9_8456984.gif" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150546_b6c50179_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150546_b6c50179_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150559_4e6f6afc_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150559_4e6f6afc_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150610_4351a9ea_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150610_4351a9ea_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150637_0c8c1499_8456984.gif" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150637_0c8c1499_8456984.gif" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150654_687717a7_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150654_687717a7_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150708_fe12dee3_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150708_fe12dee3_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150915_d55c2b70_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150915_d55c2b70_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150928_84fd4489_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150928_84fd4489_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150946_953a2d7e_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150946_953a2d7e_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151115_93315a5e_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151115_93315a5e_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151142_abdbc1da_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151142_abdbc1da_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151211_cfa06098_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151211_cfa06098_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151238_25c34fd1_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151238_25c34fd1_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151304_d991149d_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151304_d991149d_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153011_d625f1ff_1899066.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153011_d625f1ff_1899066.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153021_0701f7f6_1899066.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153021_0701f7f6_1899066.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153036_247bbc53_1899066.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153036_247bbc53_1899066.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/155106_78a14137_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/155106_78a14137_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160712_621d0351_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160712_621d0351_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160726_a311f8f8_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160726_a311f8f8_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160740_eff52230_8456984.gif" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160740_eff52230_8456984.gif" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/184559_3f5d281c_1277510.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/184559_3f5d281c_1277510.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210726_a1f2fb20_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210726_a1f2fb20_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210742_4cf5244b_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210742_4cf5244b_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210813_1923ef71_8456984.gif" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210813_1923ef71_8456984.gif" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210834_1996cb81_8456984.gif" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210834_1996cb81_8456984.gif" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210900_ec78c0a3_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210900_ec78c0a3_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210912_81ab2e4b_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210912_81ab2e4b_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211003_c2c14ec9_8456984.gif" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211003_c2c14ec9_8456984.gif" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211325_db7cf976_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211325_db7cf976_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211338_5f0754d0_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211338_5f0754d0_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211356_5be9f12f_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211356_5be9f12f_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211415_eb747ed6_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211415_eb747ed6_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211618_853d205c_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211618_853d205c_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211746_ebc51069_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211746_ebc51069_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211802_7f52d86e_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211802_7f52d86e_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211815_7a8e3dab_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211815_7a8e3dab_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211832_21255b22_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211832_21255b22_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211849_884cb0ca_8456984.png" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211849_884cb0ca_8456984.png" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/213111_8df051bf_8456984.gif" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/213111_8df051bf_8456984.gif" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 1 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\344\270\255\347\232\204\344\270\215\345\220\214\350\247\222\350\211\262.md" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 1 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\344\270\255\347\232\204\344\270\215\345\220\214\350\247\222\350\211\262.md" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 2 \345\260\217\350\212\202\357\274\232\344\270\252\344\272\272\344\270\272\344\273\200\344\271\210\350\246\201\345\217\202\344\270\216\345\274\200\346\272\220\350\264\241\347\214\256.md" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 2 \345\260\217\350\212\202\357\274\232\344\270\252\344\272\272\344\270\272\344\273\200\344\271\210\350\246\201\345\217\202\344\270\216\345\274\200\346\272\220\350\264\241\347\214\256.md" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 3 \345\260\217\350\212\202\357\274\232\344\274\201\344\270\232\344\270\272\344\273\200\344\271\210\350\246\201\345\217\202\344\270\216\345\274\200\346\272\220.md" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 3 \345\260\217\350\212\202\357\274\232\344\274\201\344\270\232\344\270\272\344\273\200\344\271\210\350\246\201\345\217\202\344\270\216\345\274\200\346\272\220.md" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\217\257\344\273\245\347\224\250\345\223\252\344\272\233\346\226\271\345\274\217\345\217\202\344\270\216\345\274\200\346\272\220.md" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\217\257\344\273\245\347\224\250\345\223\252\344\272\233\346\226\271\345\274\217\345\217\202\344\270\216\345\274\200\346\272\220.md" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\351\200\202\345\220\210\347\232\204\351\241\271\347\233\256\350\277\233\350\241\214\350\264\241\347\214\256.md" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\351\200\202\345\220\210\347\232\204\351\241\271\347\233\256\350\277\233\350\241\214\350\264\241\347\214\256.md" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 6 \345\260\217\350\212\202\357\274\232\346\217\220\344\272\244\347\254\254\344\270\200\344\270\252 Issue.md" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 6 \345\260\217\350\212\202\357\274\232\346\217\220\344\272\244\347\254\254\344\270\200\344\270\252 Issue.md" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 7 \345\260\217\350\212\202\357\274\232\346\217\220\344\272\244\347\254\254\344\270\200\344\270\252 Pull Request.md" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 7 \345\260\217\350\212\202\357\274\232\346\217\220\344\272\244\347\254\254\344\270\200\344\270\252 Pull Request.md" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 8 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\210\220\344\270\272\344\270\200\344\270\252\351\241\271\347\233\256\347\232\204\346\240\270\345\277\203\350\264\241\347\214\256\350\200\205.md" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 8 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\210\220\344\270\272\344\270\200\344\270\252\351\241\271\347\233\256\347\232\204\346\240\270\345\277\203\350\264\241\347\214\256\350\200\205.md" (100%) rename "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 9 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\350\264\241\347\214\256\345\207\206\345\210\231\345\222\214\350\264\241\347\214\256\350\200\205\345\205\254\347\272\246.md" => "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 9 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\350\264\241\347\214\256\345\207\206\345\210\231\345\222\214\350\264\241\347\214\256\350\200\205\345\205\254\347\272\246.md" (100%) rename "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/102300_01aed884_5694891.png" => "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/102300_01aed884_5694891.png" (100%) rename "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/104325_a52fecd7_5694891.png" => "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/104325_a52fecd7_5694891.png" (100%) rename "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/104817_073e4ef5_5694891.png" => "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/104817_073e4ef5_5694891.png" (100%) rename "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/134612_c1c80e44_5694891.png" => "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/134612_c1c80e44_5694891.png" (100%) rename "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/134908_9d839d42_5694891.png" => "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/134908_9d839d42_5694891.png" (100%) rename "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 1 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\351\200\202\345\220\210\350\207\252\345\267\261\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256.md" => "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 1 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\351\200\202\345\220\210\350\207\252\345\267\261\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256.md" (100%) rename "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\346\272\220\344\273\243\347\240\201\350\257\245\346\200\216\344\271\210\350\257\273.md" => "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\346\272\220\344\273\243\347\240\201\350\257\245\346\200\216\344\271\210\350\257\273.md" (100%) rename "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 3 \345\260\217\350\212\202\357\274\232\350\256\244\350\257\206\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201.md" => "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 3 \345\260\217\350\212\202\357\274\232\350\256\244\350\257\206\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201.md" (100%) rename "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\344\270\255\347\232\204\350\265\236\350\265\217\346\226\207\345\214\226.md" => "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\344\270\255\347\232\204\350\265\236\350\265\217\346\226\207\345\214\226.md" (100%) rename "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\346\234\200\345\274\272\345\274\200\346\272\220\351\241\271\347\233\256.md" => "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\346\234\200\345\274\272\345\274\200\346\272\220\351\241\271\347\233\256.md" (100%) rename "\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 1 \345\260\217\350\212\202\357\274\232\344\270\252\344\272\272\347\273\264\346\212\244\345\222\214\345\273\272\347\253\213\347\244\276\345\214\272\357\274\214\344\270\244\350\200\205\345\246\202\344\275\225\351\200\211\346\213\251.md" => "src/guide/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 1 \345\260\217\350\212\202\357\274\232\344\270\252\344\272\272\347\273\264\346\212\244\345\222\214\345\273\272\347\253\213\347\244\276\345\214\272\357\274\214\344\270\244\350\200\205\345\246\202\344\275\225\351\200\211\346\213\251.md" (100%) rename "\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 2 \345\260\217\350\212\202\357\274\232\346\211\223\351\200\240\345\274\200\346\272\220\347\244\276\345\214\272.md" => "src/guide/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 2 \345\260\217\350\212\202\357\274\232\346\211\223\351\200\240\345\274\200\346\272\220\347\244\276\345\214\272.md" (100%) rename "\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\345\270\270\350\247\201\346\262\273\347\220\206\346\236\266\346\236\204.md" => "src/guide/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\345\270\270\350\247\201\346\262\273\347\220\206\346\236\266\346\236\204.md" (100%) rename "\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 4 \345\260\217\350\212\202\357\274\232\347\241\256\344\277\235\345\274\200\346\272\220\344\273\243\347\240\201\350\264\250\351\207\217\347\232\204\345\207\240\344\270\252\350\246\201\347\202\271.md" => "src/guide/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 4 \345\260\217\350\212\202\357\274\232\347\241\256\344\277\235\345\274\200\346\272\220\344\273\243\347\240\201\350\264\250\351\207\217\347\232\204\345\207\240\344\270\252\350\246\201\347\202\271.md" (100%) rename "\347\254\254\345\205\255\351\203\250\345\210\206\357\274\232\345\205\266\344\273\226\351\227\256\351\242\230/\347\254\254 1 \345\260\217\350\212\202\357\274\232\346\200\216\346\240\267\345\234\250\346\234\254\350\201\214\345\267\245\344\275\234\345\222\214\345\274\200\346\272\220\351\241\271\347\233\256\351\227\264\345\201\232\345\245\275\345\271\263\350\241\241.md" => "src/guide/\347\254\254\345\205\255\351\203\250\345\210\206\357\274\232\345\205\266\344\273\226\351\227\256\351\242\230/\347\254\254 1 \345\260\217\350\212\202\357\274\232\346\200\216\346\240\267\345\234\250\346\234\254\350\201\214\345\267\245\344\275\234\345\222\214\345\274\200\346\272\220\351\241\271\347\233\256\351\227\264\345\201\232\345\245\275\345\271\263\350\241\241.md" (100%) rename "\347\254\254\345\205\255\351\203\250\345\210\206\357\274\232\345\205\266\344\273\226\351\227\256\351\242\230/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\205\263\344\272\216\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\345\225\206\344\270\232\345\214\226.md" => "src/guide/\347\254\254\345\205\255\351\203\250\345\210\206\357\274\232\345\205\266\344\273\226\351\227\256\351\242\230/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\205\263\344\272\216\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\345\225\206\344\270\232\345\214\226.md" (100%) rename "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/100205_f14f796d_1277510.png" => "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/100205_f14f796d_1277510.png" (100%) rename "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101008_b0b4e938_1277510.png" => "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101008_b0b4e938_1277510.png" (100%) rename "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101035_77bd62dd_1277510.png" => "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101035_77bd62dd_1277510.png" (100%) rename "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101056_0c9f2daa_1277510.png" => "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101056_0c9f2daa_1277510.png" (100%) rename "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 1 \345\260\217\350\212\202\357\274\232\346\234\211\344\272\206\345\274\200\346\272\220\347\232\204\346\203\263\346\263\225\345\220\216\344\273\216\344\275\225\345\274\200\345\247\213.md" => "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 1 \345\260\217\350\212\202\357\274\232\346\234\211\344\272\206\345\274\200\346\272\220\347\232\204\346\203\263\346\263\225\345\220\216\344\273\216\344\275\225\345\274\200\345\247\213.md" (100%) rename "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 2 \345\260\217\350\212\202\357\274\232\344\270\272\345\274\200\346\272\220\351\241\271\347\233\256\345\273\272\347\253\213\350\211\257\345\245\275\347\232\204\345\237\272\347\241\200.md" => "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 2 \345\260\217\350\212\202\357\274\232\344\270\272\345\274\200\346\272\220\351\241\271\347\233\256\345\273\272\347\253\213\350\211\257\345\245\275\347\232\204\345\237\272\347\241\200.md" (100%) rename "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201\347\232\204\345\272\224\347\224\250.md" => "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201\347\232\204\345\272\224\347\224\250.md" (100%) rename "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 4 \345\260\217\350\212\202\357\274\232\344\270\272\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256\345\273\272\347\253\213\350\264\241\347\214\256\345\207\206\345\210\231.md" => "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 4 \345\260\217\350\212\202\357\274\232\344\270\272\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256\345\273\272\347\253\213\350\264\241\347\214\256\345\207\206\345\210\231.md" (100%) rename "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\347\273\264\346\212\244\345\222\214\347\256\241\347\220\206.md" => "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\347\273\264\346\212\244\345\222\214\347\256\241\347\220\206.md" (100%) rename "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 6 \345\260\217\350\212\202\357\274\232CONTRIBUTING \347\274\226\345\206\231.md" => "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 6 \345\260\217\350\212\202\357\274\232CONTRIBUTING \347\274\226\345\206\231.md" (100%) diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/005101_de0c032b_2027303.png" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/005101_de0c032b_2027303.png" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/005101_de0c032b_2027303.png" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/005101_de0c032b_2027303.png" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/140747_66a7c384_7799079.png" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/140747_66a7c384_7799079.png" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/140747_66a7c384_7799079.png" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/140747_66a7c384_7799079.png" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/145816_170e8c7e_3026149.png" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/145816_170e8c7e_3026149.png" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/145816_170e8c7e_3026149.png" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/145816_170e8c7e_3026149.png" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/184105_3963f1ac_5406987.jpeg" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/184105_3963f1ac_5406987.jpeg" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/184105_3963f1ac_5406987.jpeg" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/184105_3963f1ac_5406987.jpeg" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/184138_28edf92b_5406987.jpeg" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/184138_28edf92b_5406987.jpeg" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/184138_28edf92b_5406987.jpeg" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/184138_28edf92b_5406987.jpeg" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185019_43cb87e5_5406987.png" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185019_43cb87e5_5406987.png" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185019_43cb87e5_5406987.png" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185019_43cb87e5_5406987.png" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185648_79e99440_5406987.jpeg" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185648_79e99440_5406987.jpeg" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185648_79e99440_5406987.jpeg" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185648_79e99440_5406987.jpeg" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185706_6c3d4653_5406987.jpeg" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185706_6c3d4653_5406987.jpeg" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185706_6c3d4653_5406987.jpeg" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185706_6c3d4653_5406987.jpeg" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185728_2a4fd21a_5406987.jpeg" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185728_2a4fd21a_5406987.jpeg" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185728_2a4fd21a_5406987.jpeg" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185728_2a4fd21a_5406987.jpeg" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185744_24f8e47b_5406987.jpeg" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185744_24f8e47b_5406987.jpeg" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185744_24f8e47b_5406987.jpeg" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185744_24f8e47b_5406987.jpeg" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185756_8c42cddf_5406987.jpeg" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185756_8c42cddf_5406987.jpeg" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185756_8c42cddf_5406987.jpeg" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/185756_8c42cddf_5406987.jpeg" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/190041_d97025e2_5694891.png" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/190041_d97025e2_5694891.png" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/190041_d97025e2_5694891.png" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/190041_d97025e2_5694891.png" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223608_99ebf50e_1998139.jpeg" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223608_99ebf50e_1998139.jpeg" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223608_99ebf50e_1998139.jpeg" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223608_99ebf50e_1998139.jpeg" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223852_ccf37eaa_1998139.jpeg" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223852_ccf37eaa_1998139.jpeg" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223852_ccf37eaa_1998139.jpeg" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223852_ccf37eaa_1998139.jpeg" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223937_2408e51a_1998139.jpeg" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223937_2408e51a_1998139.jpeg" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223937_2408e51a_1998139.jpeg" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/223937_2408e51a_1998139.jpeg" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/224104_42883a6d_1998139.jpeg" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/224104_42883a6d_1998139.jpeg" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/224104_42883a6d_1998139.jpeg" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/224104_42883a6d_1998139.jpeg" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/224307_aeb3bb91_1998139.jpeg" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/224307_aeb3bb91_1998139.jpeg" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/224307_aeb3bb91_1998139.jpeg" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/224307_aeb3bb91_1998139.jpeg" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/logo-OpenAtomFoundaton.svg" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/logo-OpenAtomFoundaton.svg" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/logo-OpenAtomFoundaton.svg" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/images/logo-OpenAtomFoundaton.svg" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 1 \345\260\217\350\212\202\357\274\232\344\273\200\344\271\210\346\230\257\345\274\200\346\272\220.md" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 1 \345\260\217\350\212\202\357\274\232\344\273\200\344\271\210\346\230\257\345\274\200\346\272\220.md" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 1 \345\260\217\350\212\202\357\274\232\344\273\200\344\271\210\346\230\257\345\274\200\346\272\220.md" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 1 \345\260\217\350\212\202\357\274\232\344\273\200\344\271\210\346\230\257\345\274\200\346\272\220.md" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\344\270\216\344\270\252\344\272\272\346\212\200\346\234\257\346\210\220\351\225\277.md" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\344\270\216\344\270\252\344\272\272\346\212\200\346\234\257\346\210\220\351\225\277.md" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\344\270\216\344\270\252\344\272\272\346\212\200\346\234\257\346\210\220\351\225\277.md" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\344\270\216\344\270\252\344\272\272\346\212\200\346\234\257\346\210\220\351\225\277.md" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\345\210\244\346\226\255\344\270\200\344\270\252\351\241\271\347\233\256\346\230\257\345\220\246\346\230\257\345\274\200\346\272\220\347\232\204.md" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\345\210\244\346\226\255\344\270\200\344\270\252\351\241\271\347\233\256\346\230\257\345\220\246\346\230\257\345\274\200\346\272\220\347\232\204.md" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\345\210\244\346\226\255\344\270\200\344\270\252\351\241\271\347\233\256\346\230\257\345\220\246\346\230\257\345\274\200\346\272\220\347\232\204.md" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\345\210\244\346\226\255\344\270\200\344\270\252\351\241\271\347\233\256\346\230\257\345\220\246\346\230\257\345\274\200\346\272\220\347\232\204.md" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\205\263\344\272\216\345\274\200\346\272\220\345\237\272\351\207\221\344\274\232.md" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\205\263\344\272\216\345\274\200\346\272\220\345\237\272\351\207\221\344\274\232.md" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\205\263\344\272\216\345\274\200\346\272\220\345\237\272\351\207\221\344\274\232.md" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\205\263\344\272\216\345\274\200\346\272\220\345\237\272\351\207\221\344\274\232.md" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 5 \345\260\217\350\212\202\357\274\232\346\234\211\345\205\263\345\274\200\346\272\220\347\232\204\345\270\270\350\247\201\350\257\257\345\214\272.md" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 5 \345\260\217\350\212\202\357\274\232\346\234\211\345\205\263\345\274\200\346\272\220\347\232\204\345\270\270\350\247\201\350\257\257\345\214\272.md" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 5 \345\260\217\350\212\202\357\274\232\346\234\211\345\205\263\345\274\200\346\272\220\347\232\204\345\270\270\350\247\201\350\257\257\345\214\272.md" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 5 \345\260\217\350\212\202\357\274\232\346\234\211\345\205\263\345\274\200\346\272\220\347\232\204\345\270\270\350\247\201\350\257\257\345\214\272.md" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 6 \345\260\217\350\212\202\357\274\232\345\270\270\350\247\201\346\226\207\344\273\266\350\256\244\350\257\206.md" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 6 \345\260\217\350\212\202\357\274\232\345\270\270\350\247\201\346\226\207\344\273\266\350\256\244\350\257\206.md" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 6 \345\260\217\350\212\202\357\274\232\345\270\270\350\247\201\346\226\207\344\273\266\350\256\244\350\257\206.md" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 6 \345\260\217\350\212\202\357\274\232\345\270\270\350\247\201\346\226\207\344\273\266\350\256\244\350\257\206.md" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 7 \345\260\217\350\212\202\357\274\232\344\274\201\344\270\232\350\247\206\350\247\222\347\234\213\345\276\205\345\274\200\346\272\220.md" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 7 \345\260\217\350\212\202\357\274\232\344\274\201\344\270\232\350\247\206\350\247\222\347\234\213\345\276\205\345\274\200\346\272\220.md" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 7 \345\260\217\350\212\202\357\274\232\344\274\201\344\270\232\350\247\206\350\247\222\347\234\213\345\276\205\345\274\200\346\272\220.md" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 7 \345\260\217\350\212\202\357\274\232\344\274\201\344\270\232\350\247\206\350\247\222\347\234\213\345\276\205\345\274\200\346\272\220.md" diff --git "a/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 8 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\345\217\221\345\261\225\350\266\213\345\212\277.md" "b/src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 8 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\345\217\221\345\261\225\350\266\213\345\212\277.md" similarity index 100% rename from "\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 8 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\345\217\221\345\261\225\350\266\213\345\212\277.md" rename to "src/guide/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\345\210\235\350\257\206\345\274\200\346\272\220/\347\254\254 8 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\345\217\221\345\261\225\350\266\213\345\212\277.md" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095504_32fddf55_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095504_32fddf55_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095504_32fddf55_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095504_32fddf55_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095610_3fe4df54_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095610_3fe4df54_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095610_3fe4df54_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095610_3fe4df54_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095627_8b4fadf6_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095627_8b4fadf6_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095627_8b4fadf6_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095627_8b4fadf6_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095655_074d520b_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095655_074d520b_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095655_074d520b_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095655_074d520b_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095715_67d435b1_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095715_67d435b1_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095715_67d435b1_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/095715_67d435b1_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121602_7f774b18_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121602_7f774b18_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121602_7f774b18_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121602_7f774b18_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121656_f6ccd9c7_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121656_f6ccd9c7_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121656_f6ccd9c7_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121656_f6ccd9c7_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121732_dd5fd2c8_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121732_dd5fd2c8_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121732_dd5fd2c8_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121732_dd5fd2c8_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121827_6dd23a40_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121827_6dd23a40_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121827_6dd23a40_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121827_6dd23a40_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121905_7de2c1b7_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121905_7de2c1b7_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121905_7de2c1b7_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121905_7de2c1b7_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121940_60a50a92_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121940_60a50a92_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121940_60a50a92_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/121940_60a50a92_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122018_2ef66098_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122018_2ef66098_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122018_2ef66098_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122018_2ef66098_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122051_3d9f8f40_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122051_3d9f8f40_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122051_3d9f8f40_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122051_3d9f8f40_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122123_f025a6a2_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122123_f025a6a2_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122123_f025a6a2_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122123_f025a6a2_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122205_fa7de81b_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122205_fa7de81b_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122205_fa7de81b_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122205_fa7de81b_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122231_61ed06f5_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122231_61ed06f5_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122231_61ed06f5_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122231_61ed06f5_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122301_aeea5b92_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122301_aeea5b92_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122301_aeea5b92_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122301_aeea5b92_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122341_7c087174_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122341_7c087174_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122341_7c087174_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122341_7c087174_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122400_f9648c84_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122400_f9648c84_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122400_f9648c84_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/122400_f9648c84_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150351_aaf54390_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150351_aaf54390_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150351_aaf54390_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150351_aaf54390_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150408_a80b686f_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150408_a80b686f_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150408_a80b686f_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150408_a80b686f_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150429_3f7cb023_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150429_3f7cb023_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150429_3f7cb023_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150429_3f7cb023_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150447_58b43a00_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150447_58b43a00_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150447_58b43a00_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150447_58b43a00_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150501_421219a8_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150501_421219a8_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150501_421219a8_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150501_421219a8_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150531_69fb8ed9_8456984.gif" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150531_69fb8ed9_8456984.gif" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150531_69fb8ed9_8456984.gif" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150531_69fb8ed9_8456984.gif" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150546_b6c50179_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150546_b6c50179_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150546_b6c50179_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150546_b6c50179_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150559_4e6f6afc_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150559_4e6f6afc_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150559_4e6f6afc_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150559_4e6f6afc_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150610_4351a9ea_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150610_4351a9ea_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150610_4351a9ea_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150610_4351a9ea_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150637_0c8c1499_8456984.gif" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150637_0c8c1499_8456984.gif" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150637_0c8c1499_8456984.gif" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150637_0c8c1499_8456984.gif" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150654_687717a7_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150654_687717a7_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150654_687717a7_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150654_687717a7_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150708_fe12dee3_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150708_fe12dee3_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150708_fe12dee3_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150708_fe12dee3_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150915_d55c2b70_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150915_d55c2b70_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150915_d55c2b70_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150915_d55c2b70_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150928_84fd4489_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150928_84fd4489_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150928_84fd4489_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150928_84fd4489_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150946_953a2d7e_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150946_953a2d7e_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150946_953a2d7e_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/150946_953a2d7e_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151115_93315a5e_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151115_93315a5e_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151115_93315a5e_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151115_93315a5e_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151142_abdbc1da_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151142_abdbc1da_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151142_abdbc1da_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151142_abdbc1da_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151211_cfa06098_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151211_cfa06098_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151211_cfa06098_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151211_cfa06098_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151238_25c34fd1_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151238_25c34fd1_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151238_25c34fd1_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151238_25c34fd1_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151304_d991149d_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151304_d991149d_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151304_d991149d_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/151304_d991149d_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153011_d625f1ff_1899066.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153011_d625f1ff_1899066.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153011_d625f1ff_1899066.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153011_d625f1ff_1899066.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153021_0701f7f6_1899066.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153021_0701f7f6_1899066.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153021_0701f7f6_1899066.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153021_0701f7f6_1899066.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153036_247bbc53_1899066.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153036_247bbc53_1899066.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153036_247bbc53_1899066.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/153036_247bbc53_1899066.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/155106_78a14137_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/155106_78a14137_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/155106_78a14137_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/155106_78a14137_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160712_621d0351_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160712_621d0351_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160712_621d0351_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160712_621d0351_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160726_a311f8f8_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160726_a311f8f8_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160726_a311f8f8_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160726_a311f8f8_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160740_eff52230_8456984.gif" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160740_eff52230_8456984.gif" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160740_eff52230_8456984.gif" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/160740_eff52230_8456984.gif" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/184559_3f5d281c_1277510.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/184559_3f5d281c_1277510.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/184559_3f5d281c_1277510.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/184559_3f5d281c_1277510.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210726_a1f2fb20_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210726_a1f2fb20_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210726_a1f2fb20_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210726_a1f2fb20_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210742_4cf5244b_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210742_4cf5244b_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210742_4cf5244b_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210742_4cf5244b_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210813_1923ef71_8456984.gif" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210813_1923ef71_8456984.gif" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210813_1923ef71_8456984.gif" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210813_1923ef71_8456984.gif" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210834_1996cb81_8456984.gif" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210834_1996cb81_8456984.gif" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210834_1996cb81_8456984.gif" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210834_1996cb81_8456984.gif" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210900_ec78c0a3_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210900_ec78c0a3_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210900_ec78c0a3_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210900_ec78c0a3_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210912_81ab2e4b_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210912_81ab2e4b_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210912_81ab2e4b_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/210912_81ab2e4b_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211003_c2c14ec9_8456984.gif" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211003_c2c14ec9_8456984.gif" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211003_c2c14ec9_8456984.gif" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211003_c2c14ec9_8456984.gif" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211325_db7cf976_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211325_db7cf976_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211325_db7cf976_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211325_db7cf976_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211338_5f0754d0_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211338_5f0754d0_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211338_5f0754d0_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211338_5f0754d0_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211356_5be9f12f_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211356_5be9f12f_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211356_5be9f12f_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211356_5be9f12f_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211415_eb747ed6_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211415_eb747ed6_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211415_eb747ed6_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211415_eb747ed6_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211618_853d205c_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211618_853d205c_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211618_853d205c_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211618_853d205c_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211746_ebc51069_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211746_ebc51069_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211746_ebc51069_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211746_ebc51069_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211802_7f52d86e_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211802_7f52d86e_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211802_7f52d86e_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211802_7f52d86e_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211815_7a8e3dab_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211815_7a8e3dab_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211815_7a8e3dab_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211815_7a8e3dab_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211832_21255b22_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211832_21255b22_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211832_21255b22_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211832_21255b22_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211849_884cb0ca_8456984.png" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211849_884cb0ca_8456984.png" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211849_884cb0ca_8456984.png" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/211849_884cb0ca_8456984.png" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/213111_8df051bf_8456984.gif" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/213111_8df051bf_8456984.gif" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/213111_8df051bf_8456984.gif" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/images/213111_8df051bf_8456984.gif" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 1 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\344\270\255\347\232\204\344\270\215\345\220\214\350\247\222\350\211\262.md" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 1 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\344\270\255\347\232\204\344\270\215\345\220\214\350\247\222\350\211\262.md" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 1 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\344\270\255\347\232\204\344\270\215\345\220\214\350\247\222\350\211\262.md" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 1 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\344\270\255\347\232\204\344\270\215\345\220\214\350\247\222\350\211\262.md" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 2 \345\260\217\350\212\202\357\274\232\344\270\252\344\272\272\344\270\272\344\273\200\344\271\210\350\246\201\345\217\202\344\270\216\345\274\200\346\272\220\350\264\241\347\214\256.md" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 2 \345\260\217\350\212\202\357\274\232\344\270\252\344\272\272\344\270\272\344\273\200\344\271\210\350\246\201\345\217\202\344\270\216\345\274\200\346\272\220\350\264\241\347\214\256.md" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 2 \345\260\217\350\212\202\357\274\232\344\270\252\344\272\272\344\270\272\344\273\200\344\271\210\350\246\201\345\217\202\344\270\216\345\274\200\346\272\220\350\264\241\347\214\256.md" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 2 \345\260\217\350\212\202\357\274\232\344\270\252\344\272\272\344\270\272\344\273\200\344\271\210\350\246\201\345\217\202\344\270\216\345\274\200\346\272\220\350\264\241\347\214\256.md" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 3 \345\260\217\350\212\202\357\274\232\344\274\201\344\270\232\344\270\272\344\273\200\344\271\210\350\246\201\345\217\202\344\270\216\345\274\200\346\272\220.md" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 3 \345\260\217\350\212\202\357\274\232\344\274\201\344\270\232\344\270\272\344\273\200\344\271\210\350\246\201\345\217\202\344\270\216\345\274\200\346\272\220.md" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 3 \345\260\217\350\212\202\357\274\232\344\274\201\344\270\232\344\270\272\344\273\200\344\271\210\350\246\201\345\217\202\344\270\216\345\274\200\346\272\220.md" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 3 \345\260\217\350\212\202\357\274\232\344\274\201\344\270\232\344\270\272\344\273\200\344\271\210\350\246\201\345\217\202\344\270\216\345\274\200\346\272\220.md" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\217\257\344\273\245\347\224\250\345\223\252\344\272\233\346\226\271\345\274\217\345\217\202\344\270\216\345\274\200\346\272\220.md" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\217\257\344\273\245\347\224\250\345\223\252\344\272\233\346\226\271\345\274\217\345\217\202\344\270\216\345\274\200\346\272\220.md" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\217\257\344\273\245\347\224\250\345\223\252\344\272\233\346\226\271\345\274\217\345\217\202\344\270\216\345\274\200\346\272\220.md" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\217\257\344\273\245\347\224\250\345\223\252\344\272\233\346\226\271\345\274\217\345\217\202\344\270\216\345\274\200\346\272\220.md" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\351\200\202\345\220\210\347\232\204\351\241\271\347\233\256\350\277\233\350\241\214\350\264\241\347\214\256.md" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\351\200\202\345\220\210\347\232\204\351\241\271\347\233\256\350\277\233\350\241\214\350\264\241\347\214\256.md" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\351\200\202\345\220\210\347\232\204\351\241\271\347\233\256\350\277\233\350\241\214\350\264\241\347\214\256.md" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\351\200\202\345\220\210\347\232\204\351\241\271\347\233\256\350\277\233\350\241\214\350\264\241\347\214\256.md" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 6 \345\260\217\350\212\202\357\274\232\346\217\220\344\272\244\347\254\254\344\270\200\344\270\252 Issue.md" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 6 \345\260\217\350\212\202\357\274\232\346\217\220\344\272\244\347\254\254\344\270\200\344\270\252 Issue.md" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 6 \345\260\217\350\212\202\357\274\232\346\217\220\344\272\244\347\254\254\344\270\200\344\270\252 Issue.md" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 6 \345\260\217\350\212\202\357\274\232\346\217\220\344\272\244\347\254\254\344\270\200\344\270\252 Issue.md" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 7 \345\260\217\350\212\202\357\274\232\346\217\220\344\272\244\347\254\254\344\270\200\344\270\252 Pull Request.md" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 7 \345\260\217\350\212\202\357\274\232\346\217\220\344\272\244\347\254\254\344\270\200\344\270\252 Pull Request.md" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 7 \345\260\217\350\212\202\357\274\232\346\217\220\344\272\244\347\254\254\344\270\200\344\270\252 Pull Request.md" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 7 \345\260\217\350\212\202\357\274\232\346\217\220\344\272\244\347\254\254\344\270\200\344\270\252 Pull Request.md" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 8 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\210\220\344\270\272\344\270\200\344\270\252\351\241\271\347\233\256\347\232\204\346\240\270\345\277\203\350\264\241\347\214\256\350\200\205.md" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 8 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\210\220\344\270\272\344\270\200\344\270\252\351\241\271\347\233\256\347\232\204\346\240\270\345\277\203\350\264\241\347\214\256\350\200\205.md" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 8 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\210\220\344\270\272\344\270\200\344\270\252\351\241\271\347\233\256\347\232\204\346\240\270\345\277\203\350\264\241\347\214\256\350\200\205.md" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 8 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\210\220\344\270\272\344\270\200\344\270\252\351\241\271\347\233\256\347\232\204\346\240\270\345\277\203\350\264\241\347\214\256\350\200\205.md" diff --git "a/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 9 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\350\264\241\347\214\256\345\207\206\345\210\231\345\222\214\350\264\241\347\214\256\350\200\205\345\205\254\347\272\246.md" "b/src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 9 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\350\264\241\347\214\256\345\207\206\345\210\231\345\222\214\350\264\241\347\214\256\350\200\205\345\205\254\347\272\246.md" similarity index 100% rename from "\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 9 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\350\264\241\347\214\256\345\207\206\345\210\231\345\222\214\350\264\241\347\214\256\350\200\205\345\205\254\347\272\246.md" rename to "src/guide/\347\254\254\344\270\211\351\203\250\345\210\206\357\274\232\345\260\235\350\257\225\345\217\202\344\270\216\345\274\200\346\272\220/\347\254\254 9 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\350\264\241\347\214\256\345\207\206\345\210\231\345\222\214\350\264\241\347\214\256\350\200\205\345\205\254\347\272\246.md" diff --git "a/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/102300_01aed884_5694891.png" "b/src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/102300_01aed884_5694891.png" similarity index 100% rename from "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/102300_01aed884_5694891.png" rename to "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/102300_01aed884_5694891.png" diff --git "a/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/104325_a52fecd7_5694891.png" "b/src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/104325_a52fecd7_5694891.png" similarity index 100% rename from "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/104325_a52fecd7_5694891.png" rename to "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/104325_a52fecd7_5694891.png" diff --git "a/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/104817_073e4ef5_5694891.png" "b/src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/104817_073e4ef5_5694891.png" similarity index 100% rename from "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/104817_073e4ef5_5694891.png" rename to "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/104817_073e4ef5_5694891.png" diff --git "a/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/134612_c1c80e44_5694891.png" "b/src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/134612_c1c80e44_5694891.png" similarity index 100% rename from "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/134612_c1c80e44_5694891.png" rename to "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/134612_c1c80e44_5694891.png" diff --git "a/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/134908_9d839d42_5694891.png" "b/src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/134908_9d839d42_5694891.png" similarity index 100% rename from "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/134908_9d839d42_5694891.png" rename to "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/images/134908_9d839d42_5694891.png" diff --git "a/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 1 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\351\200\202\345\220\210\350\207\252\345\267\261\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256.md" "b/src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 1 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\351\200\202\345\220\210\350\207\252\345\267\261\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256.md" similarity index 100% rename from "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 1 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\351\200\202\345\220\210\350\207\252\345\267\261\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256.md" rename to "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 1 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\351\200\202\345\220\210\350\207\252\345\267\261\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256.md" diff --git "a/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\346\272\220\344\273\243\347\240\201\350\257\245\346\200\216\344\271\210\350\257\273.md" "b/src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\346\272\220\344\273\243\347\240\201\350\257\245\346\200\216\344\271\210\350\257\273.md" similarity index 100% rename from "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\346\272\220\344\273\243\347\240\201\350\257\245\346\200\216\344\271\210\350\257\273.md" rename to "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\346\272\220\344\273\243\347\240\201\350\257\245\346\200\216\344\271\210\350\257\273.md" diff --git "a/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 3 \345\260\217\350\212\202\357\274\232\350\256\244\350\257\206\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201.md" "b/src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 3 \345\260\217\350\212\202\357\274\232\350\256\244\350\257\206\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201.md" similarity index 100% rename from "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 3 \345\260\217\350\212\202\357\274\232\350\256\244\350\257\206\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201.md" rename to "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 3 \345\260\217\350\212\202\357\274\232\350\256\244\350\257\206\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201.md" diff --git "a/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\344\270\255\347\232\204\350\265\236\350\265\217\346\226\207\345\214\226.md" "b/src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\344\270\255\347\232\204\350\265\236\350\265\217\346\226\207\345\214\226.md" similarity index 100% rename from "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\344\270\255\347\232\204\350\265\236\350\265\217\346\226\207\345\214\226.md" rename to "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 4 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\344\270\255\347\232\204\350\265\236\350\265\217\346\226\207\345\214\226.md" diff --git "a/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\346\234\200\345\274\272\345\274\200\346\272\220\351\241\271\347\233\256.md" "b/src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\346\234\200\345\274\272\345\274\200\346\272\220\351\241\271\347\233\256.md" similarity index 100% rename from "\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\346\234\200\345\274\272\345\274\200\346\272\220\351\241\271\347\233\256.md" rename to "src/guide/\347\254\254\344\272\214\351\203\250\345\210\206\357\274\232\345\255\246\344\271\240\345\222\214\344\275\277\347\224\250\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\246\202\344\275\225\346\211\276\345\210\260\346\234\200\345\274\272\345\274\200\346\272\220\351\241\271\347\233\256.md" diff --git "a/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 1 \345\260\217\350\212\202\357\274\232\344\270\252\344\272\272\347\273\264\346\212\244\345\222\214\345\273\272\347\253\213\347\244\276\345\214\272\357\274\214\344\270\244\350\200\205\345\246\202\344\275\225\351\200\211\346\213\251.md" "b/src/guide/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 1 \345\260\217\350\212\202\357\274\232\344\270\252\344\272\272\347\273\264\346\212\244\345\222\214\345\273\272\347\253\213\347\244\276\345\214\272\357\274\214\344\270\244\350\200\205\345\246\202\344\275\225\351\200\211\346\213\251.md" similarity index 100% rename from "\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 1 \345\260\217\350\212\202\357\274\232\344\270\252\344\272\272\347\273\264\346\212\244\345\222\214\345\273\272\347\253\213\347\244\276\345\214\272\357\274\214\344\270\244\350\200\205\345\246\202\344\275\225\351\200\211\346\213\251.md" rename to "src/guide/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 1 \345\260\217\350\212\202\357\274\232\344\270\252\344\272\272\347\273\264\346\212\244\345\222\214\345\273\272\347\253\213\347\244\276\345\214\272\357\274\214\344\270\244\350\200\205\345\246\202\344\275\225\351\200\211\346\213\251.md" diff --git "a/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 2 \345\260\217\350\212\202\357\274\232\346\211\223\351\200\240\345\274\200\346\272\220\347\244\276\345\214\272.md" "b/src/guide/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 2 \345\260\217\350\212\202\357\274\232\346\211\223\351\200\240\345\274\200\346\272\220\347\244\276\345\214\272.md" similarity index 100% rename from "\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 2 \345\260\217\350\212\202\357\274\232\346\211\223\351\200\240\345\274\200\346\272\220\347\244\276\345\214\272.md" rename to "src/guide/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 2 \345\260\217\350\212\202\357\274\232\346\211\223\351\200\240\345\274\200\346\272\220\347\244\276\345\214\272.md" diff --git "a/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\345\270\270\350\247\201\346\262\273\347\220\206\346\236\266\346\236\204.md" "b/src/guide/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\345\270\270\350\247\201\346\262\273\347\220\206\346\236\266\346\236\204.md" similarity index 100% rename from "\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\345\270\270\350\247\201\346\262\273\347\220\206\346\236\266\346\236\204.md" rename to "src/guide/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\345\270\270\350\247\201\346\262\273\347\220\206\346\236\266\346\236\204.md" diff --git "a/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 4 \345\260\217\350\212\202\357\274\232\347\241\256\344\277\235\345\274\200\346\272\220\344\273\243\347\240\201\350\264\250\351\207\217\347\232\204\345\207\240\344\270\252\350\246\201\347\202\271.md" "b/src/guide/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 4 \345\260\217\350\212\202\357\274\232\347\241\256\344\277\235\345\274\200\346\272\220\344\273\243\347\240\201\350\264\250\351\207\217\347\232\204\345\207\240\344\270\252\350\246\201\347\202\271.md" similarity index 100% rename from "\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 4 \345\260\217\350\212\202\357\274\232\347\241\256\344\277\235\345\274\200\346\272\220\344\273\243\347\240\201\350\264\250\351\207\217\347\232\204\345\207\240\344\270\252\350\246\201\347\202\271.md" rename to "src/guide/\347\254\254\344\272\224\351\203\250\345\210\206\357\274\232\345\274\200\346\272\220\346\262\273\347\220\206/\347\254\254 4 \345\260\217\350\212\202\357\274\232\347\241\256\344\277\235\345\274\200\346\272\220\344\273\243\347\240\201\350\264\250\351\207\217\347\232\204\345\207\240\344\270\252\350\246\201\347\202\271.md" diff --git "a/\347\254\254\345\205\255\351\203\250\345\210\206\357\274\232\345\205\266\344\273\226\351\227\256\351\242\230/\347\254\254 1 \345\260\217\350\212\202\357\274\232\346\200\216\346\240\267\345\234\250\346\234\254\350\201\214\345\267\245\344\275\234\345\222\214\345\274\200\346\272\220\351\241\271\347\233\256\351\227\264\345\201\232\345\245\275\345\271\263\350\241\241.md" "b/src/guide/\347\254\254\345\205\255\351\203\250\345\210\206\357\274\232\345\205\266\344\273\226\351\227\256\351\242\230/\347\254\254 1 \345\260\217\350\212\202\357\274\232\346\200\216\346\240\267\345\234\250\346\234\254\350\201\214\345\267\245\344\275\234\345\222\214\345\274\200\346\272\220\351\241\271\347\233\256\351\227\264\345\201\232\345\245\275\345\271\263\350\241\241.md" similarity index 100% rename from "\347\254\254\345\205\255\351\203\250\345\210\206\357\274\232\345\205\266\344\273\226\351\227\256\351\242\230/\347\254\254 1 \345\260\217\350\212\202\357\274\232\346\200\216\346\240\267\345\234\250\346\234\254\350\201\214\345\267\245\344\275\234\345\222\214\345\274\200\346\272\220\351\241\271\347\233\256\351\227\264\345\201\232\345\245\275\345\271\263\350\241\241.md" rename to "src/guide/\347\254\254\345\205\255\351\203\250\345\210\206\357\274\232\345\205\266\344\273\226\351\227\256\351\242\230/\347\254\254 1 \345\260\217\350\212\202\357\274\232\346\200\216\346\240\267\345\234\250\346\234\254\350\201\214\345\267\245\344\275\234\345\222\214\345\274\200\346\272\220\351\241\271\347\233\256\351\227\264\345\201\232\345\245\275\345\271\263\350\241\241.md" diff --git "a/\347\254\254\345\205\255\351\203\250\345\210\206\357\274\232\345\205\266\344\273\226\351\227\256\351\242\230/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\205\263\344\272\216\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\345\225\206\344\270\232\345\214\226.md" "b/src/guide/\347\254\254\345\205\255\351\203\250\345\210\206\357\274\232\345\205\266\344\273\226\351\227\256\351\242\230/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\205\263\344\272\216\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\345\225\206\344\270\232\345\214\226.md" similarity index 100% rename from "\347\254\254\345\205\255\351\203\250\345\210\206\357\274\232\345\205\266\344\273\226\351\227\256\351\242\230/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\205\263\344\272\216\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\345\225\206\344\270\232\345\214\226.md" rename to "src/guide/\347\254\254\345\205\255\351\203\250\345\210\206\357\274\232\345\205\266\344\273\226\351\227\256\351\242\230/\347\254\254 2 \345\260\217\350\212\202\357\274\232\345\205\263\344\272\216\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\345\225\206\344\270\232\345\214\226.md" diff --git "a/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/100205_f14f796d_1277510.png" "b/src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/100205_f14f796d_1277510.png" similarity index 100% rename from "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/100205_f14f796d_1277510.png" rename to "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/100205_f14f796d_1277510.png" diff --git "a/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101008_b0b4e938_1277510.png" "b/src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101008_b0b4e938_1277510.png" similarity index 100% rename from "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101008_b0b4e938_1277510.png" rename to "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101008_b0b4e938_1277510.png" diff --git "a/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101035_77bd62dd_1277510.png" "b/src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101035_77bd62dd_1277510.png" similarity index 100% rename from "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101035_77bd62dd_1277510.png" rename to "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101035_77bd62dd_1277510.png" diff --git "a/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101056_0c9f2daa_1277510.png" "b/src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101056_0c9f2daa_1277510.png" similarity index 100% rename from "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101056_0c9f2daa_1277510.png" rename to "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/images/101056_0c9f2daa_1277510.png" diff --git "a/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 1 \345\260\217\350\212\202\357\274\232\346\234\211\344\272\206\345\274\200\346\272\220\347\232\204\346\203\263\346\263\225\345\220\216\344\273\216\344\275\225\345\274\200\345\247\213.md" "b/src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 1 \345\260\217\350\212\202\357\274\232\346\234\211\344\272\206\345\274\200\346\272\220\347\232\204\346\203\263\346\263\225\345\220\216\344\273\216\344\275\225\345\274\200\345\247\213.md" similarity index 100% rename from "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 1 \345\260\217\350\212\202\357\274\232\346\234\211\344\272\206\345\274\200\346\272\220\347\232\204\346\203\263\346\263\225\345\220\216\344\273\216\344\275\225\345\274\200\345\247\213.md" rename to "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 1 \345\260\217\350\212\202\357\274\232\346\234\211\344\272\206\345\274\200\346\272\220\347\232\204\346\203\263\346\263\225\345\220\216\344\273\216\344\275\225\345\274\200\345\247\213.md" diff --git "a/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 2 \345\260\217\350\212\202\357\274\232\344\270\272\345\274\200\346\272\220\351\241\271\347\233\256\345\273\272\347\253\213\350\211\257\345\245\275\347\232\204\345\237\272\347\241\200.md" "b/src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 2 \345\260\217\350\212\202\357\274\232\344\270\272\345\274\200\346\272\220\351\241\271\347\233\256\345\273\272\347\253\213\350\211\257\345\245\275\347\232\204\345\237\272\347\241\200.md" similarity index 100% rename from "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 2 \345\260\217\350\212\202\357\274\232\344\270\272\345\274\200\346\272\220\351\241\271\347\233\256\345\273\272\347\253\213\350\211\257\345\245\275\347\232\204\345\237\272\347\241\200.md" rename to "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 2 \345\260\217\350\212\202\357\274\232\344\270\272\345\274\200\346\272\220\351\241\271\347\233\256\345\273\272\347\253\213\350\211\257\345\245\275\347\232\204\345\237\272\347\241\200.md" diff --git "a/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201\347\232\204\345\272\224\347\224\250.md" "b/src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201\347\232\204\345\272\224\347\224\250.md" similarity index 100% rename from "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201\347\232\204\345\272\224\347\224\250.md" rename to "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 3 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\350\256\270\345\217\257\350\257\201\347\232\204\345\272\224\347\224\250.md" diff --git "a/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 4 \345\260\217\350\212\202\357\274\232\344\270\272\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256\345\273\272\347\253\213\350\264\241\347\214\256\345\207\206\345\210\231.md" "b/src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 4 \345\260\217\350\212\202\357\274\232\344\270\272\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256\345\273\272\347\253\213\350\264\241\347\214\256\345\207\206\345\210\231.md" similarity index 100% rename from "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 4 \345\260\217\350\212\202\357\274\232\344\270\272\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256\345\273\272\347\253\213\350\264\241\347\214\256\345\207\206\345\210\231.md" rename to "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 4 \345\260\217\350\212\202\357\274\232\344\270\272\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256\345\273\272\347\253\213\350\264\241\347\214\256\345\207\206\345\210\231.md" diff --git "a/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\347\273\264\346\212\244\345\222\214\347\256\241\347\220\206.md" "b/src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\347\273\264\346\212\244\345\222\214\347\256\241\347\220\206.md" similarity index 100% rename from "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\347\273\264\346\212\244\345\222\214\347\256\241\347\220\206.md" rename to "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 5 \345\260\217\350\212\202\357\274\232\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\347\273\264\346\212\244\345\222\214\347\256\241\347\220\206.md" diff --git "a/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 6 \345\260\217\350\212\202\357\274\232CONTRIBUTING \347\274\226\345\206\231.md" "b/src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 6 \345\260\217\350\212\202\357\274\232CONTRIBUTING \347\274\226\345\206\231.md" similarity index 100% rename from "\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 6 \345\260\217\350\212\202\357\274\232CONTRIBUTING \347\274\226\345\206\231.md" rename to "src/guide/\347\254\254\345\233\233\351\203\250\345\210\206\357\274\232\345\220\257\345\212\250\350\207\252\345\267\261\347\232\204\345\274\200\346\272\220\351\241\271\347\233\256/\347\254\254 6 \345\260\217\350\212\202\357\274\232CONTRIBUTING \347\274\226\345\206\231.md" -- Gitee From 74e23b90b7fb817b0dfb18f396e80e4065e94e64 Mon Sep 17 00:00:00 2001 From: luhuadong Date: Wed, 8 May 2024 15:00:37 +0800 Subject: [PATCH 02/10] chore: add all contents --- src/comments/readme.md | 201 ++++++++ src/event/readme.md | 31 ++ ...45\351\227\250\344\275\277\347\224\250.md" | 243 ++++++++++ .../readme.md" | 26 + ...46\216\247\345\210\266\345\222\214 Git.md" | 51 ++ ...44\275\225\345\256\211\350\243\205 Git.md" | 110 +++++ .../readme.md" | 29 ++ ...34\347\250\213\344\273\223\345\272\223.md" | 117 +++++ ...70\345\205\263\345\221\275\344\273\244.md" | 309 ++++++++++++ ...7\224\250 Git \345\221\275\344\273\244.md" | 254 ++++++++++ ...70\345\205\263\345\221\275\344\273\244.md" | 393 +++++++++++++++ ...46\210\267\347\253\257\347\232\204 Git.md" | 210 ++++++++ ...50\277\201\347\247\273\345\210\260 Git.md" | 91 ++++ .../readme.md" | 6 + ...30\345\261\202\345\221\275\344\273\244.md" | 34 ++ .../2. Git \345\257\271\350\261\241.md" | 204 ++++++++ .../3. Git \345\274\225\347\224\250.md" | 52 ++ .... \345\214\205\346\226\207\344\273\266.md" | 87 ++++ ...25\347\224\250\350\247\204\350\214\203.md" | 103 ++++ ...40\350\276\223\345\215\217\350\256\256.md" | 38 ++ ...60\346\215\256\346\201\242\345\244\215.md" | 266 ++++++++++ ...57\345\242\203\345\217\230\351\207\217.md" | 189 ++++++++ .../readme.md" | 12 + ...56\350\256\242\347\211\210\346\234\254.md" | 231 +++++++++ .... \345\255\220\346\250\241\345\235\227.md" | 453 ++++++++++++++++++ .../11. \346\211\223\345\214\205.md" | 89 ++++ .../12. \346\233\277\346\215\242.md" | 101 ++++ ...55\350\257\201\345\255\230\345\202\250.md" | 79 +++ ...22\345\274\217\346\232\202\345\255\230.md" | 109 +++++ ...17\344\270\216\346\270\205\347\220\206.md" | 175 +++++++ ...76\347\275\262\345\267\245\344\275\234.md" | 202 ++++++++ .../5. \346\220\234\347\264\242.md" | 89 ++++ ...15\345\206\231\345\216\206\345\217\262.md" | 208 ++++++++ ...15\347\275\256\346\217\255\347\247\230.md" | 130 +++++ .../8. Rerere.md" | 93 ++++ ...7\224\250 Git \350\260\203\350\257\225.md" | 104 ++++ .../Git \345\267\245\345\205\267/readme.md" | 17 + ...273\200\344\271\210\346\230\257 GitOps.md" | 39 ++ ...72\344\270\216\344\275\277\347\224\250.md" | 72 +++ ...e \347\255\211\346\225\264\345\220\210.md" | 106 ++++ .../GitOps/readme.md" | 7 + .../readme.md" | 37 ++ ...45\344\275\234\346\265\201\347\250\213.md" | 83 ++++ ...71\347\233\256\350\264\241\347\214\256.md" | 100 ++++ ...64\346\212\244\351\241\271\347\233\256.md" | 161 +++++++ .../readme.md" | 7 + .../1. Git \351\205\215\347\275\256.md" | 234 +++++++++ .../2. Git \345\261\236\346\200\247.md" | 104 ++++ .../3. Git \351\222\251\345\255\220.md" | 91 ++++ ...26\347\225\245\347\244\272\344\276\213.md" | 6 + .../\345\256\232\345\210\266 Git/readme.md" | 8 + src/git_tutorial/README.md | 35 ++ src/guide/readme.md | 37 ++ src/images/wechat-qrcode-gitee2013.png | Bin 0 -> 14472 bytes src/joinus/readme.md | 23 + src/members/readme.md | 31 ++ src/readme.md | 106 ++++ src/story/readme.md | 80 ++++ ...20\347\232\204\344\270\226\347\225\214.md" | 41 ++ src/story/stories/README.md | 22 + .../images/135029_c93ca9b3_1277510.png | Bin 0 -> 29838 bytes .../images/135109_5981e394_1277510.png | Bin 0 -> 19213 bytes .../images/135151_2f25f98a_1277510.png | Bin 0 -> 100094 bytes .../images/135236_bd749e58_1277510.png | Bin 0 -> 77481 bytes .../images/135308_f229edb9_1277510.png | Bin 0 -> 82282 bytes .../images/135639_bcc762e2_1277510.png | Bin 0 -> 1802102 bytes .../images/140033_0d359644_1277510.jpeg | Bin 0 -> 761215 bytes .../images/140112_5d07dcb4_1277510.jpeg | Bin 0 -> 612961 bytes .../images/140126_88806c64_1277510.jpeg | Bin 0 -> 1283009 bytes .../images/140141_14b080ec_1277510.png | Bin 0 -> 1917948 bytes .../images/140156_6dd035e9_1277510.png | Bin 0 -> 2014935 bytes .../images/140229_324697ff_1277510.png | Bin 0 -> 201225 bytes .../images/145253_2c255404_1899542.png | Bin 0 -> 88958 bytes src/story/stories/images/20240507_220521.jpg | Bin 0 -> 315773 bytes ...00\346\272\220\346\214\207\345\214\227.md" | 85 ++++ ...45\272\246\344\271\213DolphinScheduler.md" | 66 +++ ...64\241\347\214\256 @types \345\214\205.md" | 96 ++++ ...00\346\272\220\345\216\206\347\250\213.md" | 33 ++ ...15\345\210\260\344\272\206 Windows WSL.md" | 82 ++++ ...70\344\270\215\350\244\252\350\211\262.md" | 82 ++++ ...AP\347\232\204\346\225\205\344\272\213.md" | 25 + ...PA\347\232\204\346\225\205\344\272\213.md" | 30 ++ ...10\347\232\204\346\225\205\344\272\213.md" | 12 + ...27\347\232\204\346\225\205\344\272\213.md" | 148 ++++++ ...00\346\272\220\346\225\205\344\272\213.md" | 149 ++++++ 85 files changed, 7374 insertions(+) create mode 100644 src/comments/readme.md create mode 100644 src/event/readme.md create mode 100644 "src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/Git \347\232\204\345\205\245\351\227\250\344\275\277\347\224\250.md" create mode 100644 "src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/readme.md" create mode 100644 "src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/\344\273\200\344\271\210\346\230\257\347\211\210\346\234\254\346\216\247\345\210\266\345\222\214 Git.md" create mode 100644 "src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/\345\246\202\344\275\225\345\256\211\350\243\205 Git.md" create mode 100644 "src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/readme.md" create mode 100644 "src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\344\275\277\347\224\250\345\221\275\344\273\244\346\223\215\344\275\234\350\277\234\347\250\213\344\273\223\345\272\223.md" create mode 100644 "src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\345\210\206\346\224\257\344\270\216\345\220\210\345\271\266\347\233\270\345\205\263\345\221\275\344\273\244.md" create mode 100644 "src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\345\270\270\347\224\250 Git \345\221\275\344\273\244.md" create mode 100644 "src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\346\220\255\345\273\272 Git \347\233\270\345\205\263\345\221\275\344\273\244.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \344\270\216\345\205\266\344\273\226\347\263\273\347\273\237/1. \344\275\234\344\270\272\345\256\242\346\210\267\347\253\257\347\232\204 Git.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \344\270\216\345\205\266\344\273\226\347\263\273\347\273\237/2. \350\277\201\347\247\273\345\210\260 Git.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \344\270\216\345\205\266\344\273\226\347\263\273\347\273\237/readme.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/1. \345\272\225\345\261\202\345\221\275\344\273\244\345\222\214\351\253\230\345\261\202\345\221\275\344\273\244.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/2. Git \345\257\271\350\261\241.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/3. Git \345\274\225\347\224\250.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/4. \345\214\205\346\226\207\344\273\266.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/5. \345\274\225\347\224\250\350\247\204\350\214\203.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/6. \344\274\240\350\276\223\345\215\217\350\256\256.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/7. \347\273\264\346\212\244\344\270\216\346\225\260\346\215\256\346\201\242\345\244\215.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/8. \347\216\257\345\242\203\345\217\230\351\207\217.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/readme.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/1. \351\200\211\346\213\251\344\277\256\350\256\242\347\211\210\346\234\254.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/10. \345\255\220\346\250\241\345\235\227.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/11. \346\211\223\345\214\205.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/12. \346\233\277\346\215\242.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/13. \345\207\255\350\257\201\345\255\230\345\202\250.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/2. \344\272\244\344\272\222\345\274\217\346\232\202\345\255\230.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/3. \345\202\250\350\227\217\344\270\216\346\270\205\347\220\206.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/4. \347\255\276\347\275\262\345\267\245\344\275\234.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/5. \346\220\234\347\264\242.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/6. \351\207\215\345\206\231\345\216\206\345\217\262.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/7. \351\207\215\347\275\256\346\217\255\347\247\230.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/8. Rerere.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/9. \344\275\277\347\224\250 Git \350\260\203\350\257\225.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/readme.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/GitOps/1. \344\273\200\344\271\210\346\230\257 GitOps.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/GitOps/2. \344\273\243\347\240\201\350\257\204\345\256\241\345\271\263\345\217\260\347\232\204\346\220\255\345\273\272\344\270\216\344\275\277\347\224\250.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/GitOps/3. \344\270\216 Jenkins , Nexus , Ansible \347\255\211\346\225\264\345\220\210.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/GitOps/readme.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/readme.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/\345\210\206\345\270\203\345\274\217 Git/1. \345\210\206\345\270\203\345\274\217\345\267\245\344\275\234\346\265\201\347\250\213.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/\345\210\206\345\270\203\345\274\217 Git/2. \345\220\221\344\270\200\344\270\252\351\241\271\347\233\256\350\264\241\347\214\256.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/\345\210\206\345\270\203\345\274\217 Git/3. \347\273\264\346\212\244\351\241\271\347\233\256.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/\345\210\206\345\270\203\345\274\217 Git/readme.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/\345\256\232\345\210\266 Git/1. Git \351\205\215\347\275\256.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/\345\256\232\345\210\266 Git/2. Git \345\261\236\346\200\247.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/\345\256\232\345\210\266 Git/3. Git \351\222\251\345\255\220.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/\345\256\232\345\210\266 Git/4. Git \345\274\272\345\210\266\347\255\226\347\225\245\347\244\272\344\276\213.md" create mode 100644 "src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/\345\256\232\345\210\266 Git/readme.md" create mode 100644 src/git_tutorial/README.md create mode 100644 src/guide/readme.md create mode 100644 src/images/wechat-qrcode-gitee2013.png create mode 100644 src/joinus/readme.md create mode 100644 src/members/readme.md create mode 100644 src/readme.md create mode 100644 src/story/readme.md create mode 100644 "src/story/stories/DolphinScheduler\345\246\202\344\275\225\345\270\246\351\242\206\346\210\221\350\265\260\350\277\233\345\274\200\346\272\220\347\232\204\344\270\226\347\225\214.md" create mode 100644 src/story/stories/README.md create mode 100644 src/story/stories/images/135029_c93ca9b3_1277510.png create mode 100644 src/story/stories/images/135109_5981e394_1277510.png create mode 100644 src/story/stories/images/135151_2f25f98a_1277510.png create mode 100644 src/story/stories/images/135236_bd749e58_1277510.png create mode 100644 src/story/stories/images/135308_f229edb9_1277510.png create mode 100644 src/story/stories/images/135639_bcc762e2_1277510.png create mode 100644 src/story/stories/images/140033_0d359644_1277510.jpeg create mode 100644 src/story/stories/images/140112_5d07dcb4_1277510.jpeg create mode 100644 src/story/stories/images/140126_88806c64_1277510.jpeg create mode 100644 src/story/stories/images/140141_14b080ec_1277510.png create mode 100644 src/story/stories/images/140156_6dd035e9_1277510.png create mode 100644 src/story/stories/images/140229_324697ff_1277510.png create mode 100644 src/story/stories/images/145253_2c255404_1899542.png create mode 100644 src/story/stories/images/20240507_220521.jpg create mode 100644 "src/story/stories/\342\200\234\346\210\221\347\232\204\344\270\200\345\211\202\350\211\257\350\215\257\342\200\235\344\271\213\345\274\200\346\272\220\346\214\207\345\214\227.md" create mode 100644 "src/story/stories/\344\274\227\351\207\214\345\257\273\345\245\271\345\215\203\347\231\276\345\272\246\344\271\213DolphinScheduler.md" create mode 100644 "src/story/stories/\345\220\221\345\276\256\350\275\257\345\256\230\346\226\271\350\264\241\347\214\256 @types \345\214\205.md" create mode 100644 "src/story/stories/\345\274\200\346\272\220\346\234\211\351\255\224\345\212\233-DolphinScheduler\345\222\214\346\210\221\347\232\204\345\274\200\346\272\220\345\216\206\347\250\213.md" create mode 100644 "src/story/stories/\345\274\200\346\272\220\347\244\276\345\214\272\345\256\236\344\271\240\350\256\260 - \346\210\221\346\212\212 openEuler \347\247\273\346\244\215\345\210\260\344\272\206 Windows WSL.md" create mode 100644 "src/story/stories/\346\204\237\350\260\242Apache DolphinScheduler\357\274\214\350\256\251\346\210\221\347\232\204\351\235\222\346\230\245\346\260\270\344\270\215\350\244\252\350\211\262.md" create mode 100644 "src/story/stories/\350\246\201\346\207\202\345\276\227\350\210\215\345\276\227\347\232\204UMS\344\270\216JAP\347\232\204\346\225\205\344\272\213.md" create mode 100644 "src/story/stories/\350\246\201\346\207\202\345\276\227\350\210\215\345\276\227\347\232\204UMS\344\270\216JPA\347\232\204\346\225\205\344\272\213.md" create mode 100644 "src/story/stories/\350\275\273\347\274\226\347\250\213\344\270\216CRMEB\346\211\223\351\200\232\347\211\210\347\232\204\346\225\205\344\272\213.md" create mode 100644 "src/story/stories/\351\233\252\345\261\261\345\207\214\347\213\220\344\270\216\345\274\200\346\272\220\346\214\207\345\214\227\347\232\204\346\225\205\344\272\213.md" create mode 100644 "src/story/stories/\351\233\252\345\261\261\345\207\214\347\213\220\347\232\204\345\274\200\346\272\220\346\225\205\344\272\213.md" diff --git a/src/comments/readme.md b/src/comments/readme.md new file mode 100644 index 0000000..e456725 --- /dev/null +++ b/src/comments/readme.md @@ -0,0 +1,201 @@ +# 开源寄语 + +> 以下寄语不分先后,按寄语人首字母顺序排列。 + +读开源指北,拥抱开源世界,人人为我,我为人人! +—— 安涛,Drogon 作者 + +*** + +开源指北就像启明星,给更多的的开发者指引开源的方向! +—— 阿特,CmsWing 作者 +*** + +之前国内开源界从未有一部如此详细的教科书级别的知识库,现在有了,《开源指北》堪称国内开源的百科全书,希望更多开发者能够投入开源事业,让这个社区更加繁荣! +—— 铂赛东,TLog 作者 +*** + + +开源如同人的脸,好坏一面便知,缺点可能会受到嘲讽批评,优点也会收获赞扬尊重。别担心,他们正在塑造更好的你。 +—— 百小僧,Furion 作者、企业 CEO +*** + +期待《开源指北》能帮助开发小伙伴们参与开源社区,助力开源生态更加繁荣。 +—— 陈嘉涵,vant 作者 +*** + + +开源推动了社会进步,开源是一种情怀,《开源指北》将会是大家进入开源世界的一盏明灯,带领大家在开源中走的更远。 +——陈龙飞,plumelog 作者 + +*** + + +《开源指北》一份保姆级开源百科,可以帮你扫除开源路上的一切障碍,希望有更多开发者能通过开源指北了解开源、参与开源、爱上开源! +—— 陈凯玲,kkFIleView 作者 +*** + +从进入软件行业一直享受着开源带来的红利,凭借着兴趣爱好也组织参与过很多的开源项目。开源是一种精神,希望更多的人能够通过《开源指北》了解开源、爱上开源,并能够投入到开源事业中去... +—— 大猫猫,bbs-go 作者 +*** + + +特别希望更多开发者能通过开源指北对开源有更多的了解,抛弃”拿来主义“,积极拥抱开源、参与开源,为国内开源崛起贡献一份自己的力量。 +—— 代立冬,Apache DolphinScheduler Committer & PPMC +*** + +开源是软件发展的基础,更多人参与,更多人收益,欢迎共建开源生态! +——独书先生,Luckysheet 贡献者 +*** + +希望开发者们能够取之于开源,回报于开源,共同创建美好开源社区。 +—— Gui.H,FastTunnel 作者 +*** + +开源已被证明是开发软件的最佳解决方案,而《开源指北》是进入开源世界的最佳方式! +—— 黄朝晖,Hyperf 作者 +*** + +学习编程,从“hello world”开始;参与开源,从《开源指北》开始。《开源指北》,奶妈级开源百科,奶你一个茁壮的开源项目。 +—— 黄虫,BookStack 作者 +*** + +开源不是一天两天的事,希望更多开发者能坚持开源,不忘初心,一定会有所收获 +—— iamkun,Day.js 作者、Element UI 社区负责人 +*** + +开源,是一个了不起的生态模式,希望开发者更多参与开源,爱上开源! +—— 江冬勤,LinkWeChat 作者 +*** + +开源,不仅可以提升技术,更能结识一群志同道合的人。爱上开源,从《开源指北》开始。 +—— 梁灏,iView 作者 +*** + +开源让世界运行的更美好,希望更多开发者能通过开源指北了解开源、参与开源、爱上开源! 并打造国内的开源复兴。 +—— 刘晨,ThinkPHP 作者 +*** + +《开源指北》对于开源初学者来说是一个非常好的入门教程,希望有更多的开源开发者通过《开源指北》能更好的了解开源,参与开源,并贡献开源。 +—— 刘果,OpenHarmony 开源教练、方舟社区经理 +*** + +开源指北的诞生是国内开源发展的里程碑。希望更多的工程师和高校学生能通过开源指北走进开源世界,传承开源精神! +—— 李凯龙,BabyOS 作者 +*** + +在我过去接触开源时,需要从各个角落捡起来形成自己的开源知识,《开源指北》是国内非常用心、非常优秀的开源知识手册,是开源人的教科书级知识宝典! +—— 李向龙,PyMiner 作者 +*** + +希望开源指北能像一盏灯塔,引导更多开发者踏上开源之路! +—— 潘娟,Apache ShardingSphere 作者/贡献者、项目PMC +*** + +参与开源是软件开发过程中个人学习和进步非常有效的途径,而《开源指北》是我目前接触过的最完善的开源指导手册,相信有意参与开源的开发者一定能通过它开始其开源之路。 +—— progr1mmer,big-whale 作者 +*** + +很多开源小项目如果较起真来难免会存在一些小问题,这份由众多开源大佬一起维护的指北绝对是保姆级的宝典!不仅可以给刚接触开源的新同学答疑解惑,更是开源项目作者自我检查启迪的最佳文档! +—— RememBerBer,WePush 作者 +*** + +开源是一种健康的生活方式,心平气和,不求回报,只为梦想! +—— rockdeng,xrkmonitor 作者 +*** + +对很多人来说,开源可能是一件神秘而遥远的事。心怀憧憬,却不知如何下手。幸运的是,Gitee 已经帮我们解决了这个问题。找一个悠闲的周末,读一读《开源指北》,期待你能勇敢的迈出自己的第一步。 +—— 滕佶祺,PowerJob 作者 +*** + +希望更多开发者能通过 开源指北 多多参与传播和贡献! +—— TommyLemon,APIJSON 作者 +*** + +愿开源指北能让更多中国的IT人参与开源,让中国开源走向世界! +—— Seagull,LuckyFrame 作者 +*** + +希望Gitee越来越好,希望更多开发者能通过开源指北了解开源、参与开源、爱上开源! +—— 王飞虎,Radar 作者 +*** + +五湖四海,南北东西,皆因热爱,汇聚于此。 +开源指北,匠心巨制,点亮生态,给你方向。 +—— 王兵,Huawei LiteOS 贡献者 +*** + + +开源,善莫大焉 +—— 卫剑钒,开源“圣经”《大教堂与集市》中文版译者 +*** + + +《开源指北》在开源合规、开源参与等方面提供了比较权威的指导,相信会对大家在做开源项目时有极大的帮助。拥抱开源,参与开源贡献,和 Gitee 一起进步、一起加油。 +—— 武伟峰,京东 App 后台资深工程师、开源作者 +*** + +15年来,从接触开源技术,发起开源项目,到创建开源社区,有贡献也有收获,充分认识到开源是一种非常重要的社会参与和协作的方式,大家因开源而互助共赢。希望有更多的开发者因开源指北而更好地融入开源社区,快来GITEE提交您的第一个PR吧! +—— 吴章金,Linux Lab 作者 +*** + + +如果你找不到更好的,那就去创造一个,开源就这么简单,就像《开源指北》一样 +—— 宣启 ,zvt 作者 +*** + +开源不易,道阻且长,希望更多开发者能通过开源指北了解开源、参与开源、爱上开源! +—— 许雪里,xxl-job 作者 +*** + + +《开源指北》对于开源还不熟悉的开发小伙伴来说是一本非常全面的介绍书籍,希望开发者小伙伴们能行动起来,参与到开源中来,贡献自己的力量,将"国产"的开源项目做的更加强大。 +—— 肖玉明,Knife4j 作者 +*** + + +莫悔今生走一遭,加入开源傲九霄。《开源指北》将指引更多开发者参与到开源社区的建设中来。 +—— 杨朝,Diboot 贡献者 +*** + +超越梦想,不是空想,相信开源的力量,相信自己的力量!开源指北你值得拥有! +—— 於之,IOTGate 作者 +*** + + +强烈推荐国内开发者通过开源指北了解开源、参与开源、爱上开源,在开源世界获得成长与快乐! +—— 杨舜杰,ant-design-blazor 作者 +*** + +开源指北具有很强的实践指导意义。一步一步从前到后,阐述得很清楚,希望每一位开发人员都能阅读到。 +—— 阳宗专,RuoYi 作者/贡献者 +*** + +开源不是大厂,大牛才能做的,人人都可以,小厂的人通过开源更能快速成长,获得更多的关注,希望大家都能通过开源指北能够早日成为业界大佬。 +—— 张超杰,f-render 作者 +*** + +希望更多开发者能通过开源指北了解开源、参与开源、共建美好开源环境;再新的一年里为开源社区做出自己的一份努力并获取一份收获 +—— 张广坡,BootstrapAdmin 作者 +*** + +《开源指北》开源路上的指南针,让你走进开源,并爱上开源! +—— 张红元, iot-dc3 作者 +*** + + +开源无界,希望通过开源指北,推进开源知识,布道开源文化,让更多才俊加入开源社区 +—— 张亮,Apache ShardingSphere 创始人 + +*** + +希望更多开发者通过开源指北参与到第一次项目开源,分享自己的技术 +—— 子山,SMProxy 作者 +*** + +希望更多开发者能通过开源指北了解开源、参与开源、爱上开源。 +—— 张玉龙,koalas-rpc 作者 +*** + +想做开源或者想参与开源项目的朋友,可以了解一下开源指北,里面有你想知道的一切! +—— 张玉坡,Spug 作者 \ No newline at end of file diff --git a/src/event/readme.md b/src/event/readme.md new file mode 100644 index 0000000..3bb7f54 --- /dev/null +++ b/src/event/readme.md @@ -0,0 +1,31 @@ +# 限时活动 | 分享海报参与抽奖领周边好礼 + +“为他人点亮明灯,亦是为自己照亮前路” + +将你 #接触开源的原因及开源带给你的收获# + 下方海报,分享至朋友圈,即可联系小助手入群参与群内抽奖活动!(奖品详情请见下方) + +**活动时间:** 1月27日-2月1日 + +**抽奖时间:** 2月1日 + +**抽奖礼品:** + +礼品一(10份):Gitee 陶瓷马克杯 + +礼品二(10份):Gitee 鼠标垫 + +礼品三(10份):掘金搪瓷杯 + +礼品四(5份):微众开源T恤 + 冰箱贴 + 贴纸 + +礼品五(5份):TiDB 文具套装 + +![](./../.vuepress/public/prize.png) + +### 海报 + +![](./../.vuepress/public/poster.png) + +### 小助手微信:添加“gitee2013”或扫描以下二维码 + +![](./../.vuepress/public/qrcode.jpeg) diff --git "a/src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/Git \347\232\204\345\205\245\351\227\250\344\275\277\347\224\250.md" "b/src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/Git \347\232\204\345\205\245\351\227\250\344\275\277\347\224\250.md" new file mode 100644 index 0000000..23b16d0 --- /dev/null +++ "b/src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/Git \347\232\204\345\205\245\351\227\250\344\275\277\347\224\250.md" @@ -0,0 +1,243 @@ +--- +title: Git 的入门使用 +--- + +更多配置请参阅 [Git 配置](./../Git%20团队协作与管理(进阶篇)/定制%20Git/1.%20Git%20配置.md) + +## 简单命令的认识 + +### 用户信息 + +使用以下命令来让 Git 记住你是谁,以后每次提交都会以此为签名让其他人知道是你做出了贡献 + +```shell +git config --global user.name "<你的名字>" +git config --global user.email <你的邮箱> +``` + +### init:创建本地仓库 + +假设我们将启动一个全新的项目,代码将存在于 `/home/gitee/firstProject`目录,那么以此目录为目标建立仓库 + +```shell +cd /home/gitee/firstProject +git init +``` +如此便将仓库建立好了 +### clone:获取远程仓库 + +假设我们要对一个已经存在于远程仓库的项目进行`https://gitee.com/giteeeer/example.git`,那么就需要将其同步到本地的当前目录下 + +```shell +git clone https://gitee.com/giteeeer/example.git +``` +注:这样仅仅是将默认分支同步到了本地 + +### remote :远程仓库 + +可以使用以下命令来获取远程仓库地址 + +```shell +git remote -v +``` +由此可以获得两个地址,一个是 fetch,一个是 push,fetch 地址意指我们获取代码的地址,push 则指我们要提交的地址。如下图 + +![图片](./../../.vuepress/public/images/r88kuUJ1z4lW9go5.png) + +### branch :分支管理操作 + +用以下命令来获取 branch 列表以便进一步让我们选定需要的分支 + +```shell +git branch +``` +![图片](./../../.vuepress/public/images/NuA3srhhQ1fNClRz.png) + +接下来我们将在默认分支(master)上进行操作。 + +### add: 让 Git 跟踪变更 + +在本地有了仓库之后,我们可以开始做一些开发工作了,假设我们写了一个“ToAdd.txt”文件 + +而这个新增的“ToAdd.txt”是没有被 Git “注意到“的,因此,首先要让 Git 对变更进行追踪,而已经被 Git 跟踪到的文件则是在上一次版本快照中有记录的文件。就好像学生首先要注册学籍,这样学校才能把学生的学习记录放入学籍,而 Git 就是对“学籍”进行管理的人员,入籍这个动作即为`add`。 + +使用以下命令 + +```shell +git add ToAdd.txt +``` +则 Git 会将“ToAdd.txt”文件存入暂存区以实现跟踪。 +在对某些文件进行了改动之后(此处我们修改了 project.txt 文件的内容,增加了 ToAdd.txt 文件),对于 Git 有记录的文件,Git 可以计算出变动并标记为已修改文件,而没有记录的则需要将有需要的文件加入暂存区以便管理,这时候使用`status`命令即可获得文件的状态 + +```shell +git status +``` +![图片](./../../.vuepress/public/images/EoCka30vAARNH789.png) + +如上图所示,其中“ToAdd.txt”就是新加入暂存区的文件,“project.txt”就是已经存入暂存区并且 Git 发现有修改的文件,而下面“Untracked files”就是 Git 还没有追踪的文件。 + +而当我们针对下面 “RemoteSystemTempFiles” 文件夹使用`add`命令之后, + +```shell +git add RemoteSystemTempFiles/ +``` +Git 将此文件夹下所有文件存入暂存区开始追踪,再运行`status`命令得到下图 + +![图片](./../../.vuepress/public/images/YUx3GU6IpSDKUKoM.png) + +这时候,“RemoteSystemTempFiles”中的“.project”文件就被纳入暂存区追踪了,而“Untracked files”中就看不到它了。 + +要注意的是,刚刚虽然我们是针对“RemoteSystemTempFiles”文件夹进行的`add`操作,纳入暂存区的也仅仅是彼时存在于文件夹中的文件,而如果我们之后再在“RemoteSystemTempFiles"文件夹内增加文件,则仍需针对文件运行`add`命令,否则我们会看到新加入的文件没有被追踪到,正如下图的“ThisOneHasNotBeenTracked.txt”文件。 + +![图片](./../../.vuepress/public/images/5xAArdS8XNcUfXgN.png) + +### gitignore:忽略文件 + +在上面我们看到了一些与我们项目本身毫无关系的文件比如“git”,“.DS_Store”和“.gitignore”等等,在实际应用中我们会希望这些文件不要出现在 Git 提示当中干扰我们的工作,我们可以编辑“gitignore”文件来让 Git 彻底忽略它们的存在,如将 “git” 甚至“.gitignore”文件的文件名本身写入“gitignore”,那么 Git 就不会再提示我们有关这个是不是被追踪的问题了 + +![图片](./../../.vuepress/public/images/ZFMVMSUHIgW24k4Y.png) + +再运行`status`命令就不会看到针对“git”和“.gitignore”的提示了 + +![图片](./../../.vuepress/public/images/jCEIaocNNAdNWlMm.png) + +### Fetch 和 Pull : 拉取操作 + +在我们对本地文件进行编辑的同时可能会有其他人也在对项目做出贡献,这就会造成本地和远程仓库的不同步,这时候通过使用`fetch`或`pull`操作访问远程仓库,将本地没有的数据全部拉取到本地 + +```shell +git pull +``` +这个命令会将远程仓库的变动同步到本地并且自动尝试合并到当前所在的分支,因此可能需要进一步处理冲突才能完成整个`pull`操作。 +```shell +git fetch +``` +要注意的是它和`pull`命令不同,它不会自动合并或修改你当前的变更而你必须在准备好以后手动地进行合并。 +### diff:对比不同 + +通过使用`diff`命令可以让我们详细对比每个被追踪的文件的变更 + +```shell +git diff +``` +可以看到详细的变动对比 + +![图片](./../../.vuepress/public/images/7HfoDCit9E9N3c7E.png) + +其中红色表明是删除对应`-`,绿色 表明是增加的部分对应`+`。 + +### commit: 提交到本地存储库 + +光让文件呆在暂存区不是我们的目的,将所有变更写入远程代码仓库才是,所以下一步我们要提交变更。提交的同时记得写一句简明的话来说明本次提交的目的,内容等,参数为`-m`所以 使用以下命令会将所有文件有变动的文件提交到存储库 + +```shell +git commit -m "修改介绍" +``` +这样就将修改提交了,然后 Git 会反馈一个报告,告诉你提交到了哪个分支,本次变更的 SHA-1 校验和是什么(74219eb),有多少文件被修改过,多少行被添加,多少行被删除。 + +![图片](./../../.vuepress/public/images/BV5S2wofGhUsPJMb.png) + +#### -a:全提交 + +每次都先`add`然后再`commit`多少有些繁琐,所以可以使用`-a`参数来将所有变更直接提交而不用使用`add`命令, 即 + +```shell +git commit -a -m "修改介绍" +``` +但要小心,这样可能会把不想提交的文件也给提交了,最好和 gitignore 文件配置一起配合使用。 +#### --amend:重新提交 + +有时候我们会误操作在某次提交中少提交了某些文件,除了直接再提交一次,我们可以使用 + +`--amend`参数来补齐遗漏的文件,如下操作 + +```shell +git commit -m “修改介绍” +git add renamed.txt +git commit --amend +``` +这样就只有一条说明为“修改介绍”的提交被记录下来,第二次提交的内容会**覆盖**第一次的提交。即使用`log`命令的 时候显示记录只有一条有关“修改介绍”。 +### rm:移除文件 + +Git 可以移除某个文件,我们以“ToRemove.txt”为例,那么可以通过`rm`命令 来实现 + +```shell +rm ToRemove.txt +``` +这样就从文件系统中删除了,接下来让 Git 记录此次操作 +```shell +git rm ToRemove.txt +``` +如果该文件已经放入了暂存区,那么需要加入`-f`参数 来强制移除,这个参数可以认作是 Git 防止误删操作而加的保险 +```shell +git rm -f ToRemove.txt +``` +另一种情况可能更加常用,即我们仅仅是想将其从暂存区移除而不希望把它从磁盘上删除,那么可以加入`--cached`参数来实现 +```shell +git rm --cache ToRemove.txt +``` +那么“ToRemove.txt”会再次回到“Untracked files”列表中并且也会保留在磁盘上。 + +![图片](./../../.vuepress/public/images/GbIhqyecsy6SyY5P.png) + +### mv: 移动/重命名文件 + +在 Git 中,`mv`操作相当于在暂存区删除原文件再添加改名后的文件,也就是先`rm`再`add`,虽然使用者可以同样使用`rm`和`add`命令来达到一样的效果,直接使用`mv`命令无疑更为方便。 + +```shell +git mv ToRemove.txt renamed.txt +``` +当然使用这命令的前提是原文件已经被 Git 追踪 +再运行`status`命令之后,“ToRemove.txt”就被改成了“renamed.txt” + +![图片](./../../.vuepress/public/images/U4miY2EtGP5a0as2.png) + +### reset HEAD:取消暂存的文件 + +当我们希望取消某一个文件的暂存的时候,以“toUntracked.txt”为例,是我们刚刚加入暂存区的文件。 + +![图片](./../../.vuepress/public/images/FxjqroGUQ4x1Hmvh.png) + +则可以使用以下命令 + +```shell +git reset HEAD toUntracked.txt +``` +我们会得到一个反馈说 reset 之后剩下的暂存的变动如 + +![图片](./../../.vuepress/public/images/AlRNI0ej38RIoINw.png) + +这里就只剩下了对“project.txt”的修改,运行`status`命令发现`toUntracked.txt`出现在了“Untracked files”列表当中。 + +### checkout:还原 + +如果不想保留对文件的修改呢,可以使用`checkout`命令来使其还原到上次提交的样子 + +```shell +git checkout -- project.txt +``` +注意:这个命令会使 Git 用最新提交的版本覆盖指定的文件,对该文件在本地的所有修改都会消失。 +再运行`status`命令发现针对“project.txt”的修改已经不存在了 + +![图片](./../../.vuepress/public/images/aCWIQtjkCZJHE2Qw.png) + +### log:查看提交历史 + +我们在很多场景下可能会需要查看提交历史,那么使用以下命令 + +```shell +git log +``` +此命令会按时间倒叙显示所有提交,包括 SHA-1 校验和、作者名字、邮件地址、时间和提交说明。 +### push:提交到远程仓库 + +只存在本地的代码仓库接下来使用以下命令来将本地存储库中的变动同步到远程仓库,这一步你需要提供在 Gitee 的用户名和密码以获取 push 权限。 + +```shell +git push +``` +![图片](./../../.vuepress/public/images/qdbRn12Bw6FkOjXi.png) + +### 小结 + +以上我们介绍了一些最常用的 Git 命令,但实际上 Git 最基本的流程就是`init` /`clone`->`add`->`commit`->`push`,当然在实际使用中因为可能是多人协作,所以我们需要使用分支来支持更为科学的开发策略以提高效率降低成本,与 IDE 整合以提高易用性以及与 DevOps 工具相结合以提高团队的吞吐量等,这些我们将在后面的教程中详细说明。 diff --git "a/src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/readme.md" "b/src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/readme.md" new file mode 100644 index 0000000..1bdcfa7 --- /dev/null +++ "b/src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/readme.md" @@ -0,0 +1,26 @@ +--- +blog: false +home: true +baseLang: zh_CN +title: Git 入门(初级篇) +heroText: Git 入门(初级篇) +tagline: 从零开始认识 Git + +features: + - title: 什么是版本控制和 Git? + details: 我们为什么要用 Git? + link: /git_tutorial/Git 入门(初级篇)/什么是版本控制和 Git + + - title: 如何安装 Git? + details: 一行命令即可安装 + link: /git_tutorial/Git 入门(初级篇)/如何安装 Git + + - title: Git 的入门使用 + details: 输入简单的命令就能开始使用 Git + link: /git_tutorial/Git 入门(初级篇)/Git 的入门使用 + + +copyrightText: false +footer: Git 教程采用 CC-BY-SA-4.0 进行许可 | 感谢每一位参与的开发者 | VuePress 主题:vuepress-theme-hope + +--- \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/\344\273\200\344\271\210\346\230\257\347\211\210\346\234\254\346\216\247\345\210\266\345\222\214 Git.md" "b/src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/\344\273\200\344\271\210\346\230\257\347\211\210\346\234\254\346\216\247\345\210\266\345\222\214 Git.md" new file mode 100644 index 0000000..c003398 --- /dev/null +++ "b/src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/\344\273\200\344\271\210\346\230\257\347\211\210\346\234\254\346\216\247\345\210\266\345\222\214 Git.md" @@ -0,0 +1,51 @@ +--- +title: 什么是版本控制和 Git +--- + +## 什么是版本控制和 Git + +### 关于版本控制 + +你一定不想看到如下图的场景,不但难以确认每一版的改动,还难以找到最需要的版本。 + +![图片](./../../.vuepress/public/images/uQyoTPlLtpJme36w.png) + +那么这也就是我们做版本控制的原因了:追溯每个变更并管理每个版本,当然此外还需要有更好的协作模式。 + +### 主流的版本控制系统 + +主流的版本控制系统有 CVS,SVN 和 Git 等 + +#### CVS + +我们先说 CVS(Concurrent Versions System),它是集中式版本控制系统的典型。它的工作是 C/S 模式的,即在服务器上建立一个仓库,仓库管理员管理这仓库里面的所有文件,任何人需要进行修改的时候需要下载到本地(copy)再进行对文件的修改(modify),改完以后再提交给 CVS,由 CVS 源码库统一进行合并(merge),这样就做到了只有一个人对仓库的文件进行写入,避免了很多冲突和管理难题。 + +CVS 的痛点很多,比如不支持重命名,只能删除再添加文件。又如每次提交不是原子性的,而是针对单个文件的,这给文件管理带来了极大的灵活性,但同时也对版本控制带来了挑战,想象一下某一个修改了上千个文件的版本上线之后需要回滚,那么管理员就只能一个文件一个文件地来做了。 + +#### SVN + +类似于 CVS ,SVN(subversion)也是集中式版本控制系统,它解决了一些 CVS 的痛点,如支持了重命名,对不同编码的文件的支持等,保证安全性的同时易于管理。同时也将变更变成了原子性的,以一定的灵活性的代价换来了管理的便利。但也因为它是集中控制系统,几乎所有的操作都需要发生在服务器上如对比,提交,还原等,就给服务器带来了压力,如此就不适合进行开源项目而只适合开发人数有限的项目的开发。同样的,开发人员每天都需要从服务器上获取最新的文件随后进行修改,解决冲突并提交,在某些不能保证稳定网络连接的情况下SVN是没有办法帮助企业保证其业务的连续性的。 + +#### Git + +作为本文的主角, Git 是这些主流版本控制工具中唯一的分布式版本控制系统,开发者可以将整个代码库放到本地,这样不要求客户端时刻联网而就可以在本地进行对比、提交等工作,然后再`push`进服务器端进行`merge`即可。将部分工作放在本地以平衡服务器的负载,这样的解决方案使得 Git 支持大规模多用户的开发模式便可更好地支持开源项目。 + +## Git 简史 + +同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。 + +Linux 内核开源项目有着为数众多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。 + +到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。他们对新的系统制订了若干目标: + +* 速度 +* 简单的设计 +* 对非线性开发模式的强力支持(允许成千上万个并行开发的分支) +* 完全分布式 +* 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量) + +自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统 + +注:本段引用自 + +[https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-Git-%E7%AE%80%E5%8F%B2](https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-Git-%E7%AE%80%E5%8F%B2) diff --git "a/src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/\345\246\202\344\275\225\345\256\211\350\243\205 Git.md" "b/src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/\345\246\202\344\275\225\345\256\211\350\243\205 Git.md" new file mode 100644 index 0000000..5bf0d0c --- /dev/null +++ "b/src/git_tutorial/Git \345\205\245\351\227\250\357\274\210\345\210\235\347\272\247\347\257\207\357\274\211/\345\246\202\344\275\225\345\256\211\350\243\205 Git.md" @@ -0,0 +1,110 @@ +--- +title: 如何安装 Git +language: zh_CN +--- +## 根据系统安装 + +### 在 Windows 下安装 + +打开 [https://git-scm.com/download/win](https://git-scm.com/download/win),下载会自动开始,运行下载的可执行文件跟随指引安装 + +### 在 Linux 下安装 + +#### Debian/Ubuntu + +用以下命令来安装最新的发布版 Git + +``` +apt-get install git +``` +Ubuntu 系统还可使用以下命令来安装最新的稳定 Upstream 版 Git +``` +add-apt-repository ppa:git-core/ppa +apt update; apt install git +``` +#### RedHat 企业版 Linux,Oracle Linux 等 + +RHEL 和其他衍生版本可使用`dnf`命令来安装 + +``` +sudo dnf install git-all +``` +你也可以从 [https://mirrors.edge.kernel.org/pub/software/scm/git/](https://mirrors.edge.kernel.org/pub/software/scm/git/) 下载源码来编译安装最新版的 Git 。 +#### 更多参见 + +[https://git-scm.com/download/linux](https://git-scm.com/download/linux) + +### 在 Mac OS X 下安装 + +#### homebrew + +如果你安装了 homebrew,可以通过以下命令来安装 + +```shell +$ brew install git +``` +#### 安装包安装 + +从 [https://sourceforge.net/projects/git-osx-installer/](https://sourceforge.net/projects/git-osx-installer/) 下载后根据提示安装 + +#### 编译源码 + +从 [https://mirrors.edge.kernel.org/pub/software/scm/git/](https://mirrors.edge.kernel.org/pub/software/scm/git/) 下载源代码后进行编译 + + +## Git 工具 + +### 命令行工具 + + Git 作为开源版本控制工具有诸多的用法,可以使用原生的命令行、图形界面以及第三方提供的图形界面工具,这其中命令行工具是最基础也是最强大的。 + +在上文中我们就使用的是在 MacOS 中的命令行工具 Terminal。当然如果你用的是 Linux 系统,也可以用 Terminal ,如果你用的是 Windows 系统那么可以用命令窗口(Command Prompt)或者 PowerShell。 + +### 使用 GUI 客户端操作 + +#### Source Tree + +Source Tree 是 Atlassian 公司出品的可运行在 Mac 和 Windows 下的 Git 图形客户端,可以从 [https://www.sourcetreeapp.com/](https://www.sourcetreeapp.com/)下载安装。 + +![图片](./../../.vuepress/public/images/lbk1YLUGKVvPDZkE.png) + +图片来源:[https://www.sourcetreeapp.com/](https://www.sourcetreeapp.com/) + +#### Tortoise Git + +如果你在用 Windows ,那么可以考虑从 [https://tortoisegit.org/download/](https://tortoisegit.org/download/)下载使用Tortoise Git + +### Git 集成 IDE 客户端 + +IDE 集成 Git 给我们提供了一站式的解决方案,在不切换程序的情况下即可进行版本操作,这给开发带来极大的便利。以下我们会介绍若干主流 IDE 的 Git 集成方式。 + +#### Xcode + +Xcode 自带 Git,可以在欢迎界面执行`clone`操作即可 + +![图片](./../../.vuepress/public/images/WXDktOKkcZRBC4f4.png) + +![图片](./../../.vuepress/public/images/JlrC1hkGVuENgGau.png) + +#### VS Code + +同样的 VS Code 也集成了 Git,可以通过设置来进行配置,之后即可在主界面使用 Git + + +![图片](./../../.vuepress/public/images/wpIFspkDtaE3ML2m.png) + +![图片](./../../.vuepress/public/images/Xg0gCc7YVL1gnUmM.png) + +![图片](./../../.vuepress/public/images/MfZvwNvmf54aMOcV.png) + +![图片](./../../.vuepress/public/images/xQeXHu9atH96RKdi.png) + +#### JetBrains 系列 + +JetBrains 提供了针对多种语言的开发工具,配置方法大同小异,我们以 IntelliJ IDEA 社区版为例: + +默认支持 SVN,Git 等版本控制工具,在设置中可以进行设置。 + +![图片](./../../.vuepress/public/images/qUNdkMsWPsGRwrL1.png) + +可以在主界面中进行`checkout`、`commit`、`push`等一系列操作: diff --git "a/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/readme.md" "b/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/readme.md" new file mode 100644 index 0000000..bf33b36 --- /dev/null +++ "b/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/readme.md" @@ -0,0 +1,29 @@ +--- +blog: false +home: true +baseLang: zh_CN +title: Git 命令详解 +heroText: Git 命令详解 +tagline: 从简单命令到高阶命令一网打尽 + +features: + - title: 常用 Git 命令 + details: 最常用到的 Git 命令都有哪些? + link: /git_tutorial/Git 命令详解/常用 Git 命令 + + - title: 分支与合并相关命令 + details: 如何使用命令进行分支与合并的操作 + link: /git_tutorial/Git 命令详解/分支与合并相关命令 + + - title: 搭建 Git 相关命令 + details: 使用命令在本地搭建 Git + link: /git_tutorial/Git 命令详解/搭建 Git 相关命令 + + - title: 使用命令操作远程仓库 + details: 如何使用命令对远程仓库进行克隆、拉取、推送等操作? + link: /git_tutorial/Git 命令详解/搭建 Git 相关命令 + +copyrightText: false +footer: Git 教程采用 CC-BY-SA-4.0 进行许可 | 感谢每一位参与的开发者 | VuePress 主题:vuepress-theme-hope + +--- \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\344\275\277\347\224\250\345\221\275\344\273\244\346\223\215\344\275\234\350\277\234\347\250\213\344\273\223\345\272\223.md" "b/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\344\275\277\347\224\250\345\221\275\344\273\244\346\223\215\344\275\234\350\277\234\347\250\213\344\273\223\345\272\223.md" new file mode 100644 index 0000000..645fd2f --- /dev/null +++ "b/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\344\275\277\347\224\250\345\221\275\344\273\244\346\223\215\344\275\234\350\277\234\347\250\213\344\273\223\345\272\223.md" @@ -0,0 +1,117 @@ +--- +title: 使用命令操作远程仓库 +--- + +## 创建、拉取、推送、克隆 + +创建远程库 + +![图片](./../../.vuepress/public/images/4PyWTtPatfEMPva8.png) + +填入仓库名称(Gitee支持中文、字母、数字或者下划线(_)、中划线(-)、英文句号(.)、加号(+),必须以字母或数字开头,不能以下划线/中划线结尾,且长度为2~191个字符), 建议只使用字母/中划线/下划线/数字。 + +其他信息按需配置即可,点击创建完成。 + +![图片](./../../.vuepress/public/images/4XEFGcw8y3lz0s08.png) + +创建完成后自动跳转到项目首页,如果是空项目在此获得项目链接 + +![图片](./../../.vuepress/public/images/y4YdVWdHf0PMv3DO.png) + +非空项目在此获取项目链接 + +![图片](./../../.vuepress/public/images/8KLaeVL4lfdARVmg.png) + +创建 git 仓库(注意项目名称、项目链接、用户名称替换成自己的): + +``` shell +mkdir test_git +cd test_git +git init +touch README.md +git add README.md +git commit -m "first commit" +git remote add origin git@gitee.com:username/test_git.git +git push -u origin master +``` + +已有仓库(注意替换仓库链接和用户名称) + +``` shell +cd existing_git_repo +git remote add origin git@gitee.com:minibear2333/test_git.git +git push -u origin master +``` + +## 邀请远程库协作者 + +对于一个开源项目而言,人人都可以看到项目,但是只有项目成员可以直接 push 代码,以及一些更高级的操作,如果你想在 Gitee 上邀请其他人,通过直接向你的项目提交代码的方式参与协作,你可以在浏览器访问如下链接在线邀请。 + +``` shell +https://gitee.com/用户英文id/项目名称/team +``` + +也可以从项目里直接进入,位置如下 + +![图片](./../../.vuepress/public/images/tCjmXlajVHT3wBO5.png) + +点击邀请用户以后,有三种邀请方式都非常直观,你可以按需使用。 + +![图片](./../../.vuepress/public/images/RRk20SADHmAxla4c.png) + +这里的仓库权限有四种 + +* 管理员:管理员拥有项目的全部权限,包括删除项目和清空项目等 +* 开发者:开发者能推送代码,新建和删除分支,创建 Issue, Pull Request, Wiki 等 +* 观察者:私有项目观察者不能操作代码,但可以下载代码,可以创建 Wiki,Issue,Pull Request 等 +* 报告者:私有项目报告者仅能创建 Issue,公有项目可以 `Fork` 项目、下载代码和创建 PullRequest + +当然你也可以创建组织,并通过组织成员管理和组织内的项目成员管理进行权限控制,创建组织链接[https://gitee.com/organizations/new](https://gitee.com/organizations/new) + +![图片](./../../.vuepress/public/images/j7HqrRWsZ32fvk4a.png) + +## 使用 Pull Request 贡献代码 + +但是开源项目不应该是人人都可以随意 Push、管理分支、tag的,为了保证代码质量和开发流程合规,需要由项目管理员/开发者进行管理,其他成员都是报告者的权限,也就是私有项目报告者仅能创建Issue,公有项目可以fork项目、下载代码和创建 `PullRequest` 。 + +当你遇到一个非常棒的开源项目,你可以选择发起 `PullRequest` 的方式贡献代码,如果说想在简历上添加什么闪光点,没有什么比给开源项目贡献代码更好的经历了。 + +在贡献代码之前,你需要点击仓库右上角先 `fork` 此仓库,这样会在你本地复制一个完全一样的仓库,你可以在这个新仓库里自由的修改内容。建议只在有意向参与改进该仓库时使用 Fork 功能。 + +![图片](./../../.vuepress/public/images/Pn896AiiO3WQGIPN.png) + +fork 成功后自动跳转,可以到新仓库名下有 fork 来源项目提示 + +![图片](./../../.vuepress/public/images/a5LZQbof77uA2QiM.png) + +修改代码,然后push到该项目,此时就可以在页面上发起 PR + +![图片](./../../.vuepress/public/images/BJIDxe2ZoBfoxUrz.png) + +发起 PR 需要对这次提交修改了哪些功能进行描述,方便项目管理员看到这些内容,来判断是否可以合并,点击创建按钮成功发起 + +![图片](./../../.vuepress/public/images/Ev3LOjIyyvWUy8a2.png) + +这样源项目处,就可以看到这次PR + +![图片](./../../.vuepress/public/images/0NoZ7Wk6PTbqVcXd.png) + +![图片](./../../.vuepress/public/images/n4cDod09ZW48K83s.png) + +项目管理员或者其他人可以就你的 PR 提出建议,你可以参考其他人的建议使用 `git reset --soft 上一次的commitid` 取消你的 `commit` ,修改完成后强制推送到自己的仓库里 `git push --force origin 分支名` ,PR 中会自动更新。 + +**好的习惯** + +* 在主干开发和分支开发中选择适合自己项目的解决方案并严格遵循 +* 尽量保证每个 PR 都只针对一个功能或者一个 bug 做出修改 +* 在提交代码之前,将远程分支上最新的代码合并进本地 +* 在发起 PR 之前,保证自己的项目和源项目没有冲突,有冲突需要先解决冲突 +* 发起pr的描述信息尽可能详细,不仅方便管理员查看,也方便其他人发现你修复的 bug + +## 第三方托管的选择 + +选用第三方代码托管平台,可以省去自己搭建服务器的过程,也更方便自己的项目被其他开发者发现,一起协作或者增加影响力,世面上有很多平台可以供选择,各有优略,可以参考维基百科的[https://git.wiki.kernel.org/index.php/GitHosting](https://git.wiki.kernel.org/index.php/GitHosting)页面。 + +![图片](./../../.vuepress/public/images/TethsFXt2ISwRJFE.png) + +常用的代码协作平台有开源中国的 [Gitee](https://gitee.com/)、GitHub、GitLab 等。 diff --git "a/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\345\210\206\346\224\257\344\270\216\345\220\210\345\271\266\347\233\270\345\205\263\345\221\275\344\273\244.md" "b/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\345\210\206\346\224\257\344\270\216\345\220\210\345\271\266\347\233\270\345\205\263\345\221\275\344\273\244.md" new file mode 100644 index 0000000..3746d85 --- /dev/null +++ "b/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\345\210\206\346\224\257\344\270\216\345\220\210\345\271\266\347\233\270\345\205\263\345\221\275\344\273\244.md" @@ -0,0 +1,309 @@ +--- +title: 分支与合并相关命令 +--- + + + +## 分支简介 + +分支功能是 Git 最为强大的功能之一,我们一直在使用的就是主线分支,就像一根时间轴,每次新提交都建立在上一次的基础上,正是因为这样我们才可以任意改变我们所处的位置,实现在不同时间轴上进行切换。 + +![图片](./../../.vuepress/public/images/UaDGqZlI4lqWALXY.png) + +软件开发的过程中,每个周期都会经过开发和测试,测试完成以后对最后一次提交封版,新的功能只允许在新版本上提交,旧版本只允许增加补丁,这时候就要同时维护两个版本,只有一个主线分支就不够用了。 + +如下图,继续在 `master` 上提交新功能,上一个版本 release-1.0 封版本,两个分支就可以分开管理了,分支在开发中具体要怎么用,后续的开支开流工作会做详细的讲解。 + +![图片](./../../.vuepress/public/images/FM7hCmx5XlePCoxo.png) + +分支主要解决了以下几个场景。 + +* 可以使用分支同时开发多个功能,而不产生冲突。 +* 当出现定制开发任务,不得不同时维护两个及以上版本的代码时,分支是最好的解决办法。 +* 你可以新建个人开发分支,处理完问题以后把最新的主线代码更新到本地而不产生冲突,把开发分支合并到主线以后再提交。保证主线代码的完整性和可用性。 + +## 分支的新建与合并 + +**新建分支** + +使用以下命令完成创建(如果你想直接基于当前分支复制,可以省略源分支名) + +``` +git checkout -b [源分支名] 新分支名 +``` + +因为 Git 是离线管理的,这个时候新建的分支还需要推送到远程,在平台上才可以看到 + +``` +git push origin 远程分支名 +``` + +**分支的合并** + +**如果你想把 release-1.0 分支的所有代码合并到 `master` 分支要怎么操作呢?** + +可以使用 `git merge` 命令 + +``` +git merge origin/release-1.0 +``` + +但是如果两个分支对同一个文件进行了修改,在合并时就会产生冲突 + +![产生冲突](./../../.vuepress/public/images/cUQXcrrIJ9yiAdL3.png) + +使用 `git status` 查看产生的冲突 + +![查看冲突](./../../.vuepress/public/images/PUUhJ4SpjBWkb7Lu.png) + +此处只有一个文件产生了冲突,Git 要求人工判断哪些代码需要保留哪些代码需要删除,Git 命令行已经很好的提示了解决冲突的办法,产生的冲突如下( `<<<<<< HEAD` 和 `========` 包含的代表当前分支, `========` 和 `>>>>>>>` 分支名 包含的代表合并分支) + +``` +<<<<<<< HEAD + +#### 提交新功能 + +======= + +#### 修复Bug + +>>>>>>> origin/release-1.0 +``` + +解决冲突后的效果 + +``` +### 提交新功能 + +### 修复Bug +``` + +合并冲突后完成提交 + +``` +git add README.md +git commit -m "合并 release-1.0" +git push +``` + +效果如图: + +![图片](./../../.vuepress/public/images/kijxxTIhYSYdusY6.png) + +## 分支管理命令 + +**查看分支** + +使用 `git branch` 命令,不加任何参数是查看本地有哪些分支, `*` 号代表当前所处的分支。 + +``` shell +$ git branch + dev +  dev2 +* master + +``` + +如果加 `-a` 参数,代表查看包括远程分支的所有分支 。 + +``` shell +$ git branch -a + dev +  dev2 +* master +  remotes/origin/HEAD -> origin/master +  remotes/origin/dev +  remotes/origin/dev2 +  remotes/origin/master +  remotes/origin/release-1.0 +``` + +使用 `-v` 参数,代表查看每个本地分支的最后一次提交内容。 + +``` shell +$ git branch -v +``` + +两个参数同时加上,自然就表示查看所有分支(包括远程分支)的最后一次提交内容。 + +``` shell +$ git branch -av +``` + +**删除分支** + +如果你想删除一个分支,只需要加 `-D 分支名` 即可。 + +``` shell +$ git branch -D dev2 +``` + +但是你不可以删除当前所在的分支。 + +``` shell +$ git branch -D master +error: Cannot delete branch 'master' checked out at '/home/root/gitee/learn_git' +``` + +如果是已经推送到远程的分支,可以用以下命令删除远程分支(请保证你有删除远程分支的权限)。 + +``` shell +$ git push origin -d dev2 +``` + +注意!如果远程分支不存在,在删除的过程中会报错,既然是要删除远程分支,那可以忽略这个报错。 + +``` shell +$ git push origin -d dev2 +error: unable to delete 'dev2': remote ref does not exist +error: failed to push some refs to 'git@gitee.com:minibear2333/learn_git.git' +``` + +如果是远程已经删除的分支,在本地还存在,可以使用 `git fetch -p` 命令清理本地无效的分支(仅仅会删除曾今在推送到远程且在远程删除掉本地还存在的同一个分支,不会影响本地新建但从未推送到远程的分支) + +举个例子: + +以 `master` 分支为源分支,新建本地分支,并自动切换到 `dev3` 分支 + +``` shell +$ git checkout -b dev3 master +$ git push origin dev3 +``` + +清理远程删除掉的本地分支 `dev3` 和远程的联系,并删除掉本地分支 `dev3` + +``` shell +$ git fetch -p +$ git checkout master +$ git branch -d dev3 +``` + +**在分支之间切换** + +如果是不存在的分支,可以用【分支的新建与合并】一节说过的方式基于当前分支创建并切换到新分支 + +``` shell +$ git checkout -b dev4 master +Switched to a new branch 'dev4' +``` + +如果是已存在的分支,可直接使用 `git checkout 分支名` 进行切换 + +``` shell +$ git checkout master +Switched to branch 'master' +Your branch is up to date with 'origin/master'. +``` + +但如果你已经处于待切换的分支,会提示 `Already on '分支名'` 可以忽略这个提示,比如我们再尝试切换到 `master` 分支 + +``` shell +$ git checkout master +Already on 'master' +Your branch is up to date with 'origin/master'. +``` + +**更新和推送** + +更新有两种方式,一种是 `fetch` 一种是 `pull` + +在本地的git使用中,会在某个地方离线存储远程有哪些分支、 `tag` 信息,以及每个分支和 `tag` 的提交记录和内容,在使用 `fetch` 命令刷新时,会进行联网更新,把远程新的提交、新的分支、新的 `tag` 等所有的信息进行更新,但并不会影响本地所有的代码记录,需要手动合并代码才会更新你的代码记录。 + +``` shell +$ git fetch +``` + +`pull` 其实包含了两个命令: `fetch` 和 `merge` ,当 然你也可以直接拆开来用, `fetch` 代表先把远程仓库的信息刷新,再 `merge` 和当前分支合并。 + +``` shell +$ git pull +``` + +如果出现冲突,需要使用【分支的新建与合并】-【分支的合并】那一节的方法 `git merge` 一样的处理过程进行合并冲突。 + +## 分支开流工作 + +你已经掌握了所有的常用分支操作方法,怎么正式应用到实际的开发工作中呢?这一节就进行详细的讲解。 + +因为分支可以方便的进行切换、新建、删除、合并,所以在开发过程中,可以利用这些特性,同时维护多个分支,随时可以尝试新的想法,也随时可以回到原来的思路,让工作井井有条。 + +**长期分支(团队协作工作流)** + +`master` 分支是我们的主力开发分支,在业界推荐开发过程中保证 `master` 分支永远是最稳定的分支,保留一个开发分支 `dev` 进行协作,把新需求和缺陷提交到上面,待到 `dev` 分支测试稳定以后再合并到主线上。 + +主线上针对这一次需求和缺陷,只会产生一个提交,这个过程也适用于定制开发,看起来就是这样子的。 + +![图片](./../../.vuepress/public/images/T3Yug295KBecge7H.png) + +另一种开发方式,把新功能提交到 `master` 分支上,提测时从 `master` 拉出一个 `test` 分支,下一个版本的新功能就继续在 `master` 上迭代,本次测试出现的 bug 修复到 `test` 分支中,封板以后拉出新 `release` 稳定分支,删除 `test` 分支,合并 `release` 分支修复的 bug 到 `master` 看起来是这样的过程。 + +![图片](./../../.vuepress/public/images/mUHeeiHxpvcGpxrB.png) + +**个人开发工作流** + +在个人开发过程中深深会遇到临时任务、新的想法验证、解决bug/完成需求的情况,在一天之内就会进行多次创建、使用、合并、删除分支的过程。 + +比如你正在 `master` 分支上工作,这时候你准备解决一个 feature于是新建了分支 `feature1` ;在 `feature1` 分支上工作到 C4 又有了一个新想法,于是你在 `feature1` 分支 C4 的基础上创建了一个临时验证分支 `try_feature1` 来做实验;这个时候 `master` 突然出现一个紧急 bug ,需要你立即处理,你马上切换到 `master` 分支,并创建一个 `bug1` 分支,看起来就是这样。 + +![图片](./../../.vuepress/public/images/cCHYX6s8LcnM6BFz.png) + +解决完临时 bug1 以后你把他合并回了 `master` 分支,然后你继续切换到 `try_feature1` 分支完成了开发测试,并发现自己在 `try_feature1` 上尝试的新想法惊为天人,你决定放弃 `feature1` 分支的老想法(也就是丢弃 C7 提交),把 `try_feature1` 合并回 `master` ,出现新的提交 C8 。 + +![图片](./../../.vuepress/public/images/TmspDSb9OFojLyCt.png) + +注意:只要没有 push 到远程的分支,所有的操作都是离线的 + +## 远程分支 + +`push` 命令可以把当前分支推送到远程, `git push` 仓库别名分支名推送任意本地分支到远程 + +``` shell +$ git push origin dev4 +``` + +远程为每一个分支维护了一个远程分支指针(类似于书签),指向远程的某一次提交,当你第一次 `clone` 项目时,Git 会自动给你的远程仓库起一个别名 + origin ,并创建一个本地分支指针 `master` (就是分支名)和一个远程指针 `origin/master` ,指向同一个位置,如下: + +![图片](./../../.vuepress/public/images/z0RSXbgzuUAZVpIM.png) + +只要你不推送到远程,仅在本地提交,远程就不会更新。 + +![图片](./../../.vuepress/public/images/f9c5E8JxbSy1yjOQ.png) + +当然,在多人协作中,很难避免远程分支出现本地没有的提交,也就是出现分叉,在使用 `git fetch` 命令时可以更新远程跟踪分支到本地,接下来只需要在本地解决冲突并提交和推送就好了。 + +![图片](./../../.vuepress/public/images/GwwgYtuRbPOg2Net.png) + +## 变基(git rebase) + +在 【分支的新建与合并】-【分支的合并】这一节里面我们讲述了 `merge` 操作,他的特点是不保留源合并分支的提交信息,把所有有提交重写成了一个,并且要求我们自己写 commit 信息。 + +![图片](./../../.vuepress/public/images/gaa3UEaySygXDBJa.png) + +其实还有另一个命令 `git rebase` 可以保留源合并分支的所有提交信息,在目标合并分支上重放 + +![图片](./../../.vuepress/public/images/saMJSMQuqHslmDB4.png) + +``` shell +$ git rebase origin/release-1.0 +# 解决冲突并add +$ git rebase --continue +Applying: 新功能1 +$ git push +``` + +这样我们在主线看到的提交信息就还是原作者的提交追加在后面,有多少个提交都会保留,尽管实际的开发工作是并行的,但它们看上去就像是串行的一样,提交历史是一条直线没有分叉。好处是历史记录非常简洁,不需要手动重写 `commit` 信息。 + +如果已经执行了 `git rebase` 命令,想放弃此次 `rebase` 操作执行如下命令(本地) + +``` shell +git rebase --abort +``` + +注意:如果是想用 `rebase` 的方式合并当前远程分支内容,需要是先 `git fetch` 然后再 `git rebase` + +**变基的风险** + +我们应该遵守远程分支不要强制回滚历史记录的约定 `git push --force` ,甚至应该设置远程分支为被保护分支,否则一旦回滚历史记录会导致远程的 `commit` 记录消失,如果这些 `commit` 记录被其他人合并/变基时所使用,那么在提交代码的时候就不得不重新解决冲突问题,回滚这些提交,所以即使想回滚远程提交,也应该通过新建提交的方式来回滚,这样就可以解决几乎全部的问题。 + +到底应该使用 `merge` 还是 `rebase` 需要根据团队的具体情况进行约定,如果更关注记录所有的历史提交方便溯源和管理就使用 `rebase` ,如果不在意所有的历史提交,被合并的分支职责单一,只负责某个功能 bug,那可以使用 `merge` 。 \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\345\270\270\347\224\250 Git \345\221\275\344\273\244.md" "b/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\345\270\270\347\224\250 Git \345\221\275\344\273\244.md" new file mode 100644 index 0000000..ad728f3 --- /dev/null +++ "b/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\345\270\270\347\224\250 Git \345\221\275\344\273\244.md" @@ -0,0 +1,254 @@ +--- +title: 常用 Git 命令 +--- + +## Git 命令手册 + +### 配置相关 + +省略 `--global` 参数代表仅本项目生效 + +``` shell +# 初始化本仓库(创建新仓库) +git init +git config --global user.name "xxx" # 配置用户名 +git config --global user.email "xxx@xxx.com" # 配置邮件 +git config --global color.ui true # git status等命令自动着色 +git config --global color.status auto +git config --global color.diff auto +git config --global color.branch auto +git config --global color.interactive auto +git config --global http.proxy # 查看当前代理设置 +git config --global http.proxy 'http://127.0.0.1:1080' # 设置http代理   +git config --global https.proxy 'socks5://127.0.0.1:1080' # 设置https代理   +git config --global --unset http.proxy #删除 proxy git config +``` + +### 代码文件与提交相关 + +``` shell +git status # 查看当前版本状态 +git add t.txt # 添加单个文件至暂存区 +git add . # 增加所有更改过的文件至index,不包括删除 +git add -u # 仅增加所有已经跟踪的文件至index,不包括新文件 +git add -A # git add . 和 git add -u的合集 +git commit -m 'xxx' # 提交 +git commit --amend -m 'xxx' # 合并上一次提交(用于反复修改) +git commit -am 'xxx' # 将add和commit合为一步 +git rm xxx # 删除index中的文件 +git rm -r * # 递归删除 +git log # 显示提交日志 +git log -1 # 显示1行日志 -n为n行 +git log --stat # 显示提交日志及相关变动文件 +git log -p -m +git log -- filename # 查看文件的修改日志 +git show xxxx # 显示某个提交的详细内容 +git show dfb02 # 可只用commitid的前几位 +git show HEAD # 显示HEAD提交日志 +git show HEAD^ # 显示上一个版本的提交日志 ^^为上两个版本 ^5为上5个版本 +git whatchanged # 显示提交历史对应的文件修改 +git revert xxxxxx # 撤销提交xxxxx +``` + +### tag 相关 + +``` shell +git tag # 显示已存在的tag +git tag -a v2.0 -m 'xxx' # 增加v2.0的tag +git show v2.0 # 显示v2.0的日志及详细内容 +git log v2.0 # 显示v2.0的日志 +git push --tags # 把所有tag推送到远程仓库 +git tag -d tag_name # 本地删除名为tag_name的tag +git push origin :refs/tags/tag_name # 远程删除名为tag_name的tag +``` + +### 差异比较相关 + +``` shell +git diff # 显示所有未添加至index的变更 +git diff --cached # 显示所有已添加index但还未commit的变更 +git diff HEAD^ # 比较与上一个版本的差异 +git diff HEAD -- ./lib # 比较与HEAD版本lib目录的差异 +git diff origin/master..master # 比较远程分支master上有本地分支master上没有的 +git diff origin/master..master --stat # 只显示差异的文件,不显示具体内容 +``` + +### 分支相关 + +``` shell +git clone git+ssh://git@xxx.xxx.xxx.xxx/xx.git # clone远程仓库 +git remote add origin git+ssh://git@xxx.xxx.xxx.xxx/xx.git # 增加远程定义(用于push/pull/fetch) +git branch # 显示本地分支 +git branch --contains 50089 # 显示包含提交50089的分支 +git branch -a # 显示所有分支 +git branch -r # 显示所有原创分支 +git branch --merged # 显示所有已合并到当前分支的分支 +git branch --no-merged # 显示所有未合并到当前分支的分支 +git branch -m master master_copy # 本地分支改名 +git checkout -b master_copy # 从当前分支创建新分支master_copy并检出 +git checkout -b master master_copy # 上面的完整版 +git checkout dev/minibear2333 # 检出已存在的分支 +git checkout --track dev/minibear2333 # 检出远程分支dev/minibear2333并创建本地跟踪分支 +git checkout v2.0 # 检出版本v2.0 +git checkout -b devel origin/develop # 从远程分支develop创建新本地分支devel并检出 +git checkout -- README # 检出head版本的README文件(可用于修改错误回退) +git merge origin/master # 合并远程master分支至当前分支 +git cherry-pick xxxxxx # 合并提交xxxxxx的修改 +git push origin master # 将当前分支push到远程master分支 +git push origin :dev/minibear2333 # 删除远程仓库的dev/minibear2333分支 +git fetch # 获取所有远程分支(不更新本地分支,另需merge) +git fetch --prune # 获取所有原创分支并清除服务器上已删掉的分支 +git pull origin master # 获取远程分支master并merge到当前分支 +git mv README README2 # 重命名文件README为README2 +git reset --hard HEAD # 将当前版本重置为HEAD(通常用于merge失败回退) +git rebase +git branch -d dev/minibear2333 # 删除分支dev/minibear2333(需要确认本分支修改已合并到其他分支) +git branch -D dev/minibear2333 # 强制删除分支dev/minibear2333,小心操作 +git ls-files # 列出git index包含的文件 +git show-branch # 图示当前分支历史 +git show-branch --all # 图示所有分支历史 +``` + +### 图示命令 + +``` shell +git ls-tree HEAD # 内部命令:显示某个git对象 +git rev-parse v2.0 # 内部命令:显示某个ref对于的SHA1 HASH +git reflog # 显示所有提交,包括孤立节点 +git show xxx # 查看xxx提交改变了哪些文件内容 +git show HEAD # 显示当前分支昨天的状态 +git log --pretty=format:'%h %s' --graph # 图示提交日志 +git show HEAD~3 # 查看倒数第三次提交改变了哪些内容 +git show -s --pretty=raw xxxxxx +``` + +### 暂存相关 + +``` shell +git stash # 暂存当前修改,将所有至为HEAD状态 +git stash list # 查看所有暂存 +git stash show -p stash@{0} # 参考第一次暂存 +git stash apply stash@{0} # 应用第一次暂存 +``` + +### 查找 + +``` shell +git grep "delete from" # 查找当前分支下的文件内容,可以git grep --help看具体用法 +git grep "delete from" v2.0 # 指定tag来查找 +``` + +### git index 操作(追踪) + +``` shell +git update-index —assume-unchanged 文件名 # 取消本地跟踪 +git update-index —no-assume-unchanged 文件名 # 恢复本地跟踪 +git ls-files -v| grep '^h\ ' # 可以看到本地不跟踪的文件 +``` + +### 管理远程分支 + +``` shell +git remote # 不带参数,列出已经存在的远程分支 +git remote -v #(-v是–verbose 的简写,取首字母)列出详细信息,在每一个名字后面列出其远程url +git remote add [shortname] url #添加远程仓库 +git fetch origin # 字符串 origin 指代对应的仓库地址了.比如说,要抓取所有 origin 有的,但本地仓库没有的信息,可以用 +``` + +### 打标签 + +Git 可以给任意一个提交打上标签,以示重要,默认使用标签来记录版本,这一节主要讲解标签的基本使用方法。 + +**列出所有的标签** + +``` shell +$ git tag +``` + +**如果标签太多,支持模糊匹配** + +``` shell +$ git tag -l "v1*" +``` + +**创建标签** + +不带标签提示信息快速创建(轻量标签),使用 git `tag` 标签名的形式,这种形式的 `tag` 很像一个不会改变的分支——它只是某个特定提交的引用,默认在当前分支最后一个提交打 `tag` + +``` +$ git tag v2.3 +``` + +携带提示信息创建的是附注标签,它是存储在 Git 数据库中的一个完整对象, 它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间, 此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证。 通常会建议创建附注标签,这样你可以拥有以上所有信息。但是如果你只是想用一个临时的标签, 或者因为某些原因不想要保存这些信息,那么也可以用轻量标签。 + +``` shell +$ git tag v2.4 -a -m "test" +``` + +以上的 `-a` 参数可以省略 + +**查看附注标签** + +``` shell +$ git show v2.4 +``` + +当然,你也可以给历史提交打 `tag` ,如下 `9fceb02` 就是 `commitid` + +``` shell +$ git tag -a v2.5 9fceb02 +``` + +**推送到远程** + +打完标签远程还没有,需要手动推送 + +推送单个标签 + +``` shell +$ git push origin v1.0 +``` + +**推送全部标签** + +``` shell +$ git push origin --tags +``` + +**删除标签** + +``` shell +$ git tag -d v1.0 +``` + +注意上述命令并不会从任何远程仓库中移除这个标签,你必须用 git `push :refs/tags/ ` 来更新你的远程仓库: + +``` shell +$ git push origin :refs/tags/v1.0 +``` + +第二种方式更直观 + +``` shell +$ git push origin -- delete v1.0 +``` + +**检出标签** + +如果你想把某个标签内容检出到本地,和检出分支的命令完全一样 + +``` shell +$ git checkout v1.1 +``` + +注意:检出的 `tag` 不属于任何分支,如果你在检出 `tag` 上提交代表再切到其他分支,代表会丢失,除非你记得 `commit id` ,所以如果你想在某个 `tag` 的基础上提交代码,最好的方式是创建一个新分支,如下 + +``` shell +$ git checkout -b v1.1-dev v1.1 +``` + +引用: + +[机智的程序员小熊-Git常用命令](https://coding3min.com/328.html) + +[https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE](https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE) \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\346\220\255\345\273\272 Git \347\233\270\345\205\263\345\221\275\344\273\244.md" "b/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\346\220\255\345\273\272 Git \347\233\270\345\205\263\345\221\275\344\273\244.md" new file mode 100644 index 0000000..33d12f6 --- /dev/null +++ "b/src/git_tutorial/Git \345\221\275\344\273\244\350\257\246\350\247\243/\346\220\255\345\273\272 Git \347\233\270\345\205\263\345\221\275\344\273\244.md" @@ -0,0 +1,393 @@ +--- +title: 搭建 Git 相关命令 +--- + +## 在服务器上搭建 Git + +通常我们会使用现有第三方 Git 开源平台来管理我们的代码,也可以设置为私有仓库来保证隐私性,但是企业往往不想把自己的代码维护在第三方服务器上,想自己掌握数据来保证安全性,这时候就会自建 Git 服务器。 + +搭建 Git 服务器,不需要安装特别的程序,非常的简单,支持本地协议、HTTP 协议、SSH 协议、Git 协议。 + +**本地拉取** + +本地拉取时直接指定目录即可。 + +``` shell +$ git clone /home/gitee/code/git/gitee/learn_git +``` + +**HTTP协议(智能http协议)** + +智能 HTTP 协议支持 HTTP 方式和 `git://` 的形式,后续【smart HTTP】展开详细讲解。 + +**哑(Dumb) HTTP 协议** + +Http 协议搭建出来的 Git 服务器是只读的,可以拉取,但是无法提交! 适用于一些只读仓库的场景。 + +初始化空仓库,也可以直接使用已有的仓库。 + +``` shell +$ cd /home/gitee/project1 && git init +``` + +进入 Git 服务器项目列表目录,设置 post-update 钩子,自动更新 info 和 ref 。 + +``` shell +$ cd /home/gitee/repository +$ git clone --bare /home/gitee/project1 project1.git +$ cd project1.git +$ mv hooks/post-update.sample hooks/post-update +$ chmod a+x hooks/post-update +$ git update-server-info +``` + +使用任意方式启动 web 服务器,监听任意端口,此处以 80 为例。 + +``` shell +$ cd /home/gitee/repository +$ python -m SimpleHTTPServer 80 +Serving HTTP on 0.0.0.0 port 80 ... +``` + +在任意网络通的服务器上 `clone` 即可。 + +``` shell +$ git clone http://127.0.0.1/project1/project1.git +``` + +**SSH 协议** + +SSH 是最常用的协议,搭建起来也比较简单,同样的在服务器上先创建裸仓库。 + +``` shell +$ git init /home/gitee/repository/project --bare +Initialized empty Git repository in /home/gitee/repository/project/ +$ mv /home/gitee/repository/project /home/gitee/repository/project.git +$ cd /home/gitee/repository/project.git/ +$ mv hooks/post-update.sample hooks/post-update +$ chmod a+x hooks/post-update +$ git update-server-info +``` + +更新用户组权限为可写,该命令不会修改任何文件内容,放心使用。 + +``` shell +$ cd /home/gitee/repository/project.git +$ git init --bare --shared +New password:  +Retype new password:  +``` + +直接在本地 `clone` 项目,会提示输入 `ssh` 用户名密码,只要该用户具有此目录的写权限,就可以成功的提交。 + +``` shell +$ git clone git@hostname:/home/gitee/repository/project.git  +``` + +如果只是几个人协作搭建私有仓库,那仅仅需要一个裸仓库和一个 SSH 服务器就足够了。 + +对于权限管理,你可以给每一个人都设置一个账号,然后添加到Git用户组里;你也可以设置一个 Git 账户,然后让每个人发 SSH 公钥给你,然后将其加入 Git 账户的 `~/.ssh/authorized_keys` 文件。 这样一来,所有人都将通过**git**账户访问主机。 这一点也不会影响提交的数据——访问主机用的身份不会影响提交对象的提交者信息。 + +参考: + +* [https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E5%9C%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E6%90%AD%E5%BB%BA-Git](https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E5%9C%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E6%90%AD%E5%BB%BA-Git) + +## 生成 SSH 公钥 + +在客户端生成公钥,把公钥配置到服务器中Git 账户的 `~/.ssh/authorized_keys` 文件 中,就实现了免密提交代码。 + +首选需要查看客户端是否已经有公钥,以 centos 为例,该方法适用于所有linux、mac系统,windows系统需要使用Git shell命令行工具进行生成。 + +``` shell +$ cd ~/.ssh +$ ls +id_rsa      id_rsa.pub  known_hosts +``` + +公钥是一对 `id_rsa` 和 `id_rsa.pub` 命名的密钥对, `.pub` 后缀的就是公钥,如果找不到这两个文件,或者根本就没有 `.ssh` 目录 ,需要手动生成。 + +``` shell +$ su git +$ ssh-keygen -t rsa  +``` + +以上就是切换到Git用户,为了安全使用 `rsa` 加密算法生成密钥,其中需要输入两次口令。 + +下面的内容就是你本地生成的公钥了 + +``` shell +$ cat /home/git/.ssh/id_rsa.pub  +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDX1WruuyLttlBPzqlo4QZAHo5kY1nHrbt4nVl9ZiC0FNlcRo1raxwtR/s763F32fTGTSdLqoEYqRSGZZ1MLf8kojp4DSO1dXmT+SOAUX9heVJXI8m6wj+g6gkx4s+/Tt2BMp+OvbIxnSISKPia3+7sEAtnNs3ehD74WGZSH5kzR4J14s1101IazlbXwAaGvEUEhxRKncBk2sgx+502j2YgN6kZJa+kdq1cLcGtyqL360OeUP9guAJdbY7Sr7SPHmHxENblQNpj2IlN4cJ8hq1gGgSkIf/K/vQcrzOi3qlUqQ3mMYxowE1ix+ctHhEzqH4A83MNUSA6ZpIqJcn6xEv git@VM-0-11-centos +``` + +把公钥添加到服务器中 Git 账户的 `~/.ssh/authorized_keys` 文件中即可。 + +## 配置服务器 + +我们来看看怎么配置服务器的 SSH 访问,以 `authorized_keys` 密钥认证方法为例,先要创建 `git` 用户,并创建 `git` 用户的 `.ssh` 目录。创建用户的时候会默认创建同名用户组,如果想向已有的用户组添加新用户可以使用 `useradd -g mygroup myuser` +首先创建 Git 用户 + +``` shell +$ useradd git +#设置密码 +$ passwd git +``` + +为 git 用户创建 `.ssh` 目录和 `authorized_keys` 文件 + +``` shell +$ su git +$ cd +$ mkdir .ssh && chmod 700 .ssh +$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys +``` + +假设我们已经拿到了很多公钥,例如这样的格式 + +``` shell +$ cat /home/git/.ssh/id_rsa.pub  +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDX1WruuyLttlBPzqlo4QZAHo5kY1nHrbt4nVl9ZiC0FNlcRo1raxwtR/s763F32fTGTSdLqoEYqRSGZZ1MLf8kojp4DSO1dXmT+SOAUX9heVJXI8m6wj+g6gkx4s+/Tt2BMp+OvbIxnSISKPia3+7sEAtnNs3ehD74WGZSH5kzR4J14s1101IazlbXwAaGvEUEhxRKncBk2sgx+502j2YgN6kZJa+kdq1cLcGtyqL360OeUP9guAJdbY7Sr7SPHmHxENblQNpj2IlN4cJ8hq1gGgSkIf/K/vQcrzOi3qlUqQ3mMYxowE1ix+ctHhEzqH4A83MNUSA6ZpIqJcn6xEv git@VM-0-11-centos +``` + +把他们依次添加到 `authorized_keys` 文件的末尾即可,效果如下 + +``` shell +$ cat /home/git/.ssh/authorized_keys +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDX1WruuyLttlBPzqlo4QZAHo5kY1nHrbt4nVl9ZiC0FNlcRo1raxwtR/s763F32fTGTSdLqoEYqRSGZZ1MLf8kojp4DSO1dXmT+SOAUX9heVJXI8m6wj+g6gkx4s+/Tt2BMp+OvbIxnSISKPia3+7sEAtnNs3ehD74WGZSH5kzR4J14s1101IazlbXwAaGvEUEhxRKncBk2sgx+502j2YgN6kZJa+kdq1cLcGtyqL360OeUP9guAJdbY7Sr7SPHmHxENblQNpj2IlN4cJ8hq1gGgSkIf/K/vQcrzOi3qlUqQ3mMYxowE1ix+ctHhEzqH4A83MNUSA6ZpIqJcn6xEv git@VM-0-11-centos +ssh-rsa xxxxxxxxxxxxxxx tom@hostname +ssh-rsa xxxxxxxxxxxxxxx jack@hostname +``` + +在服务器上先创建裸仓库(空仓库),该命令不会在服务器上创建工作区,请注意每个新项目都需要可以 `ssh` 的用户登陆到服务器上创建新的裸仓库 + +``` shell +$ git init /home/gitee/repository/project --bare +Initialized empty Git repository in /home/gitee/repository/project/ +$ mv /home/gitee/repository/project /home/gitee/repository/project.git +$ cd /home/gitee/repository/project.git/ +$ mv hooks/post-update.sample hooks/post-update +$ chmod a+x hooks/post-update +$ git update-server-info +``` + +在创建完裸仓库之后使用以下命令给项目目录授权 + +``` shell +$ cd /home/gitee/repository +$ chown -R git:git project.git +``` + +更新用户组权限为可写,该命令不会修改任何文件内容,放心使用。 + +``` shell +$ cd /home/gitee/repository/project.git +$ git init --bare --shared +New password:  +Retype new password:  +``` + +直接在本地 `clone` 项目,就不会再提示输入 SSH 用户名和密码了,只要该用户具有此目录的写权限,就可以成功的提交了。 + +``` shell +# 本地仓库 +$ git clone git@hostname:/home/gitee/repository/project.git  +Cloning into 'project1'... +warning: You appear to have cloned an empty repository. +$ touch README.md +$ git add README.md +$ git commit -am "init README" +$ git push origin master +``` + +以上的命令 `git` 是服务器的用户, `hostname` 代表服务器域名或者 IP +这个时候 `git` 用户也具备登陆服务器的能力,如果你想让禁用登陆权限可以通过编辑 `/etc/passwd` 文件完成。找到类似下面的一行: + +``` ruby +git:x:1001:1001:,,,:/home/git:/bin/bash +``` + +改为: + +``` ruby +git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell +``` + +这样, Git 用户可以正常通过 SSH 使用 Git,但无法登录 shell ,因为我们为 Git 用户指定的 `git-shell` 每次一登录就自动退出。 +参考: + +* [搭建Git服务器](https://www.liaoxuefeng.com/wiki/896043488029600/899998870925664) +* [Linux下创建用户和用户组](https://blog.csdn.net/u011294519/article/details/89174272) +* [服务器上的 Git - 配置服务器](https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E9%85%8D%E7%BD%AE%E6%9C%8D%E5%8A%A1%E5%99%A8) + +## Git 守护进程 + +和哑(Dumb) HTTP 协议一样,HTTP 协议搭建出来的 Git 服务器是**只读**的,可以拉取,但是无法提交,好在可以省略添加公钥的过程,只能网络通就可以访问,和哑 HTTP 协议不同的是以守护进程的方式可以指定用户和用户组。 + +用下面的命令可以启动一个 HTTP 服务,监听的9418端口,你只需要用守护进程的形式来运行该命令就可以了(**git 版本2.9.5测试成功,官方文档未说明版本号,低版本不支持**) + +``` shell +$ git daemon --reuseaddr --base-path=/srv/git/ /srv/git/ +``` + +* `--reuseaddr` 参数代表允许服务器可以不用等待客户端连接完成重启 +* `--base-path` 代表默认仓库路径,用户在指定项目的时候可以省略路径直接用项目名 +* 最后的路径代表,Git仓库的位置,可以随便设置 +* 需要防火墙放通 9418 端口 + +如果加上 `--enable=receive-pack` 代表允许 push + +``` shell +$ git daemon --reuseaddr --enable=receive-pack --base-path=/srv/git/ /srv/git/ +``` + +使用 `systemd` 来托管此项目,新建 `/etc/systemd/system/git-daemon.service` 文件,内容如下 + +``` shell +[Unit] +Description=Start Git Daemon +[Service] +ExecStart=/usr/bin/git daemon --reuseaddr --base-path=/srv/git/ /srv/git/ +Restart=always +RestartSec=500ms +StandardOutput=syslog +StandardError=syslog +SyslogIdentifier=git-daemon +User=git +Group=git +[Install] +WantedBy=multi-user.target +``` + +* 如果 `git` 不在 `/usr/bin/git` 目录里,你可以切换成实际的目录 +* 注意指定了 `git` 用户和用户组,你可以修改成任意存在的其他用户/用户组 + +更新 `systemd` 配置文件缓存,设置为开机启动,启动服务 + +``` shell +systemctl daemon-reload +systemctl enable git-daemon +systemctl start git-daemon +``` + +`clone` 拉取,使用 `git://` 前缀 + +``` shell +$ git clone git://localhost/project.git            +``` + +提交测试,需要 `git daemon` 添加 `--enable=receive-pack` 参数 + +``` +$ cd project +$ touch README.md +$ git add . +$ git commit -m "init README.md" +[master (root-commit) 0b26d54] init README.md + 1 file changed, 0 insertions(+), 0 deletions(-) + create mode 100644 README.md +$ git push origin master +[27434] Connection from 127.0.0.1:47187 +[27434] Extended attributes (16 bytes) exist +[27434] Request receive-pack for '/project.git' +Counting objects: 3, done. +Writing objects: 100% (3/3), 210 bytes | 0 bytes/s, done. +Total 3 (delta 0), reused 0 (delta 0) +To git://localhost/project.git + * [new branch]      master -> master +[25981] [27434] Disconnected +``` + +参考:[服务器上的 Git - Git 守护进程](https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-Git-%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B) + +## smart HTTP + +我们使用 `ssh://` 方式或者 `git://` 方式,还有一种方式可以同时支持以上两种方式的访问,设置 Smart HTTP 一般只需要在服务器上启用一个 Git 自带的名为 `git-http-backend` 的 CGI 脚本。 该 CGI 脚本将会读取由 `git fetch` 或 `git push` 命令向 HTTP URL 发送的请求路径和头部信息,来判断该客户端是否支持 HTTP 通信(**不低于 1.6.6 版本的客户端,否则会使用哑HTTP协议模式只读**) + +安装必要组件 + +``` shell +$ yum -y install httpd gitweb git +$ git init /home/gitee/repository/project --bare +Initialized empty Git repository in /home/gitee/repository/project +``` + +创建 httpd 账号,会提示输入两次密码 + +``` shell +$ htpasswd -m -c /etc/httpd/conf.d/git-team.htpasswd gitNew password:  +Re-type new password:  +Adding password for user git +``` + +修改访问用户和权限 + +``` shell +chown git:git /etc/httpd/conf.d/git-team.htpasswd +chmod 777 /etc/httpd/conf.d/git-team.htpasswd +# 这里是给你的项目列表目录授权 +chown -R git:git /home/gitee/repository/ +``` + +设置仓库列表目录 + +``` shell +$ vim +11 /etc/gitweb.conf +# 添加一行 +$projectroot = "/home/gitee/repository" +``` + +设置 httpd, 使其请求转发到 git-cgi,在 httpd 配置文件最后一行 `IncludeOptional conf.d/*.conf` 前添加如下内容 + +``` + +        ServerName xxx.xxx.xxx.xxx +        SetEnv GIT_HTTP_EXPORT_ALL +        SetEnv GIT_PROJECT_ROOT /home/gitee/repository/ +        ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/ +        +                AuthType Basic +                AuthName "Git" +                AuthUserFile /etc/httpd/conf.d/git-team.htpasswd +                Require valid-user +        + +``` + +* 其中 `xxx.xxx.xxx.xxx` 是你绑定服务器的 IP,也可以是域名 +* `/home/gitee/repository/` 是你的项目列表路径 +* ScriptAlias是将以/git/开头的访问路径映射至Git的CGI程序git-http-backend +* AuthUserFile是验证用户帐户的文件 + +重启 httpd + +``` shell +systemctl restart httpd +``` + +最终效果,会提示输入用户名和密码 + +``` shell + $ git clone http://xxx.xxx.xxx.xxx/git/project.git +Cloning into 'project'... +Username for 'http://xxx.xxx.xxx.xxx': git +Password for 'http://git@xxx.xxx.xxx.xxx':  +remote: Counting objects: 3, done. +remote: Total 3 (delta 0), reused 0 (delta 0) +Unpacking objects: 100% (3/3), done. +``` + +ssh方式 + +``` shell +$git clone ssh://git@xxx.xxx.xxx.xxx/home/gitee/repository/project.git +Cloning into 'project'... +git@111.229.43.245's password:  +remote: Counting objects: 3, done. +remote: Total 3 (delta 0), reused 0 (delta 0) +Receiving objects: 100% (3/3), done. +``` + +参考 : + +* [https://blog.csdn.net/AAA17864308253/article/details/103115291](https://blog.csdn.net/AAA17864308253/article/details/103115291) +* [https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-Smart-HTTP](https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-Smart-HTTP) \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \344\270\216\345\205\266\344\273\226\347\263\273\347\273\237/1. \344\275\234\344\270\272\345\256\242\346\210\267\347\253\257\347\232\204 Git.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \344\270\216\345\205\266\344\273\226\347\263\273\347\273\237/1. \344\275\234\344\270\272\345\256\242\346\210\267\347\253\257\347\232\204 Git.md" new file mode 100644 index 0000000..79977da --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \344\270\216\345\205\266\344\273\226\347\263\273\347\273\237/1. \344\275\234\344\270\272\345\256\242\346\210\267\347\253\257\347\232\204 Git.md" @@ -0,0 +1,210 @@ +--- +title: 作为客户端的 Git +--- +## Git 与 Subversion + +### git svn + +在 Git 中所有 Subversion 桥接命令的基础命令是`git svn`。 它可以跟很多命令,接下来演示一些最常用的命令。 + +需要特别注意的是当你使用`git svn`时,就是在与 Subversion 打交道,一个与 Git 完全不同的系统。 尽管**可以**在本地新建分支与合并分支,但是你最好还是通过变基你的工作来保证你的历史尽可能是直线,并且避免做类似同时与 Git 远程服务器交互的事情。 + +**开始** + +我先创建了一个SVN的测试仓库,里面随便塞了几个文件 + +[https://f69j2gkvb3upvz7/svn/mypro4_git_svn](https://f69j2gkvb3upvz7/svn/mypro4_git_svn) + +![图片](./../../../.vuepress/public/images/h7e2yyZpFrr10TPq.png) + +使用`git svn clone`命令即可完成从 svn 仓库拉取到本地, + +``` +$ git svn clone https://f69j2gkvb3upvz7/svn/mypro4_git_svn +Initialized empty Git repository in G:/git_svn_test/mypro4_git_svn/.git/ +        A       delete.sql +        A       insert.sql +        A       select.sql +        A       update.sql +r1 = 128cf673e44837ebe893856bcba67e2251cae2b4 (refs/remotes/git-svn) +        M       select.sql +r2 = a5f6fc84e95098a1c1cfb9b9c07d20aa9d8b9056 (refs/remotes/git-svn) +Checked out HEAD: +  https://f69j2gkvb3upvz7/svn/mypro4_git_svn r2 +``` + +由于该命令会将 svn 仓库中所有版本的更新都会同步到本地仓库,如果项目更新次数过多会花费很长的时间,所以我们可以通过指定版本号以避免不必要的更新 + +如:`git svn clone -r2:HEAD [svn_url] [new_name]`,r2为最新的版本号,查看版本号可直接通过浏览器访问svn地址,点击右上角的查看历史即可看到版本号信息, 如下图所示 + +![图片](./../../../.vuepress/public/images/7AVgzuZx5pYxldPs.png) + +至此,我们得到了一个已经导入了分支与标签的有效的 Git 仓库: + +``` +$ git branch -a +* master +  remotes/git-svn +``` +**提交回 Subversion** +现在你有了一个工作目录,你可以在项目上做一些改动,然后高效地使用 Git 作为 SVN 客户端将你的提交推送到上游。 + +一旦编辑了一个文件并提交它,你就有了一个存在于本地 Git 仓库的提交,这提交在 Subversion 服务器上并不存在: + +``` +$ git commit -am 'test commit' +[master 7e3b45a] test commit + 1 file changed, 1 insertion(+) +``` +你可以离线做几次提交然后一次性将它们推送到 Subversion 服务器。 要推送到一个 Subversion 服务器,运行`git svn dcommit`命令: +``` +$ git svn dcommit +Committing to https://f69j2gkvb3upvz7/svn/mypro4_git_svn ... +        M       delete.sql +Committed r3 +        M       delete.sql +r3 = a208b7c1c2adc4132e1b88b4cbf09ba98100746f (refs/remotes/git-svn) +No changes between 7e3b45aae35d9ddc336fcc71d3dc56be9860dd3d and refs/remotes/git-svn +Resetting to the latest refs/remotes/git-svn +``` +![图片](./../../../.vuepress/public/images/8xuO2QkKioC5524x.png) + +这会拿走你在 Subversion 服务器代码之上所做的所有提交,针对每一个做一个 Subversion 提交,然后重写你本地的 Git 提交来包含一个唯一的标识符。 这很重要因为这意味着所有你的提交的 SHA-1 校验和都改变了。 部分由于这个原因,同时使用一个基于 Git 的项目远程版本和一个 Subversion 服务器并不是一个好主意。 如果你查看最后一次提交,有新的`git-svn-id`被添加: + +``` +$ git log -1 +commit a208b7c1c2adc4132e1b88b4cbf09ba98100746f (HEAD -> master, git-svn) +Author: will +Date:   Sun Sep 20 17:37:41 2020 +0000 +    test commit +    git-svn-id: https://f69j2gkvb3upvz7/svn/mypro4_git_svn@3 7adf1bb6-8b8d-ba41-906b-aa243fc2b489 +``` +**拉取新改动** +如果你和其他开发者一起工作,当在某一时刻你们其中之一推送时,另一人尝试推送修改会导致冲突。 那次修改会被拒绝直到你合并他们的工作。 在`git svn`中,它看起来是这样的: + +``` +$ git commit -am 'test commit 2' +[master 55bbeea] test commit 2 + 1 file changed, 2 insertions(+), 1 deletion(-) +$ git svn dcommit +Committing to https://f69j2gkvb3upvz7/svn/mypro4_git_svn ... +        M       update.sql +ERROR from SVN: +Item is out of date: File '/update.sql' is out of date +W: 55bbeea2d8b31d0bc27e4950ef6eab550e3ef21a and refs/remotes/git-svn differ, using rebase: +:100644 100644 b0d87c3f73b0ddc69875d6caa5059a2af3b7643e 37034df32709dfcc893f4828be7d023931400086 M      update.sql +``` +为了解决这种情况,可以运行`git svn rebase`,它会从服务器拉取任何你本地还没有的改动,并将你所有的工作变基到服务器的内容之上: +``` +$ git svn rebase +        M       update.sql +r4 = 805ae86b6428fc039ec58b500a74406312b7f2fd (refs/remotes/git-svn) +First, rewinding head to replay your work on top of it... +Applying: test commit 2 +Using index info to reconstruct a base tree... +M       update.sql +Falling back to patching base and 3-way merge... +Auto-merging update.sql +CONFLICT (content): Merge conflict in update.sql +Recorded preimage for 'update.sql' +error: Failed to merge in the changes. +Patch failed at 0001 test commit 2 +Use 'git am --show-current-patch' to see the failed patch +Resolve all conflicts manually, mark them as resolved with +"git add/rm ", then run "git rebase --continue". +You can instead skip this commit: run "git rebase --skip". +To abort and get back to the state before "git rebase", run "git rebase --abort". +rebase refs/remotes/git-svn: command returned error: 128 +``` +处理了冲突之后就可以顺利地`dcommit`: +``` +$ git svn dcommit +Committing to https://f69j2gkvb3upvz7/svn/mypro4_git_svn ... +        M       update.sql +Committed r5 +        M       update.sql +r5 = a66548dab43982fbcf05b43cf24abdec46ff930e (refs/remotes/git-svn) +No changes between 5e7b5ba362f0a83ec137c7394cb3da9df0b763d3 and refs/remotes/git-svn +Resetting to the latest refs/remotes/git-svn +``` +**Git 分支问题** +当适应了 Git 的工作流程,你大概会想要创建主题分支,在上面做一些工作,然后将它们合并入主分支。 如果你正通过`git svn`推送到一个 Subversion 服务器,你可能想要把你的工作变基到一个单独的分支上,而不是将分支合并到一起。 比较喜欢变基的原因是因为 Subversion 有一个线性的历史并且无法像 Git 一样处理合并,所以`git svn`在将快照转换成 Subversion 提交时,只会保留第一父提交。 + +假设你的历史像下面这样:创建了一个`experiment`分支,做了两次提交,然后将它们合并回`master`。 当`dcommit`时,你看到输出是这样的: + +``` +$ git svn dcommit +Committing to file:///tmp/test-svn/trunk ... + M CHANGES.txt +Committed r89 + M CHANGES.txt +r89 = 89d492c884ea7c834353563d5d913c6adf933981 (refs/remotes/origin/trunk) + M COPYING.txt + M INSTALL.txt +Committed r90 + M INSTALL.txt + M COPYING.txt +r90 = cb522197870e61467473391799148f6721bcf9a0 (refs/remotes/origin/trunk) +No changes between 71af502c214ba13123992338569f4669877f55fd and refs/remotes/origin/trunk +Resetting to the latest refs/remotes/origin/trunk +``` +在一个合并过历史提交的分支上`dcommit`命令工作得很好,除了当你查看你的 Git 项目历史时,它并没有重写所有你在`experiment`分支上所做的任意提交——相反,所有这些修改显示一个单独合并提交的 SVN 版本中。 +当其他人克隆那些工作时,他们只会看到一个被塞入了所有改动的合并提交,就像运行了`git merge --squash`;他们无法看到修改从哪来或何时提交的信息。 + +**Subversion 分支** + +在 Subversion 中新建分支与在 Git 中新建分支并不相同;如果你能不用它,那最好就不要用。 + +### Subversion 命令 + +`git svn`工具集通过提供很多功能与 Subversion 中那些相似的命令来帮助简化转移到 Git 的过程。 下面是一些提供了 Subversion 中常用功能的命令。 + +SVN 风格历史 + +如果你习惯于使用 Subversion 并且想要看 SVN 输出风格的提交历史,可以运行`git svn log`来查看 SVN 格式的提交历史: + +![图片](./../../../.vuepress/public/images/pCYDbL6EcW1VjALw.png) + +关于`git svn log`,有两件重要的事你应该知道。 首先,它是离线工作的,并不像真正的`svn log`命令,会向 Subversion 服务器询问数据。 其次,它只会显示已经提交到 Subversion 服务器上的提交。它更像是最后获取到的 Subversion 服务器上的提交状态。 + +SVN 注解 + +类似`git svn log`命令离线模拟了`svn log`命令,你可以认为`git svn blame [FILE]`离线模拟了`svn annotate`。 输出看起来像这样: + +``` +$ git svn blame update.sql +     4       will update table set id='22' where 1=1 +     5       will version2222 +     5       will update table set id='22' where 1=1 +     5       will conflict +     5       will test commit 2 +``` +重复一次,它并不显示你在 Git 中的本地提交,也不显示同一时间被推送到 Subversion 的其他提交。 +SVN 服务器信息 + +可以通过运行`git svn info`得到与`svn info`相同种类的信息。 + +``` +$ git svn info +Path: . +URL: https://f69j2gkvb3upvz7/svn/mypro4_git_svn +Repository Root: https://f69j2gkvb3upvz7/svn/mypro4_git_svn +Repository UUID: 7adf1bb6-8b8d-ba41-906b-aa243fc2b489 +Revision: 5 +Node Kind: directory +Schedule: normal +Last Changed Author: will +Last Changed Rev: 5 +Last Changed Date: 2020-09-21 01:44:41 +0800 (周一, 21 九月 2020) +``` +这就像是在你上一次和 Subversion 服务器通讯时同步了之后,离线运行的`blame`与`log`命令。 +忽略 SUBVERSION 所忽略的 + +如果克隆一个在任意一处设置`svn:ignore`属性的 Subversion 仓库时,你也许会想要设置对应的`.gitignore`文件,这样就不会意外的提交那些不该提交的文件。`git svn`有两个命令来帮助解决这个问题。 第一个是`git svn create-ignore`,它会为你自动地创建对应的`.gitignore`文件,这样你的下次提交就能包含它们。 + +第二个命令是`git svn show-ignore`,它会将你需要放在`.gitignore`文件中的每行内容打印到标准输出,这样就可以将输出内容重定向到项目的例外文件中: + +``` +$ git svn show-ignore > .git/info/exclude +``` +这样,你就不会由于`.gitignore`文件而把项目弄乱。 当你是 Subversion 团队中唯一的 Git 用户时这是一个好的选项,并且你的队友并不想要项目内存在`.gitignore`文件。 \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \344\270\216\345\205\266\344\273\226\347\263\273\347\273\237/2. \350\277\201\347\247\273\345\210\260 Git.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \344\270\216\345\205\266\344\273\226\347\263\273\347\273\237/2. \350\277\201\347\247\273\345\210\260 Git.md" new file mode 100644 index 0000000..3824c1a --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \344\270\216\345\205\266\344\273\226\347\263\273\347\273\237/2. \350\277\201\347\247\273\345\210\260 Git.md" @@ -0,0 +1,91 @@ +--- +title: 迁移到 Git +--- + +这里主要说一下 SVN 迁移到 Git 。 + +我们以前迁移的时候太过粗暴,直接新建个 Git 仓库,把 SVN 的代码 copy 进来,直接提交就完了。这给我们以后的工作甩锅都造成了不小的影响。 + +如果项目体量不大,开发人员不多,简单粗暴点也还好。但是因为当时的那个项目很大,迭代了有几年了,后面有些遗留的生产问题报出来,这时候想找当事人就很难了,因为没有迁移前的代码更新记录了,只有一个提交记录。所以迁移的时候还是要注意方法。 + +如果要做这样的大项目迁移工作,而且要带上提交记录,那最好还是要用 git svn 命令。 + +## 1.clone项目 + +```shell + git svn clone https://f69j2gkvb3upvz7/svn/mypro4_git_svn +``` +这样拉下来的项目是带有提交日志等信息的 +```shell +$ git log +commit a66548dab43982fbcf05b43cf24abdec46ff930e (HEAD -> master, git-svn) +Author: will +Date:   Sun Sep 20 17:44:41 2020 +0000 +    merge +    git-svn-id: https://f69j2gkvb3upvz7/svn/mypro4_git_svn@5 7adf1bb6-8b8d-ba41- 906b-aa243fc2b489 +commit 805ae86b6428fc039ec58b500a74406312b7f2fd +Author: will +Date:   Sun Sep 20 17:40:52 2020 +0000 +    update version2 +    git-svn-id: https://f69j2gkvb3upvz7/svn/mypro4_git_svn@4 7adf1bb6-8b8d-ba41- 906b-aa243fc2b489 +``` +## 2.添加远程仓库 + +```shell +git remote add origin https://gitee.com/willcoder/my_svn_git.git +``` +当然这个仓库地址是真实存在的,我是直接在Gitee上建的一个测试。 +如果这一步的时候提示: + +```shell +fatal: remote origin already exists. +``` +那就先删除远程仓库再添加。 +```shell +$ git remote rm origin +``` +## 3.推送到远程仓库 + +```shell +$ git push https://gitee.com/willcoder/my_svn_git.git +Enumerating objects: 15, done. +Counting objects: 100% (15/15), done. +Delta compression using up to 8 threads. +Compressing objects: 100% (9/9), done. +Writing objects: 100% (15/15), 1.37 KiB | 233.00 KiB/s, done. +Total 15 (delta 3), reused 0 (delta 0) +remote: Powered by GITEE.COM [GNK-5.0] +To https://gitee.com/willcoder/my_svn_git.git + * [new branch]      master -> master +``` +## 4.验证是否成功 + +新建一个文件夹,然后再将远程仓库clone下来 + +```shell +$ git clone https://gitee.com/willcoder/my_svn_git.git +Cloning into 'my_svn_git'... +remote: Enumerating objects: 15, done. +remote: Counting objects: 100% (15/15), done. +remote: Compressing objects: 100% (9/9), done. +remote: Total 15 (delta 3), reused 0 (delta 0), pack-reused 0 +Unpacking objects: 100% (15/15), done. +``` +### **git log** +```shell +$ git log +commit 55bbeea2d8b31d0bc27e4950ef6eab550e3ef21a (HEAD -> master, origin/master, origin/HEAD) +Author: will +Date:   Mon Sep 21 01:41:45 2020 +0800 +    test commit 2 +commit a208b7c1c2adc4132e1b88b4cbf09ba98100746f +Author: will +Date:   Sun Sep 20 17:37:41 2020 +0000 +    test commit +    git-svn-id: https://f69j2gkvb3upvz7/svn/mypro4_git_svn@3 7adf1bb6-8b8d-ba41-906b-aa243fc2b489 +commit a5f6fc84e95098a1c1cfb9b9c07d20aa9d8b9056 +Author: will +Date:   Sun Sep 20 17:28:54 2020 +0000 +    version2 +    git-svn-id: https://f69j2gkvb3upvz7/svn/mypro4_git_svn@2 7adf1bb6-8b8d-ba41- +``` \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \344\270\216\345\205\266\344\273\226\347\263\273\347\273\237/readme.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \344\270\216\345\205\266\344\273\226\347\263\273\347\273\237/readme.md" new file mode 100644 index 0000000..43ff8f0 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \344\270\216\345\205\266\344\273\226\347\263\273\347\273\237/readme.md" @@ -0,0 +1,6 @@ +--- +title: Git 与其他系统 +--- + +### [1. 作为客户端的 Git](./1.%20作为客户端的%20Git.md) +### [2. 迁移到 Git](./2.%20迁移到%20Git.md) \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/1. \345\272\225\345\261\202\345\221\275\344\273\244\345\222\214\351\253\230\345\261\202\345\221\275\344\273\244.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/1. \345\272\225\345\261\202\345\221\275\344\273\244\345\222\214\351\253\230\345\261\202\345\221\275\344\273\244.md" new file mode 100644 index 0000000..262520c --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/1. \345\272\225\345\261\202\345\221\275\344\273\244\345\222\214\351\253\230\345\261\202\345\221\275\344\273\244.md" @@ -0,0 +1,34 @@ +--- +title: 底层命令和高层命令 +--- +此前已经详述了 Git 的使用和协作,接下来我们一起深入的了解一下它的内部原理和实现方式。 + +从根本上理解,Git 是 一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。 + +由于 Git 最初是一套面向版本控制系统的工具集,而不是一个完整的、用户友好的版本控制系统, 所以它还包含了一部分用于完成底层工作的子命令。 这些命令被设计成能以 UNIX 命令行的风格连接在一起,或由脚本调用,来完成工作。 这部分命令一般被称作“底层(plumbing)”命令,而那些更友好的命令,比如 checkout , branch 等则被称作“上层(porcelain)”命令。 + +其实目前的上层命令已经足够日常使用,但是底层命令能够让我们了解Git 是如何完成工作的,以及它为何如此运作的,更好的理解Git的工作机制, 多数底层命令并不面向最终用户:它们更适合作为新工具的组件和自定义脚本的组成部分。 + +当在一个新目录或已有目录执行 git init 时,Git 会创建一个 .git 目录。 这个目录包含了几乎所有 Git 存储和操作的东西。 如若想备份或复制一个版本库,只需把这个目录拷贝至另一处即可。 本章探讨的所有内容,均位于这个目录内。 新初始化的 .git 目录的典型结构如下: + +![图片](./../../../.vuepress/public/images/yk78PG28OyjpL6CX.png) + +随着 Git 版本的不同,该目录下可能还会包含其他内容。 不过对于一个全新的 git init 版本库,这将是你看到的默认结构: + +`description` 文件仅供 GitWeb 程序使用,我们无需关心。 + +`config` 文件包含项目特有的配置选项。 + +`info` 目录包含一个全局性排除(global exclude)文件, 用以放置那些不希望被记录在 `.gitignore` 文件中的忽略模式(ignored patterns)。 + +`hooks` 目录包含客户端或服务端的钩子脚本(hook scripts)。 + +剩下的四个条目很重要:`HEAD` 文件、(尚待创建的)`index` 文件,和 `objects` 目录、`refs` 目录。 它们都是 Git 的核心组成部分。 + +`objects` 目录存储所有数据内容; + +`refs` 目录存储指向数据(分支、远程仓库和标签等)的提交对象的指针; + +`HEAD` 文件指向目前被检出的分支; + +`index` 文件保存暂存区信息。 \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/2. Git \345\257\271\350\261\241.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/2. Git \345\257\271\350\261\241.md" new file mode 100644 index 0000000..b8250e1 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/2. Git \345\257\271\350\261\241.md" @@ -0,0 +1,204 @@ +--- +title: Git 对象 +--- + +Git包含四种基本对象类型: + +## 1. blob object (数据对象)-文件系统的文件 + +git 中的 blob object 就是文件系统中的文件,包含 键:一个 hash 值和校验值的组合,值:文件内容。 + +可以当成我们电脑资源管理器上各种各样的文件,比较特殊的是:blob object 只存内容,不包括文件名,路径,格式等信息。 + +### **写入** + +git hash-object 会接受你传给它的东西,而它只会返回可以存储在 Git 仓库中的唯一键。这个key的前6位即可找到指定的value + +-w 选项会指示该命令不要只返回键,还要将该对象写入数据库中。 最后,--stdin 选项则指示该命令从标准输入读取内容;若不指定此选项,则须在命令尾部给出待存储文件的路径。 + +### **读取** + +可以通过cat-file命令从 Git 那里取回数据。 这个命令简直就是一把剖析 Git 对象的瑞士军刀。 + +为cat-file指定-p选项可指示该命令自动判断内容的类型,并为我们显示大致的内容 + +git cat-file -p指返回存储的值 + +git show + +git cat-file -t指返回存储的对象类型 + +这部分感觉Git有点像Redis的味道,Git的核心部分就是一个键值对数据库(key-value data store) + +find .git/objects/ -type f + +![图片](./../../../.vuepress/public/images/qsECqUo3q28KIwRJ.png) + +![图片](./../../../.vuepress/public/images/Zopmw5K2cxohB0Lq.png) + +## 2. tree object (树对象)-文件系统的文件夹 + +相当于文件系统中的文件夹。 但它包含了此目录下的数据对象,子目录(对应于子trees),文件名、路径等元数据。因此,对于有子目录的目录,Git相当于存储了嵌套的trees。 + +树对象(tree object),它能解决文件名保存的问题,也允许我们将多个文件组织到一起。 Git 以一种类似于 UNIX 文件系统的方式存储内容,但作了些许简化。 所有内容均以树对象和数据对象的形式存储,其中树对象对应了 UNIX 中的目录项,数据对象则大致上对应了 inodes 或文件内容。 一个树对象包含了一条或多条树对象记录(tree entry),每条记录含有一个指向数据对象或者子树对象的 SHA-1 指针,以及相应的模式、类型、文件名信息。 例如,某项目当前对应的最新树对象可能是这样的: + + +![图片](./../../../.vuepress/public/images/ZiF5Sph5hLguanmr.png) + +提交新建的文件 + +```shell +$ git add . +$ git commit -m 'first commit' +[master (root-commit) 9bfba67] first commit + 4 files changed, 5 insertions(+) + create mode 100644 delete.sql + create mode 100644 insert.sql + create mode 100644 select/select.sql + create mode 100644 update.sql +``` +**使用 git cat-file -p 读取文件内容**,master^{tree}语法表示master分支上最新的提交所指向的树对象。 + +```shell +$ git cat-file -p master^{tree} +100644 blob 7be9c19f6ca8802e1d8a1e017b0eb6a56db47320    delete.sql +100644 blob 2a313e0a83e07249fb263783edcde65af44f6331    insert.sql +040000 tree 715e56aa2f24831240cf204ecdb39fef9f61e0ea    select +100644 blob 37034df32709dfcc893f4828be7d023931400086    update.sql  +``` +请注意,select子目录(所对应的那条树对象记录)并不是一个数据对象,而是一个指针,其指向的是另一个树对象: + +![图片](./../../../.vuepress/public/images/g45g7c0sjvHInBV8.png) + +### **新建 tree 对象** + +```shell +$ git write-tree +d61a5c0a3dbe06d2b5d9e25f70e830fe9f98bbf2 +``` +验证新建对象的类型 +```shell +$ git cat-file -t d61a5c0a3dbe06d2b5d9e25f70e830fe9f98bbf2 +tree +``` +## 3. commit object (提交对象)-带有时间,作者等信息的文件夹 + +提交对象可以理解为对树对象的一层封装,里面包含了提交一个更新的所有元数据,如指向的 tree,父 commit,作者、提交者、提交日期、提交日志等。 + +### **指定 tree 对象为 commit 对象** + +```shell +$ echo 'first commit' | git commit-tree 715e56 +6237a66bba1736b5430d793e009357d750eea00c +``` +### **查看 commit 对象内容**,包括提交人提交时间,提交注释等 +```shell +$ git show 6237a6 +commit 6237a66bba1736b5430d793e009357d750eea00c +Author: will +Date:   Tue Aug 25 22:43:20 2020 +0800 +    first commit +diff --git a/select.sql b/select.sql +new file mode 100644 +index 0000000..229377a +--- /dev/null ++++ b/select.sql +@@ -0,0 +1 @@ ++select * from table where 1=1 +\ No newline at end of file +``` +### **查看提交历史** + +```shell +$ git log +commit 9bfba672d63968afdbc12ae73be70c529d25f666 (HEAD -> master) +Author: will +Date:   Tue Aug 25 21:57:08 2020 +0800 +    first commit +``` + +![图片](./../../../.vuepress/public/images/6VvpTFcnSSvZnxmA.png) + + + +## 4. tag object (标签对象)- 标签 + +可以给以上的任意对象打标签,但实际使用中,一般只会给提交打标签。 + +### **列出现有 tag** + +```shell +git tag +``` +### **查看指定 tag 的信息** +```shell +git show v1.2.3 +``` +### **查看包含指定提交的 tag** +```shell +git tag --contains +``` +### **简单新建** + +```shell +git tag v1.2.3 +``` +### **给指定 commit 添加带注释的 tag** +```shell +git tag -a v1.2.3 -m "your message" 9fceb02 +``` +### **示例:** + +查看提交记录 + +```shell +$ git log +commit 681b8b5b65b186cac5e194ba1a8a3a6271267645 (HEAD -> master, tag: v1) +Author: will +Date:   Tue Aug 25 23:05:47 2020 +0800 +    commit 2 +commit 9bfba672d63968afdbc12ae73be70c529d25f666 +Author: will +Date:   Tue Aug 25 21:57:08 2020 +0800 +    first commit +``` +为提交添加Tag +```shell +$ git tag -a v1.2 -m "version 1.2" 9bfba6 +``` +查看Tag列表 +```shell +$ git tag +v1 +v1.2 +``` +查看Tag内容 +```shell +$ git show v1.2 +tag v1.2 +Tagger: will +Date:   Tue Aug 25 23:11:19 2020 +0800 +version 1.2 +commit 9bfba672d63968afdbc12ae73be70c529d25f666 (tag: v1.2) +Author: will +Date:   Tue Aug 25 21:57:08 2020 +0800 +    first commit +diff --git a/delete.sql b/delete.sql +new file mode 100644 +index 0000000..7be9c19 +--- /dev/null ++++ b/delete.sql +@@ -0,0 +1 @@ ++insert +\ No newline at end of file +diff --git a/select/select.sql b/select/select.sql +new file mode 100644 +index 0000000..229377a +--- /dev/null ++++ b/select/select.sql +@@ -0,0 +1 @@ ++update table set id='22' where 1=1 +``` +**Tag存储位置** + +![图片](./../../../.vuepress/public/images/muXdmBdgRZlIpPtt.png) \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/3. Git \345\274\225\347\224\250.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/3. Git \345\274\225\347\224\250.md" new file mode 100644 index 0000000..7f491f8 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/3. Git \345\274\225\347\224\250.md" @@ -0,0 +1,52 @@ +--- +title: Git 引用 +--- +Git 引用,引用(references,缩写 refs) + +![图片](./../../../.vuepress/public/images/8w7vKp54xjnNfwnp.png) + +引用的目的是创建一个指针替代原始的 key(SHA-1值) + +## 标签引用 + +比如上篇提到的查询对象内容的命令 + +```shell + git show +``` +如果我们给这个commit对象添加了Tag +```shell +$ git tag -a v1.2 -m "version 1.2" 9bfba6 +``` +即可使用 `git show ` 的命令查看commit内容 +```shell + $ git show v1.2 +``` +这种方式叫做标签引用。 +还有别的引用方式,Head 引用和 Remote 引用 + +## HEAD 引用 + +当你执行 `git branch ` 时,Git 如何知道最新提交的 SHA-1 值呢? 答案是 HEAD 文件。 + +![图片](./../../../.vuepress/public/images/vBunAKbOGd80gbfV.png) + +![图片](./../../../.vuepress/public/images/rZTmEnRRjWEtlaIX.png) + +HEAD 文件是可以手动编辑的,但我们有个更安全的命令来完成此事:git symbolic-ref。 也可以借助此命令来查看 HEAD 引用对应的值: + +![图片](./../../../.vuepress/public/images/9aOgmzUIzoAizbny.png) + +## 远程引用 + +remote reference + +![图片](./../../../.vuepress/public/images/DhbbZTPI5wAGUasn.png) + +如果项目有添加远程版本库 + +```shell + $ cat .git/refs/remotes/origin/master +24de949bb7c23ff052d5b39d01d809e86dd43fd2 +``` +远程引用和分支(位于 refs/heads 目录下的引用)之间最主要的区别在于,远程引用是只读的。 虽然可以 git checkout 到某个远程引用,但是 Git 并不会将 HEAD 引用指向该远程引用。因此,不能通过 commit 命令来更新远程引用。 Git 将这些远程引用作为记录远程服务器上各分支最后已知位置状态的书签来管理。 \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/4. \345\214\205\346\226\207\344\273\266.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/4. \345\214\205\346\226\207\344\273\266.md" new file mode 100644 index 0000000..f392108 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/4. \345\214\205\346\226\207\344\273\266.md" @@ -0,0 +1,87 @@ +--- +title: 包文件 +--- + +新建了一个 出师表txt + +![图片](./../../../.vuepress/public/images/0hvzNnN8rcJ9Iyx8.png) + +新增提交后 + +查看文件 + +```shell +$ git cat-file -p master^{tree} +100644 blob cd32d11c26f2909e3204e327bbd2685a87baf660 CSB.txt +``` +修改这个文件,在最后加了几行文字 +新增提交后 查看文件 + +```shell +$ git add . +$ git commit -m 'v2' +[master e532abd] v2 + 1 file changed, 3 insertions(+) +$ git cat-file -p master^{tree} +100644 blob f3858d435146e27364574fa97936b45bec65663e CSB.txt +``` +发现两次文件是不一样的 +查看文件大小 + +```shell +$ git cat-file -s cd32d1 +1498 +$ git cat-file -s f3858d +1561 +``` +这就是说,无论对这个文件做了多小的改动,Git 都会新建一个对象来保存新的内容。 +这也造成了 Git 存储了前面大量内容是重复的,这种最初的存储对象格式称为“松散(loose)”对象格式 + +但是,Git 会时常将多个这些对象打包成一个称为“包文件(packfile)”的二进制文件,以节省空间和提高效率。 当版本库中有太多的松散对象,或者我们手动执行`git gc`命令,再或者我们向远程服务器执行推送时,Git 都会执行打包过程。 + +首先,我们查看当前对象列表,有一堆数据和提交对象 + +```shell +$ find .git/objects -type f +.git/objects/54/68f3283bfc7fd3ae3cf17e89210b744d106e48 +.git/objects/af/f46a8086171b70b0146a1b44e6380ba242c022 +.git/objects/cd/32d11c26f2909e3204e327bbd2685a87baf660 +.git/objects/ce/e1c35858358f7438920ae1b7f7d86f5cc2119d +.git/objects/e5/32abd82431e55f3f03a2971b1af88002a26810 +.git/objects/f3/858d435146e27364574fa97936b45bec65663e +.git/objects/f5/abd87faf2abc34e7d1ac18e7e020f7d4e1c547 +``` +然后我们执行`git gc`命令 +```shell +$ git gc +Enumerating objects: 6, done. +Counting objects: 100% (6/6), done. +Delta compression using up to 8 threads. +Compressing objects: 100% (4/4), done. +Writing objects: 100% (6/6), done. +Total 6 (delta 1), reused 0 (delta 0) +``` +再次查看对象列表,发现内容已打包 +```shell +$ find .git/objects -type f +.git/objects/54/68f3283bfc7fd3ae3cf17e89210b744d106e48 +.git/objects/info/packs +.git/objects/pack/pack-5035b9fb775a699fecee6ac3c3df69734a095758.idx +.git/objects/pack/pack-5035b9fb775a699fecee6ac3c3df69734a095758.pack +``` +使用`git verify-pack`命令可以查看打包的内容 +```shell +$ git verify-pack -v +.git/objects/pack/pack-5035b9fb775a699fecee6ac3c3df69734a095758.idx +e532abd82431e55f3f03a2971b1af88002a26810 commit 197 139 12 +aff46a8086171b70b0146a1b44e6380ba242c022 commit 149 110 151 +f3858d435146e27364574fa97936b45bec65663e blob 1561 1076 261 +f5abd87faf2abc34e7d1ac18e7e020f7d4e1c547 tree 35 45 1337 +cee1c35858358f7438920ae1b7f7d86f5cc2119d tree 35 46 1382 +cd32d11c26f2909e3204e327bbd2685a87baf660 blob 7 18 1428 1 +f3858d435146e27364574fa97936b45bec65663e +non delta: 5 objects +chain length = 1: 1 object +.git/objects/pack/pack-5035b9fb775a699fecee6ac3c3df69734a095758.pack: ok +``` +可以看到对象`f3858d`为1561字节,为修改后的最新内容,另外一个对象`cd32d1`引用了`f3858d`,也就是保存了所有文件内容,且只占用7字节。 \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/5. \345\274\225\347\224\250\350\247\204\350\214\203.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/5. \345\274\225\347\224\250\350\247\204\350\214\203.md" new file mode 100644 index 0000000..e551087 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/5. \345\274\225\347\224\250\350\247\204\350\214\203.md" @@ -0,0 +1,103 @@ +--- +title: 引用规范 +--- +## 引用规范设置 + +添加远程仓库的命令会在`.git/config`文件中添加一个小节, 并在其中指定远程版本库的名称(origin)、URL 和一个用于获取操作的 引用规范(refspec) + +```shell +git remote add origin https://gitee.com/willcoder/fake-project.git +``` +![图片](./../../../.vuepress/public/images/uHKgz843SOvsYMNZ.png) + +引用规范的格式由一个可选的 + 号和紧随其后的`:`组成, 其中``代表远程版本库中的引用;``是本地跟踪的远程引用的位置。 + 号告诉 Git 即使在不能快进的情况下也要(强制)更新引用。 + +默认情况下,引用规范由`git remote add origin`命令自动生成, Git 获取服务器中`refs/heads/`下面的所有引用,并将它写入到本地的`refs/remotes/origin/`中。 所以,如果服务器上有一个`master`分支,你可以在本地通过下面任意一种方式来访问该分支上的提交记录: + +```shell +$ git log origin/master +$ git log remotes/origin/master +$ git log refs/remotes/origin/master +``` +上面的三个命令作用相同,因为 Git 会把它们都扩展成`refs/remotes/origin/master`。 +如果想让 Git 每次只拉取远程的`master`分支,而不是所有分支, 可以把(引用规范的)获取那一行修改为只引用该分支: + +```shell +fetch = +refs/heads/master:refs/remotes/origin/master +``` +这种方式会默认修改引用规范,如果只希望被执行一次的操作,我们可以在命令行中指定引用规范。 +若要将远程的`master`分支拉到本地的`origin/mymaster`分支,可以运行: + +```shell +git fetch origin master:refs/remotes/origin/mymaster +``` +![图片](./../../../.vuepress/public/images/B9haCkozj7Ux0ID0.png) + +也可以指定多个引用规范。 在命令行中,你可以按照如下的方式拉取多个分支: + +```shell +$ git fetch origin master:refs/remotes/origin/mymaster \ +topic:refs/remotes/origin/topic +From https://gitee.com/willcoder/fake-project.git +! [rejected] master -> origin/mymaster (non fast forward) +* [new branch] topic -> origin/topic +``` +在这个例子中,对`master`分支的拉取操作被拒绝,因为它不是一个可以快进的引用。 我们可以通过在引用规范之前指定`+`号来覆盖该规则。 +你也可以在配置文件中指定多个用于获取操作的引用规范。 如果想在每次从 origin 远程仓库获取时都包括`master`和`featureA`分支,添加如下两行: + +```shell +[remote "origin"] +url = https://gitee.com/willcoder/fake-project.git +fetch = +refs/heads/master:refs/remotes/origin/master +fetch = +refs/heads/featureA:refs/remotes/origin/featureA +``` +![图片](./../../../.vuepress/public/images/eM5r3c8QGBFqD43D.png) + +我们不能在模式中使用部分通配符,所以像下面这样的引用规范是不合法的: + +```shell +fetch = +refs/heads/qa*:refs/remotes/origin/qa* +``` +但我们可以使用命名空间(或目录)来达到类似目的。 +假设你有一个 QA 团队,他们推送了一系列分支,同时你只想要获取`master`和 QA 团队的所有分支而不关心其他任何分支,那么可以使用如下配置: + +```shell +[remote "origin"] +url = https://gitee.com/willcoder/fake-project.git +fetch = +refs/heads/master:refs/remotes/origin/master +fetch = +refs/heads/qa/*:refs/remotes/origin/qa/* +``` +如果项目的工作流很复杂,有 QA 团队推送分支、开发人员推送分支、集成团队推送并且在远程分支上展开协作,你就可以像这样(在本地)为这些分支创建各自的命名空间,非常方便。 +## 引用规范推送 + +像上面这样从远程版本库获取已在命名空间中的引用当然很棒,但 QA 团队最初应该如何将他们的分支放入远程的`qa/`命名空间呢? 我们可以通过引用规范推送来完成这个任务。 + +如果 QA 团队想把他们的`master`分支推送到远程服务器的`qa/master`分支上,可以运行: + +```shell +$ git push origin master:refs/heads/qa/master +``` +如果他们希望 Git 每次运行`git push origin`时都像上面这样推送,可以在他们的配置文件中添加一条`push`值: +```shell +[remote "origin"] +url = https://gitee.com/willcoder/fake-project.git +fetch = +refs/heads/*:refs/remotes/origin/* +push = refs/heads/master:refs/heads/qa/master +``` +![图片](./../../../.vuepress/public/images/zNpI6xmnmWS2cGS0.png) + +正如刚才所指出的,这会让`git push origin`默认把本地`master`分支推送到远程`qa/master`分支 + +## 删除引用 + +删除引用你还可以借助类似下面的命令通过引用规范从远程服务器上删除引用: + +```shell +$ git push origin :topic +``` +因为引用规范(的格式)是`:`,所以上述命令把``留空,意味着把远程版本库的 topic 分支定义为空值,也就是删除它。 +或者你可以使用更新的语法(自 Git v1.7.0 以后可用): + +```shell +$ git push origin --delete topic +``` \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/6. \344\274\240\350\276\223\345\215\217\350\256\256.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/6. \344\274\240\350\276\223\345\215\217\350\256\256.md" new file mode 100644 index 0000000..9038ef5 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/6. \344\274\240\350\276\223\345\215\217\350\256\256.md" @@ -0,0 +1,38 @@ +--- +title: 传输协议 +--- +Git 可以通过两种主要的方式在版本库之间传输数据:“哑(dumb)”协议和“智能(smart)”协议。 + +## 哑协议 + +哑协议是一个基于 HTTP 协议的只读版本库,已经很少用到了。 + +在传输过程中,服务端不需要有针对 Git 特有的代码;抓取过程是一系列 HTTP 的 GET 请求,这种情况下,客户端可以推断出服务端 Git 仓库的布局。所以使用哑协议的版本库很难保证安全性和私有化,所以现在基本很少使用到了。 + +"哑协议"的只读限制是因为其服务端没有一个Git的守护进程在持续的关注"客户端"的所需并与之关注,所以只能“客户端”去发起请求获取远程的变更。 + + + +## 智能协议 + +智能协议支持读写模式,效率比哑协议高,是目前最常用的传输方式。 + +但它需要在服务端运行一个进程,它可以读取本地数据,理解客户端有什么和需要什么,并为它生成合适的包文件。 总共有两组进程用于传输数据,它们分别负责上传和下载数据。 + +### 上传数据 + +为了上传数据至远端,Git 使用`send-pack`和`receive-pack`进程。 运行在客户端上的`send-pack`进程连接到远端运行的`receive-pack`进程。 + +比如在我们执行`git push origin master`的时候: + +1.Git会执行`send-pack`进程连接服务器,`git-receive-pack`命令会立即为它所拥有的每一个引用发送一行响应。 + +2.你的`send-pack`进程会判断哪些提交记录是它所拥有但服务端没有的。`send-pack`会告知`receive-pack`这次推送将会更新的各个引用。服务端在收到请求后相应地作出成功或失败的 HTTP 响应。 + +### 下载数据 + +当你在下载数据时,`fetch-pack`和`upload-pack`进程就起作用了。 客户端启动`fetch-pack`进程,连接至远端的`upload-pack`进程,以协商后续传输的数据。 + +1.`fetch-pack`连接远程服务器,然后`upload-pack`会返回类似`receive-pack`返回的内容。 + +2.`fetch-pack`进程查看它自己所拥有的对象,并响应 “want” 和它需要的对象的 SHA-1 值。 它还会发送“have”和所有它已拥有的对象的 SHA-1 值。 在列表的最后,它还会发送“done”以通知`upload-pack`进程可以开始发送它所需对象的包文件。 diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/7. \347\273\264\346\212\244\344\270\216\346\225\260\346\215\256\346\201\242\345\244\215.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/7. \347\273\264\346\212\244\344\270\216\346\225\260\346\215\256\346\201\242\345\244\215.md" new file mode 100644 index 0000000..07e4ba7 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/7. \347\273\264\346\212\244\344\270\216\346\225\260\346\215\256\346\201\242\345\244\215.md" @@ -0,0 +1,266 @@ +--- +title: 维护与数据恢复 +--- +## 维护 + +Git 会不定时地自动运行一个叫做 “auto gc” 的命令。 大多数时候,这个命令并不会产生效果。 然而,如果有太多松散对象(不在包文件中的对象)或者太多包文件,Git 会运行一个完整的`git gc`命令,我们可以通过修改`gc.auto`与`gc.autopacklimit`的设置来改动这些限制数值。 + +“gc” 代表垃圾回收,这个命令会做以下事情:收集所有松散对象并将它们放置到包文件中, 将多个包文件合并为一个大的包文件,移除与任何提交都不相关的陈旧对象。 + +首先,我们查看当前对象列表,有一堆松散数据对象 + +```shell +$ find .git/objects -type f +.git/objects/54/68f3283bfc7fd3ae3cf17e89210b744d106e48 +.git/objects/af/f46a8086171b70b0146a1b44e6380ba242c022 +.git/objects/cd/32d11c26f2909e3204e327bbd2685a87baf660 +.git/objects/ce/e1c35858358f7438920ae1b7f7d86f5cc2119d +.git/objects/e5/32abd82431e55f3f03a2971b1af88002a26810 +.git/objects/f3/858d435146e27364574fa97936b45bec65663e +.git/objects/f5/abd87faf2abc34e7d1ac18e7e020f7d4e1c547 +``` +然后我们执行`git gc`命令 +```shell +$ git gc +Enumerating objects: 6, done. +Counting objects: 100% (6/6), done. +Delta compression using up to 8 threads. +Compressing objects: 100% (4/4), done. +Writing objects: 100% (6/6), done. +Total 6 (delta 1), reused 0 (delta 0) +``` +再次查看对象列表,发现内容已打包 +```shell +$ find .git/objects -type f +.git/objects/54/68f3283bfc7fd3ae3cf17e89210b744d106e48 +.git/objects/info/packs +.git/objects/pack/pack-5035b9fb775a699fecee6ac3c3df69734a095758.idx +.git/objects/pack/pack-5035b9fb775a699fecee6ac3c3df69734a095758.pack +``` + +`gc`将会做的另一件事是打包你的引用到一个单独的文件。 假设你的仓库包含以下分支与标签: + +```shell +$ find .git/refs -type f +.git/refs/heads/experiment +.git/refs/heads/master +.git/refs/tags/v1.0 +.git/refs/tags/v1.1 +``` +如果你执行了`git gc`命令,`refs`目录中将不会再有这些文件。 为了保证效率 Git 会将它们移动到名为`.git/packed-refs`的文件中,就像这样: +```shell +$ cat .git/packed-refs +# pack-refs with: peeled fully-peeled +cac0cab538b970a37ea1e769cbbde608743bc96d refs/heads/experiment +ab1afef80fac8e34258ff41fc1b867c702daa24b refs/heads/master +cac0cab538b970a37ea1e769cbbde608743bc96d refs/tags/v1.0 +9585191f37f7b0fb9444f35a9bf50de191beadc2 refs/tags/v1.1 +^1a410efbd13591db07496601ebc7a059dd55cfe9 +``` +如果你更新了引用,Git 并不会修改这个文件,而是向`refs/heads`创建一个新的文件。 为了获得指定引用的正确 SHA-1 值,Git 会首先在`refs`目录中查找指定的引用,然后再到`packed-refs`文件中查找。 所以,如果你在`refs`目录中找不到一个引用,那么它或许在`packed-refs`文件中。 +## 数据恢复 + +在使用 Git 的过程中,如果强制删除了正在工作的分支,或者硬重置了一个分支,这时我们会丢失一些提交。 如果我们还需要这些提交,那我们就需要用到数据恢复。 + +下面的例子将硬重置你的测试仓库中的`master`分支到一个旧的提交,以此来恢复丢失的提交。 首先,让我们看看你的仓库现在在什么地方: + +```shell +$ git log --pretty=oneline +e201e95d4814f8c5c7522755ae6151b298b9ea4a (HEAD -> master) update submit.sh +421f3b6e9f05a97f05b845cb0905c44ed107acaf delete patch,add new file +24de949bb7c23ff052d5b39d01d809e86dd43fd2 git apply +ea561d5fded583caca9a81d8cdefede2f77240b2 (origin/featureA) insert +d3c8035e27d3efdb4333867757f34c1ba966a852 git merge +ca671b5cd1739aa6aa887e5ef9d0a04bcbd65a05 init +``` +现在,我们将`master`分支硬重置到第三次提交: +```shell +$ git reset --hard 24de949bb7c23ff052d5b39d01d809e86dd43fd2 +HEAD is now at 24de949 git apply +$ git log --pretty=oneline +24de949bb7c23ff052d5b39d01d809e86dd43fd2 git apply +ea561d5fded583caca9a81d8cdefede2f77240b2 (origin/featureA) insert +d3c8035e27d3efdb4333867757f34c1ba966a852 git merge +ca671b5cd1739aa6aa887e5ef9d0a04bcbd65a05 init +``` +现在顶部的两个提交已经丢失了——没有分支指向这些提交。 你需要找出最后一次提交的 SHA-1 然后增加一个指向它的分支。 +最方便,也是最常用的方法,是使用一个名叫`git reflog`的工具。 当你正在工作时,Git 会默默地记录每一次你改变 HEAD 时它的值。 每一次你提交或改变分支,引用日志都会被更新。 引用日志(reflog)也可以通过`git update-ref`命令更新。 你可以在任何时候通过执行`git reflog`命令来了解你曾经做过什么: + +```shell +$ git reflog +24de949 HEAD@{0}: reset: moving to 24de949bb7c23ff052d5b39d01d809e86dd43fd2 +e201e95 HEAD@{1}: commit: update submit.sh +421f3b6 HEAD@{2}: commit: delete patch,add new file +24de949 HEAD@{3}: clone: from https://gitee.com/willcoder/fake-project.git +``` +这里可以看到我们已经检出的两次提交,然而并没有足够多的信息。 为了使显示的信息更加有用,我们可以执行`git log -g`,这个命令会以标准日志的格式输出引用日志。 +```shell +$ git log -g +commit 24de949bb7c23ff052d5b39d01d809e86dd43fd2 +Reflog: HEAD@{0} (will ) +Reflog message: reset: moving to 24de949bb7c23ff052d5b39d01d809e86dd43fd2 +Author: will +Date:   Mon Aug 24 23:09:28 2020 +0800 +    git apply +commit e201e95d4814f8c5c7522755ae6151b298b9ea4a +Reflog: HEAD@{1} (will ) +Reflog message: commit: update submit.sh +Author: will +Date:   Thu Sep 3 00:11:06 2020 +0800 +    update submit.sh +commit 421f3b6e9f05a97f05b845cb0905c44ed107acaf +Reflog: HEAD@{2} (will ) +Reflog message: commit: delete patch,add new file +Author: will +Date:   Thu Sep 3 00:09:18 2020 +0800 +    delete patch,add new file +commit 24de949bb7c23ff052d5b39d01d809e86dd43fd2 +Reflog: HEAD@{3} (will ) +Reflog message: clone: from https://gitee.com/willcoder/fake-project.git +Author: will +Date:   Mon Aug 24 23:09:28 2020 +0800 +    git apply +``` +看起来下面的那个就是你丢失的提交,你可以通过创建一个新的分支指向这个提交来恢复它。 例如,你可以创建一个名为 recover-branch 的分支指向这个提交(e201e9): +```shell +$ git branch recover-branch e201e9 +$ git log --pretty=oneline recover-branch +e201e95d4814f8c5c7522755ae6151b298b9ea4a (recover-branch) update submit.sh +421f3b6e9f05a97f05b845cb0905c44ed107acaf delete patch,add new file +24de949bb7c23ff052d5b39d01d809e86dd43fd2 git apply +ea561d5fded583caca9a81d8cdefede2f77240b2 (origin/featureA) insert +d3c8035e27d3efdb4333867757f34c1ba966a852 git merge +ca671b5cd1739aa6aa887e5ef9d0a04bcbd65a05 init +``` +不错,现在有一个名为`recover-branch`的分支是你的`master`分支曾经指向的地方, 再一次使得前两次提交可到达了。接下来,假设你丢失的提交因为某些原因不在引用日志中, 那么我们可以通过移除`recover-branch`分支并删除引用日志来模拟这种情况。 现在前两次提交又不被任何分支指向了: +```shell +删除分支 +$ git branch -D recover-branch +Deleted branch recover-branch (was e201e95). +删除日志 +$ rm -Rf .git/logs/ +使用git fsck --full获取丢失的提交SHA-1 +$ git fsck --full +Checking object directories: 100% (256/256), done. +Checking objects: 100% (25/25), done. +dangling commit e201e95d4814f8c5c7522755ae6151b298b9ea4a +``` +在这个例子中,你可以在 “dangling commit” 后看到你丢失的提交。 +## 移除对象 + +`git clone`会下载整个项目的历史,包括每一个文件的每一个版本。 如果所有的东西都是源代码那么这很好,因为 Git 被高度优化来有效地存储这种数据。 如果某个人在之前向项目添加了一个大小特别大的文件,即使你将这个文件从项目中移除了,每次克隆还是都要强制的下载这个大文件。 之所以会产生这个问题,是因为这个文件在历史中是存在的,它会永远在那里。 + +当你迁移 Subversion 或 Perforce 仓库到 Git 的时候,这会是一个严重的问题。 因为这些版本控制系统并不下载所有的历史文件,所以这种文件所带来的问题比较少。 如果你从其他的版本控制系统迁移到 Git 时发现仓库比预期的大得多,那么你就需要找到并移除这些大文件。 + +**警告:这个操作对提交历史的修改是破坏性的。**它会从你必须修改或移除一个大文件引用最早的树对象开始重写每一次提交。 + +为了演示,我们将添加一个大文件到测试仓库中,并在下一次提交中删除它,现在我们需要找到它,并将它从仓库中永久删除。 首先,添加一个大文件到仓库中: + +```shell +$ curl https://www.kernel.org/pub/software/scm/git/git-2.1.0.tar.gz > git.tgz +$ git add git.tgz +$ git commit -m 'add git tarball' +[master 7b30847] add git tarball + 1 file changed, 0 insertions(+), 0 deletions(-) + create mode 100644 git.tgz +``` +哎呀——其实这个项目并不需要这个巨大的压缩文件。 现在我们将它移除: +```shell +$ git rm git.tgz +rm 'git.tgz' +$ git commit -m 'oops - removed large tarball' +[master dadf725] oops - removed large tarball + 1 file changed, 0 insertions(+), 0 deletions(-) + delete mode 100644 git.tgz +``` +现在,我们执行`gc`来查看数据库占用了多少空间: +```shell +$ git gc +Counting objects: 17, done. +Delta compression using up to 8 threads. +Compressing objects: 100% (13/13), done. +Writing objects: 100% (17/17), done. +Total 17 (delta 1), reused 10 (delta 0) +``` +你也可以执行`count-objects`命令来快速的查看占用空间大小: +```shell +$ git count-objects -v +count: 7 +size: 32 +in-pack: 17 +packs: 1 +size-pack: 4868 +prune-packable: 0 +garbage: 0 +size-garbage: 0 +``` +`size-pack`的数值指的是你的包文件以 KB 为单位计算的大小,所以你大约占用了 5MB 的空间。 在最后一次提交前,使用了不到 2KB ——显然,从之前的提交中移除文件并不能从历史中移除它。 每一次有人克隆这个仓库时,他们将必须克隆所有的 5MB 来获得这个微型项目,只因为你意外地添加了一个大文件。 现在来让我们彻底的移除这个文件。 +首先你必须找到它。 在本例中,你已经知道是哪个文件了。 但是假设你不知道;该如何找出哪个文件或哪些文件占用了如此多的空间? 如果你执行`git gc`命令,所有的对象将被放入一个包文件中,你可以通过运行`git verify-pack`命令, 然后对输出内容的第三列(即文件大小)进行排序,从而找出这个大文件。 你也可以将这个命令的执行结果通过管道传送给`tail`命令,因为你只需要找到列在最后的几个大对象。 + +```shell +$ git verify-pack -v .git/objects/pack/pack-29…69.idx \ + | sort -k 3 -n \ + | tail -3 +dadf7258d699da2c8d89b09ef6670edb7d5f91b4 commit 229 159 12 +033b4468fa6b2a9547a70d88d1bbe8bf3f9ed0d5 blob 22044 5792 4977696 +82c99a3e86bb1267b236a4b6eff7868d97489af1 blob 4975916 4976258 1438 +``` +你可以看到这个大对象出现在返回结果的最底部:占用 5MB 空间。 为了找出具体是哪个文件,可以使用`rev-list`命令。 如果你传递`--objects`参数给`rev-list`命令,它就会列出所有提交的 SHA-1、数据对象的 SHA-1 和与它们相关联的文件路径。 可以使用以下命令来找出你的数据对象的名字: +```shell +$ git rev-list --objects --all | grep 82c99a3 +82c99a3e86bb1267b236a4b6eff7868d97489af1 git.tgz +``` +现在,你只需要从过去所有的树中移除这个文件。 使用以下命令可以轻松地查看哪些提交对这个文件产生改动: +```shell +$ git log --oneline --branches -- git.tgz +dadf725 oops - removed large tarball +7b30847 add git tarball +``` +现在,你必须重写`7b30847`提交之后的所有提交来从 Git 历史中完全移除这个文件。 为了执行这个操作,我们要使用`filter-branch`命令: +```shell +$ git filter-branch --index-filter \ + 'git rm --ignore-unmatch --cached git.tgz' -- 7b30847^.. +Rewrite 7b30847d080183a1ab7d18fb202473b3096e9f34 (1/2)rm 'git.tgz' +Rewrite dadf7258d699da2c8d89b09ef6670edb7d5f91b4 (2/2) +Ref 'refs/heads/master' was rewritten +``` +`--index-filter`选项类似于`--tree-filter`选项, 不过这个选项并不会让命令将修改在硬盘上检出的文件,而只是修改在暂存区或索引中的文件。 +你必须使用`git rm --cached`命令来移除文件,而不是通过类似`rm file`的命令——因为你需要从索引中移除它,而不是磁盘中。 还有一个原因是速度—— Git 在运行过滤器时,并不会检出每个修订版本到磁盘中,所以这个过程会非常快。 如果愿意的话,你也可以通过`--tree-filter`选项来完成同样的任务。`git rm`命令的`--ignore-unmatch`选项告诉命令:如果尝试删除的模式不存在时,不提示错误。 最后,使用`filter-branch`选项来重写自`7b30847`提交以来的历史,也就是这个问题产生的地方。 否则,这个命令会从最旧的提交开始,这将会花费许多不必要的时间。 + +你的历史中将不再包含对那个文件的引用。 不过,你的引用日志和你在`.git/refs/original`通过`filter-branch`选项添加的新引用中还存有对这个文件的引用,所以你必须移除它们然后重新打包数据库。 在重新打包前需要移除任何包含指向那些旧提交的指针的文件: + +```shell +$ rm -Rf .git/refs/original +$ rm -Rf .git/logs/ +$ git gc +Counting objects: 15, done. +Delta compression using up to 8 threads. +Compressing objects: 100% (11/11), done. +Writing objects: 100% (15/15), done. +Total 15 (delta 1), reused 12 (delta 0) +``` +让我们看看你省了多少空间。 +```shell +$ git count-objects -v +count: 11 +size: 4904 +in-pack: 15 +packs: 1 +size-pack: 8 +prune-packable: 0 +garbage: 0 +size-garbage: 0 +``` +打包的仓库大小下降到了 8K,比 5MB 好很多。 可以从 size 的值看出,这个大文件还在你的松散对象中,并没有消失;但是它不会在推送或接下来的克隆中出现,这才是最重要的。 如果真的想要删除它,可以通过有`--expire`选项的`git prune`命令来完全地移除那个对象: +```shell +$ git prune --expire now +$ git count-objects -v +count: 0 +size: 0 +in-pack: 15 +packs: 1 +size-pack: 8 +prune-packable: 0 +garbage: 0 +size-garbage: 0 +``` \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/8. \347\216\257\345\242\203\345\217\230\351\207\217.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/8. \347\216\257\345\242\203\345\217\230\351\207\217.md" new file mode 100644 index 0000000..6546ef9 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/8. \347\216\257\345\242\203\345\217\230\351\207\217.md" @@ -0,0 +1,189 @@ +--- +title: 环境变量 +--- +我之前以为 Git 环境变量就是 path 里配置的那个系统变量路径。 + +就是在执行 Git 命令会提示“不是内部或外部命令,也不是可运行的程序”的时候,去系统属性里将 path 添加一个 Git 路径`C:\Program Files\Git\cmd;` + +## 全局行为 + +像通常的程序一样,Git 的常规行为依赖于环境变量。 + +`GIT_EXEC_PATH`决定 Git 到哪找它的子程序 (像`git-commit`,`git-diff`等等)。 + +你可以用`git --exec-path`来查看当前设置。 + +![图片](./../../../.vuepress/public/images/8xIXzoqx8i8Yup4s.png) + +通常不会考虑修改`HOME`这个变量(太多其它东西都依赖它),这是 Git 查找全局配置文件的地方。 + +`PREFIX`也类似,除了用于系统级别的配置。 Git 在`$PREFIX/etc/gitconfig`查找此文件。 + +如果设置了`GIT_CONFIG_NOSYSTEM`,就禁用系统级别的配置文件。 这在系统配置影响了你的命令,而你又无权限修改的时候很有用。 + +`GIT_PAGER`控制在命令行上显示多页输出的程序。 如果这个没有设置,就会用`PAGER`。 + +`GIT_EDITOR`当用户需要编辑一些文本(比如提交信息)时, Git 会启动这个编辑器。 如果没设置,就会用`EDITOR`。 + +## 版本库位置 + +Git 用了几个变量来确定它如何与当前版本库交互。 + +`GIT_DIR`是`.git`目录的位置。 如果这个没有设置, Git 会按照目录树逐层向上查找`.git`目录,直到到达`~`或`/`。 + +`GIT_CEILING_DIRECTORIES`控制查找`.git`目录的行为。 如果你访问加载很慢的目录(如那些磁带机上的或通过网络连接访问的),你可能会想让 Git 早点停止尝试,尤其是 shell 构建时调用了 Git 。 + +`GIT_WORK_TREE`是非空版本库的工作目录的根路径。 如果指定了`--git-dir`或`GIT_DIR`但未指定`--work-tree`、`GIT_WORK_TREE`或`core.worktree`,那么当前工作目录就会视作工作树的顶级目录。 + +`GIT_INDEX_FILE`是索引文件的路径(只有非空版本库有)。 + +`GIT_OBJECT_DIRECTORY`用来指定`.git/objects`目录的位置。 + +`GIT_ALTERNATE_OBJECT_DIRECTORIES`一个冒号分割的列表(格式类似`/dir/one:/dir/two:…`)用来告诉 Git 到哪里去找不在`GIT_OBJECT_DIRECTORY`目录中的对象。 如果你有很多项目有相同内容的大文件,这个可以用来避免存储过多备份。 + +## 路径规则 + +所谓 “pathspec” 是指你在 Git 中如何指定路径,包括通配符的使用。 它们会在`.gitignore`文件中用到,命令行里也会用到(`git add *.c`)。 + +`GIT_GLOB_PATHSPECS`和`GIT_NOGLOB_PATHSPECS`控制通配符在路径规则中的默认行为。 如果`GIT_GLOB_PATHSPECS`设置为 1, 通配符表现为通配符(这是默认设置); 如果`GIT_NOGLOB_PATHSPECS`设置为 1,通配符仅匹配字面。意思是`*.c`只会匹配**文件名是**“*.c” 的文件,而不是以`.c`结尾的文件。 你可以在各个路径规范中用`:(glob)`或`:(literal)`开头来覆盖这个配置,如`:(glob)*.c`。 + +`GIT_LITERAL_PATHSPECS`禁用上面的两种行为;通配符将不能用,前缀覆盖也不能用。 + +`GIT_ICASE_PATHSPECS`让所有的路径规范忽略大小写。 + +## 提交 + +Git 提交对象的创建通常最后是由`git-commit-tree`来完成,`git-commit-tree`用这些环境变量作主要的信息源。 仅当这些值不存在才回退到预置的值。 + +`GIT_AUTHOR_NAME`是 “author” 字段的可读名字。 + +`GIT_AUTHOR_EMAIL`是 “author” 字段的邮件。 + +`GIT_AUTHOR_DATE`是 “author” 字段的时间戳。 + +`GIT_COMMITTER_NAME`是 “committer” 字段的可读名字。 + +`GIT_COMMITTER_EMAIL`是 “committer” 字段的邮件。 + +`GIT_COMMITTER_DATE`是 “committer” 字段的时间戳。 + +如果`user.email`没有配置, 就会用到`EMAIL`指定的邮件地址。 如果**这个**也没有设置, Git 继续回退使用系统用户和主机名。 + +## 网络 + +Git 使用`curl`库通过 HTTP 来完成网络操作, 所以`GIT_CURL_VERBOSE`告诉 Git 显示所有由那个库产生的消息。 这跟在命令行执行`curl -v`差不多。 + +`GIT_SSL_NO_VERIFY`告诉 Git 不用验证 SSL 证书。 这在有些时候是需要的, 例如你用一个自己签名的证书通过 HTTPS 来提供 Git 服务, 或者你正在搭建 Git 服务器,还没有安装完全的证书。 + +如果 Git 操作在网速低于`GIT_HTTP_LOW_SPEED_LIMIT`字节/秒,并且持续`GIT_HTTP_LOW_SPEED_TIME`秒以上的时间,Git 会终止那个操作。 这些值会覆盖`http.lowSpeedLimit`和`http.lowSpeedTime`配置的值。 + +`GIT_HTTP_USER_AGENT`设置 Git 在通过 HTTP 通讯时用到的 user-agent。 默认值类似于`git/2.0.0`。 + +## 比较和合并 + +`GIT_DIFF_OPTS`这个有点起错名字了。 有效值仅支持`-u`或`--unified=`,用来控制在`git diff`命令中显示的内容行数。 + +`GIT_EXTERNAL_DIFF`用来覆盖`diff.external`配置的值。 如果设置了这个值, 当执行`git diff`时,Git 会调用该程序。 + +`GIT_DIFF_PATH_COUNTER`和`GIT_DIFF_PATH_TOTAL`对于`GIT_EXTERNAL_DIFF`或`diff.external`指定的程序有用。 前者表示在一系列文件中哪个是被比较的(从 1 开始),后者表示每批文件的总数。 + +`GIT_MERGE_VERBOSITY`控制递归合并策略的输出。 允许的值有下面这些: + +* 0 什么都不输出,除了可能会有一个错误信息。 +* 1 只显示冲突。 +* 2 还显示文件改变。 +* 3 显示因为没有改变被跳过的文件。 +* 4 显示处理的所有路径。 +* 5 显示详细的调试信息。 + +默认值是 2。 + +## 调试 + +想**真正地**知道 Git 正在做什么? Git 内置了相当完整的跟踪信息,你需要做的就是把它们打开。 这些变量的可用值如下: + +* “true”“1” 或 “2”——跟踪类别写到标准错误输出。 +* 以`/`开头的绝对路径——跟踪输出会被写到那个文件。 + +`GIT_TRACE`控制常规跟踪,它并不适用于特殊情况。 它跟踪的范围包括别名的展开和其他子程序的委托。 + +```shell +$ GIT_TRACE=true git lga +20:12:49.877982 git.c:554 trace: exec: 'git-lga' +20:12:49.878369 run-command.c:341 trace: run_command: 'git-lga' +20:12:49.879529 git.c:282 trace: alias expansion: lga => 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all' +20:12:49.879885 git.c:349 trace: built-in: git 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all' +20:12:49.899217 run-command.c:341 trace: run_command: 'less' +20:12:49.899675 run-command.c:192 trace: exec: 'less' +``` +`GIT_TRACE_PACK_ACCESS`控制访问打包文件的跟踪信息。 第一个字段是被访问的打包文件,第二个是文件的偏移量: +```shell +$ GIT_TRACE_PACK_ACCESS=true git status +20:10:12.081397 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 12 +20:10:12.081886 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 34662 +20:10:12.082115 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 35175 +# […] +20:10:12.087398 sha1_file.c:2088 .git/objects/pack/pack-e80e...e3d2.pack 56914983 +20:10:12.087419 sha1_file.c:2088 .git/objects/pack/pack-e80e...e3d2.pack 14303666 +On branch master +Your branch is up-to-date with 'origin/master'. +nothing to commit, working directory clean +``` +`GIT_TRACE_PACKET`打开网络操作包级别的跟踪信息。 +```shell +$ GIT_TRACE_PACKET=true git ls-remote origin +20:15:14.867043 pkt-line.c:46 packet: git< # service=git-upload-pack +20:15:14.867071 pkt-line.c:46 packet: git< 0000 +20:15:14.867079 pkt-line.c:46 packet: git< 97b8860c071898d9e162678ea1035a8ced2f8b1f HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed no-done symref=HEAD:refs/heads/master agent=git/2.0.4 +20:15:14.867088 pkt-line.c:46 packet: git< 0f20ae29889d61f2e93ae00fd34f1cdb53285702 refs/heads/ab/add-interactive-show-diff-func-name +20:15:14.867094 pkt-line.c:46 packet: git< 36dc827bc9d17f80ed4f326de21247a5d1341fbc refs/heads/ah/doc-gitk-config +# […] +``` +`GIT_TRACE_PERFORMANCE`控制性能数据的日志打印。 输出显示了每个`git`命令调用花费的时间。 +```shell +$ GIT_TRACE_PERFORMANCE=true git gc +20:18:19.499676 trace.c:414 performance: 0.374835000 s: git command: 'git' 'pack-refs' '--all' '--prune' +20:18:19.845585 trace.c:414 performance: 0.343020000 s: git command: 'git' 'reflog' 'expire' '--all' +Counting objects: 170994, done. +Delta compression using up to 8 threads. +Compressing objects: 100% (43413/43413), done. +Writing objects: 100% (170994/170994), done. +Total 170994 (delta 126176), reused 170524 (delta 125706) +20:18:23.567927 trace.c:414 performance: 3.715349000 s: git command: 'git' 'pack-objects' '--keep-true-parents' '--honor-pack-keep' '--non-empty' '--all' '--reflog' '--unpack-unreachable=2.weeks.ago' '--local' '--delta-base-offset' '.git/objects/pack/.tmp-49190-pack' +20:18:23.584728 trace.c:414 performance: 0.000910000 s: git command: 'git' 'prune-packed' +20:18:23.605218 trace.c:414 performance: 0.017972000 s: git command: 'git' 'update-server-info' +20:18:23.606342 trace.c:414 performance: 3.756312000 s: git command: 'git' 'repack' '-d' '-l' '-A' '--unpack-unreachable=2.weeks.ago' +Checking connectivity: 170994, done. +20:18:25.225424 trace.c:414 performance: 1.616423000 s: git command: 'git' 'prune' '--expire' '2.weeks.ago' +20:18:25.232403 trace.c:414 performance: 0.001051000 s: git command: 'git' 'rerere' 'gc' +20:18:25.233159 trace.c:414 performance: 6.112217000 s: git command: 'git' 'gc' +``` +`GIT_TRACE_SETUP`显示 Git 发现的关于版本库和交互环境的信息。 +```shell +$ GIT_TRACE_SETUP=true git status +20:19:47.086765 trace.c:315 setup: git_dir: .git +20:19:47.087184 trace.c:316 setup: worktree: /Users/ben/src/git +20:19:47.087191 trace.c:317 setup: cwd: /Users/ben/src/git +20:19:47.087194 trace.c:318 setup: prefix: (null) +On branch master +Your branch is up-to-date with 'origin/master'. +nothing to commit, working directory clean +``` +## 其它 + +如果指定了`GIT_SSH`, Git 连接 SSH 主机时会用指定的程序代替`ssh`。 它会被用`$GIT_SSH [username@]host [-p ] `的命令方式调用。 这不是配置定制`ssh`调用方式的最简单的方法; 它不支持额外的命令行参数, 所以你必须写一个封装脚本然后让`GIT_SSH`指向它。 可能用`~/.ssh/config`会更简单。 + +`GIT_ASKPASS`覆盖了`core.askpass`配置。 这是 Git 需要向用户请求验证时用到的程序,它接受一个文本提示作为命令行参数,并在`stdout`中返回应答。 + +`GIT_NAMESPACE`控制有命令空间的引用的访问,与`--namespace`标志是相同的。 这主要在服务器端有用, 如果你想在一个版本库中存储单个版本库的多个 fork, 只要保持引用是隔离的就可以。 + +`GIT_FLUSH`强制 Git 在向标准输出增量写入时使用没有缓存的 I/O。 设置为 1 让 Git 刷新更多, 设置为 0 则使所有的输出被缓存。 默认值(若此变量未设置)是根据活动和输出模式的不同选择合适的缓存方案。 + +`GIT_REFLOG_ACTION`让你可以指定描述性的文字写到 reflog 中。 这有个例子: + +```shell +$ GIT_REFLOG_ACTION="my action" git commit --allow-empty -m 'my message' +[master 9e3d55a] my message +$ git reflog -1 +9e3d55a HEAD@{0}: my action: my message +``` \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/readme.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/readme.md" new file mode 100644 index 0000000..7f2c3c7 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\206\205\351\203\250\345\216\237\347\220\206/readme.md" @@ -0,0 +1,12 @@ +--- +title: Git 内部原理 +--- + +### [1. 底层命令和高层命令](./1.%20底层命令和高层命令.md) +### [2. Git 对象](./2.%20Git%20对象.md) +### [3. Git 引用](./3.%20Git%20引用.md) +### [4. 包文件](./4.%20包文件.md) +### [5. 引用规范](./5.%20引用规范.md) +### [6. 传输协议](./6.%20传输协议.md) +### [7. 维护与数据恢复](./7.%20维护与数据恢复.md) +### [8. 环境变量](./8.%20环境变量.md) diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/1. \351\200\211\346\213\251\344\277\256\350\256\242\347\211\210\346\234\254.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/1. \351\200\211\346\213\251\344\277\256\350\256\242\347\211\210\346\234\254.md" new file mode 100644 index 0000000..f1f5dae --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/1. \351\200\211\346\213\251\344\277\256\350\256\242\347\211\210\346\234\254.md" @@ -0,0 +1,231 @@ +--- +title: 选择修订版本 +--- +Git 允许使用者通过几种方法在指定或者一定范围内的提交,分配提交,分组提交。 + +## 指明单次提交 + +使用简明的 SHA-1 ( hash 值)指明单个提交: git show [SHA-1值] + +获取 SHA-1 值(hash值): + +```shell +$ git log +commit b830542ac6953c0bf1c49fa5ae00a9be239ac6ca (HEAD -> master) +Author: QAQSarah <0979@example.com> +Date: Tue Aug 25 22:23:54 2020 +0800 + 2 +commit 947d9649b7a2c028050da2fa7aafef8f67cc9997 +Author: QAQSarah <0979@example.com> +Date: Tue Aug 25 22:23:33 2020 +0800 + 1 +``` +如果你在 git log 后加上 --abbrev-commit 参数,输出结果里就会显示简短且唯一的值;默认使用七个字符,不过有时为了避免 SHA-1 的歧义,会增加字符数: +```shell +$ git log --abbrev-commit --pretty=oneline +b830542 (HEAD -> master) 2 +947d964 1 +``` +假如这个提交的SHA-1的值是 974d...,则: +```shell +$ git show 947d9649b7a2c028050da2fa7aafef8f67cc9997 +commit 947d9649b7a2c028050da2fa7aafef8f67cc9997 +Author: QAQSarah <0979@example.com> +Date: Tue Aug 25 22:23:33 2020 +0800 + 1 +diff --git a/ss.txt b/ss.txt +new file mode 100644 +index 0000000..e69de29 +``` +## 分支引用 + +显示一个分支的最后一次提交的对象:git show [分支名] + +指明一次提交最直接的方法是有一个指向它的分支引用。例如,你想要查看一个分支的最后一次提交的对象,假设 topic1 分支指向 947d.. ,那么以下的命令是等价的: + +```shell +$ git show 947d9649b7a2c028050da2fa7aafef8f67cc9997 +$ git show topic1 +``` +如果你想知道某个分支指向哪个特定的 SHA-1,或者想看任何一个例子中被简写的 SHA-1 ,你可以使用一个叫做 rev-parse 的 Git 探测工具。 +```shell +$ git rev-parse topic1 +947d9649b7a2c028050da2fa7aafef8f67cc9997 +``` +## 引用日志 + +引用日志里的简称指明单个提交:git show HEAD@{n} + +当使用 Git 工作时,Git会在后台保存一个引用日志( reflog ),引用日志记录了最近一次的HEAD和分支引用所指向的历史. + +git reflog : 查看引用日志 + +```shell +$ git reflog +b830542 (HEAD -> master) HEAD@{0}: commit: 2 +947d964 HEAD@{1}: commit (initial): 1 +``` +每当你的 HEAD 所指向的位置发生了变化,Git 就会将这个信息存储到引用日志这个历史记录里。 通过这些数据,你可以很方便地获取之前的提交历史。 如果你想查看仓库中 HEAD 在五次前的所指向的提交,**你可以使用 @{n} 来引用 reflog 中输出的提交记录**。 +```shell +$ git show HEAD@{5}` +``` +例子如下: +```shell +//指定次数超过提交的次数 +$ git show HEAD@{2} +fatal: Log for 'HEAD' only has 2 entries. +$ git show HEAD@{1} +commit 947d9649b7a2c028050da2fa7aafef8f67cc9997 +Author: QAQSarah <0979@example.com> +Date: Tue Aug 25 22:23:33 2020 +0800 + 1 +diff --git a/ss.txt b/ss.txt +new file mode 100644 +index 0000000..e69de29 +``` +你同样可以使用这个语法来查看某个分支在一定时间前的位置。 例如,查看你的 master 分支在昨天的时候指向了哪个提交,你可以输入: +```shell +$ git show master@{yesterday} +commit b830542ac6953c0bf1c49fa5ae00a9be239ac6ca (HEAD -> master) +Author: QAQSarah <0979@example.com> +Date: Tue Aug 25 22:23:54 2020 +0800 + 2 +diff --git a/ss.txt b/ss.txt +deleted file mode 100644 +index e69de29..0000000 +``` +显示昨天该分支的顶端指向了哪个提交。 这个方法只对还在你引用日志里的数据有用,所以不能用来查好几个月之前的提交。 +也可以运行 git log -g 来查看类似于 git log 输出格式的引用日志信息: + +```shell +$ git log -g master commit +734713bc047d87bf7eac9674765ae793478c50d3 +Reflog: master@{0} (Scott Chacon ) +Reflog message: commit: fixed refs handling, added gc auto, updated +Author: Scott Chacon +Date: Fri Jan 2 18:32:33 2020-0800 + fixed refs handling, added gc auto, updated tests +commit d921970aadf03b3cf0e71becdaab3147ba71cdef +Reflog: master@{1} (Scott Chacon ) +Reflog message: merge phedders/rdocs: Merge made by recursive. +Author: Scott Chacon +Date: Thu Dec 11 15:08:43 2019-0800 + Merge commit 'phedders/rdocs' +``` +值得注意的是,引用日志只存在于本地仓库,一个记录你在你自己的仓库里做过什么的日志。 其他人拷贝的仓库里的引用日志不会和你的相同;而你新克隆一个仓库的时候,引用日志是空的,因为你在仓库里还没有操作。 +## 祖先引用 + +指明某次提交的父提交: `git show HEAD^` 与 `git show HEAD~` + +如果你在引用的尾部加上一个 ^(脱字符),Git转换其解析为该引用的上一个提交。假设你的提交历史是: + +```shell +$ git log --pretty=format:'%h %s' --graph +* 3201521 test1 +* b830542 2 +* 947d964 1 +``` +你也可以在 ^ 后面添加一个数字——例如 b830542^1 代表 “b830542 的第一父提交” 这个语法只适用于合并(merge)的提交,因为合并提交会有多个父提交。 第一父提交是你合并时所在分支,而第二父提交是你所合并的分支: +```shell +$ git show b830542^ +commit 947d9649b7a2c028050da2fa7aafef8f67cc9997 +Author: QAQSarah <0979@example.com> +Date: Tue Aug 25 22:23:33 2020 +0800 + 1 +diff --git a/ss.txt b/ss.txt +new file mode 100644 +index 0000000..e69de29 +``` +另一种指明祖先提交的方法是 `~`。 同样是指向第一父提交,因此 `HEAD~` 和 `HEAD^` 是等价的。 而区别在于你在后面加数字的时候。 `HEAD~2` 代表 “第一父提交的第一父提交”,也就是 “祖父提交”例如,在之前的列出的提交历史中,`HEAD~3` 就是 +```shell +$ git show HEAD~3 +commit b830542ac6953c0bf1c49fa5ae00a9be239ac6ca (test) +Author: QAQSarah <0969@example.com> +Date: Tue Aug 25 22:23:54 2020 +0800 + 2 +diff --git a/ss.txt b/ss.txt +deleted file mode 100644 +index e69de29..0000000 +``` +也可以写成 HEAD^^^,也是第一父提交的第一父提交的第一父提交: +```shell +$ git show HEAD^^^ +commit b830542ac6953c0bf1c49fa5ae00a9be239ac6ca (test) +Author: QAQSarah <0969@example.com> +Date: Tue Aug 25 22:23:54 2020 +0800 + 2 +diff --git a/ss.txt b/ss.txt +deleted file mode 100644 +index e69de29..0000000 +``` +你也可以组合使用这两个语法 —— 你可以通过 `HEAD~3^2` 来取得之前引用的第二父提交(假设它是一个合并提交)。 + +## 指明范围提交 + +### **1.双点** + +找出可从一个分支获得而不能从另一个分支获得的提交。例如,你有如下的提交历史示例范围选择的历史。 + +git log test..master  (意思是“所有可从master分支中获得而不能从test分支中获得的提交”。) + +```shell +$ git log test..master +commit ff8b135197a406132d6757e776cb66f7c547ed35 (HEAD -> master) +Author: QAQSarah <0979@example.com> +Date: Mon Aug 31 23:39:52 2020 +0800 + test1-2 +commit 7f07b6142e2064a8f77427579c6a46c6a5098fe5 +Author: QAQSarah <0979@example.com> +Date: Mon Aug 31 23:34:31 2020 +0800 + 1 +commit 3201521be8f8258ad85a5a0362660df0bd334a76 +Author: QAQSarah <0979@example.com> +Date: Mon Aug 31 23:00:31 2020 +0800 + test1 +``` +git log master..test(反过来所有在 test 而不在 master 中的分支) +```shell +$ git log master..test +commit 841ce6e314311f32a2738768b3bab73c9062a0e3 (HEAD -> test) +Author: QAQSarah <0979@example.com> +Date: Mon Aug 31 23:47:56 2020 +0800 + test-v +``` + +### **2.多点** + +在多个分支筛选提交。 + +例如查看这些提交是被包含在某些分支中的一个,但是不在你当前的分支上。在任意引用前加上 ^ 字符或者 --not,来指明你不希望提交被包含其中的分支因此下列三个命令是等价的: + +```shell +git log refA..refB <=>git log ^refA..refB <=> git log refB - -not refA +``` +多分支: +```shell +git log refA refB ^refC <=> git log refA refB - -not refC +``` +### **3.三点**: + +这个语法可以选择出被两个引用之一包含但又不被其中同时包含的提交。再看看之前双点示例中的提交历史。 +看master或者test中包含的但不是两个共有的提交,你可以执行:(在两个分支中被单个分支包含但又不被同时包含 :) + +```shell +$ git log master...test +commit 841ce6e314311f32a2738768b3bab73c9062a0e3 (HEAD -> test) +Author: QAQSarah <0979@example.com> +Date: Mon Aug 31 23:47:56 2020 +0800 + test-v +commit ff8b135197a406132d6757e776cb66f7c547ed35 (master) +Author: QAQSarah <0979@example.com> +Date: Mon Aug 31 23:39:52 2020 +0800 + test1-2 +commit 7f07b6142e2064a8f77427579c6a46c6a5098fe5 +Author: QAQSarah <0979@example.com> +Date: Mon Aug 31 23:34:31 2020 +0800 + 1 +commit 3201521be8f8258ad85a5a0362660df0bd334a76 +Author: QAQSarah <0979@example.com> +Date: Mon Aug 31 23:00:31 2020 +0800 + test1 +``` diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/10. \345\255\220\346\250\241\345\235\227.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/10. \345\255\220\346\250\241\345\235\227.md" new file mode 100644 index 0000000..0edd11b --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/10. \345\255\220\346\250\241\345\235\227.md" @@ -0,0 +1,453 @@ +--- +title: 子模块 +--- + +`git submodule` + +## 开始使用 + +有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。 + +此时就需要使用 Git 的子模块。 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。 + +我们将要演示如何在一个被分成一个主项目与几个子项目的项目上开发。 + +我们首先将一个已存在的 Git 仓库添加为正在工作的仓库的子模块。 你可以通过在`git submodule add`命令后面加上想要跟踪的项目的相对或绝对 URL 来添加新的子模块。 + +首先新建了一个远程仓库当做子模块,然后在主项目上使用命令添加子模块 + +```shell +Administrator@F69J2GKVB3UPVZ7 MINGW64 /g/test/fake-project (master) +$ git submodule add https://gitee.com/willcoder/git_submodule.git +Cloning into 'G:/test/fake-project/git_submodule'... +remote: Enumerating objects: 3, done. +remote: Counting objects: 100% (3/3), done. +remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 +Unpacking objects: 100% (3/3), done. +warning: LF will be replaced by CRLF in .gitmodules. +The file will have its original line endings in your working directory. +``` +默认情况下,子模块会将子项目放到一个与仓库同名的目录中`git_submodule`。 如果你想要放到其他地方,那么可以在命令结尾添加一个不同的路径。 +如果这时运行`git status`,你会注意到几件事。 + +```shell +$ git status +On branch master +Your branch and 'origin/master' have diverged, +and have 4 and 2 different commits each, respectively. +  (use "git pull" to merge the remote branch into yours) +Changes to be committed: +  (use "git reset HEAD ..." to unstage) +        new file:   .gitmodules +        new file:   git_submodule +``` +首先应当注意到新的`.gitmodules`文件。 该配置文件保存了项目 URL 与已经拉取的本地目录之间的映射: +![图片](./../../../.vuepress/public/images/Dy5f6kKzNebfru3u.png) + +```shell +[submodule "git_submodule"] + path = git_submodule + url = https://gitee.com/willcoder/git_submodule.git +``` +如果有多个子模块,该文件中就会有多条记录。 要重点注意的是,该文件也像`.gitignore`文件一样受到(通过)版本控制。 它会和该项目的其他部分一同被拉取推送。 这就是克隆该项目的人知道去哪获得子模块的原因。 +在`git status`输出中列出的另一个是项目文件夹记录。 如果你运行`git diff`,会看到类似下面的信息: + +```shell +$ git diff --cached git_submodule +diff --git a/git_submodule b/git_submodule +new file mode 160000 +index 0000000..0c7ce50 +--- /dev/null ++++ b/git_submodule +@@ -0,0 +1 @@ ++Subproject commit 0c7ce502e3c47b30e02e08c1ff015660ff3bed45 +``` +虽然`git_submodule`是工作目录中的一个子目录,但 Git 还是会将它视作一个子模块。当你不在那个目录中时,Git 并不会跟踪它的内容, 而是将它看作子模块仓库中的某个具体的提交。 +如果你想看到更漂亮的差异输出,可以给`git diff`传递`--submodule`选项。 + +```shell +$ git diff --cached --submodule +diff --git a/.gitmodules b/.gitmodules +new file mode 100644 +index 0000000..7345b56 +--- /dev/null ++++ b/.gitmodules +@@ -0,0 +1,3 @@ ++[submodule "git_submodule"] ++       path = git_submodule ++       url = https://gitee.com/willcoder/git_submodule.git +Submodule git_submodule 0000000...0c7ce50 (new submodule) +``` +当你提交时,会看到类似下面的信息: +```shell +$ git commit -am 'add git_submodules' +[master 8738267] add git_submodules + 2 files changed, 4 insertions(+) + create mode 100644 .gitmodules + create mode 160000 git_submodule +``` +注意`git_submodule`记录的`160000`模式。 这是 Git 中的一种特殊模式,它本质上意味着你是将一次提交记作一项目录记录的,而非将它记录成一个子目录或者一个文件。 +最后,推送这些更改: + +```shell +$ git push origin master +``` +## 克隆含有子模块的项目 + +接下来我们将会克隆一个含有子模块的项目。 当你在克隆这样的项目时,默认会包含该子模块目录,但其中还没有任何文件: + +```shell +$ git clone https://gitee.com/willcoder/fake-project.git +Cloning into 'fake-project'... +remote: Enumerating objects: 44, done. +remote: Counting objects: 100% (44/44), done. +remote: Compressing objects: 100% (31/31), done. +remote: Total 44 (delta 10), reused 0 (delta 0), pack-reused 0 +Unpacking objects: 100% (44/44), done. +$ cd fake-project/git_submodule/ +$ ll +total 0 +``` +![图片](./../../../.vuepress/public/images/GGqVzOx2U9qX6Lgf.png) + +其中有`git_submodule`目录,不过是空的。此时必须运行两个命令:`git submodule init`用来初始化本地配置文件,而`git submodule update`则从该项目中抓取所有数据并检出父项目中列出的合适的提交。 + +```shell +$ git submodule init +Submodule 'git_submodule' (https://gitee.com/willcoder/git_submodule.git) registered for path 'git_submodule' +$ git submodule update +Cloning into 'G:/test2/fake-project/git_submodule'... +Submodule path 'git_submodule': checked out '0c7ce502e3c47b30e02e08c1ff015660ff3bed45' +``` +现在`git_submodule`子目录是处在和之前提交时相同的状态了。 +不过还有更简单一点的方式。 如果给`git clone`命令传递`--recurse-submodules`选项,它就会自动初始化并更新仓库中的每一个子模块, 包括可能存在的嵌套子模块。 + +```shell +$ git clone --recurse-submodules https://gitee.com/willcoder/fake-project.git +Cloning into 'fake-project'... +remote: Enumerating objects: 44, done. +remote: Counting objects: 100% (44/44), done. +remote: Compressing objects: 100% (31/31), done. +remote: Total 44 (delta 10), reused 0 (delta 0), pack-reused 0 +Unpacking objects: 100% (44/44), done. +Submodule 'git_submodule' (https://gitee.com/willcoder/git_submodule.git) registered for path 'git_submodule' +Cloning into 'G:/test2/fake-project/git_submodule'... +remote: Enumerating objects: 3, done. +remote: Counting objects: 100% (3/3), done. +remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 +Submodule path 'git_submodule': checked out '0c7ce502e3c47b30e02e08c1ff015660ff3bed45' +``` +如果你已经克隆了项目但忘记了`--recurse-submodules`,那么可以运行`git submodule update --init`将`git submodule init`和`git submodule update`合并成一步。如果还要初始化、抓取并检出任何嵌套的子模块, 请使用简明的`git submodule update --init --recursive`。 +## 在包含子模块的项目上工作 + +现在我们有一份包含子模块的项目副本,我们将会同时在主项目和子模块项目上与队员协作。 + +### **从子模块的远端拉取上游修改** + +在项目中使用子模块的最简模型,就是只使用子项目并不时地获取更新,而并不在你的检出中进行任何更改。 我们来看一个简单的例子。 + +如果想要在子模块中查看新工作,可以进入到目录中运行`git fetch`与`git merge`,合并上游分支来更新本地代码。 + +```shell +$ git fetch +remote: Enumerating objects: 5, done. +remote: Counting objects: 100% (5/5), done. +remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 +Unpacking objects: 100% (3/3), done. +From https://gitee.com/willcoder/git_submodule +   0c7ce50..a5cbd40  master     -> origin/master +$ git merge origin/master +Updating 0c7ce50..a5cbd40 +Fast-forward + my_submodule.txt | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) +``` +如果你现在返回到主项目并运行`git diff --submodule`,就会看到子模块被更新的同时获得了一个包含新添加提交的列表。 如果你不想每次运行`git diff`时都输入`--submodle`,那么可以将`diff.submodule`设置为 “log” 来将其作为默认行为。 +```shell +$ git config --global diff.submodule log +$ git diff +Submodule git_submodule 0c7ce50..a5cbd40: +  > update my_submodule.txt. +``` +如果在此时提交,那么你会将子模块锁定为其他人更新时的新代码。 +如果你不想在子目录中手动抓取与合并,那么还有种更容易的方式。 运行`git submodule update --remote`,Git 将会进入子模块然后抓取并更新。 + +```shell +$ git submodule update --remote git_submodule +remote: Enumerating objects: 5, done. +remote: Counting objects: 100% (5/5), done. +remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 +Unpacking objects: 100% (3/3), done. +From https://gitee.com/willcoder/git_submodule +   a5cbd40..a7597da  master     -> origin/master +Submodule path 'git_submodule': checked out 'a7597dad4a94bec59bd44d36e53939add9735ada' +``` +此命令默认会假定你想要更新并检出子模块仓库的`master`分支。 不过你也可以设置为想要的其他分支。 例如,你想要子模块跟踪仓库的 “stable” 分支,那么既可以在`.gitmodules`文件中设置 (这样其他人也可以跟踪它),也可以只在本地的`.git/config`文件中设置。 让我们在`.gitmodules`文件中设置它: +```shell +$ git config -f .gitmodules submodule.git_submodule.branch stable +$ git submodule update --remote +remote: Enumerating objects: 5, done. +remote: Counting objects: 100% (5/5), done. +remote: Compressing objects: 100% (2/2), done. +remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 +Unpacking objects: 100% (3/3), done. +From https://gitee.com/willcoder/git_submodule + * [new branch]      stable     -> origin/stable +Submodule path 'git_submodule': checked out 'b2f53efebee60cf5b2092f911bf170e338c3acd1' +``` +如果不用`-f .gitmodules`选项,那么它只会为你做修改。但是在仓库中保留跟踪信息更有意义一些,因为其他人也可以得到同样的效果。 +这时我们运行`git status`,Git 会显示子模块中有“新提交”。 + +```shell +$ git status +On branch master +Your branch is up to date with 'origin/master'. +Changes not staged for commit: +  (use "git add ..." to update what will be committed) +  (use "git checkout -- ..." to discard changes in working directory) +        modified:   .gitmodules +        modified:   git_submodule (new commits) +no changes added to commit (use "git add" and/or "git commit -a") +``` +如果你设置了配置选项`status.submodulesummary`,Git 也会显示你的子模块的更改摘要: +```shell +$ git config status.submodulesummary 1 +$ git status +On branch master +Your branch is up to date with 'origin/master'. +Changes not staged for commit: +  (use "git add ..." to update what will be committed) +  (use "git checkout -- ..." to discard changes in working directory) +        modified:   .gitmodules +        modified:   git_submodule (new commits) +Submodules changed but not updated: +* git_submodule 0c7ce50...b2f53ef (3): +  > update my_submodule.txt. +no changes added to commit (use "git add" and/or "git commit -a") +``` +这时如果运行`git diff`,可以看到我们修改了 .gitmodules 文件,同时还有几个已拉取的提交需要提交到我们自己的子模块项目中。 +```shell +$ git diff +warning: LF will be replaced by CRLF in .gitmodules. +The file will have its original line endings in your working directory. +diff --git a/.gitmodules b/.gitmodules +index 7345b56..a36a136 100644 +--- a/.gitmodules ++++ b/.gitmodules +@@ -1,3 +1,6 @@ + [submodule "git_submodule"] +        path = git_submodule +        url = https://gitee.com/willcoder/git_submodule.git ++       branch = stable +``` +这非常有趣,因为我们可以直接看到将要提交到子模块中的提交日志。 提交之后,你也可以运行`git log -p`查看这个信息。 +```shell +$ git log -p --submodule +commit 873826777c305398b44496d0fb2c3408fece5f50 (HEAD -> master, origin/master, origin/HEAD) +Author: will +Date:   Mon Sep 14 00:05:37 2020 +0800 +    add git_submodules +diff --git a/.gitmodules b/.gitmodules +new file mode 100644 +index 0000000..7345b56 +--- /dev/null ++++ b/.gitmodules +@@ -0,0 +1,3 @@ ++[submodule "git_submodule"] ++       path = git_submodule ++       url = https://gitee.com/willcoder/git_submodule.git +Submodule git_submodule 0000000...0c7ce50 (new submodule) +``` +当运行`git submodule update --remote`时,Git 默认会尝试更新**所有**子模块, 所以如果有很多子模块的话,你可以传递想要更新的子模块的名字。 +**从项目远端拉取上游更改** + +默认情况下,`git pull`命令会递归地抓取子模块的更改。 然而,它不会**更新**子模块。所以需要运行`git submodule update --init --recursive`。 + +如果你想自动化此过程,那么可以为`git pull`命令添加`--recurse-submodules`选项(从 Git 2.14 开始)。 这会让 Git 在拉取后运行`git submodule update`,将子模块置为正确的状态。 此外,如果你想让 Git 总是以`--recurse-submodules`拉取,可以将配置选项`submodule.recurse`设置为`true`(从 Git 2.15 开始可用于`git pull`)。此选项会让 Git 为所有支持`--recurse-submodules`的命令使用该选项(除`clone`以外)。 + +在为父级项目拉取更新时,还会出现一种特殊的情况:在你拉取的提交中, 可能`.gitmodules`文件中记录的子模块的 URL 发生了改变。 比如,若子模块项目改变了它的托管平台,就会发生这种情况。 此时,若父级项目引用的子模块提交不在仓库中本地配置的子模块远端上,那么执行`git pull --recurse-submodules`或`git submodule update`就会失败。 为了补救,`git submodule sync`命令需要: + +```shell +# 将新的 URL 复制到本地配置中 +$ git submodule sync --recursive +# 从新 URL 更新子模块 +$ git submodule update --init --recursive +``` +### **在子模块上工作** +现在我们将通过一个例子来演示如何在子模块与主项目中同时做修改,以及如何同时提交与发布那些修改。 + +为了将子模块设置得更容易进入并修改,你需要做两件事。 首先,进入每个子模块并检出其相应的工作分支。 接着,若你做了更改就需要告诉 Git 它该做什么,然后运行`git submodule update --remote`来从上游拉取新工作。 你可以选择将它们合并到你的本地工作中,也可以尝试将你的工作变基到新的更改上。 + +首先,让我们进入子模块目录然后检出一个分支。 + +```shell +$ cd git_submodule/ +$ git checkout -b stable +Switched to a new branch 'stable' +``` +然后尝试用 “merge” 选项来更新子模块。 为了手动指定它,我们只需给`update`添加`--merge`选项即可。 这时我们将会看到服务器上的这个子模块有一个改动并且它被合并了进来。 +```shell +$ cd .. +$ git submodule update --remote --merge +remote: Enumerating objects: 11, done. +remote: Counting objects: 100% (11/11), done. +remote: Compressing objects: 100% (4/4), done. +remote: Total 9 (delta 0), reused 0 (delta 0), pack-reused 0 +Unpacking objects: 100% (9/9), done. +From https://gitee.com/willcoder/git_submodule +   0c7ce50..a7597da  master     -> origin/master + * [new branch]      stable     -> origin/stable +Updating 0c7ce50..a7597da +Fast-forward + my_submodule.txt | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) +Submodule path 'git_submodule': merged in 'a7597dad4a94bec59bd44d36e53939add9735ada' +``` +如果我们进入子模块目录,可以发现新的改动已经合并入本地`stable`分支。 现在让我们看看当我们对库做一些本地的改动而同时其他人推送另外一个修改到上游时会发生什么。 +```shell +$ cd git_submodule/ +$ vi my_submodule.txt +$ git commit -am 'my push test' +[stable 926118a] my push test + 1 file changed, 5 insertions(+), 1 deletion(-) +``` +如果我们现在更新子模块,就会看到当我们在本地做了更改时上游也有一个改动,我们需要将它并入本地。 +```shell +$ cd .. +$ git submodule update --remote --rebase +Current branch stable is up to date. +Submodule path 'git_submodule': rebased into 'a7597dad4a94bec59bd44d36e53939add9735ada' +``` +如果你忘记`--rebase`或`--merge`,Git 会将子模块更新为服务器上的状态。并且会将项目重置为一个游离的 HEAD 状态。 +```shell +$ git submodule update --remote +Submodule path 'git_submodule': checked out 'a7597dad4a94bec59bd44d36e53939add9735ada' +``` +即便这真的发生了也不要紧,你只需回到目录中再次检出你的分支(即还包含着你的工作的分支)然后手动地合并或变基`origin/stable`(或任何一个你想要的远程分支)就行了。 +如果你没有提交子模块的改动,那么运行一个子模块更新也不会出现问题,此时 Git 会只抓取更改而并不会覆盖子模块目录中未保存的工作。 + +如果你做了一些与上游改动冲突的改动,当运行更新时 Git 会让你知道。 + +```shell +$ git submodule update --remote --merge +Auto-merging my_submodule.txt +CONFLICT (content): Merge conflict in my_submodule.txt +Recorded preimage for 'my_submodule.txt' +Automatic merge failed; fix conflicts and then commit the result. +Unable to merge 'dd63fb4c96cc5fcd1af3595a995cb5e0b9ab6495' in submodule path 'git_submodule' +``` +你可以进入子模块目录中然后就像平时那样修复冲突。 +### **发布子模块改动** + +现在我们的子模块目录中有一些改动。 其中有一些是我们通过更新从上游引入的,而另一些是本地生成的,由于我们还没有推送它们,所以对任何其他人都不可用。 + +```shell +$ git diff +diff --git a/.gitmodules b/.gitmodules +index 7345b56..a36a136 100644 +--- a/.gitmodules ++++ b/.gitmodules +@@ -1,3 +1,6 @@ + [submodule "git_submodule"] +        path = git_submodule +        url = https://gitee.com/willcoder/git_submodule.git ++       branch = stable +Submodule git_submodule 0c7ce50..0b924ac: +  > conflict ok +  > test conflict +  > update my_submodule.txt. +  > update my_submodule.txt. +``` +如果我们只推送主项目而不推送子模块,检出我们项目的人可能会出现错误,为了确保这不会发生,可以让 Git 在推送到主项目前检查所有子模块是否已推送。 +`git push`命令接受可以设置为 “check” 或 “on-demand” 的`--recurse-submodules`参数。 如果任何提交的子模块改动没有推送那么 “check” 选项会直接使`push`操作失败。 + +```shell +$ git push --recurse-submodules=check +The following submodule paths contain changes that can +not be found on any remote: + git_submodule +Please try + git push --recurse-submodules=on-demand +or cd to the path and use + git push +to push them to a remote. +``` +它给我们了一些建议,指导接下来该如何做。 最简单的选项是进入每一个子模块中然后手动推送到远程仓库,确保它们能被外部访问到,之后再次尝试这次推送。 如果你想要对所有推送都执行检查,那么可以通过设置`git config push.recurseSubmodules check`让它成为默认行为。 +另一个选项是使用 “on-demand” 值,它会尝试为你这样做。 + +```shell +$ git push --recurse-submodules=on-demand +``` +Git 进入到子模块中然后在推送主项目前推送了它。 如果那个子模块因为某些原因推送失败,主项目也会推送失败。 你也可以通过设置`git config push.recurseSubmodules on-demand`让它成为默认行为。 + +### **合并子模块改动** + +如果你和其他人同时改动了一个子模块引用,那么可能会遇到一些问题。 + +如果一个提交是另一个的直接祖先(一个快进式合并),那么 Git 会简单地选择之后的提交来合并,这样没什么问题。 + +不过,Git 甚至不会尝试去进行一次简单的合并。 如果子模块提交已经分叉且需要合并,那么你会收到冲突的提示。 + +```shell +CONFLICT (content): Merge conflict in my_submodule.txt +Recorded preimage for 'my_submodule.txt' +Automatic merge failed; fix conflicts and then commit the result. +``` +所以本质上 Git 在这里指出了子模块历史中的两个分支记录点已经分叉并且需要合并。 它将其解释为 “merge following commits not found” (未找到接下来需要合并的提交),虽然这有点令人困惑,不过之后我们会解释为什么是这样。 +为了解决这个问题,你需要弄清楚子模块应该处于哪种状态。 奇怪的是,Git 并不会给你多少能帮你摆脱困境的信息,甚至连两边提交历史中的 SHA-1 值都没有。 幸运的是,这很容易解决。 如果你运行`git diff`,就会得到试图合并的两个分支中记录的提交的 SHA-1 值。 + +1. 首先解决冲突 +2. 然后返回到主项目目录中 +3. 再次检查 SHA-1 值 +4. 解决冲突的子模块记录 +5. 提交我们的合并 + +有趣的是,Git 还能处理另一种情况。 如果子模块目录中存在着这样一个合并提交,它的历史中包含了的**两边**的提交,那么 Git 会建议你将它作为一个可行的解决方案。 它看到有人在子模块项目的某一点上合并了包含这两次提交的分支,所以你可能想要那个。 + +如果它找到了一个可以接受的合并提交,你会看到类似下面的信息: + +```shell +$ git merge origin/master +warning: Failed to merge submodule git_submodule(not fast-forward) +Found a possible merge resolution for the submodule: + 9fd905e5d7f45a0d4cbc43d1ee550f16a30e825a: > merged our changes +If this is correct simply add it to the index for example +by using: + git update-index --cacheinfo 160000 9fd905e5d7f45a0d4cbc43d1ee550f16a30e825a "git_submodule" +which will accept this suggestion. +Auto-merging git_submodule +CONFLICT (submodule): Merge conflict in git_submodule +Automatic merge failed; fix conflicts and then commit the result. +``` +Git 建议的命令是更新索引,就像你运行了`git add`那样,这样会清除冲突然后提交。 不过你可能不应该这样做。你可以轻松地进入子模块目录,查看差异是什么,快进到这次提交,恰当地测试,然后提交它。 +```shell +$ cd git_submodule/ +$ git merge 9fd905e +Updating eb41d76..9fd905e +Fast-forward +$ cd .. +$ git add git_submodule +$ git commit -am 'Fast forwarded to a common submodule child' +``` +这些命令完成了同一件事,但是通过这种方式你至少可以验证工作是否有效,以及当你在完成时可以确保子模块目录中有你的代码。 +## **其他** + +### **子模块遍历** + +有一个`foreach`子模块命令,它能在每一个子模块中运行任意命令。 如果项目中包含了大量子模块,这会非常有用。 + +```shell +$ git submodule foreach 'git stash' +Entering 'git_submodule' +Saved working directory and index state WIP on (no branch): 0b924ac conflict ok +``` +### **有用的别名** + +你可能想为其中一些命令设置别名,因为它们可能会非常长而你又不能设置选项作为它们的默认选项。 + +```shell +$ git config alias.sdiff '!'"git diff && git submodule foreach 'git diff'" +$ git config alias.spush 'push --recurse-submodules=on-demand' +$ git config alias.supdate 'submodule update --remote --merge' +``` +这样当你想要更新子模块时可以简单地运行`git supdate`,或`git spush`检查子模块依赖后推送。 \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/11. \346\211\223\345\214\205.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/11. \346\211\223\345\214\205.md" new file mode 100644 index 0000000..382cd51 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/11. \346\211\223\345\214\205.md" @@ -0,0 +1,89 @@ +--- +title: 打包 +--- + +`git bundle` + +虽然我们已经了解了网络传输 Git 数据的常用方法(如 HTTP,SSH 等),但还有另外一种不太常见却又十分有用的方式。 + +Git 可以将它的数据“打包”到一个文件中。 这在许多场景中都很有用。 有可能你的网络中断了,但你又希望将你的提交传给你的合作者。 可能你不在办公网中并且出于安全考虑没有给你接入内网的权限。 可能你的无线、有线网卡坏掉了。 可能你现在没有共享服务器的权限,你又希望通过邮件将更新发送给别人, 却不希望通过`format-patch`的方式传输 40 个提交。 + +这些情况下`git bundle`就会很有用。`bundle`命令会将`git push`命令所传输的所有内容打包成一个二进制文件, 你可以将这个文件通过邮件或者闪存传给其他人,然后解包到其他的仓库中。 + +来看看一个简单的例子。 假设你有一个包含两个提交的仓库: + +如果你想把这个仓库发送给其他人但你没有其他仓库的权限,或者就是懒得新建一个仓库, 你就可以用`git bundle create`命令来打包。 + +```shell +$ git bundle create git_submodle.bundle HEAD master +Enumerating objects: 12, done. +Counting objects: 100% (12/12), done. +Delta compression using up to 8 threads. +Compressing objects: 100% (5/5), done. +Writing objects: 100% (12/12), 1.03 KiB | 529.00 KiB/s, done. +Total 12 (delta 0), reused 0 (delta 0) +``` +然后你就会有一个bundle文件,该文件包含了所有重建该仓库`master`分支所需的数据。 在使用`bundle`命令时,你需要列出所有你希望打包的引用或者提交的区间。 如果你希望这个仓库可以在别处被克隆,你应该像例子中那样增加一个 HEAD 引用。 +你可以将这个`git_submodle.bundle`文件通过邮件或者U盘传给别人。 + +另一方面,假设别人传给你一个`git_submodle.bundle`文件并希望你在这个项目上工作。 你可以从这个二进制文件中克隆出一个目录,就像从一个 URL 克隆一样。 + +```shell +$ git clone git_submodle.bundle +Cloning into 'git_submodle'... +Receiving objects: 100% (12/12), done. +$ cd git_submodle +$ git log --oneline +0328eb8 (HEAD -> master, origin/master, origin/HEAD) update my_submodule.txt. +a7597da update my_submodule.txt. +a5cbd40 update my_submodule.txt. +0c7ce50 init submodule +``` +如果你在打包时没有包含 HEAD 引用,你还需要在命令后指定一个`-b master`或者其他被引入的分支, 否则 Git 不知道应该检出哪一个分支。 +现在假设你提交了修订,并且要用邮件或者U盘将新的提交放在一个包里传回去。我们可以像上面那样将整个仓库打包,但最好仅仅打包变更的部分。 + +我们可以用`git bundle create`命令,加上我们想用的文件名,以及要打包的提交区间。 + +```shell +$ git bundle create commits.bundle master ^9a466c5 +``` +现在在我们的目录下会有一个`commits.bundle`文件。 如果我们把这个文件发送给我们的合作者,她可以将这个文件导入到原始的仓库中, 即使在这期间已经有其他的工作提交到这个仓库中。 +当她拿到这个包时,她可以在导入到仓库之前查看这个包里包含了什么内容。`bundle verify`命令可以检查这个文件是否是一个合法的 Git 包,是否拥有共同的祖先来导入。 + +```shell +$ git bundle verify ../commits.bundle +The bundle contains 1 ref +71b84daaf49abed142a373b6e5c59a22dc6560dc refs/heads/master +The bundle requires these 1 ref +9a466c572fe88b195efd356c3f2bbeccdb504102 second commit +../commits.bundle is okay +``` +如果打包工具仅仅把最后两个提交打包,而不是三个,原始的仓库是无法导入这个包的, 因为这个包缺失了必要的提交记录。这时候`verify`的输出类似: +```shell +$ git bundle verify ../commits-bad.bundle +error: Repository lacks these prerequisite commits: +error: 7011d3d8fc200abe0ad561c011c3852a4b7bbe95 third commit - second repo +``` +而我们的第一个包是合法的,所以我们可以从这个包里提取出提交。 如果你想查看这边包里可以导入哪些分支,同样有一个命令可以列出这些顶端: +```shell +$ git bundle list-heads ../commits.bundle +71b84daaf49abed142a373b6e5c59a22dc6560dc refs/heads/master +``` +`verify`子命令同样可以告诉你有哪些顶端。 该功能的目的是查看哪些是可以被拉入的,所以你可以使用`fetch`或者`pull`命令从包中导入提交。 这里我们要从包中取出`master`分支到我们仓库中的**other-master**分支: +```shell +$ git fetch ../commits.bundle master:other-master +From ../commits.bundle + * [new branch] master -> other-master +``` +可以看到我们已经将提交导入到`other-master`分支,以及在这期间我们自己在`master`分支上的提交。 +```shell +$ git log --oneline --decorate --graph --all +* 8255d41 (HEAD, master) third commit - first repo +| * 71b84da (other-master) last commit - second repo +| * c99cf5b fourth commit - second repo +| * 7011d3d third commit - second repo +|/ +* 9a466c5 second commit +* b1ec324 first commit +``` +因此,当你在没有合适的网络或者可共享仓库的情况下,`git bundle`很适合用于共享或者网络类型的操作。 \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/12. \346\233\277\346\215\242.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/12. \346\233\277\346\215\242.md" new file mode 100644 index 0000000..7930572 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/12. \346\233\277\346\215\242.md" @@ -0,0 +1,101 @@ +--- +title: 替换 +--- + +`git replace` + +我们之前强调过,Git 对象数据库中的对象是不可改变的, 然而 Git 提供了一种有趣的方式来用其他对象**假装**替换数据库中的 Git 对象。 + +`replace`命令可以让你在 Git 中指定**某个对象**并告诉 Git:“每次遇到这个 Git 对象时,假装它是**其它对象**”。 在你用一个不同的提交替换历史中的一个提交而不想以`git filter-branch`之类的方式重建完整的历史时,这会非常有用。 + +让我们来试试吧。 首先获取一个已经存在的仓库,并将其分成两个仓库,一个是最近的仓库,一个是历史版本的仓库, 然后我们将看到如何在不更改仓库 SHA-1 值的情况下通过`replace`命令来合并他们。 + +```shell +$ git log --oneline +0328eb8 (HEAD -> master, origin/master, origin/HEAD) update my_submodule.txt. +a7597da update my_submodule.txt. +a5cbd40 update my_submodule.txt. +0c7ce50 init submodule +``` +创建历史版本的历史很容易,我们可以只将一个历史中的分支推送到一个新的远程仓库的`master`分支。 +```shell +$ git branch history a5cbd40  +$ git log --oneline --decorate +0328eb8 (HEAD -> master, origin/master, origin/HEAD) update my_submodule.txt. +a7597da (history) update my_submodule.txt. +a5cbd40 update my_submodule.txt. +0c7ce50 init submodule +``` +现在我们可以把这个新的`history`分支推送到我们新仓库的`master`分支: + +```shell +$ git remote add p-h https://gitee.com/willcoder/p-h.git +$ git push p-h history:master +Enumerating objects: 9, done. +Counting objects: 100% (9/9), done. +Delta compression using up to 8 threads. +Compressing objects: 100% (3/3), done. +Writing objects: 100% (9/9), 773 bytes | 773.00 KiB/s, done. +Total 9 (delta 0), reused 9 (delta 0) +remote: Powered by GITEE.COM [GNK-5.0] +To https://gitee.com/willcoder/p-h.git + * [new branch]      history -> master +``` +这样一来,我们的历史版本就发布了。 稍难的部分则是删减我们最近的历史来让它变得更小。 我们需要一个重叠以便于用一个相等的提交来替换另一个提交,这样一来,我们将截断最后的提交。 +在这种情况下,创建一个能够指导扩展历史的基础提交是很有用的。 这样一来,如果其他的开发者想要修改第一次提交或者其他操作时就知道要做些什么,因此,接下来我们要做的是用命令创建一个最初的提交对象,然后将最后的提交变基到它的上面。 + +为了这么做,我们需要选择一个点去拆分,对于我们而言是第三个提交(SHA 是`a5cbd40`)。 因此我们的提交将基于此提交树。我们可以使用`commit-tree`命令来创建基础提交, 这样我们就有了一个树,并返回一个全新的、无父节点的 SHA-1 提交对象。 + +```shell +$  echo 'get history from blah blah blah' | git commit-tree a5cbd40^{tree} +b06ec96de666b38d61470a566634707b3033a87a +``` +现在我们已经有一个基础提交了,我们可以通过`git rebase --onto`命令来将剩余的历史变基到基础提交之上。`--onto`参数是刚才`commit-tree`命令返回的 SHA-1 值,变基点会成为第二个提交(我们想留下的第一个提交的父提交,`a5cbd40`): + +```shell +$ git rebase --onto b06ec9 a5cbd40 +First, rewinding head to replay your work on top of it... +Applying: update my_submodule.txt. +Applying: update my_submodule.txt. +``` +我们已经用基础提交重写了最近的历史,基础提交包括如何重新组成整个历史的说明。 我们可以将新历史推送到新项目中,当其他人克隆这个仓库时,他们仅能看到最近两次提交以及一个包含上述说明的基础提交。 + +现在我们将以想获得整个历史的人的身份来初次克隆这个项目。 在克隆这个截断后的仓库后为了得到历史数据,需要添加第二个远程的历史版本库并对其做获取操作: + +```shell +$ git clone https://gitee.com/willcoder/git_submodule.git +Cloning into 'git_submodule'... +remote: Enumerating objects: 21, done. +remote: Counting objects: 100% (21/21), done. +remote: Compressing objects: 100% (11/11), done. +remote: Total 21 (delta 3), reused 0 (delta 0), pack-reused 0 +Unpacking objects: 100% (21/21), done. +$ cd git_submodule/ +$ git remote add p-h https://gitee.com/willcoder/p-h.git +$ git fetch p-h +From https://gitee.com/willcoder/p-h + * [new branch]      master     -> p-h/master +``` +现在,协作者在`master`分支中拥有他们最近的提交并且在`p-h/master`分支中拥有过去的提交。 +```shell +$ git log --oneline master +eea6ff3 (master) update my_submodule.txt. +0f808ad update my_submodule.txt. +b06ec96 get history from blah blah blah +$ git log --oneline p-h/master +a7597da (p-h/master) update my_submodule.txt. +a5cbd40 update my_submodule.txt. +0c7ce50 init submodule +``` +为了合并它们,你可以使用`git replace`命令加上你想替换的提交信息来进行替换。 这样一来,我们就可以将`master`分支中的第四个提交替换为`p-/master`分支中的“第四个”提交。 +```shell +$ git replace 0f808ad a7597da +``` +现在,查看`master`分支中的历史信息,显示如下: +```shell +$ git log --oneline master +eea6ff3 (master) update my_submodule.txt. +0f808ad (replaced) update my_submodule.txt. +a5cbd40 update my_submodule.txt. +0c7ce50 init submodule +``` \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/13. \345\207\255\350\257\201\345\255\230\345\202\250.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/13. \345\207\255\350\257\201\345\255\230\345\202\250.md" new file mode 100644 index 0000000..3d071b7 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/13. \345\207\255\350\257\201\345\255\230\345\202\250.md" @@ -0,0 +1,79 @@ +--- +title: 凭证存储 +--- + +`git credential` + +## 凭证存储设置 + +如果你使用的是 SSH 方式连接远端,并且设置了一个没有口令的密钥,这样就可以在不输入用户名和密码的情况下安全地传输数据。 然而,这对 HTTP 协议来说是不可能的 —— 每一个连接都是需要用户名和密码的,但我们使用时,并没有每次都被要求输入凭证,原因就是Git拥有凭证系统来处理这个事情。 + +* 默认所有都不缓存。 每一次连接都会询问你的用户名和密码。 +* “cache” 模式会将凭证存放在内存中一段时间。 密码永远不会被存储在磁盘中,并且在15分钟后从内存中清除。 +* “store” 模式会将凭证用明文的形式存放在磁盘中,并且永不过期。 这意味着除非你修改了你在 Git 服务器上的密码,否则你永远不需要再次输入你的凭证信息。 这种方式的缺点是你的密码是用明文的方式存放在你的 home 目录下。 +* 如果你使用的是 Mac,Git 还有一种 “osxkeychain” 模式,它会将凭证缓存到你系统用户的钥匙串中。 这种方式将凭证存放在磁盘中,并且永不过期,但是是被加密的,这种加密方式与存放 HTTPS 凭证以及 Safari 的自动填写是相同的。 +* 如果你使用的是 Windows,你可以安装一个叫做 “Git Credential Manager for Windows” 的辅助工具。 这和上面说的 “osxkeychain” 十分类似,但是是使用 Windows Credential Store 来控制敏感信息。 可以在[https://github.com/Microsoft/Git-Credential-Manager-for-Windows](https://github.com/Microsoft/Git-Credential-Manager-for-Windows)下载。 +* 你可以设置 Git 的配置来选择上述的一种方式 + +```shell +$ git config --global credential.helper cache +``` +查看凭证缓存配置: +```shell +git config --list | grep credential +``` +Mac,默认会输出: +```shell +include.path=.gitcredential +credential.helper=osxkeychain +``` +对应的也就是Mac的“钥匙串”系统。 +Windows安装GitGUI后,默认会输出: + +```shell +credential.helper=manager +``` + +Git 甚至允许你配置多个辅助工具。 当查找特定服务器的凭证时,Git 会按顺序查询,并且在找到第一个回答时停止查询。 当保存凭证时,Git 会将用户名和密码发送给**所有**配置列表中的辅助工具,它们会按自己的方式处理用户名和密码。 如果你在闪存上有一个凭证文件,但又希望在该闪存被拔出的情况下使用内存缓存来保存用户名密码,`.gitconfig`配置文件如下: + +```shell +[credential] +    helper = store --file G:/test2/fake-project/.git-credentials +    helper = cache --timeout 30000 +``` +![图片](./../../../.vuepress/public/images/WTawtBgQ4ru6U5Fc.png) + +## 底层实现 + +Git 凭证辅助工具系统的命令是`git credential`,这个命令接收一个参数,并通过标准输入获取更多的参数。 + +举一个例子更容易理解。 我们假设已经配置好一个凭证辅助工具,这个辅助工具保存了`mygithost`的凭证信息。 下面是一个使用 “fill” 命令的会话,当 Git 尝试寻找一个服务器的凭证时就会被调用。 + +```shell +$ git credential fill (1) +protocol=https (2) +host=mygithost +(3) +protocol=https (4) +host=mygithost +username=bob +password=s3cre7 +$ git credential fill (5) +protocol=https +host=unknownhost +Username for 'https://unknownhost': bob +Password for 'https://bob@unknownhost': +protocol=https +host=unknownhost +username=bob +password=s3cre7 +``` +1. 这是开始交互的命令。 +2. Git-credential 接下来会等待标准输入。 我们提供我们所知道的信息:协议和主机名。 +3. 一个空行代表输入已经完成,凭证系统应该输出它所知道的信息。 +4. 接下来由 Git-credential 接管,并且将找到的信息打印到标准输出。 +5. 如果没有找到对应的凭证,Git 会询问用户的用户名和密码,我们将这些信息输入到在标准输出的地方(这个例子中是同一个控制台)。 + +简单来说:就是每次需要用户名密码的时候,都会调用 Git-credential 命令,它会先向辅助程序获取用户密码,如果成功,就用这个获得的用户密码去访问远程仓库。如果获取不到,就会让用户输入一次,并尝试保存下来。 + +因此我们第一次使用的时候,会被提示输入用户名密码,就是因为git的内部调用了这个命令。 \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/2. \344\272\244\344\272\222\345\274\217\346\232\202\345\255\230.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/2. \344\272\244\344\272\222\345\274\217\346\232\202\345\255\230.md" new file mode 100644 index 0000000..c54e658 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/2. \344\272\244\344\272\222\345\274\217\346\232\202\345\255\230.md" @@ -0,0 +1,109 @@ +--- +title: 交互式暂存 +--- + +## 共同暂存 + +当希望替换能替换为多个提交而不是替代在一起成为一个提交,几个临时的 Git 命令可以帮助将文件的特定部分组合成提交。 + +如果运行 git add 时使用 -i 或者 --interactive 选项,Git 将会进入一个交互终端模式,显示类似下面的东西: + +```shell +$ git add -i +staged unstaged path +1: +1/-0 nothing 12.txt +2: +0/-0 nothing 新建文本文档.txt +*** Commands *** +1: status 2: update 3: revert 4: add untracked +5: patch 6: diff 7: quit 8: help! + +``` +在这块区域后是“Commands”命令区域。 在这里你可以做一些工作,包括暂存文件、取消暂存文件、暂存文件的一部分、添加未被追踪的文件、显示暂存内容的区别。 +## 暂存与取消暂存条件 + +如果在 What now> 将来后键入u 或2(更新),它会问你想要暂存其中文件, + +输入要暂存文件前的数字,例如: + +```shell +*** Commands *** +1: status 2: update 3: revert 4: add untracked +5: patch 6: diff 7: quit 8: help +What now> u +staged unstaged path +1: +1/-0 +5/-1 新建文本文档.txt +Update>> 1 +staged unstaged path +* 1: +1/-0 +5/-1 新建文本文档.txt +Update>> +``` +文件前面的 *,意味着文件将会被暂存 +如果 Update>> 提示符不输入回车,Git 将会暂存之前选择的文件,意思是,按了回车才是将自己的文件暂存,否则将暂存之前的文件 + +```shell +Update>> 1 +staged unstaged path +* 1: +1/-0 +7/-1 新建文本文档.txt +Update>> +updated 1 path +``` +新建文本文档.txt 还没被暂存 +如果这时想要取消暂存的文件,使用。r或3(撤消)选项: + +```shell +*** Commands *** +1: status 2: update 3: revert 4: add untracked +5: patch 6: diff 7: quit 8: help +What now> r +staged unstaged path +1: +1/-0 nothing 12.txt +2: +7/-0 nothing 新建文本文档.txt +Revert>> 1 +staged unstaged path +* 1: +1/-0 nothing 12.txt +2: +7/-0 nothing 新建文本文档.txt +Revert>> +``` +如果要查看已暂存内容的区别,可以使用 d 或6(区别)命令。它会显示暂存文件的一个列表,可以从中选择想要查看的暂存区别。这跟你在命令行指定 git diff --cached 非常相似: +```shell +*** Commands *** +1: status 2: update 3: revert 4: add untracked +5: patch 6: diff 7: quit 8: help +What now> d +staged unstaged path +1: +1/-0 nothing 12.txt +2: +7/-0 nothing 新建文本文档.txt +Review diff>> 1 +diff --git a/12.txt b/12.txt +new file mode 100644 +index 0000000..509f9ed +--- /dev/null ++++ b/12.txt +@@ -0,0 +1 @@ ++123s12143 +``` +## 暂存补丁 + +Git 暂时存文件的特定部分. + +输入 p 或5(补丁) Git 中会询问你想要部分暂存哪些文件,然后,对已选择文件的每一个部分,它都会一个个地显示文件区别并询问你是否想要暂存他们: + +```shell +\ No newline at end of file ++cdfdsfds\gucdgfafas\ ++faofheaopufa0e-f\ +\ No newline at end of file +Stage this hunk [y,n,q,a,d,e,?]? y +``` +这时有很多选项。输入?显示所有可以使用的命令列表: +```shell +Stage this hunk [y,n,q,a,d,e,?]? ? +y - stage this hunk +n - do not stage this hunk +q - quit; do not stage this hunk or any of the remaining ones +a - stage this hunk and all later hunks in the file +d - do not stage this hunk or any of the later hunks in the file +e - manually edit the current hunk +? - print help +``` +如果你想暂存各个区块,通常你会输入 y 或者 n,但是暂存特定文件里的全部区块链或暂时跳过对一个区块块的处理同样也很有用。 \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/3. \345\202\250\350\227\217\344\270\216\346\270\205\347\220\206.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/3. \345\202\250\350\227\217\344\270\216\346\270\205\347\220\206.md" new file mode 100644 index 0000000..3cc5836 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/3. \345\202\250\350\227\217\344\270\216\346\270\205\347\220\206.md" @@ -0,0 +1,175 @@ +--- +title: 储藏与清理 +--- + +贮藏命令:git stash + +当想要切换分支做别的事,又不想把当前分支做到一半的代码提交时,可以使用贮藏( stash )。 + +贮藏会跟踪文件的修改与暂存的改动,然后将未完成的修改保存到一个栈上,可以在任何时候重新应用这些改动. + +## 贮藏工作 + +实例: + +改动文件后,`git status` + +```shell +$ git status +On branch master +Your branch is up to date with 'origin/master'. +Changes not staged for commit: +  (use "git add ..." to update what will be committed) +  (use "git checkout -- ..." to discard changes in working directory) +        modified:   my_Unfinished_Work.txt +no changes added to commit (use "git add" and/or "git commit -a") +``` +贮藏当前的工作`git stash`或`git stash push` + +```shell +$ git stash +Saved working directory and index state WIP on master: a66ee73 unfinishedwork +``` +再次查看当前状态,现在分支是干净的了。此时,你可以切换分支并在其他地方工作;你的修改被存储在栈上。 + +```shell +$ git status +On branch master +Your branch is up to date with 'origin/master'. +nothing to commit, working tree clean +``` +查看当前贮藏列表:`git stash list` + +```shell +$ git stash list +stash@{0}: WIP on master: a66ee73 unfinishedwork +stash@{1}: WIP on master: 60434ac Subject line (try to keep under 50 characters) +``` +应用贮藏其中的一个工作:`git stash apply`。如果不指定一个贮藏,Git 认为指定的是最近的贮藏 + +```shell +$ git stash apply stash@{0} +On branch master +Your branch is up to date with 'origin/master'. +Changes not staged for commit: +  (use "git add ..." to update what will be committed) +  (use "git checkout -- ..." to discard changes in working directory) +        modified:   my_Unfinished_Work.txt +no changes added to commit (use "git add" and/or "git commit -a") +``` +移除贮藏:`git stash drop` + +```shell +$ git stash drop stash@{1} +Dropped stash@{1} (ae8139183fd57272bf32c1f7eaabda0c2bf99081) +``` +## 贮藏的创意性使用 + +贮藏变种有用且流行的几个选项: + +1.`git stash`命令的`--keep-index`选项:告诉 Git 不仅要贮藏所有已暂存的内容,同时还要将它们保留在索引中。 + +```shell +$ git status -s +M  my_Unfinished_Work2.txt +M  my_Unfinished_Work3.txt +$ git stash --keep-index +Saved working directory and index state WIP on master: a732e98 add work +$ git status -s +M  my_Unfinished_Work2.txt +M  my_Unfinished_Work3.txt +``` +2.`git stash`指定`--inc lude-untracked`或`-u`选项: Git 会贮藏任何未跟踪文件(默认情况下,`git stash`只会贮藏已修改和暂存的已跟踪文件) +```shell +$ git status -s +M  my_Unfinished_Work2.txt +M  my_Unfinished_Work3.txt +?? my_Unfinished_Work4.txt +$ git stash -u +Saved working directory and index state WIP on master: a732e98 add work +$ git status -s +$ +``` +3.`git stash`指定`--patch`标记: Git 不会贮藏所有修改过的任何东西, 但是会交互式地提示哪些改动想要贮藏、哪些改动需要保存在工作目录中。 +```shell +$ git stash --patch +diff --git a/my_Unfinished_Work2.txt b/my_Unfinished_Work2.txt +index e69de29..eaca4b7 100644 +--- a/my_Unfinished_Work2.txt ++++ b/my_Unfinished_Work2.txt +@@ -0,0 +1 @@ ++miss you! +\ No newline at end of file +Stash this hunk [y,n,q,a,d,e,?]? y + +diff --git a/my_Unfinished_Work3.txt b/my_Unfinished_Work3.txt +index e69de29..79a1388 100644 +--- a/my_Unfinished_Work3.txt ++++ b/my_Unfinished_Work3.txt +@@ -0,0 +1 @@ ++hate you! +\ No newline at end of file +Stash this hunk [y,n,q,a,d,e,?]? n + +Saved working directory and index state WIP on master: a732e98 add work +``` +## 从贮藏创建一个分支 + +如果贮藏了一些工作,将它留在那,然后继续在贮藏的分支上工作,在重新应用工作时可能会有问题。 如果应用尝试修改刚刚修改的文件,你会得到一个合并冲突并不得不解决它。 如果想要一个轻松的方式来再次测试贮藏的改动,可以运行`git stash branch `以你指定的分支名创建一个新分支,检出贮藏工作时所在的提交,重新在那应用工作,然后在应用成功后丢弃贮藏: + +```shell +$ git stash branch testchanges +Switched to a new branch 'testchanges' +M       my_Unfinished_Work2.txt +M       my_Unfinished_Work3.txt +A       my_Unfinished_Work4.txt +On branch testchanges +Changes to be committed: +  (use "git reset HEAD ..." to unstage) +        modified:   my_Unfinished_Work2.txt +        modified:   my_Unfinished_Work3.txt +        new file:   my_Unfinished_Work4.txt +Changes not staged for commit: +  (use "git add ..." to update what will be committed) +  (use "git checkout -- ..." to discard changes in working directory) +        modified:   my_Unfinished_Work2.txt +Dropped refs/stash@{0} (69fd89ac16b7bf45163922fbedac81ed6356a842) +``` +这是在新分支轻松恢复贮藏工作并继续工作的一个很不错的途径。 +## 清理工作目录 + +`git clean`命令可用来移除工作目录中以一些工作或文件。 + +但它被设计为从工作目录中移除未被跟踪的文件,是无法找回文件内容的,**需谨慎使用**。较安全的选项是运行`git stash --all`来移除每一个东西并存放在栈中. + +你可以使用`git clean`命令去除冗余文件或者清理工作目录。 使用`git clean -f -d`命令来移除工作目录中所有未追踪的文件以及空的子目录。`-f`意味着“强制(force)”或“确定要移除”,使用它需要 Git 配置变量`clean.requireForce`没有显式设置为`false`。 + +使用`--dry-run`或`-n`选项:**做一次演习**,然后告诉你将要移除什么,即演练一遍即将要做的操作. + +```shell +$ git clean -d -n +Would remove my_Unfinished_Work4.txt +``` +默认情况下,`git clean`命令只会移除没有忽略的未跟踪文件。 任何与`.gitignore`或其他忽略文件中的模式匹配的文件都不会被移除。 如果你也想要移除那些文件,例如为了做一次完全干净的构建而移除所有由构建生成的`.o`文件, 可以给`clean`命令增加一个`-x`选项。 +```shell +$ git status -s + M my_Unfinished_Work2.txt + M my_Unfinished_Work3.txt +?? my_Unfinished_Work4.txt +$ git clean -n -d +Would remove my_Unfinished_Work4.txt +$ git clean -n -d -x +Would remove my_Unfinished_Work4.txt +``` +`git clean`在将`-n`改为`-f`来真正做之前总是先用-n来运行它做双重检验。另一个小心处理过程的方式是使用`-i`或者`interactive`” 标记来运行它。 +交互模式运行 clean 命令: + +```shell +$ git clean -x -i +Would remove the following item: +  my_Unfinished_Work4.txt +*** Commands *** +    1: clean                2: filter by pattern    3: select by numbers +    4: ask each             5: quit                 6: help +What now> +``` diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/4. \347\255\276\347\275\262\345\267\245\344\275\234.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/4. \347\255\276\347\275\262\345\267\245\344\275\234.md" new file mode 100644 index 0000000..b6f614f --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/4. \347\255\276\347\275\262\345\267\245\344\275\234.md" @@ -0,0 +1,202 @@ +--- +title: 签署工作 +--- + +Git 虽然是密码级安全,但它也不是万无一失的。 如果你从网上的其他人那里拿取工作,并且想要验证提交是不是真正地来自于可信来源, Git 提供了几种通过 GPG 来签署和验证工作的方式。 + +## GPG 介绍 + +首先,在开始签名之前你需要先配置 GPG 并安装个人密钥。 + +```shell +$ gpg --list-keys +gpg: /c/Users/Administrator/.gnupg/trustdb.gpg: trustdb created +``` +如果你没安装密钥,可以使用 gpg--gen-key 生成一个. +```shell +$ gpg --gen-key +gpg (GnuPG) 1.4.22; Copyright (C) 2015 Free Software Foundation, Inc. +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +Please select what kind of key you want: + (1) RSA and RSA (default) + (2) DSA and Elgamal + (3) DSA (sign only) + (4) RSA (sign only) +Your selection? +RSA keys may be between 1024 and 4096 bits long. +What keysize do you want? (2048) +Requested keysize is 2048 bits +Please specify how long the key should be valid. + 0 = key does not expire + = key expires in n days + w = key expires in n weeks + m = key expires in n months + y = key expires in n years +Key is valid for? (0) +Key does not expire at all +Is this correct? (y/N) y +You need a user ID to identify your key; the software constructs the user ID +from the Real Name, Comment and Email Address in this form: + "Heinrich Heine (Der Dichter) " +Real name: will +Name must be at least 5 characters long +Real name: will.wang +Email address: willcoder@example.com +Comment: will +You selected this USER-ID: + "will.wang (will) " +Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o +You need a Passphrase to protect your secret key. +We need to generate a lot of random bytes. It is a good idea to perform +some other action (type on the keyboard, move the mouse, utilize the +disks) during the prime generation; this gives the random number +generator a better chance to gain enough entropy. +..+++++ +..+++++ +We need to generate a lot of random bytes. It is a good idea to perform +some other action (type on the keyboard, move the mouse, utilize the +disks) during the prime generation; this gives the random number +generator a better chance to gain enough entropy. +.........+++++ +..........+++++ +gpg: key AF53EA1B marked as ultimately trusted +public and secret key created and signed. +gpg: checking the trustdb +gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model +gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u +pub 2048R/AF53EA1B 2020-09-02 + Key fingerprint = 62A1 4017 33B5 2A2B 7223 6CC6 9EEE 8AE9 AF53 EA1B +uid will.wang (will) +sub 2048R/4188B8D3 20 +``` +一旦你有一个可以签署的私钥,可以通过设置 Git 的 user.signingkey 选项来签署。 +```shell +$ git config --global user.signingkey 0A46826A +``` +现在 Git 默认使用你的密钥来签署标签与提交。 +## 签署标签 + +若已设置好一个 GPG 私钥,可使用它来签署新的标签.所需要做的只是使用 -s 代替 -a 即可: + +```shell +$ git tag -s v1.5 -m 'my signed 1.5 tag' +You need a passphrase to unlock the secret key for +user: "will.wang (will) " +2048-bit RSA key, ID AF53EA1B, created 2020-09-02 +``` +如果在那个标签上运行 git show,会看到你的 GPG 签名附属在后面: +```shell +$ git show v1.5 +tag v1.5 +Tagger: will +Date:   Mon Sep 2 22:58:56 2020 +0800 +my signed 1.5 tag +-----BEGIN PGP SIGNATURE----- +iQEcBAABAgAGBQJfVkqwAAoJEJ7uiumvU+ob6QcH/inTffFD8u6SW0HpdqS0uXPZ +AfjAiYYyHpB9u2/dNS0Z/VDRTq0pHpeG6PMqMirMOQlwPT6lnnHjN5ciI04zQ0Ex +IinPZ9VvleO9/7WxoLPCwZLRGhzGP12F6FMNgMvB9+Fv2UZqb0TESwkJahpthyRV +Pdao7Lo1BqmG9WfkrdQm4S8nP2QyuyWDJQlTjuPKJlRZKeSCU+wPP7aFy7yvnJn1 +BvIPBUvjrqPKZTcJF18MJtZZaHTBoDfMoSZS6Z6qgJBmGYBaNH81OwD8dO3UElSu ++f+ypLi68SGrSXgOvuaDjlddzqpn3FVQKfBzcSWY/PlVeKxkJjQHmknROXzm178= +=MkgG +-----END PGP SIGNATURE----- +commit a732e98e0cb8226e9c5e6d22d3ea1c981b986b1d (HEAD -> master, tag: v1.5, origin/master, origin/HEAD) +Author: will +Date:   Mon Sep 7 22:15:58 2020 +0800 +    add work +diff --git a/my_Unfinished_Work2.txt b/my_Unfinished_Work2.txt +new file mode 100644 +index 0000000..e69de29 +diff --git a/my_Unfinished_Work3.txt b/my_Unfinished_Work3.txt +new file mode 100644 +index 0000000..e69de29 +``` +## 验证标签 + +要验证一个签署的标签,可以运行 `git tag -v `。 这个命令使用 GPG 来验证签名。 为了验证能正常工作,签署者的公钥需要在你的钥匙链中。 + +```shell +$ git tag -v v1.5 +gpg: Signature made 2020年09月 2日 周三 22:58:56 +gpg:                using RSA key 9EEE8AE9AF53EA1B +gpg: Good signature from "will.wang (will) " +object a732e98e0cb8226e9c5e6d22d3ea1c981b986b1d +type commit +tag v1.5 +tagger will 1599490736 +0800 +my signed 1.5 tag +``` +如果没有签署者的公钥,那么你将会得到类似下面的东西: +```shell +gpg: Signature made 2020年09月 2日 周三 22:58:57 +gpg: using RSA key 9EEE8AE9AF53EA1B +gpg: Can't check signature: public key not found +error: could not verify the tag 'v1.5' +``` +## 签署提交 + +在最新版本的 Git 中(v1.7.9 及以上),也可以签署个人提交。 如果相对于标签而言你对直接签署到提交更感兴趣的话,所有要做的只是增加一个 -S 到 git commit 命令。 + +```shell +$ git commit -a -S -m 'signed commit' +You need a passphrase to unlock the secret key for +user: "will.wang (will) " +2048-bit RSA key, ID AF53EA1B, created 2020-09-02 +[master 3b69384] signed commit + 2 files changed, 2 insertions(+) +``` +**git log 也有一个 --show-signature 选项来查看及验证这些签名。** +```shell +$ git log --show-signature -1 +commit 3b69384a52720f9efcd282f825824171013ee120 (HEAD -> master) +gpg: Signature made 2020年09月 2日 周三 23:06:11 +gpg:                using RSA key 9EEE8AE9AF53EA1B +gpg: Good signature from "will.wang (will) " +Author: will +Date:   Mon Sep 2 23:06:11 2020 +0800 +    signed commit +``` +另外,也可以配置 git log 来验证任何找到的签名并将它们以 %G? 格式列在输出中。 +```shell +$ git log --pretty="format:%h %G? %aN  %s" +3b69384 G will  signed commit +a732e98 N will  add work +a66ee73 N will  unfinishedwork +60434ac N will  Subject line (try to keep under 50 characters) +24de949 N will  git apply +ea561d5 N will  insert +d3c8035 N will  git merge +3d0dc48 N wzw-001  delete +d76809c N wangzhenwei  update +ca671b5 N will  init +``` +这里我们可以看到只有最后一次提交是签署并有效的,而之前的提交都不是。 +在 Git 1.8.3 及以后的版本中,git merge 与 git pull 可以使用 --verify-signatures 选项来检查并拒绝没有携带可信 GPG 签名的提交。 + +如果使用这个选项来合并一个包含未签名或有效的提交的分支时,合并不会生效。 + +```shell +$ git merge --verify-signatures non-verify +fatal: Commit ab06180 does not have a GPG signature. +``` +如果合并包含的只有有效的签名的提交,合并命令会提示所有的签名它已经检查过了然后会继续向前。 +```shell +$ git merge --verify-signatures signed-branch +Commit 13ad65e has a good GPG signature by Scott Chacon (Git signing key) +Updating 5c3386c..13ad65e +Fast-forward + README | 2 ++ + 1 file changed, 2 insertions(+) +``` +也可以给 git merge 命令附加 -S 选项来签署自己生成的合并提交。 下面的例子演示了验证将要合并的分支的每一个提交都是签名的并且签署最后生成的合并提交。 +```shell +$ git merge --verify-signatures -S signed-branch +Commit 13ad65e has a good GPG signature by Scott Chacon (Git signing key) +You need a passphrase to unlock the secret key for +user: "Scott Chacon (Git signing key) " +2048-bit RSA key, ID 0A46826A, created 2014-06-04 +Merge made by the 'recursive' strategy. + README | 2 ++ + 1 file changed, 2 insertions(+) +``` diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/5. \346\220\234\347\264\242.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/5. \346\220\234\347\264\242.md" new file mode 100644 index 0000000..9fa4a16 --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/5. \346\220\234\347\264\242.md" @@ -0,0 +1,89 @@ +--- +title: 搜索 +--- +Git 提供了两个工具来快速地从 Git 数据库中浏览代码和提交. + +## Git Grep + +`grep`命令可以使你方便地从提交历史,工作目录,甚至索引中查找一个字符或者正则表达式. + +默认情况下`git grep`会查找你工作目录的文件。第一种变体是,可以传递`-n`或者`--line-number`选项数来输出 Git 找出的匹配行号。 + +```shell +$ git grep -n miss +my_Unfinished_Work2.txt:1:miss you +``` +`git grep`还支持大量其它有趣的选项。 +例如,若不想打印所有匹配的项,你可以使用`-c`或`--count`选项来让`git grep`输出概述的信息, 其中仅包括那些包含匹配字符串的文件,以及每个文件中包含了多少个匹配。 + +```shell +$ git grep --count you +my_Unfinished_Work2.txt:1 +my_Unfinished_Work3.txt:1 +``` +搜索字符串的上下文,那么可以传入`-p`或`--show-function`选项来显示每一个匹配的字符串所在的方法或函数: +```shell +$ git grep -p you +my_Unfinished_Work2.txt:miss you +my_Unfinished_Work3.txt:hate you +``` +使用`--and`标志来查看复杂的字符串组合,它确保了多个匹配出现在同一文本行中 +比如,我们要查看在旧版本 1.5 的 Git 代码库中定义了常量名包含 “YOU” 或者 “hate” 这两个字符串的行 (这里也用到了`--break`和`--heading`选项来使输出更加容易阅读)。 + +```shell +$ git grep --break --heading -n -e '#define' --and \( -e YOU -e hate\) v1.5 +``` +相比于一些常用的搜索命令比如`grep`和`ack`,`git grep`命令有一些的优点。 第一就是速度非常快,第二是你不仅仅可以可以搜索工作目录,还可以搜索任意的 Git 树。 在上一个例子中,我们在一个旧版本的 Git 源代码中查找,而不是当前检出的版本。 +## Git Log Searching + +Git 日志搜索 + +`git log`命令有许多强大的工具可以通过提交信息甚至是`diff`的内容来找到某个特定的提交。 + +例如,如果我们想找到 ZLIB_BUF_MAX 常量是什么时候引入的,我们可以使用`-S`选项 (在 Git 中俗称“鹤嘴锄(pickaxe)”选项)来显示新增和删除该字符串的提交。 + +```shell +$ git log -S ZLIB_BUF_MAX --oneline +e01503b zlib: allow feeding more than 4GB in one go +ef49a7a zlib: zlib can only process 4GB at a time +``` +如果我们查看这些提交的`diff`,我们可以看到在`ef49a7a`这个提交引入了常量,并且在`e01503b`这个提交中被修改了。 +如果你希望得到更精确的结果,你可以使用 -G 选项来使用正则表达式搜索。 + +### **Line Log Search (行日志搜索)** + +行日志搜索是另一个相当高级并且有用的日志搜索功能。 在`git log`后加上`-L`选项即可调用,它可以展示代码中一行或者一个函数的历史。 + +例如,假设我们想查看 zlib.c 文件中`git_deflate_bound`函数的每一次变更, 我们可以执行`git log -L :git_deflate_bound:zlib.c`。 Git 会尝试找出这个函数的范围,然后查找历史记录,并且显示从函数创建之后一系列变更对应的补丁。 + +```shell +$ git log -L :git_deflate_bound:zlib.c +commit ef49a7a0126d64359c974b4b3b71d7ad42ee3bca +Author: Junio C Hamano +Date: Fri Jun 10 11:52:15 2011 -0700 + zlib: zlib can only process 4GB at a time +diff --git a/zlib.c b/zlib.c +--- a/zlib.c ++++ b/zlib.c +@@ -85,5 +130,5 @@ +-unsigned long git_deflate_bound(z_streamp strm, unsigned long size) ++unsigned long git_deflate_bound(git_zstream *strm, unsigned long size) + { +- return deflateBound(strm, size); ++ return deflateBound(&strm->z, size); + } +commit 225a6f1068f71723a910e8565db4e252b3ca21fa +Author: Junio C Hamano +Date: Fri Jun 10 11:18:17 2011 -0700 + zlib: wrap deflateBound() too +diff --git a/zlib.c b/zlib.c +--- a/zlib.c ++++ b/zlib.c +@@ -81,0 +85,5 @@ ++unsigned long git_deflate_bound(z_streamp strm, unsigned long size) ++{ ++ return deflateBound(strm, size); ++} ++ +``` +如果 Git 无法计算出如何匹配你代码中的函数或者方法,你可以提供一个正则表达式。 例如,这个命令和上面的是等同的:`git log -L '/unsigned long git_deflate_bound/',/^}/:zlib.c`。 你也可以提供单行或者一个范围的行号来获得相同的输出。 \ No newline at end of file diff --git "a/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/6. \351\207\215\345\206\231\345\216\206\345\217\262.md" "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/6. \351\207\215\345\206\231\345\216\206\345\217\262.md" new file mode 100644 index 0000000..126be8d --- /dev/null +++ "b/src/git_tutorial/Git \345\233\242\351\230\237\345\215\217\344\275\234\344\270\216\347\256\241\347\220\206\357\274\210\350\277\233\351\230\266\347\257\207\357\274\211/Git \345\267\245\345\205\267/6. \351\207\215\345\206\231\345\216\206\345\217\262.md" @@ -0,0 +1,208 @@ +--- +title: 重写历史 +--- + +## 修改最后一次提交 + +修改最后一次提交可能是所有修改历史提交的操作中最常见的一个。一般是:简单修改提交信息,或者通过添加,移除或修改文件来更改提交实际的内容。 + +首先做一次提交: + +```shell +$ git commit -m 'test commit' +[master 3587f3f] test commit + 1 file changed, 1 insertion(+) + create mode 100644 my_Unfinished_Work4.txt +``` +如果,你只是想修改最近一次提交的提交信息,那么很简单: +```shell +$ git commit --amend +``` +![图片](./../../../.vuepress/public/images/pXxyiOZEqGoGIB3d.png) + +上面这条命令会将最后一次的提交信息载入到编辑器中供你修改。 当保存并关闭编辑器后,编辑器会将更新后的提交信息写入新提交中,它会成为新的最后一次提交。 + +另一方面,如果你想要修改最后一次提交的实际内容,那么流程很相似:首先作出你想要补上的修改, 暂存它们,然后用 git commit --amend 以新的改进后的提交来**替换**掉旧有的最后一次提交,使用这个技巧的时候需要小心,因为修正会改变提交的 SHA-1 。 它类似于一个小的变基——如果已经推送了最后一次提交就不要修正它。 + +## 修改多个提交说明 + +要修改更早的历史提交,Git 没有提供工具,但可以使用 rebase 来衍合一系列的提交到它们原来所在的 HEAD 上而不是移到新的上。你可以通过给 git rebase 增加 -i 选项来以交互方式地运行 rebase。 + +例如,如果想要修改最近三次提交信息,或者那组提交中的任意一个提交信息, 将想要修改的最近一次提交的父提交作为参数传递给 git rebase -i 命令,即 `HEAD~2^` 或 `HEAD~3`。 记住 `~3` 可能比较容易,因为你正尝试修改最后三次提交;但是注意实际上指定了以前的四次提交,即想要修改提交的父提交: + +```shell +$ git rebase -i HEAD~3 +``` +再次记住这是一个变基命令——在 `HEAD~3..HEAD` 范围内的每一个修改了提交信息的提交及其**所有后裔**都会被重写。 不要涉及任何已经推送到中央服务器的提交——这样做会产生一次变更的两个版本,因而使他人困惑。 +运行这个命令会在文本编辑器上给你一个提交的列表,看起来像下面这样: + +```shell +pick a732e98 add work +pick 3b69384 signed commit +pick c7b2f02 test commit +# Rebase a66ee73..c7b2f02 onto a66ee73 (3 commands) +# +# Commands: +# p, pick = use commit +# r, reword = use commit, but edit the commit message +# e, edit = use commit, but stop for amending +# s, squash = use commit, but meld into previous commit +# f, fixup = like "squash", but discard this commit's log message +# x, exec = run command (the rest of the line) using shell +# d, drop = remove commit +# l, label