Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
2 ·Ö²¼Ê½ Git - ÏòÒ»¸öÏîÄ¿¹±Ï×
 
  2052  次浏览      28
 2018-10-11 
 
±à¼­ÍƼö:

±¾ÎÄÀ´×Ôgit-scm.com£¬ÎÒÃǽ«»áÓÉdzÈëÉͨ¹ýһϵÁÐÓÃÀýÀ´½²ÊöÆäÖеÄÿһ¸ö·½Ã棻´ÓÕâЩÀý×ÓÓ¦¸ÃÄܹ»½¨Á¢Êµ¼ÊÖÐÄãÐèÒªµÄÌØ¶¨¹¤×÷Á÷³Ì¡£

ÎÄÕµĵÚһƪ 1·Ö²¼Ê½ Git - ·Ö²¼Ê½¹¤×÷Á÷³Ì

ÎÄÕµĵÚÈýƪ 3 ·Ö²¼Ê½ Git - ά»¤ÏîÄ¿

ÏòÒ»¸öÏîÄ¿¹±Ï×

ÃèÊöÈçºÎÏòÒ»¸öÏîÄ¿¹±Ï×µÄÖ÷ÒªÀ§ÄÑÔÚÓÚÍê³É¹±Ï×Óкܶ಻ͬµÄ·½Ê½¡£ ÒòΪ Git ·Ç³£Áé»î£¬ÈËÃÇ¿ÉÒÔͨ¹ý²»Í¬µÄ·½Ê½À´Ò»Æð¹¤×÷£¬ËùÒÔÃèÊöÓ¦¸ÃÈçºÎ¹±Ïײ¢²»ÊǷdz£×¼È· - ÿһ¸öÏîÄ¿¶¼ÓÐÒ»µã¶ù²»Í¬¡£ Ó°ÏìÒòËØ°üÀ¨»îÔ¾¹±Ï×ÕßµÄÊýÁ¿¡¢Ñ¡ÔñµÄ¹¤×÷Á÷³Ì¡¢ÌύȨÏÞÓë¿ÉÄܰüº¬µÄÍⲿ¹±Ï×·½·¨¡£

µÚÒ»¸öÓ°ÏìÒòËØÊÇ»îÔ¾¹±Ï×ÕßµÄÊýÁ¿ - »ý¼«µØÏòÕâ¸öÏîÄ¿¹±Ï×´úÂëµÄÓû§ÊýÁ¿ÒÔ¼°ËûÃǵűÏׯµÂÊ¡£ ÔÚÐí¶àÇé¿öÏ£¬Äã¿ÉÄÜ»áÓÐÁ½Èý¸ö¿ª·¢ÕßÒ»ÌìÌá½»¼¸´Î£¬¶ÔÓÚ²»»îÔ¾µÄÏîÄ¿¿ÉÄܸüÉÙ¡£ ¶ÔÓÚ´óһЩµÄ¹«Ë¾»òÏîÄ¿£¬¿ª·¢ÕßµÄÊýÁ¿¿ÉÄÜ»áÊÇÉÏǧ£¬Ã¿Ìì¶¼ÓгɰÙÉÏǧ´ÎÌá½»¡£ ÕâºÜÖØÒª£¬ÒòÎªËæ×Å¿ª·¢ÕßÔ½À´Ô½¶à£¬ÔÚÈ·±£ÄãµÄ´úÂëÄܸɾ»µØÓ¦ÓûòÇáËɵغϲ¢Ê±»áÓöµ½¸ü¶àÎÊÌâ¡£ Ìá½»µÄ¸Ä¶¯¿ÉÄܱíÏÖΪ¹ýʱµÄ£¬Ò²¿ÉÄÜÔÚÄãÕýÔÚ×ö¸Ä¶¯»òÕߵȴý¸Ä¶¯±»Åú×¼Ó¦ÓÃʱ±»ºÏ²¢ÈëµÄ¹¤×÷ÑÏÖØË𻵡£ ÈçºÎ±£Ö¤´úÂëʼÖÕÊÇ×îÐµģ¬²¢ÇÒÌύʼÖÕÊÇÓÐЧµÄ£¿

ÏÂÒ»¸öÓ°ÏìÒòËØÊÇÏîĿʹÓõŤ×÷Á÷³Ì¡£ ËüÊÇÖÐÐÄ»¯µÄÂ𣬼´Ã¿Ò»¸ö¿ª·¢Õß¶¼¶ÔÖ÷Ïß´úÂëÓÐÏàͬµÄдÈëȨÏÞ£¿ ÏîÄ¿ÊÇ·ñÓÐÒ»¸ö¼ì²éËùÓв¹¶¡µÄά»¤Õß»òÕûºÏÕߣ¿ ÊÇ·ñËùÓеIJ¹¶¡ÊÇͬÐÐÆÀÉóºóÅú×¼µÄ£¿ ÄãÊÇ·ñ²ÎÓëÁËÄǸö¹ý³Ì£¿ ÊÇ·ñ´æÔÚ¸±¹Ùϵͳ£¬Äã±ØÐëÏȽ«ÄãµÄ¹¤×÷Ìá½»µ½ÉÏÃæ£¿

ÏÂÒ»¸öÎÊÌâÊÇÌύȨÏÞ¡£ ÊÇ·ñÓÐÏîÄ¿µÄдȨÏÞ»áʹÏòÏîÄ¿¹±Ï×ËùÐèµÄÁ÷³ÌÓм«´óµÄ²»Í¬¡£ Èç¹ûûÓÐдȨÏÞ£¬ÏîÄ¿»áÑ¡ÔñºÎÖÖ·½Ê½½ÓÊܹ±Ï׵Ť×÷£¿ ÊÇ·ñÉõÖÁÓÐÒ»¸öÈçºÎ¹±Ï׵Ĺ淶£¿ ÄãÒ»´Î¹±Ï×¶àÉÙ¹¤×÷£¿ Äã¶à¾Ã¹±Ï×Ò»´Î£¿

ËùÓÐÕâЩÎÊÌâ¶¼»áÓ°Ïìʵ¼ÊÈçºÎÏòÒ»¸öÏîÄ¿¹±Ï×£¬ÒÔ¼°¶ÔÄãÀ´ËµÄÄЩ¹¤×÷Á÷³Ì¸üÊʺϻòÕß¿ÉÓᣠÎÒÃǽ«»áÓÉdzÈëÉͨ¹ýһϵÁÐÓÃÀýÀ´½²ÊöÆäÖеÄÿһ¸ö·½Ã棻´ÓÕâЩÀý×ÓÓ¦¸ÃÄܹ»½¨Á¢Êµ¼ÊÖÐÄãÐèÒªµÄÌØ¶¨¹¤×÷Á÷³Ì¡£

Ìá½»×¼Ôò

ÔÚÎÒÃÇ¿ªÊ¼²é¿´Ìض¨µÄÓÃÀýǰ£¬ÕâÀïÓÐÒ»¸ö¹ØÓÚÌá½»ÐÅÏ¢µÄ¿ìËÙ˵Ã÷¡£ ÓÐÒ»¸öºÃµÄ´´½¨Ìá½»µÄ×¼Ôò²¢ÇÒ¼á³ÖʹÓûáÈÃÓë Git ¹¤×÷ºÍÓëÆäËûÈËЭ×÷¸üÈÝÒס£ Git ÏîÄ¿ÌṩÁËÒ»¸öÎĵµ£¬ÆäÖÐÁоÙÁ˹ØÓÚ´´½¨Ìá½»µ½Ìá½»²¹¶¡µÄÈô¸ÉºÃµÄÌáʾ - ¿ÉÒÔÔÚ Git Ô´´úÂëÖÐµÄ Documentation/SubmittingPatches ÎļþÖÐÔĶÁËü¡£

Ê×ÏÈ£¬Äã²»»áÏëÒª°Ñ¿Õ°×´íÎ󣨸ù¾Ý git help diff µÄÃèÊö£¬½áºÏÏÂÃæ¸ø³öµÄͼƬ£¬¿Õ°×´íÎóÊÇÖ¸ÐÐβµÄ¿Õ¸ñ¡¢Tab ÖÆ±í·û£¬ºÍÐÐÊ׿ոñºó¸ú Tab ÖÆ±í·ûµÄÐÐΪ£©Ìá½»ÉÏÈ¥¡£ Git ÌṩÁËÒ»¸ö¼òµ¥µÄ·½Ê½À´¼ì²éÕâµã - ÔÚÌύǰ£¬ÔËÐÐ git diff --check£¬Ëü½«»áÕÒµ½¿ÉÄܵĿհ״íÎó²¢½«ËüÃÇΪÄãÁгöÀ´¡£

