ÏÖÔÚ£¬ÄãÒѾѧϰÁ˹ÜÀí»òÕßά»¤ Git ²Ö¿â£¬ÊµÏÖ´úÂë¿ØÖÆËùÐèµÄ´ó¶àÊýÈÕ³£ÃüÁîºÍ¹¤×÷Á÷³Ì¡£ÄãÒѾÍê³ÉÁ˸ú×ÙºÍÌá½»ÎļþµÄ»ù±¾ÈÎÎñ£¬²¢ÇÒ·¢»ÓÁËÔÝ´æÇøºÍÇáÁ¿¼¶µÄÌØÐÔ·ÖÖ§¼°ºÏ²¢µÄÍþÁ¦¡£
½ÓÏÂÀ´Ä㽫ÁìÂÔµ½Ò»Ð© Git ¿ÉÒÔʵÏֵķdz£Ç¿´óµÄ¹¦ÄÜ£¬ÕâЩ¹¦ÄÜÄã¿ÉÄܲ¢²»»áÔÚÈÕ³£²Ù×÷ÖÐʹÓ㬵«ÔÚijЩʱºòÄãÒ²Ðí»áÐèÒª¡£
6.1 ÐÞ¶©°æ±¾£¨Revision£©Ñ¡Ôñ
Git ÔÊÐíÄãͨ¹ý¼¸ÖÖ·½·¨À´Ö¸Ã÷ÌØ¶¨µÄ»òÕßÒ»¶¨·¶Î§ÄÚµÄÌá½»¡£Á˽âËüÃDz¢²»ÊDZØÐèµÄ£¬µ«ÊÇÁ˽âÒ»ÏÂ×Üû»µ´¦¡£
µ¥¸öÐÞ¶©°æ±¾
ÏÔÈ»Äã¿ÉÒÔʹÓøø³öµÄ SHA-1 ÖµÀ´Ö¸Ã÷Ò»´ÎÌá½»£¬²»¹ýÒ²Óиü¼ÓÈËÐÔ»¯µÄ·½·¨À´×öͬÑùµÄÊ¡£±¾½Ú¸ÅÊöÁËÖ¸Ã÷µ¥¸öÌá½»µÄÖî¶à·½·¨¡£
¼ò¶ÌµÄSHA
Git ºÜ´ÏÃ÷£¬ËüÄܹ»Í¨¹ýÄãÌṩµÄǰ¼¸¸ö×Ö·ûÀ´Ê¶±ðÄãÏëÒªµÄÄÇ´ÎÌá½»£¬Ö»ÒªÄãÌṩµÄÄDz¿·Ö
SHA-1 ²»¶ÌÓÚËĸö×Ö·û£¬²¢ÇÒûÓÐÆçÒ塪¡ªÒ²¾ÍÊÇ˵£¬µ±Ç°²Ö¿âÖÐÖ»ÓÐÒ»¸ö¶ÔÏóÒÔÕâ¶Î SHA-1 ¿ªÍ·¡£
ÀýÈ磬ÏëÒª²é¿´Ò»´ÎÖ¸¶¨µÄÌá½»£¬¼ÙÉèÄãÔËÐÐ git log ÃüÁî²¢ÕÒµ½ÄãÔö¼ÓÁ˹¦ÄܵÄÄÇ´ÎÌá½»£º
$ git log commit 734713bc047d87bf7eac9674765ae793478c50d3 Author:
Scott Chacon <schacon@gmail.com> Date: Fri Jan 2 18:32:33 |
¼ÙÉèÊÇ 1c002dd.... ¡£Èç¹ûÄãÏë git show Õâ´ÎÌá½»£¬ÏÂÃæµÄÃüÁîÊǵȼ۵썼ÙÉè¼ò¶ÌµÄ°æ±¾Ã»ÓÐÆçÒ壩£º
$ git show 1c002dd4b536e7479fe34593e72e6c6c1819e53b $ git show 1c002dd4b536e7479f $ git show 1c002d |
Git ¿ÉÒÔΪÄãµÄ SHA-1 ÖµÉú³É³ö¼ò¶ÌÇÒΨһµÄËõд¡£Èç¹ûÄã´«µÝ --abbrev-commit
¸ø git log ÃüÁÊä³ö½á¹ûÀï¾Í»áʹÓüò¶ÌÇÒΨһµÄÖµ£»ËüĬÈÏʹÓÃÆß¸ö×Ö·ûÀ´±íʾ£¬²»¹ý±ØÒªÊ±ÎªÁ˱ÜÃâ
SHA-1 µÄÆçÒ壬»áÔö¼Ó×Ö·ûÊý£º
$ git log --abbrev-commit --pretty=oneline ca82a6d changed the version
number 085bb3b removed unnecessary test code a11bef0 f |
ͨ³£ÔÚÒ»¸öÏîÄ¿ÖУ¬Ê¹Óð˵½Ê®¸ö×Ö·ûÀ´±ÜÃâ SHA-1 ÆçÒåÒѾ×ã¹»ÁË¡£×î´óµÄ
Git ÏîĿ֮һ£¬Linux Äںˣ¬Ä¿Ç°Ò²Ö»ÐèÒª× 40 ¸ö×Ö·ûÖÐµÄ 12 ¸ö×Ö·ûÀ´±£³ÖΨһÐÔ¡£
¹ØÓÚ SHA-1 µÄ¼ò¶Ì˵Ã÷
Ðí¶àÈË¿ÉÄܻᵣÐÄÒ»¸öÎÊÌ⣺ÔÚËæ»úµÄżȻÇé¿öÏ£¬ÔÚËûÃǵIJֿâÀï»á³öÏÖÁ½¸ö¾ßÓÐÏàͬ
SHA-1 ÖµµÄ¶ÔÏó¡£ÄÇ»áÔõôÑùÄØ£¿
Èç¹ûÄãÕæµÄÏò²Ö¿âÀïÌá½»ÁËÒ»¸ö¸ú֮ǰµÄij¸ö¶ÔÏó¾ßÓÐÏàͬ SHA-1 ÖµµÄ¶ÔÏó£¬Git
½«»á·¢ÏÖ֮ǰµÄÄǸö¶ÔÏóÒѾ´æÔÚÔÚ Git Êý¾Ý¿âÖУ¬²¢ÈÏΪËüÒѾ±»Ð´ÈëÁË¡£Èç¹ûʲôʱºòÄãÏëÔٴμì³öÄǸö¶ÔÏóʱ£¬Äã»á×ÜÊǵõ½ÏÈǰµÄÄǸö¶ÔÏóµÄÊý¾Ý¡£
²»¹ý£¬ÄãÓ¦¸ÃÁ˽⵽£¬ÕâÖÖÇé¿ö·¢ÉúµÄ¸ÅÂÊÊǶàô΢С¡£SHA-1 ÕªÒª³¤¶ÈÊÇ
20 ×Ö½Ú£¬Ò²¾ÍÊÇ 160 λ¡£ÎªÁ˱£Ö¤ÓÐ 50% µÄ¸ÅÂʳöÏÖÒ»´Î³åÍ»£¬ÐèÒª 2^80 ¸öËæ»ú¹þÏ£µÄ¶ÔÏ󣨼ÆËã³åÍ»»úÂʵĹ«Ê½ÊÇp
= (n(n-1)/2) * (1/2^160))¡£2^80 ÊÇ 1.2 x 10^24£¬Ò²¾ÍÊÇÒ»ÒÚÒÚÒÚ£¬ÄÇÊǵØÇòÉÏɳÁ£×ÜÊýµÄ
1200 ±¶¡£
ÏÖÔÚ¾ÙÀý˵һÏÂÔõÑù²ÅÄܲúÉúÒ»´Î SHA-1 ³åÍ»¡£Èç¹ûµØÇòÉÏ 65 ÒÚµÄÈËÀà¶¼ÔÚ±à³Ì£¬Ã¿ÈËÿÃë¶¼ÔÚ²úÉúµÈ¼ÛÓÚÕû¸ö
Linux ÄÚºËÀúÊ·£¨Ò»°ÙÍò¸ö Git ¶ÔÏ󣩵ĴúÂ룬²¢½«Ö®Ìá½»µ½Ò»¸ö¾Þ´óµÄ Git ²Ö¿âÀïÃæ£¬Äǽ«»¨·Ñ
5 ÄêµÄʱ¼ä²Å»á²úÉú×ã¹»µÄ¶ÔÏó£¬Ê¹ÆäÓµÓÐ 50% µÄ¸ÅÂʲúÉúÒ»´Î SHA-1 ¶ÔÏó³åÍ»¡£ÕâÒª±ÈÄã±à³ÌÍŶӵijÉԱͬһ¸öÍíÉÏÔÚ»¥²»Ïà¸ÉµÄÒâÍâÖб»ÀÇÏ®»÷²¢É±ËÀµÄ»úÂÊ»¹ÒªÐ¡¡£
·ÖÖ§ÒýÓÃ
Ö¸Ã÷Ò»´ÎÌá½»µÄ×îÖ±½ÓµÄ·½·¨ÒªÇóÓÐÒ»¸öÖ¸ÏòËüµÄ·ÖÖ§ÒýÓá£ÕâÑù£¬Äã¾Í¿ÉÒÔÔÚÈκÎÐèÒªÒ»¸öÌá½»¶ÔÏó»òÕß
SHA-1 ÖµµÄ Git ÃüÁîÖÐʹÓø÷ÖÖ§Ãû³ÆÁË¡£Èç¹ûÄãÏëÒªÏÔʾһ¸ö·ÖÖ§µÄ×îºóÒ»´ÎÌá½»µÄ¶ÔÏó£¬ÀýÈç¼ÙÉètopic1
·ÖÖ§Ö¸Ïò ca82a6d£¬ÄÇôÏÂÃæµÄÃüÁîÊǵȼ۵ģº
$ git show ca82a6dff817ec66f44342007202690a93763949 $ git show topic1 |
Èç¹ûÄãÏëÖªµÀij¸ö·ÖÖ§Ö¸ÏòÄĸöÌØ¶¨µÄ SHA£¬»òÕßÏë¿´ÈκÎÒ»¸öÀý×ÓÖб»¼òдµÄ
SHA-1£¬Äã¿ÉÒÔʹÓÃÒ»¸ö½Ð×ö rev-parse µÄ Git ̽²â¹¤¾ß¡£ÔÚµÚ 9 ÕÂÄã¿ÉÒÔ¿´µ½¹ØÓÚ̽²â¹¤¾ßµÄ¸ü¶àÐÅÏ¢£»¼òµ¥À´Ëµ£¬rev-parse
ÊÇΪÁ˵ײã²Ù×÷¶ø²»ÊÇÈÕ³£²Ù×÷Éè¼ÆµÄ¡£²»¹ý£¬ÓÐʱÄãÏë¿´ Git ÏÖÔÚµ½µ×´¦ÓÚʲô״̬ʱ£¬Ëü¿ÉÄÜ»áºÜÓÐÓá£ÕâÀïÄã¿ÉÒÔ¶ÔÄãµÄ·ÖÖ§ÔËÖ´ÐÐrev-parse¡£
$ git rev-parse topic1 ca82a6dff817ec66f44342007202690a93763949 |
ÒýÓÃÈÕÖ¾ÀïµÄ¼ò³Æ
ÔÚÄ㹤×÷µÄͬʱ£¬Git ÔÚºǫ́µÄ¹¤×÷Ö®Ò»¾ÍÊDZ£´æÒ»·ÝÒýÓÃÈÕÖ¾¡ª¡ªÒ»·Ý¼Ç¼×î½ü¼¸¸öÔÂÄãµÄ
HEAD ºÍ·ÖÖ§ÒýÓõÄÈÕÖ¾¡£
Äã¿ÉÒÔʹÓà git reflog À´²é¿´ÒýÓÃÈÕÖ¾£º
$ git reflog 734713b... HEAD@{0}: commit: fixed refs handling, added gc auto,
updated d921970... HEAD@{1}: merge phedders/rdo |
ÿ´ÎÄãµÄ·ÖÖ§¶¥¶ËÒòΪijЩÔÒò±»ÐÞ¸Äʱ£¬Git ¾Í»áΪÄ㽫ÐÅÏ¢±£´æÔÚÕâ¸öÁÙʱÀúÊ·¼Ç¼ÀïÃæ¡£ÄãÒ²¿ÉÒÔʹÓÃÕâ·ÝÊý¾ÝÀ´Ö¸Ã÷¸üÔçµÄ·ÖÖ§¡£Èç¹ûÄãÏë²é¿´²Ö¿âÖÐ
HEAD ÔÚÎå´ÎǰµÄÖµ£¬Äã¿ÉÒÔʹÓÃÒýÓÃÈÕÖ¾µÄÊä³öÖеÄ@{n} ÒýÓãº
ÄãÒ²¿ÉÒÔʹÓÃÕâ¸öÓï·¨À´²é¿´Ò»¶¨Ê±¼äǰ·ÖÖ§Ö¸ÏòÄÄÀï¡£ÀýÈ磬Ïë¿´ÄãµÄ master
·ÖÖ§×òÌìÔÚÄÄ£¬Äã¿ÉÒÔÊäÈë
$ git show master@{yesterday} |
Ëü¾Í»áÏÔʾ×òÌì·ÖÖ§µÄ¶¥¶ËÔÚÄÄ¡£ÕâÏî¼¼ÊõÖ»¶Ô»¹ÔÚÄãÒýÓÃÈÕÖ¾ÀïµÄÊý¾ÝÓÐÓã¬ËùÒÔ²»ÄÜÓÃÀ´²é¿´±È¼¸¸öÔÂǰ»¹ÔçµÄÌá½»¡£
ÏëÒª¿´ÀàËÆÓÚ git log Êä³ö¸ñʽµÄÒýÓÃÈÕÖ¾ÐÅÏ¢£¬Äã¿ÉÒÔÔËÐÐ git log -g£º
$ git log -g master commit 734713bc047d87bf7eac9674765ae793478c50d3 Reflog:
master@{0} (Scott Chacon <schacon@gmail.com>) Re |
ÐèҪעÒâµÄÊÇ£¬ÈÕÖ¾ÒýÓÃÐÅÏ¢Ö»´æÔÚÓÚ±¾µØ¡ª¡ªÕâÊÇÒ»¸öÄãÔÚ²Ö¿âÀï×ö¹ýʲôµÄÈÕÖ¾¡£ÆäËûÈ˵IJֿ⿽±´ÀïµÄÒýÓúÍÄãµÄÏàͬ£»¶øÄãпˡһ¸ö²Ö¿âµÄʱºò£¬ÒýÓÃÈÕÖ¾Êǿյģ¬ÒòΪÄãÔÚ²Ö¿âÀﻹûÓвÙ×÷¡£Ö»ÓÐÄã¿Ë¡ÁËÒ»¸öÏîÄ¿ÖÁÉÙÁ½¸öÔ£¬git
show HEAD@{2.months.ago} ²Å»áÓÐÓ᪡ªÈç¹ûÄãÊÇÎå·ÖÖÓǰ¿Ë¡µÄ²Ö¿â£¬½«²»»áÓнá¹û·µ»Ø¡£
׿ÏÈÒýÓÃ
ÁíÒ»ÖÖÖ¸Ã÷ij´ÎÌá½»µÄ³£Ó÷½·¨ÊÇͨ¹ýËüµÄ׿ÏÈ¡£Èç¹ûÄãÔÚÒýÓÃ×îºó¼ÓÉÏÒ»¸ö ^£¬Git
½«ÆäÀí½âΪ´Ë´ÎÌá½»µÄ¸¸Ìá½»¡£ ¼ÙÉèÄãµÄ¹¤³ÌÀúÊ·ÊÇÕâÑùµÄ£º
$ git log --pretty=format:'%h %s' --graph * 734713b fixed refs handling, added gc auto, updated tests * d921970 Merge commit |
ÄÇô£¬Ïë¿´ÉÏÒ»´ÎÌá½»£¬Äã¿ÉÒÔʹÓà HEAD^£¬Òâ˼ÊÇ¡°HEAD µÄ¸¸Ìá½»¡±£º
$ git show HEAD^ commit d921970aadf03b3cf0e71becdaab3147ba71cdef Merge:
1c002dd... 35cfb2b... Author: Scott Chacon <schacon@ |
ÄãÒ²¿ÉÒÔÔÚ ^ ºóÌí¼ÓÒ»¸öÊý×Ö¡ª¡ªÀýÈ磬d921970^2 Òâ˼ÊÇ¡°d921970
µÄµÚ¶þ¸¸Ìá½»¡±¡£ÕâÖÖÓï·¨Ö»Ôںϲ¢ÌύʱÓÐÓã¬ÒòΪºÏ²¢Ìá½»¿ÉÄÜÓжà¸ö¸¸Ìá½»¡£µÚÒ»¸¸Ìá½»ÊÇÄãºÏ²¢Ê±ËùÔÚ·ÖÖ§£¬¶øµÚ¶þ¸¸Ìá½»ÊÇÄãËùºÏ²¢µÄ·ÖÖ§£º
$ git show d921970^ commit 1c002dd4b536e7479fe34593e72e6c6c1819e53b Author:
Scott Chacon <schacon@gmail.com> Date: Thu Dec 1 |
ÁíÍâÒ»¸öÖ¸Ã÷׿ÏÈÌá½»µÄ·½·¨ÊÇ ~¡£ÕâÒ²ÊÇÖ¸ÏòµÚÒ»¸¸Ìá½»£¬ËùÒÔ HEAD~
ºÍ HEAD^ Êǵȼ۵ġ£µ±ÄãÖ¸¶¨Êý×ÖµÄʱºò¾ÍÃ÷ÏÔ²»Ò»ÑùÁË¡£HEAD~2 ÊÇÖ¸¡°µÚÒ»¸¸Ìá½»µÄµÚÒ»¸¸Ìá½»¡±£¬Ò²¾ÍÊÇ¡°×游Ìá½»¡±¡ª¡ªËü»á¸ù¾ÝÄãÖ¸¶¨µÄ´ÎÊý¼ìË÷µÚÒ»¸¸Ìá½»¡£ÀýÈ磬ÔÚÉÏÃæÁгöµÄÀúÊ·¼Ç¼ÀïÃæ£¬HEAD~3
»áÊÇ
$ git show HEAD~3 commit 1c3618887afb5fbcbea25b7c013f4e2114448b8d Author:
Tom Preston-Werner <tom@mojombo.com> Date: Fri Nov |
Ò²¿ÉÒÔд³É HEAD^^^£¬Í¬ÑùÊǵÚÒ»¸¸Ìá½»µÄµÚÒ»¸¸Ìá½»µÄµÚÒ»¸¸Ìá½»£º
$ git show HEAD^^^ commit 1c3618887afb5fbcbea25b7c013f4e2114448b8d Author:
Tom Preston-Werner <tom@mojombo.com> Date: Fri Nov |
ÄãÒ²¿ÉÒÔ»ìºÏʹÓÃÕâЩÓï·¨¡ª¡ªÄã¿ÉÒÔͨ¹ý HEAD~3^2 Ö¸Ã÷ÏÈǰÒýÓõĵڶþ¸¸Ìá½»£¨¼ÙÉèËüÊÇÒ»¸öºÏ²¢Ìá½»£©¡£
Ìá½»·¶Î§
ÏÖÔÚÄãÒѾ¿ÉÒÔÖ¸Ã÷µ¥´ÎµÄÌá½»£¬ÈÃÎÒÃÇÀ´¿´¿´ÔõÑùÖ¸Ã÷Ò»¶¨·¶Î§µÄÌá½»¡£ÕâÔÚÄã¹ÜÀí·ÖÖ§µÄʱºòÓÈÏÔÖØÒª¡ª¡ªÈç¹ûÄãÓкܶà·ÖÖ§£¬Äã¿ÉÒÔÖ¸Ã÷·¶Î§À´È¦¶¨Ò»Ð©ÎÊÌâµÄ´ð°¸£¬±ÈÈ磺¡°Õâ¸ö·ÖÖ§ÉÏÎÒÓÐÄÄЩ¹¤×÷»¹Ã»ºÏ²¢µ½Ö÷·ÖÖ§µÄ£¿¡±
Ë«µã
×î³£ÓõÄÖ¸Ã÷·¶Î§µÄ·½·¨ÊÇË«µãµÄÓï·¨¡£ÕâÖÖÓï·¨Ö÷ÒªÊÇÈà Git Çø·Ö³ö¿É´ÓÒ»¸ö·ÖÖ§ÖлñµÃ¶ø²»ÄÜ´ÓÁíÒ»¸ö·ÖÖ§ÖлñµÃµÄÌá½»¡£ÀýÈ磬¼ÙÉèÄãÓÐÀàËÆÓÚͼ
6-1 µÄÌá½»ÀúÊ·¡£

