6.4
ÖØÐ´ÀúÊ·
ºÜ¶àʱºò£¬ÔÚ Git ÉϹ¤×÷µÄʱºò£¬ÄãÒ²Ðí»áÓÉÓÚijÖÖÔÒòÏëÒªÐÞ¶©ÄãµÄÌá½»ÀúÊ·¡£Git
µÄÒ»¸ö׿Խ֮´¦¾ÍÊÇËüÔÊÐíÄãÔÚ×îºó¿ÉÄܵÄʱ¿ÌÔÙ×÷¾ö¶¨¡£Äã¿ÉÒÔÔÚÄã¼´½«Ìá½»ÔÝ´æÇøÊ±¾ö¶¨Ê²Ã´Îļþ¹éÈëÄÄÒ»´ÎÌá½»£¬Äã¿ÉÒÔʹÓÃ
stash ÃüÁîÀ´¾ö¶¨ÄãÔÝʱ¸éÖõŤ×÷£¬Äã¿ÉÒÔÖØÐ´ÒѾ·¢ÉúµÄÌá½»ÒÔʹËüÃÇ¿´ÆðÀ´ÊÇÁíÍâÒ»ÖÖÑù×Ó¡£Õâ¸ö°üÀ¨¸Ä±äÌá½»µÄ´ÎÐò¡¢¸Ä±ä˵Ã÷»òÕßÐÞ¸ÄÌá½»Öаüº¬µÄÎļþ£¬½«Ìá½»¹é²¢¡¢²ð·Ö»òÕßÍêȫɾ³ý¡ª¡ªÕâÒ»ÇÐÔÚÄãÉÐδ¿ªÊ¼½«ÄãµÄ¹¤×÷ºÍ±ðÈ˹²Ïíǰ¶¼ÊÇ¿ÉÒԵġ£
ÔÚÕâÒ»½ÚÖУ¬Äã»áѧµ½ÈçºÎÍê³ÉÕâЩºÜÓÐÓõÄÈÎÎñÒÔʹÄãµÄÌá½»ÀúÊ·ÔÚÄ㽫Æä¹²Ïí¸ø±ðÈË֮ǰ±ä³ÉÄãÏëÒªµÄÑù×Ó¡£
¸Ä±ä×î½üÒ»´ÎÌá½»
¸Ä±ä×î½üÒ»´ÎÌá½»Ò²ÐíÊÇ×î³£¼ûµÄÖØÐ´ÀúÊ·µÄÐÐΪ¡£¶ÔÓÚÄãµÄ×î½üÒ»´ÎÌá½»£¬Äã¾³£Ïë×öÁ½¼þ»ù±¾ÊÂÇ飺¸Ä±äÌύ˵Ã÷£¬»òÕ߸ıäÄã¸Õ¸Õͨ¹ýÔö¼Ó£¬¸Ä±ä£¬É¾³ý¶ø¼Ç¼µÄ¿ìÕÕ¡£
Èç¹ûÄãÖ»ÏëÐÞ¸Ä×î½üÒ»´ÎÌύ˵Ã÷£¬Õâ·Ç³£¼òµ¥£º
Õâ»á°ÑÄã´øÈëÎı¾±à¼Æ÷£¬ÀïÃæ°üº¬ÁËÄã×î½üÒ»´ÎÌύ˵Ã÷£¬¹©ÄãÐ޸ġ£µ±Äã±£´æ²¢Í˳ö±à¼Æ÷£¬Õâ¸ö±à¼Æ÷»áдÈëÒ»¸öеÄÌá½»£¬ÀïÃæ°üº¬ÁËÄǸö˵Ã÷£¬²¢ÇÒÈÃËü³ÉΪÄãµÄеÄ×î½üÒ»´ÎÌá½»¡£
Èç¹ûÄãÍê³ÉÌá½»ºóÓÖÏëÐ޸ı»Ìá½»µÄ¿ìÕÕ£¬Ôö¼Ó»òÕßÐÞ¸ÄÆäÖеÄÎļþ£¬¿ÉÄÜÒòΪÄã×î³õÌύʱ£¬ÍüÁËÌí¼ÓÒ»¸öн¨µÄÎļþ£¬Õâ¸ö¹ý³Ì»ù±¾ÉÏÒ»Ñù¡£Äãͨ¹ýÐÞ¸ÄÎļþÈ»ºó¶ÔÆäÔËÐÐgit
add»ò¶ÔÒ»¸öÒѱ»¼Ç¼µÄÎļþÔËÐÐgit rm£¬ËæºóµÄgit commit --amend»á»ñÈ¡Ä㵱ǰµÄÔÝ´æÇø²¢½«Ëü×÷ΪÐÂÌá½»¶ÔÓ¦µÄ¿ìÕÕ¡£
ʹÓÃÕâÏî¼¼ÊõµÄʱºòÄã±ØÐëСÐÄ£¬ÒòΪÐÞÕý»á¸Ä±äÌá½»µÄSHA-1Öµ¡£Õâ¸öºÜÏñÊÇÒ»´Î·Ç³£Ð¡µÄrebase¡ª¡ª²»ÒªÔÚÄã×î½üÒ»´ÎÌá½»±»ÍÆËͺó»¹È¥ÐÞÕýËü¡£
Ð޸Ķà¸öÌύ˵Ã÷
ÒªÐÞ¸ÄÀúÊ·ÖиüÔçµÄÌá½»£¬Äã±ØÐë²ÉÓøü¸´ÔӵŤ¾ß¡£GitûÓÐÒ»¸öÐÞ¸ÄÀúÊ·µÄ¹¤¾ß£¬µ«ÊÇÄã¿ÉÒÔʹÓÃrebase¹¤¾ßÀ´ÑܺÏһϵÁеÄÌá½»µ½ËüÃÇÔÀ´ËùÔÚµÄHEADÉ϶ø²»ÊÇÒÆµ½ÐµÄÉÏ¡£ÒÀ¿¿Õâ¸ö½»»¥Ê½µÄrebase¹¤¾ß£¬Äã¾Í¿ÉÒÔÍ£ÁôÔÚÿһ´ÎÌá½»ºó£¬Èç¹ûÄãÏëÐ޸Ļò¸Ä±ä˵Ã÷¡¢Ôö¼ÓÎļþ»òÈÎºÎÆäËûÊÂÇé¡£Äã¿ÉÒÔͨ¹ý¸øgit
rebaseÔö¼Ó-iÑ¡ÏîÀ´ÒÔ½»»¥·½Ê½µØÔËÐÐrebase¡£Äã±ØÐëͨ¹ý¸æËßÃüÁîÑܺϵ½ÄÄ´ÎÌá½»£¬À´Ö¸Ã÷ÄãÐèÒªÖØÐ´µÄÌá½»µÄ»ØËÝÉî¶È¡£
ÀýÈ磬ÄãÏëÐÞ¸Ä×î½üÈý´ÎµÄÌύ˵Ã÷£¬»òÕ߯äÖÐÈÎÒâÒ»´Î£¬Äã±ØÐë¸øgit rebase
-iÌṩһ¸ö²ÎÊý£¬Ö¸Ã÷ÄãÏëÒªÐ޸ĵÄÌá½»µÄ¸¸Ìá½»£¬ÀýÈçHEAD~2»òÕßHEAD~3¡£¿ÉÄܼÇס~3¸ü¼ÓÈÝÒ×£¬ÒòΪÄãÏëÐÞ¸Ä×î½üÈý´ÎÌá½»£»µ«ÊÇÇë¼ÇסÄãÊÂʵÉÏËùÖ¸µÄÊÇËÄ´ÎÌύ֮ǰ£¬¼´ÄãÏëÐ޸ĵÄÌá½»µÄ¸¸Ìá½»¡£
ÔÙ´ÎÌáÐÑÕâÊÇÒ»¸öÑܺÏÃüÁ¡ªHEAD~3..HEAD·¶Î§ÄÚµÄÿһ´ÎÌá½»¶¼»á±»ÖØÐ´£¬ÎÞÂÛÄãÊÇ·ñÐÞ¸Ä˵Ã÷¡£²»Òªº¸ÇÄãÒÑ¾ÍÆË͵½ÖÐÐÄ·þÎñÆ÷µÄÌá½»¡ª¡ªÕâô×ö»áʹÆäËû¿ª·¢Õß²úÉú»ìÂÒ£¬ÒòΪÄãÌṩÁËͬÑù±ä¸üµÄ²»Í¬°æ±¾¡£
ÔËÐÐÕâ¸öÃüÁî»áΪÄãµÄÎı¾±à¼Æ÷Ìṩһ¸öÌá½»ÁÐ±í£¬¿´ÆðÀ´ÏñÏÂÃæÕâÑù
pick f7f3f6d changed my name a bit pick 310154e updated README formatting and
added blame pick a5f4a0d added cat-file # Rebase |
ºÜÖØÒªµÄÒ»µãÊÇÄãµÃ×¢ÒâÕâЩÌá½»µÄ˳ÐòÓëÄãͨ³£Í¨¹ýlogÃüÁî¿´µ½µÄÊÇÏà·´µÄ¡£Èç¹ûÄãÔËÐÐlog£¬Äã»á¿´µ½ÏÂÃæÕâÑùµÄ½á¹û£º
$ git log --pretty=format:"%h %s" HEAD~3..HEAD a5f4a0d added cat-file 310154
e updated README formatting and added blame f7f3f |
Çë×¢ÒâÕâÀïµÄµ¹Ðò¡£½»»¥Ê½µÄrebase¸øÁËÄãÒ»¸ö¼´½«ÔËÐеĽű¾¡£Ëü»á´ÓÄãÔÚÃüÁîÐÐÉÏÖ¸Ã÷µÄÌá½»¿ªÊ¼(HEAD~3)È»ºó×ÔÉÏÖÁÏÂÖØ²¥Ã¿´ÎÌá½»ÀïÒýÈëµÄ±ä¸ü¡£Ëü½«×îÔçµÄÁÐÔÚ¶¥É϶ø²»ÊÇ×î½üµÄ£¬ÒòΪÕâÊǵÚÒ»¸öÐèÒªÖØ²¥µÄ¡£
ÄãÐèÒªÐÞ¸ÄÕâ¸ö½Å±¾À´ÈÃËüÍ£ÁôÔÚÄãÏëÐ޸ĵıä¸üÉÏ¡£Òª×öµ½ÕâÒ»µã£¬ÄãÖ»Òª½«ÄãÏëÐ޸ĵÄÿһ´ÎÌá½»Ç°ÃæµÄpick¸ÄΪedit¡£ÀýÈ磬ֻÏëÐ޸ĵÚÈý´ÎÌύ˵Ã÷µÄ»°£¬Äã¾ÍÏñÏÂÃæÕâÑùÐÞ¸ÄÎļþ£º
edit f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file |
µ±Äã±£´æ²¢Í˳ö±à¼Æ÷£¬Git»áµ¹»ØÖÁÁбíÖеÄ×îºóÒ»´ÎÌá½»£¬È»ºó°ÑÄãË͵½ÃüÁîÐÐÖУ¬Í¬Ê±ÏÔʾÒÔÏÂÐÅÏ¢£º
$ git rebase -i HEAD~3 Stopped at 7482e0d...
updated the gemspec to hopefully work better You can amend the commit now, with |
ÕâЩָʾºÜÃ÷È·µØ¸æËßÁËÄã¸Ã¸Éʲô¡£ÊäÈë
ÐÞ¸ÄÌύ˵Ã÷£¬Í˳ö±à¼Æ÷¡£È»ºó£¬ÔËÐÐ
Õâ¸öÃüÁî»á×Ô¶¯Ó¦ÓÃÆäËûÁ½´ÎÌá½»£¬Äã¾ÍÍê³ÉÈÎÎñÁË¡£Èç¹ûÄ㽫¸ü¶àÐÐµÄ pick
¸ÄΪ edit £¬Äã¾ÍÄܶÔÄãÏëÐ޸ĵÄÌá½»ÖØ¸´ÕâЩ²½Öè¡£Gitÿ´Î¶¼»áͣϣ¬ÈÃÄãÐÞÕýÌá½»£¬Íê³Éºó¼ÌÐøÔËÐС£
ÖØÅÅÌá½»
ÄãÒ²¿ÉÒÔʹÓý»»¥Ê½µÄÑܺÏÀ´³¹µ×ÖØÅÅ»òɾ³ýÌá½»¡£Èç¹ûÄãÏëɾ³ý¡±added
cat-file¡±Õâ¸öÌá½»²¢ÇÒÐÞ¸ÄÆäËûÁ½´ÎÌá½»ÒýÈëµÄ˳Ðò£¬Ä㽫rebase½Å±¾´ÓÕâ¸ö
pick f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file |
¸ÄΪÕâ¸ö£º
pick 310154e updated README formatting and added blame pick f7f3f6d changed my name a bit |
µ±Äã±£´æ²¢Í˳ö±à¼Æ÷£¬Git ½«·ÖÖ§µ¹»ØÖÁÕâЩÌá½»µÄ¸¸Ìá½»£¬Ó¦ÓÃ310154e£¬È»ºóf7f3f6d£¬½Ó×ÅÍ£Ö¹¡£ÄãÓÐЧµØÐÞ¸ÄÁËÕâЩÌá½»µÄ˳Ðò²¢ÇÒ³¹µ×ɾ³ýÁË¡±added
cat-file¡±Õâ´ÎÌá½»¡£
Ñ¹ÖÆ(Squashing)Ìá½»
½»»¥Ê½µÄÑܺϹ¤¾ß»¹¿ÉÒÔ½«Ò»ÏµÁÐÌá½»Ñ¹ÖÆÎªµ¥Ò»Ìá½»¡£½Å±¾ÔÚ rebase
µÄÐÅÏ¢Àï·ÅÁËһЩÓÐÓõÄָʾ£º
# # Commands: # p, pick = use commit # e, edit = use commit, but stop for amending # s,
squash = use commit, but meld into pr |
Èç¹û²»Óá±pick¡±»òÕß¡±edit¡±£¬¶øÊÇÖ¸¶¨¡±squash¡±£¬Git
»áͬʱӦÓÃÄǸö±ä¸üºÍËü֮ǰµÄ±ä¸ü²¢½«Ìύ˵Ã÷¹é²¢¡£Òò´Ë£¬Èç¹ûÄãÏ뽫ÕâÈý¸öÌá½»ºÏ²¢Îªµ¥Ò»Ìá½»£¬Äã¿ÉÒÔ½«½Å±¾Ð޸ijÉÕâÑù£º
pick f7f3f6d changed my name a bit squash310154e updated READMEformatting and added blame squash a5f4a0d added cat-file |
µ±Äã±£´æ²¢Í˳ö±à¼Æ÷£¬Git »áÓ¦ÓÃÈ«²¿Èý´Î±ä¸üÈ»ºó½«ÄãËÍ»Ø±à¼Æ÷À´¹é²¢Èý´ÎÌύ˵Ã÷¡£
#This is a combination of 3 commits. #The first commit's message is: changed my name a bit # This is the 2nd commit message |
µ±Äã±£´æÖ®ºó£¬Äã¾ÍÓµÓÐÁËÒ»¸ö°üº¬Ç°Èý´ÎÌá½»µÄÈ«²¿±ä¸üµÄµ¥Ò»Ìá½»¡£
²ð·ÖÌá½»
²ð·ÖÌá½»¾ÍÊdz·ÏúÒ»´ÎÌá½»£¬È»ºó¶à´Î²¿·ÖµØÔÝ´æ»òÌá½»Ö±µ½½áÊø¡£ÀýÈ磬¼ÙÉèÄãÏ뽫Èý´ÎÌá½»ÖеÄÖмäÒ»´Î²ð·Ö¡£½«¡±updated
README formatting and added blame¡±²ð·Ö³ÉÁ½´ÎÌá½»£ºµÚÒ»´ÎΪ¡±updated
README formatting¡±£¬µÚ¶þ´ÎΪ¡±added blame¡±¡£Äã¿ÉÒÔÔÚrebase -i½Å±¾ÖÐÐÞ¸ÄÄãÏë²ð·ÖµÄÌύǰµÄÖ¸ÁîΪ¡±edit¡±£º
pick f7f3f6d changed my name a bit edit 310154e updated README formatting and added blame pick a5f4a0d added cat-file |
È»ºó£¬Õâ¸ö½Å±¾¾Í½«Äã´øÈëÃüÁîÐУ¬ÄãÖØÖÃÄÇ´ÎÌá½»£¬ÌáÈ¡±»ÖØÖõıä¸ü£¬´ÓÖд´½¨¶à´ÎÌá½»¡£µ±Äã±£´æ²¢Í˳ö±à¼Æ÷£¬Git
µ¹»Øµ½ÁбíÖеÚÒ»´ÎÌá½»µÄ¸¸Ìá½»£¬Ó¦ÓõÚÒ»´ÎÌá½»£¨f7f3f6d£©£¬Ó¦Óõڶþ´ÎÌá½»£¨310154e£©£¬È»ºó½«Äã´øµ½¿ØÖÆÌ¨¡£ÄÇÀïÄã¿ÉÒÔÓÃgit
reset HEAD^¶ÔÄÇ´ÎÌá½»½øÐÐÒ»´Î»ìºÏµÄÖØÖã¬Õ⽫³·ÏúÄÇ´ÎÌá½»²¢ÇÒ½«Ð޸ĵÄÎļþ³·»Ø¡£´ËʱÄã¿ÉÒÔÔÝ´æ²¢Ìá½»Îļþ£¬Ö±µ½ÄãÓµÓжà´ÎÌá½»£¬½áÊøºó£¬ÔËÐÐgit
rebase --continue¡£
$ git reset HEAD^ $ git add README $ git commit -m 'updated README formatting' $ git add lib/simplegit.rb $ git commit -m 'add |
GitÔڽű¾ÖÐÓ¦ÓÃÁË×îºóÒ»´ÎÌá½»£¨a5f4a0d£©£¬ÄãµÄÀúÊ·¿´ÆðÀ´¾ÍÏñÕâÑùÁË£º
$ git log -4 --pretty=format:"%h %s" 1c002dd added cat-file 9b29157 added blame 35cfb2b updated README formatting f3cc40e ch |
ÔÙ´ÎÌáÐÑ£¬Õâ»áÐÞ¸ÄÄãÁбíÖеÄÌá½»µÄ SHA Öµ£¬ËùÒÔÇëÈ·±£Õâ¸öÁбíÀï²»°üº¬ÄãÒÑ¾ÍÆË͵½¹²Ïí²Ö¿âµÄÌá½»¡£
ºËµ¯¼¶Ñ¡Ïî: filter-branch
Èç¹ûÄãÏëÓýű¾µÄ·½Ê½Ð޸ĴóÁ¿µÄÌá½»£¬»¹ÓÐÒ»¸öÖØÐ´ÀúÊ·µÄÑ¡Ïî¿ÉÒÔÓ᪡ªÀýÈ磬ȫ¾ÖÐÔµØÐ޸ĵç×ÓÓʼþµØÖ·»òÕß½«Ò»¸öÎļþ´ÓËùÓÐÌá½»ÖÐɾ³ý¡£Õâ¸öÃüÁîÊÇfilter-branch£¬Õâ¸ö»á´óÃæ»ýµØÐÞ¸ÄÄãµÄÀúÊ·£¬ËùÒÔÄãºÜÓпÉÄܲ»¸ÃÈ¥ÓÃËü£¬³ý·ÇÄãµÄÏîÄ¿ÉÐδ¹«¿ª£¬Ã»ÓÐÆäËûÈËÔÚÄã×¼±¸Ð޸ĵÄÌá½»µÄ»ù´¡ÉϹ¤×÷¡£¾¡¹ÜÈç´Ë£¬Õâ¸ö¿ÉÒԷdz£ÓÐÓá£Äã»áѧϰһЩ³£¼ûÓ÷¨£¬½è´Ë¶ÔËüµÄÄÜÁ¦ÓÐËùÈÏʶ¡£
´ÓËùÓÐÌá½»ÖÐɾ³ýÒ»¸öÎļþ
Õâ¸ö¾³£·¢Éú¡£ÓÐЩÈ˲»¾Ë¼¿¼Ê¹ÓÃgit add .£¬ÒâÍâµØÌá½»ÁËÒ»¸ö¾Þ´óµÄ¶þ½øÖÆÎļþ£¬ÄãÏ뽫Ëü´ÓËùÓеط½É¾³ý¡£Ò²ÐíÄ㲻СÐÄÌá½»ÁËÒ»¸ö°üº¬ÃÜÂëµÄÎļþ£¬¶øÄãÏëÈÃÄãµÄÏîÄ¿¿ªÔ´¡£filter-branch´ó¸Å»áÊÇÄãÓÃÀ´ÇåÀíÕû¸öÀúÊ·µÄ¹¤¾ß¡£Òª´ÓÕû¸öÀúÊ·ÖÐɾ³ýÒ»¸öÃû½Ðpassword.txtµÄÎļþ£¬Äã¿ÉÒÔÔÚfilter-branchÉÏʹÓÃ--tree-filterÑ¡Ï
$ git filter-branch --tree-filter 'rm -f passwords.txt' HEAD Rewrite 6b9b3cf04e7c5686a9cb838c3f36a8cb6a0fc2bd (21/21) Ref 're |
--tree-filterÑ¡Ïî»áÔÚÿ´Î¼ì³öÏîĿʱÏÈÖ´ÐÐÖ¸¶¨µÄÃüÁîÈ»ºóÖØÐÂÌá½»½á¹û¡£ÔÚÕâ¸öÀý×ÓÖУ¬Äã»áÔÚËùÓпìÕÕÖÐɾ³ýÒ»¸öÃû½Ð
password.txt µÄÎļþ£¬ÎÞÂÛËüÊÇ·ñ´æÔÚ¡£Èç¹ûÄãÏëɾ³ýËùÓв»Ð¡ÐÄÌá½»ÉÏÈ¥µÄ±à¼Æ÷±¸·ÝÎļþ£¬Äã¿ÉÒÔÔËÐÐÀàËÆgit
filter-branch --tree-filter 'rm -f *~' HEADµÄÃüÁî¡£
Äã¿ÉÒԹ۲쵽 Git ÖØÐ´Ä¿Â¼Ê÷²¢ÇÒÌá½»£¬È»ºó½«·ÖÖ§Ö¸ÕëÒÆµ½Ä©Î²¡£Ò»¸ö±È½ÏºÃµÄ°ì·¨ÊÇÔÚÒ»¸ö²âÊÔ·ÖÖ§ÉÏ×öÕâЩȻºóÔÚÄãÈ·¶¨²úÎïÕæµÄÊÇÄãËùÒªµÄÖ®ºó£¬ÔÙ
hard-reset ÄãµÄÖ÷·ÖÖ§¡£ÒªÔÚÄãËùÓеķÖÖ§ÉÏÔËÐÐfilter-branchµÄ»°£¬Äã¿ÉÒÔ´«µÝÒ»¸ö--all¸øÃüÁî¡£
½«Ò»¸ö×ÓĿ¼ÉèÖÃΪеĸùĿ¼
¼ÙÉèÄãÍê³ÉÁË´ÓÁíÍâÒ»¸ö´úÂë¿ØÖÆÏµÍ³µÄµ¼È빤×÷£¬µÃµ½ÁËһЩûÓÐÒâÒåµÄ×ÓĿ¼£¨trunk,
tagsµÈµÈ£©¡£Èç¹ûÄãÏëÈÃtrunk×ÓĿ¼³ÉΪÿһ´ÎÌá½»µÄеÄÏîÄ¿¸ùĿ¼£¬filter-branchÒ²¿ÉÒÔ°ïÄã×öµ½£º
$ git filter-branch --subdirectory-filter trunk HEAD Rewrite 856f0bf61e41a27326cdae8f09fe708d679f596f (12/12) Ref 'refs/head |
ÏÖÔÚÄãµÄÏîÄ¿¸ùĿ¼¾ÍÊÇtrunk×ÓĿ¼ÁË¡£Git »á×Ô¶¯µØÉ¾³ý²»¶ÔÕâ¸ö×ÓĿ¼²úÉúÓ°ÏìµÄÌá½»¡£
È«¾ÖÐԵظü»»µç×ÓÓʼþµØÖ·
ÁíÒ»¸ö³£¼ûµÄ°¸ÀýÊÇÄãÔÚ¿ªÊ¼Ê±ÍüÁËÔËÐÐgit configÀ´ÉèÖÃÄãµÄÐÕÃûºÍµç×ÓÓʼþµØÖ·£¬Ò²ÐíÄãÏ뿪Դһ¸öÏîÄ¿£¬°ÑÄãËùÓеŤ×÷µç×ÓÓʼþµØÖ·ÐÞ¸ÄΪ¸öÈ˵ØÖ·¡£ÎÞÂÛÄÄÖÖÇé¿öÄã¶¼¿ÉÒÔÓÃfilter-branchÀ´¸ü»»¶à´ÎÌá½»ÀïµÄµç×ÓÓʼþµØÖ·¡£Äã±ØÐëСÐÄһЩ£¬Ö»¸Ä±äÊôÓÚÄãµÄµç×ÓÓʼþµØÖ·£¬ËùÒÔÄãʹÓÃ--commit-filter£º
$ git filter-branch --commit-filter ' if [ "$GIT_AUTHOR_EMAIL" =
"schacon@localhost" ]; then GIT_AUTHOR_NAME="Scott Chacon"; |
Õâ¸ö»á±éÀú²¢ÖØÐ´ËùÓÐÌύʹ֮ӵÓÐÄãµÄеØÖ·¡£ÒòΪÌá½»Àï°üº¬ÁËËüÃǵĸ¸Ìá½»µÄSHA-1Öµ£¬Õâ¸öÃüÁî»áÐÞ¸ÄÄãµÄÀúÊ·ÖеÄËùÓÐÌá½»£¬¶ø²»½ö½öÊǰüº¬ÁËÆ¥ÅäµÄµç×ÓÓʼþµØÖ·µÄÄÇЩ¡£
6.5 ʹÓà Git µ÷ÊÔ
Git ͬÑùÌṩÁËһЩ¹¤¾ßÀ´°ïÖúÄãµ÷ÊÔÏîÄ¿ÖÐÓöµ½µÄÎÊÌâ¡£ÓÉÓÚ Git ±»Éè¼ÆÎª¿ÉÓ¦ÓÃÓÚ¼¸ºõÈκÎÀàÐ͵ÄÏîÄ¿£¬ÕâЩ¹¤¾ßÊÇͨÓÃÐÍ£¬µ«ÊÇÔÚÓöµ½ÎÊÌâʱ¿ÉÒÔ¾³£°ïÖúÄã²éÕÒȱÏÝËùÔÚ¡£
Îļþ±ê×¢
Èç¹ûÄãÔÚ×·×Ù´úÂëÖеÄȱÏÝÏëÖªµÀÕâÊÇʲôʱºòΪʲô±»Òý½øÀ´µÄ£¬Îļþ±ê×¢»áÊÇÄãµÄ×î¼Ñ¹¤¾ß¡£Ëü»áÏÔʾÎļþÖжÔÿһÐнøÐÐÐ޸ĵÄ×î½üÒ»´ÎÌá½»¡£Òò´Ë£¬Èç¹ûÄã·¢ÏÖ×Ô¼º´úÂëÖеÄÒ»¸ö·½·¨´æÔÚȱÏÝ£¬Äã¿ÉÒÔÓÃgit
blameÀ´±ê×¢Îļþ£¬²é¿´ÄǸö·½·¨µÄÿһÐзֱðÊÇÓÉËÔÚÄÄÒ»ÌìÐ޸ĵġ£ÏÂÃæÕâ¸öÀý×ÓʹÓÃÁË-LÑ¡ÏîÀ´ÏÞÖÆÊä³ö·¶Î§ÔÚµÚ12ÖÁ22ÐУº
$ git blame -L 12,22 simplegit.rb ^4832fe2 (Scott Chacon 2008-03-15 10:31:28 -0700 12) def show(tree = 'master') ^4832fe2 (S |
Çë×¢ÒâµÚÒ»¸öÓòÀïÊÇ×îºóÒ»´ÎÐ޸ĸÃÐеÄÄÇ´ÎÌá½»µÄ SHA-1 Öµ¡£½ÓÏÂÈ¥µÄÁ½¸öÓòÊÇ´ÓÄÇ´ÎÌá½»ÖгéÈ¡µÄÖµ¡ª¡ª×÷ÕßÐÕÃûºÍÈÕÆÚ¡ª¡ªËùÒÔÄã¿ÉÒÔ·½±ãµØ»ñÖªËÔÚʲôʱºòÐÞ¸ÄÁËÕâÒ»ÐС£ÔÚÕâºóÃæÊÇÐкźÍÎļþµÄÄÚÈÝ¡£Çë×¢Òâ^4832fe2Ìá½»µÄÄÇЩÐУ¬ÕâЩָµÄÊÇÎļþ×î³õÌá½»µÄÄÇЩÐС£ÄǸöÌá½»ÊÇÎļþµÚÒ»´Î±»¼ÓÈëÕâ¸öÏîĿʱ´æÔڵģ¬×ÔÄÇÒÔºóδ±»Ð޸Ĺý¡£Õâ»á´øÀ´Ð¡Ð¡µÄÀ§»ó£¬ÒòΪÄãÒѾÖÁÉÙ¿´µ½ÁËGitʹÓÃ^À´ÐÞÊÎÒ»¸öÌá½»µÄSHAÖµµÄÈýÖÖ²»Í¬µÄÒâÒ壬µ«ÕâÀïȷʵ¾ÍÊÇÕâ¸öÒâ˼¡£
ÁíÒ»¼þºÜ¿áµÄÊÂÇéÊÇÔÚ Git ÖÐÄã²»ÐèÒªÏÔʽµØ¼Ç¼ÎļþµÄÖØÃüÃû¡£Ëü»á¼Ç¼¿ìÕÕÈ»ºó¸ù¾ÝÏÖʵ³¢ÊÔÕÒ³öÒþʽµÄÖØÃüÃû¶¯×÷¡£ÕâÆäÖÐÓÐÒ»¸öºÜÓÐÒâ˼µÄÌØÐÔ¾ÍÊÇÄã¿ÉÒÔÈÃËüÕÒ³öËùÓеĴúÂëÒÆ¶¯¡£Èç¹ûÄãÔÚgit
blameºó¼ÓÉÏ-C£¬Git»á·ÖÎöÄãÔÚ±ê×¢µÄÎļþÈ»ºó³¢ÊÔÕÒ³öÆäÖдúÂëÆ¬¶ÎµÄÔʼ³ö´¦£¬Èç¹ûËüÊÇ´ÓÆäËûµØ·½¿½±´¹ýÀ´µÄ»°¡£×î½ü£¬ÎÒÔÚ½«Ò»¸öÃû½ÐGITServerHandler.mµÄÎļþ·Ö½âµ½¶à¸öÎļþÖУ¬ÆäÖÐÒ»¸öÊÇGITPackUpload.m¡£Í¨¹ý¶ÔGITPackUpload.mÖ´Ðдø-C²ÎÊýµÄblameÃüÁÎÒ¿ÉÒÔ¿´µ½´úÂë¿éµÄÔʼ³ö´¦£º
$ git blame -C -L 141,153 GITPackUpload.m f344f58d GITServerHandler.m
(Scott 2009-01-04 141) f344f58d GITServerHandler.m |
ÕâÕæµÄ·Ç³£ÓÐÓá£Í¨³££¬Äã»á°ÑÄ㿽±´´úÂëµÄÄÇ´ÎÌá½»×÷ΪÔʼÌá½»£¬ÒòΪÕâÊÇÄãÔÚÕâ¸öÎļþÖеÚÒ»´Î½Ó´¥µ½ÄǼ¸ÐС£Git¿ÉÒÔ¸æËßÄã±àдÄÇЩÐеÄÔʼÌá½»£¬¼´±ãÊÇÔÚÁíÒ»¸öÎļþÀï¡£
¶þ·Ö²éÕÒ
±ê×¢ÎļþÔÚÄãÖªµÀÎÊÌâÊÇÄÄÀïÒýÈëµÄʱºò»áÓаïÖú¡£Èç¹ûÄã²»ÖªµÀ£¬²¢ÇÒ×ÔÉϴδúÂë¿ÉÓõÄ״̬ÒѾ¾ÀúÁËÉϰٴεÄÌá½»£¬Äã¿ÉÄܾÍÒªÇóÖúÓÚbisectÃüÁîÁË¡£bisect»áÔÚÄãµÄÌá½»ÀúÊ·ÖнøÐжþ·Ö²éÕÒÀ´¾¡¿ìµØÈ·¶¨ÄÄÒ»´ÎÌá½»ÒýÈëÁË´íÎó¡£
ÀýÈçÄã¸Õ¸ÕÍÆËÍÁËÒ»¸ö´úÂë·¢²¼°æ±¾µ½²úÆ·»·¾³ÖУ¬¶Ô´úÂëΪʲô»á±íÏÖ³ÉÄÇÑù°Ù˼²»µÃÆä½â¡£Äã»Øµ½ÄãµÄ´úÂëÖУ¬»¹ºÃÄã¿ÉÒÔÖØÏÖÄǸöÎÊÌ⣬µ«ÊÇÕÒ²»µ½ÔÚÄÄÀï¡£Äã¿ÉÒÔ¶Ô´úÂëÖ´ÐÐbisectÀ´Ñ°ÕÒ¡£Ê×ÏÈÄãÔËÐÐgit
bisect startÆô¶¯£¬È»ºóÄãÓÃgit bisect badÀ´¸æËßϵͳµ±Ç°µÄÌá½»ÒѾÓÐÎÊÌâÁË¡£È»ºóÄã±ØÐë¸æËßbisectÒÑÖªµÄ×îºóÒ»´ÎÕý³£×´Ì¬ÊÇÄÄ´ÎÌá½»£¬Ê¹ÓÃgit
bisect good [good_commit]£º
$ git bisect start $ git bisect bad $ git bisect good v1.0 Bisecting: 6 revisions left to test after this [ecb6e1bc347ccecc5 |
Git ·¢ÏÖÔÚÄã±ê¼ÇΪÕý³£µÄÌá½»(v1.0)ºÍµ±Ç°µÄ´íÎó°æ±¾Ö®¼äÓдóÔ¼12´ÎÌá½»£¬ÓÚÊÇËü¼ì³öÖмäµÄÒ»¸ö¡£ÔÚÕâÀÄã¿ÉÒÔÔËÐвâÊÔÀ´¼ì²éÎÊÌâÊÇ·ñ´æÔÚÓÚÕâ´ÎÌá½»¡£Èç¹ûÊÇ£¬ÄÇôËüÊÇÔÚÕâ¸öÖмäÌύ֮ǰµÄijһ´ÎÒýÈëµÄ£»Èç¹û·ñ£¬ÄÇôÎÊÌâÊÇÔÚÖмäÌá½»Ö®ºóÒýÈëµÄ¡£¼ÙÉèÕâÀïÊÇûÓдíÎóµÄ£¬ÄÇôÄã¾Íͨ¹ýgit
bisect goodÀ´¸æËß Git È»ºó¼ÌÐøÄãµÄÂọ́º
$ git bisect good Bisecting: 3 revisions left to test after this [b047b02ea83310a70fd603dc8cd7a6cd13d15c04] secure this thing |
ÏÖÔÚÄãÔÚÁíÍâÒ»¸öÌá½»ÉÏÁË£¬ÔÚÄã¸Õ¸Õ²âÊÔͨ¹ýµÄºÍÒ»¸ö´íÎóÌá½»µÄÖе㴦¡£ÄãÔÙ´ÎÔËÐвâÊÔÈ»ºó·¢ÏÖÕâ´ÎÌá½»ÊÇ´íÎóµÄ£¬Òò´ËÄãͨ¹ýgit
bisect badÀ´¸æËßGit£º
$ git bisect bad Bisecting: 1 revisions left to test after this [f71ce38690acf49c1f3c9bea38e09d82a5ce6014] drop exceptions t |
Õâ´ÎÌá½»ÊǺõģ¬ÄÇô Git ¾Í»ñµÃÁËÈ·¶¨ÎÊÌâÒýÈëλÖÃËùÐèµÄËùÓÐÐÅÏ¢¡£Ëü¸æËßÄãµÚÒ»¸ö´íÎóÌá½»µÄ
SHA-1 Öµ²¢ÇÒÏÔʾһЩÌύ˵Ã÷ÒÔ¼°ÄÄЩÎļþÔÚÄÇ´ÎÌá½»ÀïÐ޸Ĺý£¬ÕâÑùÄã¿ÉÒÔÕÒ³öȱÏݱ»ÒýÈëµÄ¸ùÔ´£º
$ git bisect good b047b02ea83310a70fd603dc8cd7a6cd13d15c04 is first
bad commit commit b047b02ea83310a70fd603dc8cd7a6cd13d15c0 |
µ±ÄãÍê³ÉÖ®ºó£¬ÄãÓ¦¸ÃÔËÐÐgit bisect resetÀ´ÖØÉèÄãµÄHEADµ½Ä㿪ʼǰµÄµØ·½£¬·ñÔòÄã»á´¦ÓÚÒ»¸ö¹îÒìµÄµØ·½£º
ÕâÊǸöÇ¿´óµÄ¹¤¾ß£¬¿ÉÒÔ°ïÖúÄã¼ì²éÉϰٵÄÌá½»£¬ÔÚ¼¸·ÖÖÓÄÚÕÒ³öȱÏÝÒýÈëµÄλÖá£ÊÂʵÉÏ£¬Èç¹ûÄãÓÐÒ»¸ö½Å±¾»áÔÚ¹¤³ÌÕý³£Ê±·µ»Ø0£¬´íÎóʱ·µ»Ø·Ç0µÄ»°£¬Äã¿ÉÒÔÍêÈ«×Ô¶¯µØÖ´ÐÐgit
bisect¡£Ê×ÏÈÄãÐèÒªÌṩÒÑÖªµÄ´íÎóºÍÕýÈ·Ìá½»À´¸æËßËü¶þ·Ö²éÕҵķ¶Î§¡£Äã¿ÉÒÔͨ¹ýbisect startÃüÁîÀ´ÁгöËüÃÇ£¬ÏÈÁгöÒÑÖªµÄ´íÎóÌá½»ÔÙÁгöÒÑÖªµÄÕýÈ·Ìá½»£º
$ git bisect start HEAD v1.0 $ git bisect run test-error.sh |
ÕâÑù»á×Ô¶¯µØÔÚÿһ¸ö¼ì³öµÄÌá½»ÀïÔËÐÐtest-error.shÖ±µ½GitÕÒ³öµÚÒ»¸öÆÆËðµÄÌá½»¡£ÄãÒ²¿ÉÒÔÔËÐÐÏñmake»òÕßmake
tests»òÕßÈκÎÄãËùÓµÓеÄÀ´ÎªÄãÖ´ÐÐ×Ô¶¯»¯µÄ²âÊÔ¡£
6.6 ×ÓÄ£¿é
¾³£ÓÐÕâÑùµÄÊÂÇ飬µ±ÄãÔÚÒ»¸öÏîÄ¿ÉϹ¤×÷ʱ£¬ÄãÐèÒªÔÚÆäÖÐʹÓÃÁíÍâÒ»¸öÏîÄ¿¡£Ò²ÐíËüÊÇÒ»¸öµÚÈý·½¿ª·¢µÄ¿â»òÕßÊÇÄã¶ÀÁ¢¿ª·¢ºÍ²¢ÔÚ¶à¸ö¸¸ÏîÄ¿ÖÐʹÓõġ£Õâ¸ö³¡¾°ÏÂÒ»¸ö³£¼ûµÄÎÊÌâ²úÉúÁË£ºÄãÏ뽫Á½¸öÏîÄ¿µ¥¶À´¦Àíµ«ÊÇÓÖÐèÒªÔÚÆäÖÐÒ»¸öÖÐʹÓÃÁíÍâÒ»¸ö¡£
ÕâÀïÓÐÒ»¸öÀý×Ó¡£¼ÙÉèÄãÔÚ¿ª·¢Ò»¸öÍøÕ¾£¬ÎªÖ®´´½¨AtomÔ´¡£Äã²»Ïë±àдһ¸ö×Ô¼ºµÄAtomÉú³É´úÂ룬¶øÊǾö¶¨Ê¹ÓÃÒ»¸ö¿â¡£Äã¿ÉÄܲ»µÃ²»ÏñCPAN
install»òÕßRuby gemÒ»Ñù°üº¬À´×Ô¹²Ïí¿âµÄ´úÂ룬»òÕß½«´úÂ뿽±´µ½ÄãµÄÏîÄ¿Ê÷ÖС£Èç¹û²ÉÓðüº¬¿âµÄ°ì·¨£¬ÄÇô²»¹ÜÓÃʲô°ì·¨¶¼ºÜÄÑÈ¥¶¨ÖÆÕâ¸ö¿â£¬²¿ÊðËü¾Í¸ü¼ÓÀ§ÄÑÁË£¬ÒòΪÄã±ØÐëÈ·±£Ã¿¸ö¿Í»§¶¼ÓµÓÐÄǸö¿â¡£°Ñ´úÂë°üº¬µ½Äã×Ô¼ºµÄÏîÄ¿ÖдøÀ´µÄÎÊÌâÊÇ£¬µ±ÉÏÓα»ÐÞ¸Äʱ£¬ÈκÎÄã½øÐе͍֯»¯µÄÐ޸ͼºÜÄѹ鲢¡£
Git ͨ¹ý×ÓÄ£¿é´¦ÀíÕâ¸öÎÊÌâ¡£×ÓÄ£¿éÔÊÐíÄ㽫һ¸ö Git ²Ö¿âµ±×÷ÁíÍâÒ»¸öGit²Ö¿âµÄ×ÓĿ¼¡£ÕâÔÊÐíÄã¿Ë¡ÁíÍâÒ»¸ö²Ö¿âµ½ÄãµÄÏîÄ¿Öв¢ÇÒ±£³ÖÄãµÄÌá½»Ïà¶Ô¶ÀÁ¢¡£
×ÓÄ£¿é³õ²½
¼ÙÉèÄãÏë°Ñ Rack ¿â£¨Ò»¸ö Ruby µÄ web ·þÎñÆ÷Íø¹Ø½Ó¿Ú£©¼ÓÈëµ½ÄãµÄÏîÄ¿ÖУ¬¿ÉÄܼÈÒª±£³ÖÄã×Ô¼ºµÄ±ä¸ü£¬ÓÖÒªÑÓÐøÉÏÓεıä¸ü¡£Ê×ÏÈÄãÒª°ÑÍⲿµÄ²Ö¿â¿Ë¡µ½ÄãµÄ×ÓĿ¼ÖС£Äãͨ¹ýgit
submodule add½«ÍⲿÏîÄ¿¼ÓΪ×ÓÄ£¿é£º
$ git submodule add git://github.com/chneukirchen/rack.git rack Initialized empty Git repository in /opt/subtest/rack/.git/ |
ÏÖÔÚÄã¾ÍÔÚÏîÄ¿ÀïµÄrack×ÓĿ¼ÏÂÓÐÁËÒ»¸ö Rack ÏîÄ¿¡£Äã¿ÉÒÔ½øÈëÄǸö×ÓĿ¼£¬½øÐбä¸ü£¬¼ÓÈëÄã×Ô¼ºµÄÔ¶³Ì¿Éд²Ö¿âÀ´ÍÆËÍÄãµÄ±ä¸ü£¬´ÓÔʼ²Ö¿âÀÈ¡ºÍ¹é²¢µÈµÈ¡£Èç¹ûÄãÔÚ¼ÓÈë×ÓÄ£¿éºóÁ¢¿ÌÔËÐÐgit
status£¬Äã»á¿´µ½ÏÂÃæÁ½Ï
$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: .gitmo |
Ê×ÏÈÄã×¢Òâµ½ÓÐÒ»¸ö.gitmodulesÎļþ¡£ÕâÊÇÒ»¸öÅäÖÃÎļþ£¬±£´æÁËÏîÄ¿
URL ºÍÄãÀÈ¡µ½µÄ±¾µØ×ÓĿ¼
$ cat .gitmodules [submodule "rack"] path = rack url = git://github.com/chneukirchen/rack.git |
Èç¹ûÄãÓжà¸ö×ÓÄ£¿é£¬Õâ¸öÎļþÀï»áÓжà¸öÌõÄ¿¡£ºÜÖØÒªµÄÒ»µãÊÇÕâ¸öÎļþ¸úÆäËûÎļþÒ»ÑùÒ²ÊÇ´¦ÓÚ°æ±¾¿ØÖÆÖ®Ïµģ¬¾ÍÏñÄãµÄ.gitignoreÎļþÒ»Ñù¡£Ëü¸úÏîÄ¿ÀïµÄÆäËûÎļþÒ»Ñù¿ÉÒÔ±»ÍÆËͺÍÀÈ¡¡£ÕâÊÇÆäËû¿Ë¡´ËÏîÄ¿µÄÈË»ñÖª×ÓÄ£¿éÏîÄ¿À´Ô´µÄ;¾¶¡£
git statusµÄÊä³öÀïËùÁеÄÁíÒ»ÏîÄ¿ÊÇ rack ¡£Èç¹ûÄãÔËÐÐÔÚÄÇÉÏÃæÔËÐÐgit
diff£¬»á·¢ÏÖһЩÓÐȤµÄ¶«Î÷£º
$ git diff --cached rack diff --git a/rack b/rack new file mode 160000 index 0000000..08d709f /dev/null +++ b/rack @@ -0, |
¾¡¹ÜrackÊÇÄ㹤×÷Ŀ¼ÀïµÄ×ÓĿ¼£¬µ« Git °ÑËüÊÓ×÷Ò»¸ö×ÓÄ£¿é£¬µ±Äã²»ÔÚÄǸöĿ¼Àïʱ²¢²»¼Ç¼ËüµÄÄÚÈÝ¡£È¡¶ø´úÖ®µÄÊÇ£¬Git
½«Ëü¼Ç¼³ÉÀ´×ÔÄǸö²Ö¿âµÄÒ»¸öÌØÊâµÄÌá½»¡£µ±ÄãÔÚÄǸö×ÓĿ¼ÀïÐ޸IJ¢Ìύʱ£¬×ÓÏîÄ¿»á֪ͨÄÇÀïµÄ HEAD ÒѾ·¢Éú±ä¸ü²¢¼Ç¼Ä㵱ǰÕýÔÚ¹¤×÷µÄÄǸöÌá½»£»Í¨¹ýÄÇÑùµÄ·½·¨£¬µ±ÆäËûÈ˿ˡ´ËÏîÄ¿£¬ËûÃÇ¿ÉÒÔÖØÐ´´½¨Ò»ÖµĻ·¾³¡£
ÕâÊǹØÓÚ×ÓÄ£¿éµÄÖØÒªÒ»µã£ºÄã¼Ç¼ËûÃǵ±Ç°È·ÇÐËù´¦µÄÌá½»¡£Äã²»ÄܼǼһ¸ö×ÓÄ£¿éµÄmaster»òÕ߯äËûµÄ·ûºÅÒýÓá£
µ±ÄãÌύʱ£¬»á¿´µ½ÀàËÆÏÂÃæµÄ£º
$ git commit -m 'first commit with submodule rack' [master 0550271] first commit with submodule rack 2 files changed, 4 inse |
×¢Òâ rack ÌõÄ¿µÄ 160000 ģʽ¡£ÕâÔÚGitÖÐÊÇÒ»¸öÌØÊâģʽ£¬»ù±¾Òâ˼ÊÇÄ㽫һ¸öÌá½»¼Ç¼Ϊһ¸öĿ¼Ïî¶ø²»ÊÇ×ÓĿ¼»òÕßÎļþ¡£
Äã¿ÉÒÔ½«rackĿ¼µ±×÷Ò»¸ö¶ÀÁ¢µÄÏîÄ¿£¬±£³ÖÒ»¸öÖ¸Ïò×ÓĿ¼µÄ×îÐÂÌá½»µÄÖ¸ÕëÈ»ºó·´¸´µØ¸üÐÂÉϲãÏîÄ¿¡£ËùÓеÄGitÃüÁî¶¼ÔÚÁ½¸ö×ÓĿ¼Àï¶ÀÁ¢¹¤×÷£º
$ git log -1 commit 0550271328a0038865aad6331e620cd7238601bb Author:
Scott Chacon <schacon@gmail.com> Date: Thu Apr 9 09:03: |
¿Ë¡һ¸ö´ø×ÓÄ£¿éµÄÏîÄ¿
ÕâÀïÄ㽫¿Ë¡һ¸ö´ø×ÓÄ£¿éµÄÏîÄ¿¡£µ±Äã½ÓÊÕµ½ÕâÑùÒ»¸öÏîÄ¿£¬Ä㽫µÃµ½Á˰üº¬×ÓÏîÄ¿µÄĿ¼£¬µ«ÀïÃæÃ»ÓÐÎļþ£º
$ git clone git://github.com/schacon/myproject.git Initialized empty Git repository in /opt/myproject/.git/ remote: Counting |
rackĿ¼´æÔÚÁË£¬µ«ÊÇÊǿյġ£Äã±ØÐëÔËÐÐÁ½¸öÃüÁgit submodule
initÀ´³õʼ»¯ÄãµÄ±¾µØÅäÖÃÎļþ£¬git submodule updateÀ´´ÓÄǸöÏîÄ¿ÀÈ¡ËùÓÐÊý¾Ý²¢¼ì³öÄãÉϲãÏîÄ¿ÀïËùÁеĺÏÊʵÄÌá½»£º
$ git submodule init Submodule 'rack' (git://github.com/chneukirchen/rack.git) registered for path 'rack' $ git submodule upda |
ÏÖÔÚÄãµÄrack×ÓĿ¼¾Í´¦ÓÚÄãÏÈǰÌá½»µÄÈ·ÇÐ״̬ÁË¡£Èç¹ûÁíÍâÒ»¸ö¿ª·¢Õß±ä¸üÁË
rack µÄ´úÂë²¢Ìá½»£¬ÄãÀÈ¡ÄǸöÒýÓÃÈ»ºó¹é²¢Ö®£¬½«µÃµ½ÉÔÓеã¹ÖÒìµÄ¶«Î÷£º
$ git merge origin/master Updating 0550271..85a3eee Fast forward rack | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) |
Äã¹é²¢À´µÄ½ö½öÉÏÊÇÒ»¸öÖ¸ÏòÄãµÄ×ÓÄ£¿éµÄÖ¸Õ룻µ«ÊÇËü²¢²»¸üÐÂÄã×ÓÄ£¿éĿ¼ÀïµÄ´úÂ룬ËùÒÔ¿´ÆðÀ´ÄãµÄ¹¤×÷Ŀ¼´¦ÓÚÒ»¸öÁÙʱ״̬£º
$git diff diff --git a/rack b/rack index 6c5e70b..08d709f 160000 a/rack +++ b/rack@@ -1 +1 @@-Subproject commit 6c5e70 |
ÊÂÇé¾ÍÊÇÕâÑù£¬ÒòΪÄãËùÓµÓеÄ×ÓÄ£¿éµÄÖ¸Õë²¢¶ÔÓ¦ÓÚ×ÓÄ£¿éĿ¼µÄÕæÊµ×´Ì¬¡£ÎªÁËÐÞ¸´ÕâÒ»µã£¬Äã±ØÐëÔÙ´ÎÔËÐÐgit
submodule update£º
$ git submodule update remote: Counting objects: 5, done. remote: Compressing objects: 100% (3/3), done. remote: Total 3 (de |
ÿ´ÎÄã´ÓÖ÷ÏîÄ¿ÖÐÀȡһ¸ö×ÓÄ£¿éµÄ±ä¸ü¶¼±ØÐëÕâÑù×ö¡£¿´ÆðÀ´ºÜ¹Öµ«ÊǹÜÓá£
Ò»¸ö³£¼ûÎÊÌâÊǵ±¿ª·¢Õß¶Ô×ÓÄ£¿é×öÁËÒ»¸ö±¾µØµÄ±ä¸üµ«ÊDz¢Ã»ÓÐÍÆË͵½¹«¹²·þÎñÆ÷¡£È»ºóËûÃÇÌá½»ÁËÒ»¸öÖ¸ÏòÄǸö·Ç¹«¿ª×´Ì¬µÄÖ¸ÕëÈ»ºóÍÆËÍÉϲãÏîÄ¿¡£µ±ÆäËû¿ª·¢ÕßÊÔͼÔËÐÐgit
submodule update£¬ÄǸö×ÓÄ£¿éϵͳ»áÕÒ²»µ½ËùÒýÓõÄÌá½»£¬ÒòΪËüÖ»´æÔÚÓÚµÚÒ»¸ö¿ª·¢ÕßµÄϵͳÖС£Èç¹û·¢ÉúÄÇÖÖÇé¿ö£¬Äã»á¿´µ½ÀàËÆÕâÑùµÄ´íÎó£º
$ git submodule update fatal: reference isn¡¯t a tree: 6c5e70b984a60b3cecd395edd5b48a7575bf58e0 Unable to checkout '6c5e70b9 |
Äã²»µÃ²»È¥²é¿´Ë×îºó±ä¸üÁË×ÓÄ£¿é
$ git log -1 rack commit 85a3eee996800fcfa91e2119372dd4172bf76678 Author:
Scott Chacon <schacon@gmail.com> Date: Thu Apr 9 0 |
È»ºó£¬Äã¸øÄǸö¼Ò»ï·¢µç×ÓÓʼþ˵Ëûһͨ¡£
ÉϲãÏîÄ¿
ÓÐʱºò£¬¿ª·¢ÕßÏë°´ÕÕËûÃǵķÖ×é»ñȡһ¸ö´óÏîÄ¿µÄ×ÓĿ¼µÄ×Ó¼¯¡£Èç¹ûÄãÊÇ´Ó
CVS »òÕß Subversion Ç¨ÒÆ¹ýÀ´µÄ»°Õâ¸öºÜ³£¼û£¬ÔÚÄÇЩϵͳÖÐÄãÒѾ¶¨ÒåÁËÒ»¸öÄ£¿é»òÕß×ÓĿ¼µÄ¼¯ºÏ£¬¶øÄãÏëÑÓÐøÕâÖÖÀàÐ͵Ť×÷Á÷³Ì¡£
ÔÚ Git ÖÐʵÏÖÕâ¸öµÄÒ»¸öºÃ°ì·¨ÊÇÄ㽫ÿһ¸ö×ÓĿ¼¶¼×ö³É¶ÀÁ¢µÄ Git
²Ö¿â£¬È»ºó´´½¨Ò»¸öÉϲãÏîÄ¿µÄ Git ²Ö¿â°üº¬¶à¸ö×ÓÄ£¿é¡£Õâ¸ö°ì·¨µÄÒ»¸öÓÅÊÆÊÇÄã¿ÉÒÔÔÚÉϲãÏîÄ¿ÖÐͨ¹ý±êÇ©ºÍ·ÖÖ§¸üΪÃ÷È·µØ¶¨ÒåÏîĿ֮¼äµÄ¹ØÏµ¡£
×ÓÄ£¿éµÄÎÊÌâ
ʹÓÃ×ÓÄ£¿é²¢·ÇûÓÐÈκÎȱµã¡£Ê×ÏÈ£¬ÄãÔÚ×ÓÄ£¿éĿ¼Öй¤×÷ʱ±ØÐëÏà¶ÔСÐÄ¡£µ±ÄãÔËÐÐgit
submodule update£¬Ëü»á¼ì³öÏîÄ¿µÄÖ¸¶¨°æ±¾£¬µ«ÊDz»ÔÚ·ÖÖ§ÄÚ¡£Õâ½Ð×ö»ñµÃÒ»¸ö·ÖÀëµÄÍ·¡ª¡ªÕâÒâζ×Å
HEAD ÎļþÖ±½ÓÖ¸ÏòÒ»´ÎÌá½»£¬¶ø²»ÊÇÒ»¸ö·ûºÅÒýÓá£ÎÊÌâÔÚÓÚÄãͨ³£²¢²»ÏëÔÚÒ»¸ö·ÖÀëµÄÍ·µÄ»·¾³Ï¹¤×÷£¬ÒòΪ̫ÈÝÒ×¶ªÊ§±ä¸üÁË¡£Èç¹ûÄãÏÈÖ´ÐÐÁËÒ»´Îsubmodule
update£¬È»ºóÔÚÄǸö×ÓÄ£¿éĿ¼Àï²»´´½¨·ÖÖ§¾Í½øÐÐÌá½»£¬È»ºóÔٴδÓÉϲãÏîÄ¿ÀïÔËÐÐgit submodule
updateͬʱ²»½øÐÐÌá½»£¬Git»áºÁÎÞÌáʾµØ¸²¸ÇÄãµÄ±ä¸ü¡£¼¼ÊõÉϽ²Äã²»»á¶ªÊ§¹¤×÷£¬µ«ÊÇÄ㽫ʧȥָÏòËüµÄ·ÖÖ§£¬Òò´Ë»áºÜÄÑÈ¡µ½¡£
ΪÁ˱ÜÃâÕâ¸öÎÊÌ⣬µ±ÄãÔÚ×ÓÄ£¿éĿ¼À﹤×÷ʱӦʹÓÃgit checkout
-b work´´½¨Ò»¸ö·ÖÖ§¡£µ±ÄãÔÙ´ÎÔÚ×ÓÄ£¿éÀï¸üеÄʱºò£¬ËüÈÔÈ»»á¸²¸ÇÄãµÄ¹¤×÷£¬µ«ÊÇÖÁÉÙÄãÓµÓÐÒ»¸ö¿ÉÒÔ»ØËݵÄÖ¸Õë¡£
Çл»´øÓÐ×ÓÄ£¿éµÄ·Ö֧ͬÑùÒ²ºÜÓм¼ÇÉ¡£Èç¹ûÄã´´½¨Ò»¸öеķÖÖ§£¬Ôö¼ÓÁËÒ»¸ö×ÓÄ£¿é£¬È»ºóÇл»»Ø²»´ø¸Ã×ÓÄ£¿éµÄ·ÖÖ§£¬ÄãÈÔÈ»»áÓµÓÐÒ»¸öδ±»×·×ÙµÄ×ÓÄ£¿éµÄĿ¼
$ git checkout -b rack Switched to a new branch "rack" $ git submodule add git@github.com:schacon/rack.git rack Initialized |
Ä㽫²»µÃ²»½«ËüÒÆ×ß»òÕßɾ³ý£¬ÕâÑùµÄ»°µ±ÄãÇл»»ØÈ¥µÄʱºò±ØÐëÖØÐ¿Ë¡Ëü¡ª¡ªÄã¿ÉÄܻᶪʧÄãÎ´ÍÆË͵ı¾µØµÄ±ä¸ü»ò·ÖÖ§¡£
×îºóÒ»¸öÐèÒªÒýÆð×¢ÒâµÄÊǹØÓÚ´Ó×ÓĿ¼Çл»µ½×ÓÄ£¿éµÄ¡£Èç¹ûÄãÒѾ¸ú×ÙÁËÄãÏîÄ¿ÖеÄһЩÎļþµ«ÊÇÏë°ÑËüÃÇÒÆµ½×ÓÄ£¿éÈ¥£¬Äã±ØÐë·Ç³£Ð¡ÐÄ£¬·ñÔòGit»áÉúÄãµÄÆø¡£¼ÙÉèÄãµÄÏîÄ¿ÖÐÓÐÒ»¸ö×ÓĿ¼Àï·ÅÁË
rack µÄÎļþ£¬È»ºóÄãÏ뽫Ëüת»»Îª×ÓÄ£¿é¡£Èç¹ûÄãɾ³ý×ÓĿ¼ȻºóÔËÐÐsubmodule add£¬Git»áÏòÄã´óºð£º
$ rm -Rf rack/ $ git submodule add git@github.com:schacon/rack.git rack 'rack' already exists in the index |
Äã±ØÐëÏȽ«rackĿ¼³·»Ø¡£È»ºóÄã²ÅÄܼÓÈë×ÓÄ£¿é£º
$ git rm -r rack $ git submodule add git@github.com:schacon/rack.git rack Initialized empty Git repository in /opt/testsub/r |
ÏÖÔÚ¼ÙÉèÄãÔÚÒ»¸ö·ÖÖ§ÀïÄÇÑù×öÁË¡£Èç¹ûÄã³¢ÊÔÇл»»ØÒ»¸öÈÔÈ»ÔÚĿ¼Àï±£ÁôÄÇЩÎļþ¶ø²»ÊÇ×ÓÄ£¿éµÄ·Ö֧ʱ¡ª¡ªÄã»áµÃµ½ÏÂÃæµÄ´íÎó£º
$ git checkout master error: Untracked working tree file 'rack/AUTHORS' would be overwritten by merge. |
Äã±ØÐëÏÈÒÆ³ýrack×ÓÄ£¿éµÄĿ¼²ÅÄÜÇл»µ½²»°üº¬ËüµÄ·ÖÖ§£º
$ mv rack /tmp/ $ git checkout master Switched to branch "master" $ ls README rack |
È»ºó£¬µ±ÄãÇл»»ØÀ´£¬Äã»áµÃµ½Ò»¸ö¿ÕµÄrackĿ¼¡£Äã¿ÉÒÔÔËÐÐgit submodule
updateÖØÐ¿Ë¡£¬Ò²¿ÉÒÔ½«/tmp/rackÄ¿Â¼ÖØÐÂÒÆ»Ø¿ÕĿ¼¡£
6.7 ×ÓÊ÷ºÏ²¢
ÏÖÔÚÄãÒѾ¿´µ½ÁË×ÓÄ£¿éϵͳµÄÂé·³Ö®´¦£¬ÈÃÎÒÃÇÀ´¿´Ò»Ï½â¾öÏàͬÎÊÌâµÄÁíһ;¾¶¡£µ±
Git ¹é²¢Ê±£¬Ëü»á¼ì²éÐèÒª¹é²¢µÄÄÚÈÝÈ»ºóÑ¡ÔñÒ»¸öºÏÊʵĹ鲢²ßÂÔ¡£Èç¹ûÄã¹é²¢µÄ·ÖÖ§ÊÇÁ½¸ö£¬GitʹÓÃÒ»¸ö_µÝ¹é_²ßÂÔ¡£Èç¹ûÄã¹é²¢µÄ·ÖÖ§³¬¹ýÁ½¸ö£¬Git²ÉÓÃ_ÕÂÓã_²ßÂÔ¡£ÕâЩ²ßÂÔÊÇ×Ô¶¯Ñ¡ÔñµÄ£¬ÒòΪµÝ¹é²ßÂÔ¿ÉÒÔ´¦Àí¸´ÔÓµÄÈý·¹é²¢Çé¿ö¡ª¡ª±ÈÈç¶àÓÚÒ»¸ö¹²Í¬×æÏȵġª¡ªµ«ÊÇËüÖ»ÄÜ´¦ÀíÁ½¸ö·ÖÖ§µÄ¹é²¢¡£ÕÂÓã¹é²¢¿ÉÒÔ´¦Àí¶à¸ö·ÖÖ§µ«Êǵ«±ØÐë¸ü¼ÓСÐÄÒÔ±ÜÃâ³åÍ»´øÀ´µÄÂé·³£¬Òò´ËËü±»Ñ¡ÖÐ×÷Ϊ¹é²¢Á½¸öÒÔÉÏ·ÖÖ§µÄĬÈϲßÂÔ¡£
ʵ¼ÊÉÏ£¬ÄãÒ²¿ÉÒÔÑ¡ÔñÆäËû²ßÂÔ¡£ÆäÖеÄÒ»¸ö¾ÍÊÇ_×ÓÊ÷_¹é²¢£¬Äã¿ÉÒÔÓÃËüÀ´´¦Àí×ÓÏîÄ¿ÎÊÌâ¡£ÕâÀïÄã»á¿´µ½ÈçºÎ»»ÓÃ×ÓÊ÷¹é²¢µÄ·½·¨À´ÊµÏÖǰһ½ÚÀïËù×öµÄ
rack µÄǶÈë¡£
×ÓÊ÷¹é²¢µÄ˼ÏëÊÇÄãÓµÓÐÁ½¸ö¹¤³Ì£¬ÆäÖÐÒ»¸öÏîĿӳÉäµ½ÁíÍâÒ»¸öÏîÄ¿µÄ×ÓĿ¼ÖУ¬·´¹ýÀ´Ò²Ò»Ñù¡£µ±ÄãÖ¸¶¨Ò»¸ö×ÓÊ÷¹é²¢£¬Git¿ÉÒÔ´ÏÃ÷µØÌ½ÖªÆäÖÐÒ»¸öÊÇÁíÍâÒ»¸öµÄ×ÓÊ÷´Ó¶øÊµÏÖÕýÈ·µÄ¹é²¢¡ª¡ªÕâÏ൱ÉñÆæ¡£
Ê×ÏÈÄ㽫 Rack Ó¦ÓüÓÈëµ½ÏîÄ¿ÖС£Ä㽫 Rack ÏîÄ¿µ±×÷ÄãÏîÄ¿ÖеÄÒ»¸öÔ¶³ÌÒýÓã¬È»ºó½«Ëü¼ì³öµ½Ëü×ÔÉíµÄ·ÖÖ§£º
$ git remote add rack_remote git@github.com:schacon/rack.
git $ git fetch rack_remote warning: no common commits remote: Count |
ÏÖÔÚÔÚÄãµÄrack_branch·ÖÖ§ÖоÍÓÐÁËRackÏîÄ¿µÄ¸ùĿ¼£¬¶øÄã×Ô¼ºµÄÏîÄ¿ÔÚmaster·ÖÖ§ÖС£Èç¹ûÄãÏȼì³öÆäÖÐÒ»¸öÈ»ºóÁíÍâÒ»¸ö£¬Äã»á¿´µ½ËüÃÇÓв»Í¬µÄÏîÄ¿¸ùĿ¼£º
$ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING
README bin example test $ git checkout master Switched to branch "mas |
Òª½« Rack ÏîÄ¿µ±×÷×ÓĿ¼ÀÈ¡µ½ÄãµÄmasterÏîÄ¿ÖС£Äã¿ÉÒÔÔÚ Git
ÖÐÓÃgit read-treeÀ´ÊµÏÖ¡£Äã»áÔÚµÚ9ÕÂѧµ½¸ü¶àÓëread-treeºÍËüµÄÅóÓÑÏà¹ØµÄ¶«Î÷£¬µ±Ç°Äã»áÖªµÀËü¶Áȡһ¸ö·ÖÖ§µÄ¸ùĿ¼Ê÷µ½µ±Ç°µÄÔÝ´æÇøºÍ¹¤×÷Ŀ¼¡£ÄãÖ»ÒªÇл»»ØÄãµÄmaster·ÖÖ§£¬È»ºóÀÈ¡rack·ÖÖ§µ½ÄãÖ÷ÏîÄ¿µÄmaster·ÖÖ§µÄrack×ÓĿ¼£º
$ git read-tree --prefix=rack/ -u rack_branch |
µ±ÄãÌá½»µÄʱºò£¬¿´ÆðÀ´¾ÍÏñÄãÔÚÄǸö×ÓĿ¼ÏÂÓµÓÐRackµÄÎļþ¡ª¡ª¾ÍÏñÄã´ÓÒ»¸ötarballÀ�±´µÄÒ»Ñù¡£ÓÐÒâ˼µÄÊÇÄã¿ÉÒԱȽÏÈÝÒ׵ع鲢ÆäÖÐÒ»¸ö·ÖÖ§µÄ±ä¸üµ½ÁíÍâÒ»¸ö¡£Òò´Ë£¬Èç¹û
Rack ÏîÄ¿¸üÐÂÁË£¬Äã¿ÉÒÔͨ¹ýÇл»µ½ÄǸö·ÖÖ§²¢Ö´ÐÐÀÈ¡À´»ñµÃÉÏÓεıä¸ü£º
$ git checkout rack_branch $ git pull |
È»ºó£¬Äã¿ÉÒÔ½«ÄÇЩ±ä¸ü¹é²¢»ØÄãµÄ master ·ÖÖ§¡£Äã¿ÉÒÔʹÓÃgit
merge -s subtree£¬Ëü»á¹¤×÷µÄºÜºÃ£»µ«ÊÇ Git ͬʱ»á°ÑÀúÊ·¹é²¢µ½Ò»Æð£¬Õâ¿ÉÄܲ»ÊÇÄãÏëÒªµÄ¡£ÎªÁËÀÈ¡±ä¸ü²¢Ô¤ÖÃÌύ˵Ã÷£¬ÐèÒªÔÚ-s
subtree²ßÂÔÑ¡ÏîµÄͬʱʹÓÃ--squashºÍ--no-commitÑ¡Ïî¡£
$ git checkout master $ git merge --squash -s subtree
--no-commit rack_branch Squash commit -- not updating HEAD Automatic me |
ËùÓÐ Rack ÏîÄ¿µÄ±ä¸ü¶¼±»¹é²¢¿ÉÒÔ½øÐб¾µØÌá½»¡£ÄãÒ²¿ÉÒÔ×öÏà·´µÄÊÂÇ顪¡ªÔÚÄãÖ÷·ÖÖ§µÄrackĿ¼Àï½øÐбä¸üÈ»ºó¹é²¢»Ørack_branch·ÖÖ§£¬È»ºó½«ËüÃÇÌá½»¸øÎ¬»¤Õß»òÕßÍÆË͵½ÉÏÓΡ£
ΪÁ˵õ½rack×ÓĿ¼ºÍÄãrack_branch·ÖÖ§µÄÇø±ð¡ª¡ªÒÔ¾ö¶¨ÄãÊÇ·ñÐèÒª¹é²¢ËüÃÇ¡ª¡ªÄã²»ÄÜʹÓÃÒ»°ãµÄdiffÃüÁî¡£¶øÊǶÔÄãÏë±È½ÏµÄ·ÖÖ§ÔËÐÐgit
diff-tree£º
$ git diff-tree -p rack_branch |
»òÕߣ¬ÎªÁ˱ȽÏÄãµÄrack×ÓĿ¼ºÍ·þÎñÆ÷ÉÏÄãÀȡʱµÄmaster·ÖÖ§£¬Äã¿ÉÒÔÔËÐÐ
$ git diff-tree -p rack_remote/master |
6.8 ×ܽá
ÄãÒѾ¿´µ½Á˺ܶà¸ß¼¶µÄ¹¤¾ß£¬ÔÊÐíÄã¸ü¼Ó¾«È·µØ²Ù¿ØÄãµÄÌá½»ºÍÔÝ´æÇø¡£µ±ÄãÅöµ½ÎÊÌâʱ£¬ÄãÓ¦¸Ã¿ÉÒÔºÜÈÝÒ×ÕÒ³öÊÇÄĸö·Ö֧ʲôʱºòÓÉËÒýÈëÁËËüÃÇ¡£Èç¹ûÄãÏëÔÚÏîÄ¿ÖÐʹÓÃ×ÓÏîÄ¿£¬ÄãÒ²ÒѾѧ»áÁËһЩ·½·¨À´Âú×ãÕâЩÐèÇó¡£µ½´Ë£¬ÄãÓ¦¸ÃÄܹ»Íê³ÉÈÕ³£ÀïÄãÐèÒªÓÃÃüÁîÐÐÔÚ
Git ÏÂ×öµÄ´ó²¿·ÖÊÂÇ飬²¢ÇҸе½±È½Ï˳ÊÖ¡£
|