Figure 57. git diff --check µÄÊä³ö

Èç¹ûÔÚÌύǰÔËÐÐÄǸöÃüÁ¿ÉÒÔÖªµÀÌá½»ÖÐÊÇ·ñ°üº¬¿ÉÄÜ»áʹÆäËû¿ª·¢ÕßÄÕÅ­µÄ¿Õ°×ÎÊÌâ¡£

½ÓÏÂÀ´£¬³¢ÊÔÈÃÿһ¸öÌá½»³ÉΪһ¸öÂß¼­ÉϵĶÀÁ¢±ä¸ü¼¯¡£ Èç¹û¿ÉÒÔ£¬³¢ÊÔÈøĶ¯¿ÉÒÔÀí½â - ²»ÒªÔÚÕû¸öÖÜÄ©±àÂë½â¾öÎå¸öÎÊÌ⣬ȻºóÔÚÖÜһʱ½«ËüÃÇÌύΪһ¸ö¾Þ´óµÄÌá½»¡£ ¼´Ê¹ÔÚÖÜÄ©ÆÚ¼äÄãÎÞ·¨Ìá½»£¬ÔÚÖÜһʱʹÓÃÔÝ´æÇøÓò½«ÄãµÄ¹¤×÷×îÉÙ²ð·ÖΪÿ¸öÎÊÌâÒ»¸öÌá½»£¬²¢ÇÒΪÿһ¸öÌá½»¸½´øÒ»¸öÓÐÓõÄÐÅÏ¢¡£ Èç¹ûÆäÖÐһЩ¸Ä¶¯ÐÞ¸ÄÁËͬһ¸öÎļþ£¬³¢ÊÔʹÓà git add --patch À´²¿·ÖÔÝ´æÎļþ£¨ÔÚ ½»»¥Ê½ÔÝ´æ ÖÐÓÐÏêϸ½éÉÜ£©¡£ ²»¹ÜÄã×öÒ»¸ö»òÎå¸öÌá½»£¬Ö»ÒªËùÓеĸ͝ÊÇÔÚͬһʱ¿ÌÌí¼ÓµÄ£¬ÏîÄ¿·ÖÖ§Ä©¶ËµÄ¿ìÕÕ¾ÍÊǶÀÁ¢µÄ£¬Ê¹Í¬Ê¿ª·¢Õß±ØÐëÉó²éÄãµÄ¸Ä¶¯Ê±¾¡Á¿ÈÃÊÂÇéÈÝÒ×Щ¡£ µ±ÄãÖ®ºóÐèҪʱÕâ¸ö·½·¨Ò²»áʹÀ­³ö»ò»¹Ô­Ò»¸ö±ä¸ü¼¯¸üÈÝÒ×Щ¡£ ÖØÐ´ÀúÊ· ÃèÊöÁËÖØÐ´ÀúÊ·Óë½»»¥Ê½ÔÝ´æÎļþµÄÈô¸ÉÓÐÓÃµÄ Git ¼¼ÇÉ - ÔÚ½«¹¤×÷·¢Ë͸øÆäËûÈËǰʹÓÃÕâЩ¹¤¾ßÀ´°ïÖúÉú³ÉÒ»¸ö¸É¾»ÓÖÒ×¶®µÄÀúÊ·¡£

×îºóÒ»¼þÒªÀμǵÄÊÂÊÇÌá½»ÐÅÏ¢¡£ ÓÐÒ»¸ö´´½¨ÓÅÖÊÌá½»ÐÅÏ¢µÄϰ¹ß»áʹ Git µÄʹÓÃÓëЭ×÷ÈÝÒ׵Ķࡣ Ò»°ãÇé¿öÏ£¬ÐÅÏ¢Ó¦µ±ÒÔÉÙÓÚ 50 ¸ö×Ö·û£¨25¸öºº×Ö£©µÄµ¥ÐпªÊ¼ÇÒ¼òÒªµØÃèÊö±ä¸ü£¬½Ó×ÅÊÇÒ»¸ö¿Õ°×ÐУ¬ÔÙ½Ó×ÅÊÇÒ»¸ö¸üÏêϸµÄ½âÊÍ¡£ Git ÏîĿҪÇóÒ»¸ö¸üÏêϸµÄ½âÊÍ£¬°üÀ¨×ö¸Ä¶¯µÄ¶¯»úºÍËüµÄʵÏÖÓë֮ǰÐÐΪµÄ¶Ô±È - ÕâÊÇÒ»¸öÖµµÃ×ñÑ­µÄºÃ¹æÔò¡£ ÔÚÕâЩÐÅÏ¢ÖÐʹÓÃÏÖÔÚʱ̬ÆíʹÓïÆøÒ²ÊÇÒ»¸öºÃÏë·¨¡£ »»¾ä»°Ëµ£¬Ê¹ÓÃÃüÁî¡£ ʹÓà ¡°Add tests for.¡± ¶ø²»ÊÇ ¡°I added tests for¡± »ò ¡°Adding tests for,¡±¡£ ÕâÀïÊÇÒ»·Ý×î³õÓÉ Tim Pope дµÄÄ£°å£º

Ð޸ĵÄÕªÒª£¨50 ¸ö×Ö·û»ò¸üÉÙ£©

Èç¹û±ØÒªµÄ»°£¬¼ÓÈë¸üÏêϸµÄ½âÊÍÎÄ×Ö¡£ÔÚ
´ó¸Å 72 ¸ö×Ö·ûµÄʱºò»»ÐС£ÔÚijЩÇéÐÎÏ£¬
µÚÒ»Ðб»µ±×÷Ò»·âµç×ÓÓʼþµÄ±êÌ⣬ʣϵÄ
Îı¾×÷ΪÕýÎÄ¡£·Ö¸ôÕªÒªÓëÕýÎĵĿÕÐÐÊÇ
±ØÐëµÄ£¨³ý·ÇÄãÍêȫʡÂÔÕýÎÄ£©£»Èç¹ûÄ㽫
Á½Õß»ìÔÚÒ»Æð£¬ÄÇôÀàËÆ±ä»ùµÈ¹¤¾ßÎÞ·¨
Õý³£¹¤×÷¡£

¿ÕÐнÓןü½øÒ»²½µÄ¶ÎÂä¡£

- ¾äºÅÒ²ÊÇ¿ÉÒԵġ£

- ÏîÄ¿·ûºÅ¿ÉÒÔʹÓõäÐ͵ÄÁ¬×Ö·û»òÐǺÅ
Ç°ÃæÒ»¸ö¿Õ¸ñ£¬Ö®¼äÓÿÕÐиô¿ª£¬
µ«ÊÇ¿ÉÒÔÒÀ¾Ý²»Í¬µÄ¹ßÀýÓÐËù²»Í¬¡£

Èç¹ûÄãËùÓеÄÌá½»ÐÅÏ¢¿´ÆðÀ´¶¼ÏñÕâÑù£¬¶ÔÄãÓë¸úÄ㹤×÷ÔÚÒ»ÆðµÄÆäËû¿ª·¢ÕßÀ´ËµÊÂÇé»á±äµÃ·Ç³£ÈÝÒס£ Git ÏîÄ¿ÓÐÒ»¸öÁ¼ºÃ¸ñʽ»¯µÄÌá½»ÐÅÏ¢ - ³¢ÊÔÔÚÄǶùÔËÐÐ git log --no-merges À´¿´¿´Æ¯ÁÁµÄ¸ñʽ»¯µÄÏîÄ¿Ìá½»ÀúÊ·ÏñʲôÑù¡£

ÔÚ½ÓÏÂÀ´µÄÀý×ÓÖУ¬ÒÔ¼°¹á´©±¾Êé´ó²¿·Ö£¬³öÓÚ¼ò½àÐÔµÄÔ­Òò±¾Êé²»»áÓÐÏñÕâÑùƯÁÁ¸ñʽµÄÐÅÏ¢£»Ïà·´£¬ÎÒÃÇʹÓà -m Ñ¡ÏîµÄ git commit¡£ ÕÕÎÒÃÇ˵µÄ×ö£¬¶ø²»ÊÇÕÕÎÒÃÇ×öµÄ×ö¡£

˽ÓÐСÐÍÍŶÓ