ͼ 6-1. ·¶Î§Ñ¡ÔñµÄÌá½»ÀúʷʵÀý
ÄãÏëÒª²é¿´ÄãµÄÊÔÑé·ÖÖ§ÉÏÄÄЩûÓб»Ìá½»µ½Ö÷·ÖÖ§£¬ÄÇôÄã¾Í¿ÉÒÔʹÓà master..experiment
À´Èà Git ÏÔʾÕâЩÌá½»µÄÈÕÖ¾¡ª¡ªÕâ¾ä»°µÄÒâ˼ÊÇ¡°ËùÓпɴÓexperiment·ÖÖ§ÖлñµÃ¶ø²»ÄÜ´Ómaster·ÖÖ§ÖлñµÃµÄÌá½»¡±¡£ÎªÁËʹÀý×Ó¼òµ¥Ã÷ÁË£¬ÎÒʹÓÃÁËͼ±êÖÐÌá½»¶ÔÏóµÄ×ÖĸÀ´´úÌæÕæÊµÈÕÖ¾µÄÊä³ö£¬ËùÒÔ»áÏÔʾ£º
$ git log master..experiment D C |
ÁíÒ»·½Ã棬Èç¹ûÄãÏë¿´Ïà·´µÄ¡ª¡ªËùÓÐÔÚ master ¶ø²»ÔÚ experiment
ÖеķÖÖ§¡ª¡ªÄã¿ÉÒÔ½»»»·ÖÖ§µÄÃû×Ö¡£experiment..master ÏÔʾËùÓпÉÔÚmaster »ñµÃ¶øÔÚ
experiment Öв»ÄܵÄÌá½»£º
$ git log experiment..master F E |
ÕâÔÚÄãÏë±£³Ö experiment ·ÖÖ§×îкÍÔ¤ÀÀÄ㽫ºÏ²¢µÄÌá½»µÄʱºòÌØ±ðÓÐÓá£Õâ¸öÓï·¨µÄÁíÒ»ÖÖ³£¼ûÓÃ;ÊDz鿴Ä㽫°ÑÊ²Ã´ÍÆË͵½Ô¶³Ì£º
$ git log origin/master..HEAD |
ÕâÌõÃüÁîÏÔʾÈκÎÔÚÄ㵱ǰ·ÖÖ§É϶ø²»ÔÚÔ¶³Ìorigin ÉϵÄÌá½»¡£Èç¹ûÄãÔËÐÐ
git push ²¢ÇÒµÄÄãµÄµ±Ç°·ÖÖ§ÕýÔÚ¸ú×Ùorigin/master£¬±»git log origin/master..HEAD
ÁгöµÄÌá½»¾ÍÊǽ«±»´«Êäµ½·þÎñÆ÷ÉϵÄÌá½»¡£ ÄãÒ²¿ÉÒÔÁô¿ÕÓï·¨ÖеÄÒ»±ßÀ´Èà Git À´¼Ù¶¨ËüÊÇ HEAD¡£ÀýÈ磬ÊäÈëgit
log origin/master.. ½«µÃµ½ºÍÉÏÃæµÄÀý×ÓÒ»ÑùµÄ½á¹û¡ª¡ª Git ʹÓà HEAD À´´úÌæ²»´æÔÚµÄÒ»±ß¡£
¶àµã
Ë«µãÓï·¨¾ÍÏñËÙ¼ÇÒ»ÑùÓÐÓ㻵«ÊÇÄãÒ²Ðí»áÏëÕë¶ÔÁ½¸öÒÔÉϵķÖÖ§À´Ö¸Ã÷ÐÞ¶©°æ±¾£¬±ÈÈç²é¿´ÄÄЩÌá½»±»°üº¬ÔÚijЩ·ÖÖ§ÖеÄÒ»¸ö£¬µ«ÊDz»ÔÚÄ㵱ǰµÄ·ÖÖ§ÉÏ¡£GitÔÊÐíÄãÔÚÒýÓÃǰʹÓÃ^×Ö·û»òÕß--notÖ¸Ã÷Ä㲻ϣÍûÌá½»±»°üº¬ÆäÖеķÖÖ§¡£Òò´ËÏÂÃæÈý¸öÃüÁîÊǵÈͬµÄ£º
$ git log refA..refB $ git log ^refA refB $ git log refB --not refA |
ÕâÑùºÜºÃ£¬ÒòΪËüÔÊÐíÄãÔÚ²éѯÖÐÖ¸¶¨¶àÓÚÁ½¸öµÄÒýÓ㬶øÕâÊÇË«µãÓï·¨Ëù×ö²»µ½µÄ¡£ÀýÈ磬Èç¹ûÄãÏë²éÕÒËùÓдÓrefA»òrefB°üº¬µÄµ«ÊDz»±»refC°üº¬µÄÌá½»£¬Äã¿ÉÒÔÊäÈëÏÂÃæÖеÄÒ»¸ö
$ git log refA refB ^refC $ git log refA refB --not refC |
Õ⽨Á¢ÁËÒ»¸ö·Ç³£Ç¿´óµÄÐÞ¶©°æ±¾²éѯϵͳ£¬Ó¦¸Ã¿ÉÒÔ°ïÖúÄã½â¾ö·ÖÖ§Àï°üº¬ÁËʲôÕâ¸öÎÊÌâ¡£
Èýµã
×îºóÒ»ÖÖÖ÷ÒªµÄ·¶Î§Ñ¡ÔñÓï·¨ÊÇÈýµãÓï·¨£¬Õâ¸ö¿ÉÒÔÖ¸¶¨±»Á½¸öÒýÓÃÖеÄÒ»¸ö°üº¬µ«ÓÖ²»±»Á½Õßͬʱ°üº¬µÄ·ÖÖ§¡£»Ø¹ýÍ·À´¿´Ò»ÏÂͼ6-1ÀïËùÁеÄÌá½»ÀúÊ·µÄÀý×Ó¡£
Èç¹ûÄãÏë²é¿´master»òÕßexperimentÖаüº¬µÄµ«²»ÊÇÁ½Õß¹²ÓеÄÒýÓã¬Äã¿ÉÒÔÔËÐÐ
$ git log master...experiment F E D C |
Õâ¸öÔٴθø³öÄãÆÕͨµÄlogÊä³öµ«ÊÇÖ»ÏÔʾÄÇËÄ´ÎÌá½»µÄÐÅÏ¢£¬°´ÕÕ´«Í³µÄÌá½»ÈÕÆÚÅÅÁС£
ÕâÖÖÇéÐÎÏ£¬logÃüÁîµÄÒ»¸ö³£ÓòÎÊýÊÇ--left-right£¬Ëü»áÏÔʾÿ¸öÌá½»µ½µ×´¦ÓÚÄÄÒ»²àµÄ·ÖÖ§¡£ÕâʹµÃÊý¾Ý¸ü¼ÓÓÐÓá£
$ git log --left-right master...experiment < F < E > D > C |
ÓÐÁËÒÔÉϹ¤¾ß£¬ÈÃGitÖªµÀÄãÒª²ì¿´ÄÄЩÌá½»¾ÍÈÝÒ׵öàÁË¡£
6.2 ½»»¥Ê½ÔÝ´æ
GitÌṩÁ˺ܶà½Å±¾À´¸¨ÖúijЩÃüÁîÐÐÈÎÎñ¡£ÕâÀÄ㽫¿´µ½Ò»Ð©½»»¥Ê½ÃüÁËüÃǰïÖúÄã·½±ãµØ¹¹½¨Ö»°üº¬Ìض¨×éºÏºÍ²¿·ÖÎļþµÄÌá½»¡£ÔÚÄãÐÞ¸ÄÁËÒ»´óÅúÎļþÈ»ºó¾ö¶¨½«ÕâЩ±ä¸ü·Ö²¼ÔÚ¼¸¸ö¸÷ÓвàÖØµÄÌá½»¶ø²»Êǵ¥¸öÓÖ´óÓÖÂÒµÄÌύʱ£¬ÕâЩ¹¤¾ß·Ç³£ÓÐÓá£ÓÃÕâÖÖ·½·¨£¬Äã¿ÉÒÔÈ·±£ÄãµÄÌá½»ÔÚÂß¼ÉÏ»®·ÖΪÏàÓ¦µÄ±ä¸ü¼¯£¬ÒÔ±ãÓÚ¹©ºÍÄãÒ»Æð¹¤×÷µÄ¿ª·¢ÕßÉóÔÄ¡£Èç¹ûÄãÔËÐÐgit
addʱ¼ÓÉÏ-i»òÕß--interactiveÑ¡ÏGit¾Í½øÈëÁËÒ»¸ö½»»¥Ê½µÄshellģʽ£¬ÏÔʾһЩÀàËÆÓÚÏÂÃæµÄÐÅÏ¢£º
$ git add -i staged unstaged path 1: unchanged +0/-1 TODO 2: unchanged +1/-1 index.html 3: unchanged +5/-1 lib/simplegit.rb |
Äã»á¿´µ½Õâ¸öÃüÁîÒÔÒ»¸öÍêÈ«²»Í¬µÄÊÓͼÏÔʾÁËÄãµÄÔÝ´æÇø¡ª¡ªÖ÷ÒªÊÇÄãͨ¹ýgit
statusµÃµ½µÄÄÇЩÐÅÏ¢µ«ÊÇÉÔ΢¼ò½àµ«ÐÅÏ¢¸ü¼Ó·á¸»Ò»Ð©¡£ËüÔÚ×ó²àÁгöÁËÄãÔÝ´æµÄ±ä¸ü£¬ÔÚÓÒ²àÁгöÁËδ±»ÔÝ´æµÄ±ä¸ü¡£
ÔÚÕâÖ®ºóÊÇÒ»¸öÃüÁîÇø¡£ÕâÀïÄã¿ÉÒÔ×öºÜ¶àÊÂÇ飬°üÀ¨ÔÝ´æÎļþ£¬³·»ØÎļþ£¬Ôݴ沿·ÖÎļþ£¬¼ÓÈëδ±»×·×ÙµÄÎļþ£¬²é¿´ÔÝ´æÎļþµÄ²î±ð¡£
ÔÝ´æºÍ³·»ØÎļþ
Èç¹ûÄãÔÚWhat now>µÄÌáʾºóÊäÈë2»òÕßu£¬Õâ¸ö½Å±¾»áÌáʾÄãÄÇЩÎļþÄãÏëÒªÔݴ棺
What now> 2 staged unstaged path 1: unchanged +0/-1 TODO 2:
unchanged +1/-1 index.html 3: unchanged +5/-1 lib/simplegit.rb U |
Èç¹ûÏëÔÝ´æTODOºÍindex.html£¬Äã¿ÉÒÔÊäÈëÏàÓ¦µÄ±àºÅ£º
Update>> 1,2 staged unstaged path * 1: unchanged +0/-1 TODO * 2:
unchanged +1/-1 index.html 3: unchanged +5/-1 lib/simplegit. |
ÿ¸öÎļþÅԱߵÄ*±íʾѡÖеÄÎļþ½«±»ÔÝ´æ¡£Èç¹ûÄãÔÚupdate>>ÌáʾºóÖ±½ÓÇÃÈë»Ø³µ£¬Git»áÌæÄã°ÑËùÓÐÑ¡ÖеÄÄÚÈÝÔݴ棺
Update>> updated 2 paths *** Commands *** 1: status 2: update 3:
revert 4: add untracked 5: patch 6: diff 7: quit 8: help Wha |
ÏÖÔÚÄã¿ÉÒÔ¿´µ½TODOºÍindex.htmlÎļþ±»ÔÝ´æÁËͬʱsimplegit.rbÎļþÈÔȻδ±»ÔÝ´æ¡£Èç¹ûÕâʱÄãÏëÒª³·»ØTODOÎļþ£¬¾ÍʹÓÃ3»òÕßr£¨´ú±írevert£¬»Ö¸´£©Ñ¡Ï
*** Commands *** 1: status 2: update 3: revert 4: add untracked 5: patch 6: diff 7: quit 8: help What now> 3 staged unstaged |
Ôٴβ鿴GitµÄ״̬£¬Äã»á¿´µ½ÄãÒѾ³·»ØÁËTODOÎļþ
*** Commands *** 1: status 2: update 3: revert 4: add untracked 5: patch 6: diff 7: quit 8: help What now> 1 staged unstaged |
Òª²é¿´ÄãÔÝ´æÄÚÈݵIJîÒ죬Äã¿ÉÒÔʹÓÃ6»òÕßd£¨±íʾdiff£©ÃüÁî¡£Ëü»áÏÔʾÄãÔÝ´æÎļþµÄÁÐ±í£¬Äã¿ÉÒÔÑ¡ÔñÆäÖеö£¬ÏÔʾÆä±»ÔÝ´æµÄ²îÒì¡£Õâ¸úÄãÔÚÃüÁîÐÐÏÂÖ¸¶¨git
diff --cached·Ç³£ÏàËÆ£º
*** Commands *** 1: status 2: update 3: revert 4: add untracked 5: patch 6: diff 7: quit 8: help What now> 6 staged unstaged p |
ͨ¹ýÕâЩ»ù±¾ÃüÁÄã¿ÉÒÔʹÓý»»¥Ê½Ôö¼Óģʽ¸ü¼Ó·½±ãµØ´¦ÀíÔÝ´æÇø¡£
ÔÝ´æ²¹¶¡
Ö»ÈÃGitÔÝ´æÎļþµÄijЩ²¿·Ö¶øºöÂÔÆäËûÒ²ÊÇÓпÉÄܵġ£ÀýÈ磬Äã¶Ôsimplegit.rbÎļþ×÷ÁËÁ½´¦Ð޸ĵ«ÊÇÖ»ÏëÔÝ´æÆäÖÐÒ»¸ö¶øºöÂÔÁíÒ»¸ö£¬ÔÚGitÖÐʵÏÖÕâÒ»µã·Ç³£ÈÝÒס£ÔÚ½»»¥Ê½µÄÌáʾ·ûÏ£¬ÊäÈë5»òÕßp£¨±íʾpatch£¬²¹¶¡£©¡£Git»áѯÎÊÄÄЩÎļþÄãÏ£Íû²¿·ÖÔݴ棻Ȼºó¶ÔÓÚ±»Ñ¡ÖÐÎļþµÄÿһ½Ú£¬Ëû»áÖð¸öÏÔʾÎļþµÄ²îÒìÇø¿é²¢Ñ¯ÎÊÄãÊÇ·ñÏ£ÍûÔÝ´æËûÃÇ£º
diff --git a/lib/simplegit.rb b/lib/simplegit.rb index dd5ecc4..57399e0 100644 --- a/lib/simplegit.rb +++ b/lib/simplegit.rb @ |
´Ë´¦ÄãÓкܶàÑ¡Ôñ¡£ÊäÈë?¿ÉÒÔÏÔʾÁÐ±í£º
Stage this hunk [y,n,a,d,/,j,J,g,e,?]? ? y - stage this hunk n - do not stage this hunk a - stage this and all the remaining h |
Èç¹ûÄãÏëÔÝ´æ¸÷¸öÇø¿é£¬Í¨³£Äã»áÊäÈëy»òÕßn£¬µ«ÊÇÔÝ´æÌض¨ÎļþÀïµÄÈ«²¿Çø¿é»òÕßÔÝÊ±Ìø¹ý¶ÔÒ»¸öÇø¿éµÄ´¦ÀíͬÑùÒ²ºÜÓÐÓá£Èç¹ûÄãÔÝ´æÁËÎļþµÄÒ»¸ö²¿·Ö¶ø±£ÁôÁíÍâÒ»¸ö²¿·Ö²»±»Ôݴ棬ÄãµÄ״̬Êä³ö¿´ÆðÀ´»áÊÇÕâÑù£º
What now> 1 staged unstaged path 1: unchanged +0/-1 TODO 2: +1/-1 nothing index.html 3: +1/-1 +4/-0 lib/simplegit.rb |
simplegit.rbµÄ״̬·Ç³£ÓÐÒâ˼¡£ËüÏÔʾÓм¸Ðб»ÔÝ´æÁË£¬Óм¸ÐÐûÓС£Ä㲿·ÖµØÔÝ´æÁËÕâ¸öÎļþ¡£ÔÚÕâʱ£¬Äã¿ÉÒÔÍ˳ö½»»¥Ê½½Å±¾È»ºóÔËÐÐgit
commitÀ´Ìá½»²¿·ÖÔÝ´æµÄÎļþ¡£
×îºóÄãÒ²¿ÉÒÔ²»Í¨¹ý½»»¥Ê½Ôö¼ÓµÄģʽÀ´ÊµÏÖ²¿·ÖÎļþÔݴ桪¡ªÄã¿ÉÒÔÔÚÃüÁîÐÐÏÂͨ¹ýgit
add -p»òÕßgit add --patchÀ´Æô¶¯Í¬ÑùµÄ½Å±¾¡£
6.3 ´¢²Ø£¨Stashing£©
¾³£ÓÐÕâÑùµÄÊÂÇé·¢Éú£¬µ±ÄãÕýÔÚ½øÐÐÏîÄ¿ÖÐijһ²¿·ÖµÄ¹¤×÷£¬ÀïÃæµÄ¶«Î÷´¦ÓÚÒ»¸ö±È½ÏÔÓÂÒµÄ״̬£¬¶øÄãÏëתµ½ÆäËû·ÖÖ§ÉϽøÐÐһЩ¹¤×÷¡£ÎÊÌâÊÇ£¬Äã²»ÏëÌá½»½øÐÐÁËÒ»°ëµÄ¹¤×÷£¬·ñÔòÒÔºóÄãÎÞ·¨»Øµ½Õâ¸ö¹¤×÷µã¡£½â¾öÕâ¸öÎÊÌâµÄ°ì·¨¾ÍÊÇgit
stashÃüÁî¡£
¡°¡®´¢²Ø¡±¡°¿ÉÒÔ»ñÈ¡Ä㹤×÷Ŀ¼µÄÖмä״̬¡ª¡ªÒ²¾ÍÊÇÄãÐ޸ĹýµÄ±»×·×ÙµÄÎļþºÍÔÝ´æµÄ±ä¸ü¡ª¡ª²¢½«Ëü±£´æµ½Ò»¸öδÍê½á±ä¸üµÄ¶ÑÕ»ÖУ¬ËæÊ±¿ÉÒÔÖØÐÂÓ¦Óá£
´¢²ØÄãµÄ¹¤×÷
ΪÁËÑÝʾÕâÒ»¹¦ÄÜ£¬Äã¿ÉÒÔ½øÈëÄãµÄÏîÄ¿£¬ÔÚһЩÎļþÉϽøÐй¤×÷£¬ÓпÉÄÜ»¹ÔÝ´æÆäÖÐÒ»¸ö±ä¸ü¡£Èç¹ûÄãÔËÐÐ
git status£¬Äã¿ÉÒÔ¿´µ½ÄãµÄÖмä״̬£º
$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: index |
ÏÖÔÚÄãÏëÇл»·ÖÖ§£¬µ«ÊÇÄ㻹²»ÏëÌá½»ÄãÕýÔÚ½øÐÐÖеŤ×÷£»ËùÒÔÄã´¢²ØÕâЩ±ä¸ü¡£ÎªÁËÍù¶ÑÕ»ÍÆËÍÒ»¸öеĴ¢²Ø£¬Ö»ÒªÔËÐÐ
git stash£º
$ git stash Saved working directory and index state \ "WIP on master: 049d078 added the index file" HEAD is now at 049d078 a |
ÄãµÄ¹¤×÷Ŀ¼¾Í¸É¾»ÁË£º
$ git status # On branch master nothing to commit (working directory clean) |
Õâʱ£¬Äã¿ÉÒÔ·½±ãµØÇл»µ½ÆäËû·ÖÖ§¹¤×÷£»ÄãµÄ±ä¸ü¶¼±£´æÔÚÕ»ÉÏ¡£Òª²é¿´ÏÖÓеĴ¢²Ø£¬Äã¿ÉÒÔʹÓÃ
git stash list£º
$ git stash list stash@{0}: WIP on master: 049d078 added the index file stash@{1}: WIP on master: c264051... Revert "added f |
ÔÚÕâ¸ö°¸ÀýÖУ¬Ö®Ç°ÒѾ½øÐÐÁËÁ½´Î´¢²Ø£¬ËùÒÔÄã¿ÉÒÔ·ÃÎʵ½Èý¸ö²»Í¬µÄ´¢²Ø¡£Äã¿ÉÒÔÖØÐÂÓ¦ÓÃÄã¸Õ¸ÕʵʩµÄ´¢²Ø£¬Ëù²ÉÓõÄÃüÁî¾ÍÊÇ֮ǰÔÚÔʼµÄ
stash ÃüÁîµÄ°ïÖúÊä³öÀïÌáʾµÄ£ºgit stash apply¡£Èç¹ûÄãÏëÓ¦ÓøüÔçµÄ´¢²Ø£¬Äã¿ÉÒÔͨ¹ýÃû×ÖÖ¸¶¨Ëü£¬ÏñÕâÑù£ºgit
stash apply stash@{2}¡£Èç¹ûÄã²»Ö¸Ã÷£¬Git ĬÈÏʹÓÃ×î½üµÄ´¢²Ø²¢³¢ÊÔÓ¦ÓÃËü£º
$ git stash apply # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # |
Äã¿ÉÒÔ¿´µ½ Git ÖØÐÂÐÞ¸ÄÁËÄãËù´¢²ØµÄÄÇЩµ±Ê±ÉÐδÌá½»µÄÎļþ¡£ÔÚÕâ¸ö°¸ÀýÀÄã³¢ÊÔÓ¦Óô¢²ØµÄ¹¤×÷Ŀ¼ÊǸɾ»µÄ£¬²¢ÇÒÊôÓÚͬһ·ÖÖ§£»µ«ÊÇÒ»¸ö¸É¾»µÄ¹¤×÷Ŀ¼ºÍÓ¦Óõ½ÏàͬµÄ·ÖÖ§Éϲ¢²»ÊÇÓ¦Óô¢²ØµÄ±ØÒªÌõ¼þ¡£Äã¿ÉÒÔÔÚÆäÖÐÒ»¸ö·ÖÖ§Éϱ£ÁôÒ»·Ý´¢²Ø£¬ËæºóÇл»µ½ÁíÍâÒ»¸ö·ÖÖ§£¬ÔÙÖØÐÂÓ¦ÓÃÕâЩ±ä¸ü¡£ÔÚ¹¤×÷Ŀ¼Àï°üº¬ÒÑÐ޸ĺÍδÌá½»µÄÎļþʱ£¬ÄãÒ²¿ÉÒÔÓ¦Óô¢²Ø¡ª¡ªGit
»á¸ø³ö¹é²¢³åÍ»Èç¹ûÓÐÈκαä¸üÎÞ·¨¸É¾»µØ±»Ó¦Óá£
¶ÔÎļþµÄ±ä¸ü±»ÖØÐÂÓ¦Ó㬵«ÊDZ»ÔÝ´æµÄÎļþûÓÐÖØÐ±»ÔÝ´æ¡£ÏëÄÇÑùµÄ»°£¬Äã±ØÐëÔÚÔËÐÐ git stash
apply ÃüÁîʱ´øÉÏÒ»¸ö --index µÄÑ¡ÏîÀ´¸æËßÃüÁîÖØÐÂÓ¦Óñ»ÔÝ´æµÄ±ä¸ü¡£Èç¹ûÄãÊÇÕâô×öµÄ£¬ÄãÓ¦¸ÃÒѾ»Øµ½ÄãÔÀ´µÄλÖãº
$ git stash apply --index # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # mod |
apply Ñ¡ÏîÖ»³¢ÊÔÓ¦Óô¢²ØµÄ¹¤×÷¡ª¡ª´¢²ØµÄÄÚÈÝÈÔÈ»ÔÚÕ»ÉÏ¡£ÒªÒƳýËü£¬Äã¿ÉÒÔÔËÐÐ
git stash drop£¬¼ÓÉÏÄãÏ£ÍûÒÆ³ýµÄ´¢²ØµÄÃû×Ö£º
$ git stash list stash@{0}: WIP on master: 049d078 added the index file stash@{1}: WIP on master: c264051... Revert "added f |
ÄãÒ²¿ÉÒÔÔËÐÐ git stash pop À´ÖØÐÂÓ¦Óô¢²Ø£¬Í¬Ê±Á¢¿Ì½«Æä´Ó¶ÑÕ»ÖÐÒÆ×ß¡£
Un-applying a Stash
In some use case scenarios you might
want to apply stashed changes, do some work, but then
un-apply those changes that originally came form the
stash. Git does not provide such astash unapply command,
but it is possible to achieve the effect by simply retrieving
the patch associated with a stash and applying it in
reverse:
$ git stash show -p stash@{0} | git apply -R |
Again, if you don¡¯t specify a stash, Git assumes the
most recent stash:
$ git stash show -p | git apply -R |
You may want to create an alias and effectively add
a stash-unapply command to your git. For example:
$ git config --global alias.stash-unapply '!git stash show -p | git apply -R' $ git stash $ #... work work work $ git stash- |
´Ó´¢²ØÖд´½¨·ÖÖ§
Èç¹ûÄã´¢²ØÁËһЩ¹¤×÷£¬ÔÝʱ²»È¥Àí»á£¬È»ºó¼ÌÐøÔÚÄã´¢²Ø¹¤×÷µÄ·ÖÖ§ÉϹ¤×÷£¬ÄãÔÚÖØÐÂÓ¦Óù¤×÷ʱ¿ÉÄÜ»áÅöµ½Ò»Ð©ÎÊÌâ¡£Èç¹û³¢ÊÔÓ¦Óõıä¸üÊÇÕë¶ÔÒ»¸öÄãÄÇÖ®ºóÐ޸ĹýµÄÎļþ£¬Äã»áÅöµ½Ò»¸ö¹é²¢³åÍ»²¢ÇÒ±ØÐëÈ¥»¯½âËü¡£Èç¹ûÄãÏëÓøü·½±ãµÄ·½·¨À´ÖØÐ¼ìÑéÄã´¢²ØµÄ±ä¸ü£¬Äã¿ÉÒÔÔËÐÐgit
stash branch£¬Õâ»á´´½¨Ò»¸öеķÖÖ§£¬¼ì³öÄã´¢²Ø¹¤×÷ʱµÄËù´¦µÄÌá½»£¬ÖØÐÂÓ¦ÓÃÄãµÄ¹¤×÷£¬Èç¹û³É¹¦£¬½«»á¶ªÆú´¢²Ø¡£
$ git stash branch testchanges Switched to a new branch "testchanges" # On branch testchanges # Changes to be committed: # ( |
ÕâÊÇÒ»¸öºÜ°ôµÄ½Ý¾¶À´»Ö¸´´¢²ØµÄ¹¤×÷È»ºóÔÚеķÖÖ§ÉϼÌÐøµ±Ê±µÄ¹¤×÷¡£
|