Äã¿ÉÄÜ»áÓöµ½µÄ×î¼òµ¥µÄÅäÖÃÊÇÓÐÒ»Á½¸öÆäËû¿ª·¢ÕßµÄ˽ÓÐÏîÄ¿¡£ ¡°Ë½ÓС± ÔÚÕâ¸öÉÏÏÂÎÄÖУ¬Òâζ×űÕÔ´ - ²»¿ÉÒÔ´ÓÍâÃæµÄÊÀ½çÖзÃÎʵ½¡£ ÄãºÍÆäËûµÄ¿ª·¢Õß¶¼ÓвֿâµÄÍÆËÍȨÏÞ¡£

ÔÚÕâ¸ö»·¾³Ï£¬¿ÉÒÔ²ÉÓÃÒ»¸öÀàËÆÊ¹Óà Subversion »òÆäËû¼¯ÖÐʽµÄϵͳʱ»áʹÓõŤ×÷Á÷³Ì¡£ ÒÀÈ»¿ÉÒԵõ½ÏñÀëÏßÌá½»¡¢·Ç³£ÈÝÒ×µØÐ½¨·ÖÖ§ÓëºÏ²¢·ÖÖ§µÈ¸ß¼¶¹¦ÄÜ£¬µ«Êǹ¤×÷Á÷³Ì¿ÉÒÔÊǺܼòµ¥µÄ£»Ö÷ÒªµÄÇø±ðÊǺϲ¢·¢ÉúÔÚ¿Í»§¶ËÕâ±ß¶ø²»ÊÇÔÚÌύʱ·¢ÉúÔÚ·þÎñÆ÷ÄDZߡ£ ÈÃÎÒÃÇ¿´¿´µ±Á½¸ö¿ª·¢ÕßÔÚÒ»¸ö¹²Ïí²Ö¿âÖÐÒ»Æð¹¤×÷ʱ»áÊÇʲôÑù×Ó¡£ µÚÒ»¸ö¿ª·¢Õߣ¬John£¬¿Ë¡Á˲ֿ⣬×öÁ˸͝£¬È»ºó±¾µØÌá½»¡£ £¨ÎªÁËËõ¶ÌÕâЩÀý×Ó³¤¶È£¬Ð­ÒéÐÅÏ¢Òѱ»Ì滻Ϊ ...¡££©

# John's Machine
$ git clone john@githost:simplegit.git
Initialized empty Git repository in /home/john/simplegit/.git/
...
$ cd simplegit/
$ vim lib/simplegit.rb
$ git commit -am 'removed invalid default value'
[master 738ee87] removed invalid default value
1 files changed, 1 insertions(+), 1 deletions(-)

µÚ¶þ¸ö¿ª·¢Õߣ¬Jessica£¬×öÁËͬÑùµÄÊÂÇé - ¿Ë¡²Ö¿â²¢Ìá½»ÁËÒ»¸ö¸Ä¶¯£º

# Jessica's Machine
$ git clone jessica@githost:simplegit.git
Initialized empty Git repository in /home/jessica/simplegit/.git/
...
$ cd simplegit/
$ vim TODO
$ git commit -am 'add reset task'
[master fbff5bc] add reset task
1 files changed, 1 insertions(+), 0 deletions(-)

ÏÖÔÚ£¬Jessica °ÑËýµÄ¹¤×÷ÍÆË͵½·þÎñÆ÷ÉÏ£º

# Jessica's Machine
$ git push origin master
...
To jessica@githost:simplegit.git
1edee6b..fbff5bc master -> master

John Ò²³¢ÊÔÍÆËÍËûµÄ¸Ä¶¯£º

# John's Machine
$ git push origin master
To john@githost:simplegit.git
! [rejected] master -> master (non-fast forward)
error: failed to push some refs to 'john@githost:simplegit.git'

²»ÔÊÐí John ÍÆËÍÊÇÒòΪÔÚͬһʱ¼ä Jessica ÒѾ­ÍÆËÍÁË¡£ Èç¹û֮ǰϰ¹ßÓÚÓà Subversion ÄÇôÀí½âÕâµãÌØ±ðÖØÒª£¬ÒòΪÄã»á×¢Òâµ½Á½¸ö¿ª·¢Õß²¢Ã»Óб༭ͬһ¸öÎļþ¡£ ¾¡¹Ü Subversion »á¶Ô±à¼­µÄ²»Í¬ÎļþÔÚ·þÎñÆ÷ÉÏ×Ô¶¯½øÐÐÒ»´ÎºÏ²¢£¬µ« Git ÒªÇóÄãÔÚ±¾µØºÏ²¢Ìá½»¡£ John ±ØÐëץȡ Jessica µÄ¸Ä¶¯²¢ºÏ²¢ËüÃÇ£¬²ÅÄܱ»ÔÊÐíÍÆËÍ¡£

$ git fetch origin
...
From john@githost:simplegit
+ 049d078...fbff5bc master -> origin/master

ÔÚÕâ¸öʱºò£¬John µÄ±¾µØ²Ö¿â¿´ÆðÀ´ÏñÕâÑù£º

Figure 58. John µÄ·Ö²æÀúÊ·

John ÓÐÒ»¸öÒýÓÃÖ¸Ïò Jessica ÍÆËÍÉÏÈ¥µÄ¸Ä¶¯£¬µ«ÊÇËû±ØÐ뽫ËüÃǺϲ¢Èë×Ô¼ºµÄ¹¤×÷ÖÐÖ®ºó²ÅÄܱ»ÔÊÐíÍÆËÍ¡£

$ git merge origin/master
Merge made by recursive.
TODO | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)

ºÏ²¢½øÐеغÜ˳Àû - John µÄÌá½»ÀúÊ·ÏÖÔÚ¿´ÆðÀ´ÏñÕâÑù£º

Figure 59. ºÏ²¢ÁË origin/master Ö®ºó John µÄ²Ö¿â

ÏÖÔÚ£¬John ¿ÉÒÔ²âÊÔ´úÂ룬ȷ±£ËüÒÀÈ»Õý³£¹¤×÷£¬È»ºóËû¿ÉÒ԰Ѻϲ¢µÄй¤×÷ÍÆË͵½·þÎñÆ÷ÉÏ£º

$ git push origin master
...
To john@githost:simplegit.git
fbff5bc..72bbc59 master -> master

×îÖÕ£¬John µÄÌá½»ÀúÊ·¿´ÆðÀ´ÏñÕâÑù£º

Figure 60. ÍÆË͵½ origin ·þÎñÆ÷ºó John µÄÀúÊ·

ÔÚ´ËÆÚ¼ä£¬Jessica ÔÚÒ»¸öÌØÐÔ·ÖÖ§ÉϹ¤×÷¡£ Ëý´´½¨ÁËÒ»¸ö³Æ×÷ issue54 µÄÌØÐÔ·ÖÖ§²¢ÇÒÔÚÄǸö·ÖÖ§ÉÏ×öÁËÈý´ÎÌá½»¡£ Ëý»¹Ã»ÓÐץȡ John µÄ¸Ä¶¯£¬ËùÒÔËýµÄÌá½»ÀúÊ·¿´ÆðÀ´ÏñÕâÑù£º

Figure 61. Jessica µÄÌØÐÔ·ÖÖ§

Jessica ÏëÒªÓë John ͬ²½£¬ËùÒÔËý½øÐÐÁËץȡ²Ù×÷£º

# Jessica's Machine
$ git fetch origin
...
From jessica@githost:simplegit
fbff5bc..72bbc59 master -> origin/master

ÄÇ»áͬʱÀ­È¡ John ÍÆË͵Ť×÷¡£ Jessica µÄÀúÊ·ÏÖÔÚ¿´ÆðÀ´ÏñÕâÑù£º

Figure 62. ץȡ John µÄ¸Ä¶¯ºó Jessica µÄÀúÊ·

Jessica ÈÏΪËýµÄÌØÐÔ·ÖÖ§ÒѾ­×¼±¸ºÃÁË£¬µ«ÊÇËýÏëÒªÖªµÀ±ØÐëºÏ²¢Ê²Ã´½øÈëËýµÄ¹¤×÷²ÅÄÜÍÆËÍ¡£ ËýÔËÐÐ git log À´ÕÒ³ö£º

$ git log --no-merges issue54..origin/master
commit 738ee872852dfaa9d6634e0dea7a324040193016
Author: John Smith <jsmith@example.com>
Date: Fri May 29 16:01:27 2009 -0700

removed invalid default value

issue54..origin/master Óï·¨ÊÇÒ»¸öÈÕÖ¾¹ýÂËÆ÷£¬ÒªÇó Git Ö»ÏÔʾËùÓÐÔÚºóÃæ·ÖÖ§£¨ÔÚ±¾ÀýÖÐÊÇ origin/master£©µ«²»ÔÚÇ°Ãæ·ÖÖ§£¨ÔÚ±¾ÀýÖÐÊÇ issue54£©µÄÌá½»µÄÁÐ±í¡£ ÎÒÃǽ«»áÔÚ Ìá½»Çø¼ä ÖÐÏêϸ½éÉÜÕâ¸öÓï·¨¡£

Ŀǰ£¬ÎÒÃÇ¿ÉÒÔ´ÓÊä³öÖп´µ½ÓÐÒ»¸ö John Éú³ÉµÄµ«ÊÇ Jessica »¹Ã»Óкϲ¢ÈëµÄÌá½»¡£ Èç¹ûËýºÏ²¢ origin/master£¬Ò²¾ÍÊÇ˵½«»áÐÞ¸ÄËýµÄ±¾µØ¹¤×÷µÄÄǸöµ¥¸öÌá½»¡£

ÏÖÔÚ£¬Jessica ¿ÉÒԺϲ¢ËýµÄÌØÐÔ¹¤×÷µ½ËýµÄ master ·ÖÖ§£¬ºÏ²¢ John µÄ¹¤×÷£¨origin/master£©½øÈëËýµÄ master ·ÖÖ§£¬È»ºóÔÙ´ÎÍÆËͻطþÎñÆ÷¡£ Ê×ÏÈ£¬ÎªÁËÕûºÏËùÓÐÕâЩ¹¤×÷ËýÇл»»ØËýµÄ master ·ÖÖ§¡£

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.

Ëý¼È¿ÉÒÔÏȺϲ¢ origin/master Ò²¿ÉÒÔÏȺϲ¢ issue54 - ËüÃǶ¼ÊÇÉÏÓΣ¬ËùÒÔ˳Ðò²¢Ã»ÓйØÏµ¡£ ²»ÂÛËýÑ¡ÔñµÄ˳ÐòÊÇʲô×îÖյĽá¹û¿ìÕÕÊÇÍêȫһÑùµÄ£»Ö»ÊÇÀúÊ·»áÓÐÒ»µãÇá΢µÄÇø±ð¡£ ËýÑ¡ÔñÏȺϲ¢Èë issue54£º

$ git merge issue54
Updating fbff5bc..4af4298
Fast forward
README | 1 +
lib/simplegit.rb | 6 +++++-
2 files changed, 6 insertions(+), 1 deletions(-)

ûÓз¢ÉúÎÊÌ⣻ÈçÄãËù¼ûËüÊÇÒ»´Î¼òµ¥µÄ¿ì½ø¡£ ÏÖÔÚ Jessica ºÏ²¢Èë John µÄ¹¤×÷£¨origin/master£©£º

$ git merge origin/master
Auto-merging lib/simplegit.rb
Merge made by recursive.
lib/simplegit.rb | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

ÿһ¸öÎļþ¶¼¸É¾»µØºÏ²¢ÁË£¬Jessica µÄÀúÊ·¿´ÆðÀ´ÏñÕâÑù£º

Figure 63. ºÏ²¢ÁË John µÄ¸Ä¶¯ºó Jessica µÄÀúÊ·

ÏÖÔÚ origin/master ÊÇ¿ÉÒÔ´Ó Jessica µÄ master ·ÖÖ§µ½´ïµÄ£¬ËùÒÔËýÓ¦¸Ã¿ÉÒԳɹ¦µØÍÆËÍ£¨¼ÙÉèͬһʱ¼ä John ²¢Ã»ÓÐÔÙ´ÎÍÆËÍ£©£º

$ git push origin master
...
To jessica@githost:simplegit.git
72bbc59..8059c15 master -> master

ÿһ¸ö¿ª·¢Õß¶¼Ìá½»Á˼¸´Î²¢³É¹¦µØºÏ²¢ÁËÆäËûÈ˵Ť×÷¡£

Figure 64. ÍÆËÍËùÓеĸ͝»Ø·þÎñÆ÷ºó Jessica µÄÀúÊ·

ÕâÊÇÒ»¸ö×î¼òµ¥µÄ¹¤×÷Á÷³Ì¡£ Äãͨ³£ÔÚÒ»¸öÌØÐÔ·ÖÖ§¹¤×÷Ò»»á¶ù£¬µ±Ëü×¼±¸ºÃÕûºÏʱºÏ²¢»ØÄãµÄ master ·ÖÖ§¡£ µ±ÏëÒª¹²Ïí¹¤×÷ʱ£¬½«ÆäºÏ²¢»ØÄã×Ô¼ºµÄ master ·ÖÖ§£¬Èç¹ûÓи͝µÄ»°È»ºóץȡ²¢ºÏ²¢ origin/master£¬×îÖÕÍÆË͵½·þÎñÆ÷É쵀 master ·ÖÖ§¡£ ͨ³£Ë³ÐòÏñÕâÑù£º

Figure 65. Ò»¸ö¼òµ¥µÄ¶àÈË Git ¹¤×÷Á÷³ÌµÄͨ³£Ê¼þ˳Ðò

˽ÓйÜÀíÍŶÓ

ÔÚ½ÓÏÂÀ´µÄÇéÐÎÖУ¬Äã»á¿´µ½´óÐÍ˽ÓÐÍŶÓÖй±Ï×ÕߵĽÇÉ«¡£ ÔÚÄ㽫ѧϰµ½µÄÕâÖÖ¹¤×÷»·¾³ÖУ¬Ð¡×é»ùÓÚÌØÐÔ½øÐÐЭ×÷£¬ÕâЩÍŶӵűÏ×½«»áÓÉÆäËûÈËÕûºÏ¡£

ÈÃÎÒÃǼÙÉè John Óë Jessica ÔÚÒ»¸öÌØÐÔÉϹ¤×÷£¬Í¬Ê± Jessica Óë Josie ÔÚµÚ¶þ¸öÌØÐÔÉϹ¤×÷¡£ ÔÚ±¾ÀýÖУ¬¹«Ë¾Ê¹ÓÃÁËÒ»ÖÖÕûºÏ-¹ÜÀíÕß¹¤×÷Á÷³Ì£¬¶ÀÁ¢Ð¡×éµÄ¹¤×÷Ö»Äܱ»Ìض¨µÄ¹¤³ÌʦÕûºÏ£¬Ö÷²Ö¿âµÄ master ·ÖÖ§Ö»Äܱ»ÄÇЩ¹¤³Ìʦ¸üС£ ÔÚÕâÖÖÇé¿öÏ£¬ËùÓеŤ×÷¶¼ÊÇÔÚ»ùÓÚÍŶӵķÖÖ§ÉÏÍê³ÉµÄ²¢ÇÒÉÔºó»á±»ÕûºÏÕßÀ­µ½Ò»Æð¡£

ÒòΪ Jessica ÔÚÁ½¸öÌØÐÔÉϹ¤×÷£¬²¢ÇÒÆ½ÐеØÓëÁ½¸ö²»Í¬µÄ¿ª·¢ÕßЭ×÷£¬ÈÃÎÒÃǸúËæËýµÄ¹¤×÷Á÷³Ì¡£ ¼ÙÉèËýÒѾ­¿Ë¡Á˲ֿ⣬Ê×ÏȾö¶¨ÔÚ featureA ÉϹ¤×÷¡£ ËýΪÄǸöÌØÐÔ´´½¨ÁËÒ»¸öзÖÖ§È»ºóÔÚÄÇ×öÁËһЩ¹¤×÷£º

# Jessica's Machine
$ git checkout -b featureA
Switched to a new branch 'featureA'
$ vim lib/simplegit.rb
$ git commit -am 'add limit to log function'
[featureA 3300904] add limit to log function
1 files changed, 1 insertions(+), 1 deletions(-)

ÔÚÕâ¸öʱºò£¬ËýÐèÒª½«¹¤×÷¹²Ïí¸ø John£¬ËùÒÔËýÍÆËÍÁË featureA ·ÖÖ§µÄÌá½»µ½·þÎñÆ÷ÉÏ¡£ Jessica ûÓÐ master ·ÖÖ§µÄÍÆËÍȨÏÞ - Ö»ÓÐÕûºÏÕßÓÐ - ËùÒÔΪÁËÓë John Э×÷±ØÐëÍÆËÍÁíÒ»¸ö·ÖÖ§¡£

$ git push -u origin featureA
...
To jessica@githost:simplegit.git
* [new branch] featureA -> featureA

Jessica Ïò John ·¢Óʼþ¸æËßËûÒѾ­ÍÆËÍÁËһЩ¹¤×÷µ½ featureA ·ÖÖ§ÏÖÔÚ¿ÉÒÔ¿´Ò»¿´¡£ µ±ËýµÈ´ý John µÄ·´À¡Ê±£¬Jessica ¾ö¶¨Óë Josie ¿ªÊ¼ÔÚ featureB ÉϹ¤×÷¡£ ΪÁË¿ªÊ¼¹¤×÷£¬Ëý»ùÓÚ·þÎñÆ÷µÄ master ·ÖÖ§¿ªÊ¼ÁËÒ»¸öзÖÖ§¡£

# Jessica's Machine
$ git fetch origin
$ git checkout -b featureB origin/master
Switched to a new branch 'featureB'

ÏÖÔÚ£¬Jessica ÔÚ featureB ·ÖÖ§ÉÏ´´½¨Á˼¸´ÎÌá½»£º

$ vim lib/simplegit.rb
$ git commit -am 'made the ls-tree function recursive'
[featureB e5b0fdc] made the ls-tree function recursive
1 files changed, 1 insertions(+), 1 deletions(-)
$ vim lib/simplegit.rb
$ git commit -am 'add ls-files'
[featureB 8512791] add ls-files
1 files changed, 5 insertions(+), 0 deletions(-)

Jessica µÄ²Ö¿â¿´ÆðÀ´ÏñÕâÑù£º

Figure 66. Jessica µÄ³õʼÌá½»ÀúÊ·

Ëý×¼±¸ºÃÍÆË͹¤×÷ÁË£¬µ«ÊÇÒ»·âÀ´×Ô Josie µÄÓʼþ¸æÖªÒ»Ð©³õʼ¹¤×÷ÒѾ­±»ÍÆË͵½·þÎñÆ÷É쵀 featureBee ÉÏÁË¡£ Jessica ÔÚÄÜÍÆË͵½·þÎñÆ÷ǰÊ×ÏÈÐèÒª½«ÄÇЩ¸Ä¶¯ÓëËý×Ô¼ºµÄºÏ²¢¡£ È»ºóËý¿ÉÒÔͨ¹ý git fetch ץȡ Josie µÄ¸Ä¶¯£º

$ git fetch origin
...
From jessica@githost:simplegit
* [new branch] featureBee -> origin/featureBee

Jessica ÏÖÔÚ¿ÉÒÔͨ¹ý git merge ½«ÆäºÏ²¢µ½Ëý×öµÄ¹¤×÷ÖУº

$ git merge origin/featureBee
Auto-merging lib/simplegit.rb
Merge made by recursive.
lib/simplegit.rb | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)

Óеã¶ùÎÊÌâ - ËýÐèÒª½«ÔÚ featureB ·ÖÖ§ÉϺϲ¢µÄ¹¤×÷ÍÆË͵½·þÎñÆ÷É쵀 featureBee ·ÖÖ§¡£ Ëý¿ÉÒÔͨ¹ýÖ¸¶¨±¾µØ·ÖÖ§¼ÓÉÏðºÅ£¨:£©¼ÓÉÏÔ¶³Ì·ÖÖ§¸ø git push ÃüÁîÀ´ÕâÑù×ö£º

$ git push -u origin featureB:featureBee
...
To jessica@githost:simplegit.git
fba9af8..cd685d1 featureB -> featureBee

Õâ³Æ×÷Ò»¸ö ÒýÓùæ¸ñ¡£ ²é¿´ ÒýÓùæ¸ñ ÁË½â¹ØÓÚ Git ÒýÓùæ¸ñÓëͨ¹ýËüÃÇ¿ÉÒÔ×öµÄ²»Í¬µÄÊÂÇéµÄÏêϸÌÖÂÛ¡£ ҲҪעÒâ -u ±ê¼Ç£»ÕâÊÇ --set-upstream µÄ¼òд£¬¸Ã±ê¼Ç»áΪ֮ºóÇáËɵØÍÆËÍÓëÀ­È¡ÅäÖ÷ÖÖ§¡£

½ô½Ó×Å£¬John ·¢Óʼþ¸ø Jessica ˵ËûÒѾ­ÍÆËÍÁËһЩ¸Ä¶¯µ½ featureA ·ÖÖ§²¢ÒªÇóËýÈ¥ÑéÖ¤ËüÃÇ¡£ ËýÔËÐÐÒ»¸ö git fetch À´À­È¡ÏÂÄÇЩ¸Ä¶¯£º

$ git fetch origin
...
From jessica@githost:simplegit
3300904..aad881d featureA -> origin/featureA

È»ºó£¬Í¨¹ý git log Ëý¿ÉÒÔ¿´µ½ÄÄЩ·¢ÉúÁ˸ı䣺

$ git log featureA..origin/featureA
commit aad881d154acdaeb2b6b18ea0e827ed8a6d671e6
Author: John Smith <jsmith@example.com>
Date: Fri May 29 19:57:33 2009 -0700

changed log output to 30 from 25

×îÖÕ£¬ËýºÏ²¢ John µÄ¹¤×÷µ½Ëý×Ô¼ºµÄ featureA ·ÖÖ§£º

$ git checkout featureA
Switched to branch 'featureA'
$ git merge origin/featureA
Updating 3300904..aad881d
Fast forward
lib/simplegit.rb | 10 +++++++++-
1 files changed, 9 insertions(+), 1 deletions(-)

Jessica ÏëÒªÇá΢µ÷ÕûһЩ¶«Î÷£¬ËùÒÔËýÔÙ´ÎÌύȻºó½«ÆäÍÆËͻطþÎñÆ÷£º

$ git commit -am 'small tweak'
[featureA 774b3ed] small tweak
1 files changed, 1 insertions(+), 1 deletions(-)
$ git push
...
To jessica@githost:simplegit.git
3300904..774b3ed featureA -> featureA

Jessica µÄÌá½»ÀúÊ·ÏÖÔÚ¿´ÆðÀ´ÏñÕâÑù£º

Figure 67. ÔÚÒ»¸öÌØÐÔ·ÖÖ§Ìá½»ºó Jessica µÄÀúÊ·

Jessica¡¢Josie Óë John ֪ͨÕûºÏÕßÔÚ·þÎñÆ÷É쵀 featureA Óë featureBee ·ÖÖ§×¼±¸ºÃÕûºÏµ½Ö÷ÏßÖÐÁË¡£ ÔÚÕûºÏÕߺϲ¢ÕâЩ·ÖÖ§µ½Ö÷Ïߺó£¬Ò»´Îץȡ»áÄÃÏÂÀ´Ò»¸öеĺϲ¢Ìá½»£¬Ê¹ÀúÊ·¿´ÆðÀ´ÏñÕâÑù£º

Figure 68. ºÏ²¢ÁË Jessica µÄÁ½¸öÌØÐÔ·ÖÖ§ºóËýµÄÀúÊ·

Ðí¶àÍŶÓÇл»µ½ Git ÊÇÒòΪÕâÒ»ÔÊÐí¶à¸öÍŶӲ¢Ðй¤×÷¡¢²¢ÔÚÖ®ºóºÏ²¢²»Í¬¹¤×÷µÄÄÜÁ¦¡£ ÍŶÓÖиüСһЩµÄ×ÓС×é¿ÉÒÔͨ¹ýÔ¶³Ì·Ö֧Э×÷¶ø²»±ØÓ°Ïì»ò·Á°­Õû¸öÍŶӵÄÄÜÁ¦ÊÇ Git µÄÒ»¸ö¾Þ´óÓÅÊÆ¡£ ÔÚÕâ¶ù¿´µ½µÄ¹¤×÷Á÷³Ì˳ÐòÀàËÆÕâÑù£º

Figure 69. ÕâÖÖ¹ÜÀíÍŶӹ¤×÷Á÷³ÌµÄ»ù±¾Ë³Ðò

ÅÉÉúµÄ¹«¿ªÏîÄ¿

Ïò¹«¿ªÏîÄ¿×ö¹±Ï×ÓÐÒ»µã¶ù²»Í¬¡£ ÒòΪûÓÐȨÏÞÖ±½Ó¸üÐÂÏîÄ¿µÄ·ÖÖ§£¬Äã±ØÐëÓÃÆäËû°ì·¨½«¹¤×÷¸øÎ¬»¤Õß¡£ µÚÒ»¸öÀý×ÓÃèÊöÔÚÖ§³Ö¼òµ¥ÅÉÉúµÄ Git ÍйÜÉÏʹÓÃÅÉÉúÀ´×ö¹±Ïס£ Ðí¶àÍйÜÕ¾µãÖ§³ÖÕâ¸ö¹¦ÄÜ£¨°üÀ¨ GitHub¡¢BitBucket¡¢Google Code¡¢repo.or.cz µÈµÈ£©£¬Ðí¶àÏîĿά»¤Õ߯ÚÍûÕâÖÖ·ç¸ñµÄ¹±Ïס£ ÏÂÒ»½Ú»áÌÖÂÛÆ«ºÃͨ¹ýÓʼþ½ÓÊܹ±Ïײ¹¶¡µÄÏîÄ¿¡£

Ê×ÏÈ£¬Äã¿ÉÄÜÏëÒª¿Ë¡Ö÷²Ö¿â£¬Îª¼Æ»®¹±Ï׵IJ¹¶¡»ò²¹¶¡ÐòÁд´½¨Ò»¸öÌØÐÔ·ÖÖ§£¬È»ºóÔÚÄǶù×ö¹¤×÷¡£ ˳Ðò¿´ÆðÀ´»ù±¾ÏñÕâÑù£º

$ git clone (url)
$ cd project
$ git checkout -b featureA
# (work)
$ git commit
# (work)
$ git commit

Note        Äã¿ÉÄÜ»áÏëҪʹÓà rebase -i À´½«¹¤×÷ѹËõ³ÉÒ»¸öµ¥¶ÀµÄÌá½»£¬»òÕßÖØÅÅÌá½»ÖеŤ×÷ʹ²¹¶¡¸üÈÝÒ×±»Î¬»¤ÕßÉóºË - ²é¿´ ÖØÐ´ÀúÊ· ÁË½â¹ØÓÚ½»»¥Ê½±ä»ùµÄ¸ü¶àÐÅÏ¢¡£

µ±ÄãµÄ·ÖÖ§¹¤×÷Íê³Éºó×¼±¸½«Æä¹±Ï×»ØÎ¬»¤Õߣ¬È¥Ô­Ê¼ÏîÄ¿ÖÐÈ»ºóµã»÷ ¡°Fork¡± °´Å¥£¬´´½¨Ò»·Ý×Ô¼ºµÄ¿ÉдµÄÏîÄ¿ÅÉÉú²Ö¿â¡£ È»ºóÐèÒªÌí¼ÓÕâ¸öвֿâ URL ΪµÚ¶þ¸öÔ¶³Ì²Ö¿â£¬ÔÚ±¾ÀýÖгÆ×÷ myfork£º

$ git remote add myfork (url)

È»ºóÐèÒªÍÆË͹¤×÷µ½ÉÏÃæ¡£ Ïà¶ÔÓںϲ¢µ½Ö÷·ÖÖ§ÔÙÍÆËÍÉÏÈ¥£¬ÍÆËÍÄãÕýÔÚ¹¤×÷µÄÌØÐÔ·ÖÖ§µ½²Ö¿âÉϸü¼òµ¥¡£ Ô­ÒòÊǹ¤×÷Èç¹û²»±»½ÓÊÜ»òÕßÊDZ»¼ðÑ¡µÄ£¬¾Í²»±Ø»ØÍËÄãµÄ master ·ÖÖ§¡£ Èç¹ûά»¤Õߺϲ¢¡¢±ä»ù»ò¼ðÑ¡ÄãµÄ¹¤×÷£¬²»¹ÜÔõÑùÄã×îÖÕ»áͨ¹ýÀ­È¡ËûÃǵIJֿâÕÒ»ØÀ´ÄãµÄ¹¤×÷¡£

$ git push -u myfork featureA

µ±¹¤×÷ÒѾ­±»ÍÆË͵½ÄãµÄÅÉÉúºó£¬ÄãÐèҪ֪ͨά»¤Õß¡£ Õâͨ³£±»³Æ×÷Ò»¸öÀ­È¡ÇëÇó£¨pull request£©£¬Äã¼È¿ÉÒÔͨ¹ýÍøÕ¾Éú³ÉËü - GitHub ÓÐËü×Ô¼ºµÄ Pull Request »úÖÆ£¬ÎÒÃǽ«»áÔÚ GitHub ½éÉÜ - Ò²¿ÉÒÔÔËÐÐ git request-pull ÃüÁîÈ»ºóÊÖ¶¯µØ½«Êä³ö·¢Ë͵ç×ÓÓʼþ¸øÏîÄ¿µÄά»¤Õß¡£

request-pull ÃüÁî½ÓÊÜÌØÐÔ·ÖÖ§À­ÈëµÄ»ù´¡·ÖÖ§£¬ÒÔ¼°ËüÃÇÀ­ÈëµÄ Git ²Ö¿â URL£¬Êä³öÇëÇóÀ­ÈëµÄËùÓÐÐ޸ĵÄ×ܽᡣ ÀýÈ磬Jessica ÏëÒª·¢Ë͸ø John Ò»¸öÀ­È¡ÇëÇó£¬ËýÒѾ­ÔÚ¸Õ¸ÕÍÆË͵ķÖÖ§ÉÏ×öÁËÁ½´ÎÌá½»¡£Ëý¿ÉÒÔÔËÐÐÕâ¸ö£º

$ git request-pull origin/master myfork
The following changes since commit 1edee6b1d61823a2de3b09c160d7080b8d1b3a40:
John Smith (1):
added a new function

are available in the git repository at:

git://githost/simplegit.git featureA

Jessica Smith (2):
add limit to log function
change log output to 30 from 25

lib/simplegit.rb | 10 +++++++++-
1 files changed, 9 insertions(+), 1 deletions(-)

Õâ¸öÊä³ö¿ÉÒÔ±»·¢Ë͸øÎ¬»¤Õß - Ëü¸æËßËûÃǹ¤×÷ÊÇ´ÓÄĸö·ÖÖ§¿ªÊ¼¡¢¹éÄɵÄÌá½»Óë´ÓÄÄÀïÀ­ÈëÕâЩ¹¤×÷¡£

ÔÚÒ»¸öÄã²»ÊÇά»¤ÕßµÄÏîÄ¿ÉÏ£¬Í¨³£ÓÐÒ»¸ö×ÜÊǸú×Ù origin/master µÄ master ·ÖÖ§»áºÜ·½±ã£¬ÔÚÌØÐÔ·ÖÖ§ÉÏ×ö¹¤×÷ÊÇÒòΪÈç¹ûËüÃDZ»¾Ü¾øÊ±Äã¿ÉÒÔÇáËɵضªÆú¡£ Èç¹ûͬһʱ¼äÖ÷²Ö¿âÒÆ¶¯ÁËÈ»ºóÄãµÄÌá½»²»ÔÙÄܸɾ»µØÓ¦Óã¬ÄÇôʹ¹¤×÷Ö÷Ìâ¶ÀÁ¢ÓÚÌØÐÔ·ÖÖ§Ò²»áʹÄã±ä»ù£¨rebase£©¹¤×÷ʱ¸üÈÝÒס£ ÀýÈ磬ÄãÏëÒªÌṩµÚ¶þ¸öÌØÐÔ¹¤×÷µ½ÏîÄ¿£¬²»Òª¼ÌÐøÔÚ¸Õ¸ÕÍÆË͵ÄÌØÐÔ·ÖÖ§ÉϹ¤×÷ - ´ÓÖ÷²Ö¿âµÄ master ·ÖÖ§ÖØÐ¿ªÊ¼£º

$ git checkout -b featureB origin/master
# (work)
$ git commit
$ git push myfork featureB
# (email maintainer)
$ git fetch origin

ÏÖÔÚ£¬Ã¿Ò»¸öÌØÐÔ¶¼±£´æÔÚÒ»¸öÖü²Ø¿âÖÐ - ÀàËÆÓÚ²¹¶¡¶ÓÁÐ - ¿ÉÒÔÖØÐ´¡¢±ä»ùÓëÐ޸Ķø²»»áÈÃÌØÐÔ»¥Ïà¸ÉÉæ»ò»¥ÏàÒÀÀµ£¬ÏñÕâÑù£º

Figure 70. featureB µÄ³õʼÌá½»ÀúÊ·

¼ÙÉèÏîĿά»¤ÕßÒѾ­À­È¡ÁËÒ»´®ÆäËû²¹¶¡£¬È»ºó³¢ÊÔÀ­È¡ÄãµÄµÚÒ»¸ö·ÖÖ§£¬µ«ÊÇûÓиɾ»µØºÏ²¢¡£ ÔÚÕâÖÖÇé¿öÏ£¬¿ÉÒÔ³¢ÊÔ±ä»ùÄǸö·ÖÖ§µ½ origin/master µÄ¶¥²¿£¬ÎªÎ¬»¤Õß½â¾ö³åÍ»£¬È»ºóÖØÐÂÌá½»ÄãµÄ¸Ä¶¯£º

$ git checkout featureA
$ git rebase origin/master
$ git push -f myfork featureA

ÕâÑù»áÖØÐ´ÄãµÄÀúÊ·£¬ÏÖÔÚ¿´ÆðÀ´ÏñÊÇ featureA ¹¤×÷Ö®ºóµÄÌá½»ÀúÊ·

Figure 71. featureA ¹¤×÷Ö®ºóµÄÌá½»ÀúÊ·

ÒòΪÄ㽫·ÖÖ§±ä»ùÁË£¬ËùÒÔ±ØÐëÎªÍÆËÍÃüÁîÖ¸¶¨ -f Ñ¡ÏÕâÑù²ÅÄܽ«·þÎñÆ÷ÉÏÓÐÒ»¸ö²»ÊÇËüµÄºó´úµÄÌá½»µÄ featureA ·ÖÖ§Ìæ»»µô¡£ Ò»¸öÌæ´úµÄÑ¡ÏîÊÇÍÆËÍÕâ¸öй¤×÷µ½·þÎñÆ÷ÉϵÄÒ»¸ö²»Í¬·ÖÖ§£¨¿ÉÄܳÆ×÷ featureAv2£©¡£

ÈÃÎÒÃÇ¿´Ò»¸ö¸üÓпÉÄܵÄÇé¿ö£ºÎ¬»¤Õß¿´µ½ÁËÄãµÄµÚ¶þ¸ö·ÖÖ§ÉϵŤ×÷²¢ÇÒºÜϲ»¶ÆäÖеĸÅÄµ«ÊÇÏëÒªÄãÐÞ¸ÄÒ»ÏÂʵÏÖµÄϸ½Ú¡£ ÄãÒ²¿ÉÒÔÀûÓÃÕâ´Î»ú»á½«¹¤×÷»ùÓÚÏîÄ¿ÏÖÔÚµÄ master ·ÖÖ§¡£ Äã´ÓÏÖÔÚµÄ origin/master ·ÖÖ§¿ªÊ¼Ò»¸öзÖÖ§£¬ÔÚÄǶùѹËõ featureB µÄ¸Ä¶¯£¬½â¾öÈκγåÍ»£¬¸Ä±äʵÏÖ£¬È»ºóÍÆËÍËüΪһ¸öзÖÖ§¡£

$ git checkout -b featureBv2 origin/master
$ git merge --squash featureB
# (change implementation)
$ git commit
$ git push myfork featureBv2

 

--squash Ñ¡Ïî½ÓÊܱ»ºÏ²¢µÄ·ÖÖ§ÉϵÄËùÓй¤×÷£¬²¢½«ÆäѹËõÖÁÒ»¸ö±ä¸ü¼¯£¬Ê¹²Ö¿â±ä³ÉÒ»¸öÕæÕýµÄºÏ²¢·¢ÉúµÄ״̬£¬¶ø²»»áÕæµÄÉú³ÉÒ»¸öºÏ²¢Ìá½»¡£ ÕâÒâζ×ÅÄãµÄδÀ´µÄÌá½»½«»áÖ»ÓÐÒ»¸ö¸¸Ìá½»£¬²¢ÔÊÐíÄãÒýÈëÁíÒ»¸ö·ÖÖ§µÄËùÓи͝£¬È»ºóÔڼǼһ¸öÐÂÌύǰ×ö¸ü¶àµÄ¸Ä¶¯¡£ ͬÑù --no-commit Ñ¡ÏîÔÚĬÈϺϲ¢¹ý³ÌÖпÉÒÔÓÃÀ´ÑÓ³ÙÉú³ÉºÏ²¢Ìá½»¡£

ÏÖÔÚÄã¿ÉÒÔ¸øÎ¬»¤Õß·¢ËÍÒ»ÌõÏûÏ¢£¬±íʾÄãÒѾ­×öÁËÒªÇóµÄÐÞ¸ÄÈ»ºóËûÃÇ¿ÉÒÔÔÚÄãµÄ featureBv2 ·ÖÖ§ÉÏÕÒµ½ÄÇЩ¸Ä¶¯¡£

Figure 72. featureBv2 ¹¤×÷Ö®ºóµÄÌá½»ÀúÊ·

ͨ¹ýÓʼþµÄ¹«¿ªÏîÄ¿

Ðí¶àÏîÄ¿½¨Á¢Á˽ÓÊܲ¹¶¡µÄÁ÷³Ì - ÐèÒª¼ì²éÿһ¸öÏîÄ¿µÄÌØ¶¨¹æÔò£¬ÒòΪËüÃÇÖ®¼äÓÐÇø±ð¡£ ÒòΪÓм¸¸öÀúÊ·ÓÆ¾ÃµÄ¡¢´óÐ͵ÄÏîÄ¿»áͨ¹ýÒ»¸ö¿ª·¢ÕßµÄÓʼþÁбí½ÓÊܲ¹¶¡£¬ÏÖÔÚÎÒÃǽ«»áͨ¹ýÒ»¸öÀý×ÓÀ´ÑÝʾ¡£

¹¤×÷Á÷³ÌÓë֮ǰµÄÓÃÀýÊÇÀàËÆµÄ - ÄãΪ¹¤×÷µÄÿһ¸ö²¹¶¡ÐòÁд´½¨ÌØÐÔ·ÖÖ§¡£ Çø±ðÊÇÈçºÎÌá½»ËüÃǵ½ÏîÄ¿ÖС£ Éú³Éÿһ¸öÌá½»ÐòÁеĵç×ÓÓʼþ°æ±¾È»ºóÓʼÄËüÃǵ½¿ª·¢ÕßÓʼþÁÐ±í£¬¶ø²»ÊÇÅÉÉúÏîĿȻºóÍÆË͵½Äã×Ô¼ºµÄ¿Éд°æ±¾¡£

$ git checkout -b topicA
# (work)
$ git commit
# (work)
$ git commit

ÏÖÔÚÓÐÁ½¸öÌá½»Òª·¢Ë͵½ÓʼþÁÐ±í¡£ ʹÓà git format-patch À´Éú³É¿ÉÒÔÓʼĵ½ÁбíµÄ mbox ¸ñʽµÄÎļþ - Ëü½«Ã¿Ò»¸öÌύת»»ÎªÒ»·âµç×ÓÓʼþ£¬Ìá½»ÐÅÏ¢µÄµÚÒ»ÐÐ×÷ΪÖ÷Ì⣬ʣÓàÐÅÏ¢ÓëÌá½»ÒýÈëµÄ²¹¶¡×÷ΪÕýÎÄ¡£ ËüÓÐÒ»¸öºÃ´¦ÊÇÊÇʹÓà format-patch Éú³ÉµÄÒ»·âµç×ÓÓʼþÓ¦ÓõÄÌá½»ÕýÈ·µØ±£ÁôÁËËùÓеÄÌá½»ÐÅÏ¢¡£

$ git format-patch -M origin/master
0001-add-limit-to-log-function.patch
0002-changed-log-output-to-30-from-25.patch

format-patch ÃüÁî´òÓ¡³öËü´´½¨µÄ²¹¶¡ÎļþÃû×Ö¡£ -M ¿ª¹Ø¸æËß Git ²éÕÒÖØÃüÃû¡£ Îļþ×îºó¿´ÆðÀ´ÏñÕâÑù£º

$ cat 0001-add-limit-to-log-function.patch
From 330090432754092d704da8e76ca5c05c198e71a8 Mon Sep 17 00:00:00 2001
From: Jessica Smith <jessica@example.com>
Date: Sun, 6 Apr 2008 10:17:23 -0700
Subject: [PATCH 1/2] add limit to log function

Limit log functionality to the first 20

---
lib/simplegit.rb | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index 76f47bc..f9815f1 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -14,7 +14,7 @@ class SimpleGit
end

def log(treeish = 'master')
- command("git log #{treeish}")
+ command("git log -n 20 #{treeish}")
end

def ls_tree(treeish = 'master')
--
2.1.0

Ò²¿ÉÒԱ༭ÕâЩ²¹¶¡ÎļþΪÓʼþÁбíÌí¼Ó¸ü¶à²»ÏëÒªÔÚÌá½»ÐÅÏ¢ÖÐÏÔʾ³öÀ´µÄÐÅÏ¢¡£ Èç¹ûÔÚ --- ÐÐÓë²¹¶¡¿ªÍ·£¨diff --git ÐУ©Ö®¼äÌí¼ÓÎı¾£¬ÄÇô¿ª·¢Õ߾ͿÉÒÔÔĶÁËü£»µ«ÊÇÓ¦Óò¹¶¡Ê±»áÅųýËü¡£

ΪÁ˽«ÆäÓʼĵ½ÓʼþÁÐ±í£¬Äã¼È¿ÉÒÔ½«ÎļþÕ³Ìù½øµç×ÓÓʼþ¿Í»§¶Ë£¬Ò²¿ÉÒÔͨ¹ýÃüÁîÐгÌÐò·¢ËÍËü¡£ Õ³ÌùÎı¾¾­³£»á·¢Éú¸ñʽ»¯ÎÊÌâ£¬ÌØ±ðÊÇÄÇЩ²»»áºÏÊʵر£Áô»»ÐзûÓëÆäËû¿Õ°×µÄ ¡°¸ü´ÏÃ÷µÄ¡± ¿Í»§¶Ë¡£ ÐÒÔ˵ÄÊÇ£¬Git ÌṩÁËÒ»¸ö¹¤¾ß°ïÖúÄãͨ¹ý IMAP ·¢ËÍÕýÈ·¸ñʽ»¯µÄ²¹¶¡£¬Õâ¿ÉÄܶÔÄã¸üÈÝÒ×Щ¡£ ÎÒÃǽ«»áÑÝʾÈçºÎͨ¹ý Gmail ·¢ËÍÒ»¸ö²¹¶¡£¬ËüÕýºÃÊÇÎÒÃÇËùÖª×îºÃµÄÓʼþ´úÀí£»¿ÉÒÔÔÚ֮ǰÌáµ½µÄ Git Ô´´úÂëÖÐµÄ Documentation/SubmittingPatches ÎļþµÄ×îÏÂÃæÁ˽âһϵÁÐÓʼþ³ÌÐòµÄÏêϸָÁî¡£

Ê×ÏÈ£¬ÐèÒªÔÚ ~/.gitconfig ÎļþÖÐÉèÖà imap Çø¿é¡£ ¿ÉÒÔͨ¹ýһϵÁÐµÄ git config ÃüÁîÀ´·Ö±ðÉèÖÃÿһ¸öÖµ£¬»òÕßÊÖ¶¯Ìí¼ÓËüÃÇ£¬²»¹ÜÔõÑù×îºóÅäÖÃÎļþÓ¦¸Ã¿´ÆðÀ´ÏñÕâÑù£º

[imap]
folder = "[Gmail]/Drafts"
host = imaps://imap.gmail.com
user = user@gmail.com
pass = p4ssw0rd
port = 993
sslverify = false

Èç¹û IMAP ·þÎñÆ÷²»Ê¹Óà SSL£¬×îºóÁ½ÐпÉÄÜûÓбØÒª£¬host µÄÖµ»áÊÇ imap:// ¶ø²»ÊÇ imaps://¡£ µ±ÄÇЩÉèÖÃÍê³Éºó£¬¿ÉÒÔʹÓà git imap-send ½«²¹¶¡ÐòÁзÅÔÚÌØ¶¨ IMAP ·þÎñÆ÷µÄ Drafts Îļþ¼ÐÖУº

$ cat *.patch |git imap-send
Resolving imap.gmail.com... ok
Connecting to [74.125.142.109]:993... ok
Logging in...
sending 2 messages
100% (2/2) done

ÔÚÕâ¸öʱºò£¬ÄãÓ¦¸ÃÄܹ»µ½ Drafts Îļþ¼ÐÖУ¬ÐÞ¸ÄÊÕ¼þÈË×Ö¶ÎΪÏëÒª·¢ËͲ¹¶¡µÄÓʼþÁÐ±í£¬¿ÉÄÜÐèÒª³­Ë͸øÎ¬»¤Õß»ò¸ºÔðÄǸö²¿·ÖµÄÈË£¬È»ºó·¢ËÍ¡£

ÄãÒ²¿ÉÒÔͨ¹ýÒ»¸ö SMTP ·þÎñÆ÷·¢ËͲ¹¶¡¡£ ֮ͬǰһÑù£¬Äã¿ÉÒÔͨ¹ýһϵÁÐµÄ git config ÃüÁîÀ´·Ö±ðÉèÖÃÑ¡Ï»òÕßÄã¿ÉÒÔÊÖ¶¯µØ½«ËüÃÇÌí¼Óµ½ÄãµÄ ~/.gitconfig ÎļþµÄ sendmail Çø¿é£º

[sendemail]
smtpencryption = tls
smtpserver = smtp.gmail.com
smtpuser = user@gmail.com
smtpserverport = 587

µ±ÕâÍê³Éºó£¬Äã¿ÉÒÔʹÓà git send-email ·¢ËÍÄãµÄ²¹¶¡£º

$ git send-email *.patch
0001-added-limit-to-log-function.patch
0002-changed-log-output-to-30-from-25.patch
Who should the emails appear to be from? [Jessica Smith <jessica@example.com>]
Emails will be sent from: Jessica Smith <jessica@example.com>
Who should the emails be sent to? jessica@example.com
Message-ID to be used as In-Reply-To for the first email? y

È»ºó£¬¶ÔÓÚÕýÔÚ·¢Ë͵Äÿһ¸ö²¹¶¡£¬Git »áͳöÕâÑùµÄÒ»´®ÈÕÖ¾ÐÅÏ¢£º

(mbox) Adding cc: Jessica Smith <jessica@example.com> from
\line 'From: Jessica Smith <jessica@example.com>'
OK. Log says:
Sendmail: /usr/sbin/sendmail -i jessica@example.com
From: Jessica Smith <jessica@example.com>
To: jessica@example.com
Subject: [PATCH 1/2] added limit to log function
Date: Sat, 30 May 2009 13:29:15 -0700
Message-Id: <1243715356-61726-1-git-send-email-jessica@example.com>
X-Mailer: git-send-email 1.6.2.rc1.20.g8c5b.dirty
In-Reply-To: <y>
References: <y>

Result: OK

×ܽá

Õâ¸ö²¿·Ö½éÉÜÁË´¦Àí¿ÉÄÜ»áÓöµ½µÄ¼¸¸öåÄÈ»²»Í¬ÀàÐ굀 Git ÏîÄ¿µÄһЩ³£¼ûµÄ¹¤×÷Á÷³Ì£¬½éÉÜÁ˰ïÖú¹ÜÀíÕâ¸ö¹ý³ÌµÄһЩй¤¾ß¡£ ½ÓÏÂÀ´£¬Äã»áÁ˽⵽ÈçºÎÔÚ¹±Ï×µÄÁíÒ»Ãæ¹¤×÷£ºÎ¬»¤Ò»¸ö Git ÏîÄ¿¡£ Ä㽫»áѧϰÈçºÎ³ÉΪһ¸öÈʴȵĶÀ²ÃÕß»òÕûºÏ¹ÜÀíÕß¡£

   
2052 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

ÿÈÕ¹¹½¨½â¾ö·½°¸
ÈçºÎÖÆ¶¨ÓÐЧµÄÅäÖùÜÀíÁ÷³Ì
ÅäÖùÜÀíÖ÷Òª»î¶¯¼°ÊµÏÖ·½·¨
¹¹½¨¹ÜÀíÈëÃÅ
Ïà¹ØÎĵµ

ÅäÖùÜÀíÁ÷³Ì
ÅäÖùÜÀí°×ƤÊé
CM09_CÅäÖùÜÀí±ê×¼
ʹÓÃSVN½øÐа汾¿ØÖÆ
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀíʵ¼ù
ÅäÖùÜÀí·½·¨¡¢¹¤¾ßÓëÓ¦ÓÃ
¶à²ã´Î¼¯³ÉÅäÖùÜÀí
²úÆ··¢²¼¹ÜÀí