±à¼ÍƼö: |
±¾ÎÄÖ÷ÒªÒÔÂÛÎİ汾¿ØÖÆÏµÍ³Àý×ӵķÖÎöΪÒý£¬½éÉÜÁËGit
µÄÉè¼ÆÀíÄîÒÔ¼°·ÖÖ§¹ÜÀíµÄÏêϸʵ¼ù¹ý³Ì£¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚgitee£¬ÓÉ»ðÁú¹ûÈí¼þLuca±à¼¡¢ÍƼö¡£ |
|
Linux & Git ±»³ÆÎª Linus Travis
µÄÁ½´óÉñ×÷, ʵÖÁÃû¹é!
ÔÚ̸ Git ֮ǰ, ÏÈ̸һÏ Linux¡£
Linux ºÍ Windows ×÷ΪÁ½¸ö¹ã·ºÊ¹ÓõIJÙ×÷ϵͳ, ÓÐ׿«´óµÄ²îÒì, ÔÚ¸÷Öֹ㷺µÄÆÀ¼ÛºÍÕùÖ´ÖÐ,
ÎÒ¶ÔÏÂÃæµÄÆÀ¼ÛÊ®·ÖÔÞͬ :
Linux Óë Windows ×î±¾ÖʵÄÇø±ðÔÚÄÄÀï¡£ÓÐÈË»á˵ǰÕßÃâ·Ñ£¬ºóÕßÐèÒªÂò (»ò͵)¡£ÕâÖ»ÊǶÔ
¡°free software¡± µÄÇú½â¡£ÔÚÎÒ¿´À´£¬¶þÕß×îÖØÒªµÄÇø±ðÄËÊÇËüÃǶÔ×Ô¼ºµÄÓû§Ëù×öµÄ¼ÙÉè¡£
¶ÔÓÚ Linux£¬Õâ¸ö¼ÙÉèÊÇ£ºÓû§ÖªµÀ×Ô¼ºÏëҪʲô£¬Ò²Ã÷°××Ô¼ºÔÚ×öʲô£¬²¢ÇÒ»áΪ×Ô¼ºµÄÐÐΪ¸ºÔð¡£
¶ø Windows ÔòÇ¡ºÃÏà·´£ºÓû§²»ÖªµÀ×Ô¼ºÏëҪʲô£¬Ò²²»Ã÷°××Ô¼ºÔÚ×öʲô£¬¸ü²»´òËãΪ×Ô¼ºµÄÐÐΪ¸ºÔð¡£
ÎÒ²»ÏþµÃÉÏÊö¹Ûµã×î³õÔ´×ÔÄÄÀï, »òÐíÊÇÕâÀï: Zaikun's Blog¡£
ÎÒ²»ÊÇÒ»¸ö¼«¶ËÖ÷ÒåÕß, ÕâÁ½ÖÖÀíÄîûÓÐËÊÇË·Ç, ÊëÓÅÊëÁÓ. º£Äɰٴ¨, ÓÐÈÝÄË´ó, Îһ᳢ÊÔ·¢ÏÖÿһÖÖÀíÄîµÄÓÅÊÆºÍÊÊÓó¡¾°,
¶ø²»ÊÇһζµØÈ¥·ñ¶¨Ê²Ã´¡£
ÔÚ¹¤×÷³¡¾°ÉÏ, ÎÒ¸üϲ»¶ Linux µÄÀíÄî :
ÎÒÔørm -rfÎóɾ¹ý/etcĿ¼, µ¼ÖÂϵͳÏÝÈë̱»¾; Ò²ÔøÒò°ü¹ÜÀíÒÀÀµÎÊÌâ¶øµ¼ÖÂÈí¼þË𻵠...
ÔÚÎÒ¿´À´, ÕâЩ¶¼²»¿ÉÅÂ, Linux »á׼ȷµÄÏòÎÒչʾ¹ÊÕÏÔÒò, ¶ø²»ÊÇ¡¸ÇëÉÔºó...¡¹, ¡¸ÎÒÃÇÕýÔÚ×öһЩ׼±¸¹¤×÷¡¹
ÕâÀï¹ÊÕÏÔÒòÊÇÖ¸Ò»¸ö»ùÓڹ㷺ÈÏÖª»ù´¡ÉϵĽâÊÍ. ±ÈÈç: Èç¹ûÒòΪ´úÂë±àдµÄʧÎó, µ¼ÖÂÒ»¶Î³ÌÐòûÓа´ÕÕÉè¼ÆÒâͼִÐÐ,
ÎÒÖ»ÐèÁ˽â´úÂë²ãÃæµÄÂß¼´íÎó¼´¿É, ¶ø²»ÊÇÉ´íÎóµÄ´úÂëÔڵ緲ãÃæµ¼ÖÂÁËʲôÑùµÄÎÊÌâ·¢Éú
ÈÕ¸´Ò»ÈÕµÄʹÓÃ, ÎÒ·¸´íÎóµÄ¸ÅÂÊÔ½À´Ô½µÍ, ¶Ô Linux ±¾ÉíµÄÀí½âÔ½À´Ô½ÉîÈë, ¶Ô Linux
Ô½À´Ô½ÐÅÈÎ, ²¢ÇÒÖð½¥ÓÐÁËÒ»ÖÖ¶Ô Linux µÄÕÆ¿Ø¸Ð¡£
È»¶øÔÚÓÎÏ·ÓéÀÖ³¡¾°ÉÏ, ÎÒ¸üÐÀÉÍ Windows µÄÀíÄî:
µ±ÎÒÏëÍæÓÎÏ··ÅËÉÒ»ÏÂʱ, ÎÒÏ£Íû Windows ΪÎÒ°ü°ìÒ»ÇÐ, ÎÒÒª×öµÄ¾ÍÊÇË«»÷ÔËÐÐ, È»ºó¿ªÊ¼ÓÎÏ·¡£
Git Óë Linux ͬԴͬ×Ú, ÒàÊÇÓÐ×ÅÏàËÆµÄÀíÄî, Æä±¾ÉíÓÐ׿«ÎªÁé»îµÄÉè¼Æ, Git ÈÏΪ
:
Óû§ÖªµÀ×Ô¼ºÔÚ×öʲô, ²¢ÇÒ»áΪ×Ô¼ºµÄÐÐΪ¸ºÔð¡£
ÔÚ¿ªÔ´ÁìÓòµÄ¹ã·ºÊ¹ÓÃÖÐÐγÉÁËÈýÖÖ±»¹ã·º½ÓÊܵÄ×î¼Ñʵ¼ù : Git flow,
Github flow, Gitlab flow.
´ÓÊÖæ½ÅÂÒ¿ªÊ¼
µ±ÎÒ³õѧ Git ʱ, ÎÒ¹Ø×¢ Git µÄ¹¤³Ìʵ¼ùʤ¹ýÆäÄÚÔÚµÄÉè¼ÆÀíÄî, ÒÔÖÁÓÚÆÈÇеÄȥѰÕÒһЩËùνµÄ×î¼Ñʵ¼ù,
È»ºó½©Ó²µØÄ£·ÂÉõÖÁÉú°áÓ²Ì×, ½á¹ûÏÔ¶øÒ×¼û, ÎÒʼÖÕÎÞ·¨×öµ½
flow£¬ÔÒâÊÇË®Á÷£¬±ÈÓ÷ÏîÄ¿ÏñË®Á÷ÄÇÑù£¬Ë³³©¡¢×ÔÈ»µØÏòǰÁ÷¶¯£¬²»»á·¢Éú³å»÷¡¢¶Ôײ¡¢ÉõÖÁäöÎÐ.
ÀíÏëÊÇÐÐÔÆÁ÷Ë®, ÏÖʵȴÍùÍù²Ò²»È̶Ã
¾²ÏÂÐÄÀ´ÏëÒ»Ïë
ÊÕÆð¼±¹¦½üÀûµÄÐÄ̬, ÎÒ¿ªÊ¼Ë¼¿¼, Git µÄÉè¼ÆÀíÄîµ½µ×ÊÇʲô¡£
Git ÊÇÒ»ÖÖ°æ±¾¿ØÖÆÏµÍ³, ÏȲ»Ì¸ Git ÊÇÈçºÎÉè¼ÆµÄ, Èç¹ûÈÃÎÒÀ´Éè¼ÆÒ»¸ö°æ±¾¹ÜÀíϵͳ, ¸ÃÈçºÎÏÂÊÖ?
Éè¼ÆÒ»¸ö×î¼òµ¥µÄ°æ±¾¿ØÖÆÏµÍ³
Õâ¾ÍÊÇÒ»¸ö¼òµ¥´Ö±©µÄ°æ±¾¿ØÖÆÏµÍ³, ¼òµ¥µÄÎļþ¿½±´¼ÓÖØÃüÃûÒѾÄÜÂú×ã¶ÔÓÚ±ÏÒµÂÛÎĵİ汾¿ØÖÆ, µ½×îºó,
ÄÜÄóöÒ»¸öƯÁÁµÄ±ÏÒµÂÛÎÄÖÕ°å¼´ÍòÊ´󼪡£
ÉÏÃæµÄÿһ¸ö°æ±¾¶¼ÊÇ»ùÓÚÉÏÒ»¸ö°æ±¾Ð޸ĶøÀ´µÄ, ²¢ÇÒµ±Ðµİ汾³öÀ´Ö®ºó, ÀϾɰ汾µÄ¼ÛÖµ¾Í¼¸ºõ²»´æÔÚÁË,
ÔÚʹÓà SVN »òÕß Git Ò»¸öÈË¿ª·¢Ð¡ÏîÄ¿»ò¼Ç±Ê¼ÇµÄʱºò, ³¡¾°Óë´ËÀàËÆ¡£
Èç¹û³¡¾°¸´ÔÓÒ»µã¶ùÄØ?
Èç¹ûµ¼Ê¦°ïÎÒÒ»¿é¸Ä, ¶¼»ùÓÚ¡¸±ÏÒµÂÛÎÄ×îÖÕ°æ1.doc¡¹ÐÞ¸Ä, µ¼Ê¦¸Ä³öÁË¡¸C.doc¡¹, ÎҸijöÁË¡¸D.doc¡¹,
ÕâʱÈôÏë±£ÁôÁ½ÈËËùÓеÄÐÞ¸Ä, ²¢ºÏ²¢³öÒ»¸öеİ汾¡¸E.doc¡¹, ËÆºõ¾ÍÒª»¨Ð©¹¦·òÁË¡£
Ê×ÏÈÒªÕÒ³öÀ´µ¼Ê¦¸ÄÁËÄÄЩ, ÎÒ¸ÄÁËÄÄЩ;
È»ºó»ùÓÚ¡¸±ÏÒµÂÛÎÄ×îÖÕ°æ1.doc¡¹, °Ñµ¼Ê¦µÄÐ޸ĺÍÎÒµÄÐÞ¸ÄÓ¦ÓùýÀ´;
Èç¹ûµ¼Ê¦µÄÐ޸ĺÍÎÒµÄÐÞ¸ÄÊÇÔÚ²»Í¬µØ·½Ð޸ĵÄ, ÄÇô»¥²»Ó°Ïì, ·Ö±ðÓ¦ÓÃ;
Èç¹ûµ¼Ê¦µÄÐ޸ĺÍÎÒµÄÐÞ¸ÄÔÚͬһ´¦, ҪѡÔñÒÔµ¼Ê¦µÄΪ׼, »¹ÊÇÒÔÎÒµÄΪ׼;
¼´Ê¹µ¼Ê¦µÄÐ޸ĺÍÎÒµÄÐ޸IJ»ÔÚͬһ´¦, µ«ÊÇ·ñ»áÔì³ÉÕûÌåÂß¼µÄì¶Ü, Òª´ÓÕûÌåÉÏÐÞÕýÂß¼.
¹þ! Õâ²»¾ÍÊÇ git merge Âï!
²»ºÃÒâ˼, ͼ·Å´íÁË
¹Ø×¢µãµ½µ×ÔÚÄÄÀï?
µ¼Ê¦µÄ¼ÓÈëʹµÃÎÒÃǼòÒ׵ıÏÒµÂÛÎİ汾¿ØÖÆÏµÍ³±äµÃÓеã¶ùÁ¦²»´ÓÐÄ, ÎÒÃDZØÐëСÐÄ´¦Àíµ¼Ê¦µÄÐÞ¸ÄÓëÎÒµÄÐ޸ĶÔÂÛÎı¾ÉíÔì³ÉµÄÓ°Ïì,
Èç¹ûÓÖÀ´Ò»¸öÈÈÐÄѧ³¤Í¬Ê±¶ÔÎÒµÄÂÛÎļÓÒÔÖ¸µ¼(ÐÞ¸Ä), ÎÊÌâËÆºõ±äµÃ¸ü¼Ó¸´ÔÓÁË¡£
²»Öª²»¾õÖÐ, ÎÒÃǵĹØ×¢µãÒѾ´ÓÂÛÎı¾ÉíתÏòÁËÐÞ¸Ä, ¶àÈËͬʱ½øÐÐÐÞ¸ÄʹµÃÎÒ±ØÐëСÐÄ´¦Àíÿ¸öÈ˵ÄÐÞ¸Ä,
²»ÄÜÒÅ©, ²»ÄܳåÍ», Ò²²»ÄÜÂ߼ì¶Ü, Õâ¼òֱ̫»ìÂÒÁË¡£
Git µÄÉè¼ÆÀíÄî
Àí½â Commit
ͨ¹ý¶ÔÉÏÃæÀý×ӵķÖÎö, ÏàÐÅÄãÒѾÌå»á, ÂÛÎİ汾¿ØÖÆÏµÍ³µÄºËÐĹØ×¢µãÓ¦¸ÃÊÇÐÞ¸Ä, ¶ø²»ÊÇÂÛÎı¾Éí¡£
ÈÃ˼·»Øµ½ Git ÉÏÀ´, Git ·Ö֧ͼÖеÄÿ¸öµãÓÉgit commitÃüÁî²úÉú, ²¢ÇÒ»á²úÉúÒ»¸öΨһµÄsha1Öµ,
Òò´Ë¿ÉÒÔͨ¹ýsha1ÖµÀ´Î¨Ò»È·¶¨Ò»¸öÌá½»µã¡£
ÔÚÉÏͼÖÐ, BµãÓ¦ÓÐÁ½ÖÖº¬Òå :
±íʾһ¸ö¿ìÕÕ, ¼´ÏîÄ¿¹¤³ÌËùÓÐÎļþÔÚÕâÒ»¿ÌµÄ״̬;
±íʾһ¸ö²îÒì, ¼´B״̬ÓëA״̬ÎļþµÄ²îÒì, Òà³Æ×÷²¹¶¡(patch)¡£
Àà±ÈÓÚ±ÏÒµÂÛÎÄ, ¿ìÕÕÒ²¾ÍÊDZÏÒµÂÛÎÄ×îÖÕ°æ1.docÂÛÎı¾Éí, ²îÒìÒ²¾ÍÊÇÐÞ¸Ä.
ÈçºÎÌåÏÖBµãµÄÕâÁ½¸öÊôÐÔ? (ÎÒÃÇÓÃ[B]À´±íʾBµãµÄsha1Öµ)
»Øµ½BµãµÄ¿ìÕÕ: git checkout [B]
²é¿´BµãÓëÉÏÒ»¸öÌá½»µãµÄ²îÒì: git show [B]
ʹÓÃgit checkoutÃüÁîÎÒÃÇ¿ÉÒÔÔÚÕû¸ö Git Ìá½»ÀúÊ·ÉϵÄËùÓпìÕÕ°æ±¾´©Ëó,
Äã¿ÉÄÜÌý¹ý˵HEADÖ¸Õë, git checkoutÕýÊÇͨ¹ýŲ¶¯HEADÖ¸ÕëÀ´´ïµ½¿ìÕÕÇл»µÄÄ¿µÄ,
Èç¹û¶à´Î´©Ëóºó, ÄãÃÔʧÁË×Ô¼º, ÕÒ²»µ½µ±Ç°ÔÚÄÄÒ»¸ö¿ìÕÕ, Çë²é¿´ Git ·Ö֧ͼ, ÕÒµ½HEADÖ¸Õë,
Õâ¾ÍÊÇÄãËù´¦µÄ¿ìÕÕ°æ±¾¡£

¿ÉÒÔ¿´µ½, git showÃüÁîÍêÕûµÄչʾÁËBµãÓëÆäÉÏÓнڵãAµãµÄ²îÒì,
Git ×÷Ϊһ¸öÃæÏòÔ´ÂëµÄ°æ±¾¿ØÖƹ¤¾ß, ½«²îÒìÒÔÐÐΪ»ù±¾µ¥Î»±íʾÊDZȽϺÏÀíµÄÒ»¸öÑ¡Ôñ. ÕâÒ²Òâζ׎«
Git ÓÃÓÚ·ÇÎı¾×ÊÔ´µÄ°æ±¾¿ØÖƹ¤¾ß»òÐí²»ÊÇ×î¼ÑÑ¡Ôñ¡£
¶ÔÒ»¸öÌá½»µãº¬ÒåµÄË«ÖØ½âÊÍ¿´ÉÏÈ¥ºÜ²»´í, ²»¹ý, ÔÚÕâ¸ö·Ö֧ͼÉÏ, EµãÓеã¶ùÌØÊâ, Ö»ÓÐEµãÓÐÁ½¸öÉÏÓνڵãCºÍD,
³¢ÊÔÖ´ÐÐgit show [E], ·¢ÏÖ²¢Ã»ÓÐÏñÆäËû½ÚµãÒ»Ñù, ÏÔʾ³ödiffÐÅÏ¢, Õâ˵µÃ¹ýÈ¥,
²»È»µ½µ×¸ÃÏÔʾEºÍCµÄ²îÒì, »¹ÊÇEºÍDµÄ²îÒìÄØ?
Õâʱ¾ÍÖ»ÄܽèÖú Git µÄÁíÒ»¸öÃüÁîgit diff [X] [Y]À´ÏÔʽÉùÃ÷Òª±È½ÏÈÎÒâÁ½¸ö½ÚµãXºÍYµÄ²îÒì¡£
שͷÓÐÁË, ³Ç±¤ÔÚÄÄÄØ?
ÈÕ³£Ò»Ìì
ÔÚһЩÏîÄ¿×éÀï, Äã¿ÉÄܻᱻ¸æ½ëµÀ: "¼ÇµÃÿÌìϰàǰÌá½»ÏÂÄãµÄ´úÂë." Ò²ÐíËûÃÇÒѾ·¢ÏÖ:
"Ôõô´úÂëÓÖ³åÍ»ÁË", "ÎÒдµÄ´úÂëÔõô±»¸²¸ÇÁË", »á¶ÔÄã¶àÌáÒ»¾ä¸æ½ë:
"¼ÇµÃÌύǰÏÈÀһϴúÂë, ±ð°ÑͬÊÂдµÄ¸²¸ÇÁË". ÓÚÊÇ, Git ¾Í½ö½ö³ÉΪÁËÒ»¸öÔ¶³Ì´úÂë²Ö¿â¡£
²úÆ·: "ÉÏ´ÎÌáµÄ3¸öÐèÇó, ½ñÌì¾ÍÉÏ1¸ö, ÁíÍâ2¸ö²»ÓÃÁË"
¿ª·¢: "ÎÒ´úÂë×òÌ춼дÍêÌá½»ÁË, ÄÇÖ»ÄܰÑ2¸öÐèÇó´úÂëɾµôÁË. ÎÒ¿ÉÊÇÓдúÂë½àñ±µÄ,
²»ÄÜÈÃÎÒµÄÏîÄ¿ÀïÕâô¶àÎÞÓôúÂëÁô×Å"
[Á½Ð¡Ê±ºó]
²úÆ·: "ÎÒÏëÁËÒ»ÏÂ, B¹¦ÄÜ»¹ÊÇÒªÉϵÄ, Ò»¹²ÉÏ2¸ö¹¦ÄÜ"
¿ª·¢: "ÐаÉ, ÎÒÔÙ°Ñ´úÂ뿽±´»ØÀ´"
[ÁÙÉÏÏß]
²úÆ·: "²»ÐÐ, ϵôB¹¦ÄÜ, ÉÏC¹¦ÄÜ! ¿ì!!!"
¿ª·¢: "W-- ÎÒ·ð´È±¯!"
[ÉÏÏߺó]
ÀÏ´ó: "C¹¦ÄÜÓÐbug, Á¢¿Ì»Ø¹ö"
¿ª·¢: "ºÃ, ÎÒÍ˻ص½Éϴη¢°æµÄ¿ìÕÕ"
ÕâÊÇÈÕ³£µÄÒ»Ìì, Ò²ÊÇÔã¸âµÄÒ»Ìì, ´ó°ÑµÄʱ¼äÀË·ÑÔÚ´úÂëµÄɾ³ýºÍ¿½±´ÉÏ, ¶ø²»ÊÇÔÚ´´ÔìÉÏ¡£
ÎÊÌâ³öÔÚÄÄÁË?
ÉϽÚÎÒÃÇÌáµ½, Git ÿ¸ö Commit ¶¼ÓÐÁ½ÖÖÊôÐÔ, ¿ìÕպͲ¹¶¡. ÔÚÉÏÃæµÄʹÓó¡¾°ÖÐ, Git
Ö»·¢»Ó³öÁ˲»µ½Ò»²ã¹¦Á¦, ´ó¼Ò¹Ø×¢µÄ½ö½öÊÇ×îÐÂÌá½»µãµÄ¿ìÕÕ, µ±È», Õâ¸ö¿ìÕÕÊǼ«ÎªÖØÒªµÄ, ÖØÒªµ½ÎÒÃǵÄHEADÖ¸Õ뼸ºõ×ÜÊÇÔÚÖ¸ÏòËû,
ÖØÒªµ½ÎÒÃÇ»á°ÑËû³ÆÎª×îеÄmaster·ÖÖ§¡£
ÎÒÃǰѹØ×¢µã×ªÒÆµ½ Git µÄ²¹¶¡ÊôÐÔÉÏÀ´, ÄãÿÌìÌá½»µÄ commit ´ú±í×ÅÄãÕâÒ»ÌìµÄ¹¤×÷³É¹û,
ÄÇôÃèÊöÔõôд?
"ÕÅÈý20190622¹¤×÷"? »¹ÊÇ "Ôö¼ÓÁËA¹¦ÄÜ, B¹¦ÄÜ, C¹¦ÄÜдÁËÒ»°ë"
»òÐíºóÕßÉÔ΢ºÃÒ»µã¶ù, ÖÁÉÙÔÚ¼¸Ììʱºò²é¿´ Git Ìá½»¼Ç¼ʱÄÜһĿÁËÈ»µÄÖªµÀÕâ´ÎÌá½»°üº¬Ê²Ã´Ð޸ġ£
»¹¼ÇµÃgit diffµÄÊä³öÂð? ÊÇÐм¶µÄ²îÒì¡£ Ϊʲô²»ÊÇÎļþ¼¶±ð, »òÕß×Ö·û¼¶±ð? ÿ´Î´úÂëÌá½»ÒÔÌìΪµ¥Î»ÕæµÄºÏÊÊÂð?
µ±È»²»ºÏÊÊ, ÿ¸ö commit µÄ×î¼ÑÁ£¶ÈÓ¦¸ÃÊÇÏà¶Ô¶ÀÁ¢µÄÌØÐÔ(feature), ±ÈÈçÉÏÎÄÌáµ½µÄA,
B, CÈý¸ö¹¦ÄÜ¡£
ÀíÏëÇé¿öÏÂ, A, B, CÊÇÈý¸ö¶ÀÁ¢µÄ¹¦ÄÜ, ·Ö±ð×÷ΪÈý´Î commit¡£

¸üºÃµÄ×ö·¨ÊÇʲô?
»¹¼ÇµÃÂð? A, B, C¶¼ÊǶÀÁ¢µÄ²¹¶¡(patch), ÄÇôA, B, CµÄ´ÎÐòÊÇûÓйØÏµµÄ,
Ò²¾ÍÊÇ˵C1, B2, A3µÄ´úÂë¿ìÕÕÓ¦¸ÃÊÇÒ»ÑùµÄ. ²»ÐÅÊÔÒ»ÏÂ, ¿ÉÒÔÓÃgit diffÑéÖ¤½á¹û¡£

µ±ÒªÇó³·µô B ¹¦ÄÜʱ, Èç¹û¿ÉÒÔÖ±½Óɾµô B Õâ´ÎÌá½», ÄÇô˲¼ä¾Í´ïµ½Ä¿µÄÁË. µ«ÊÇ, ÓÐÁ½µãÊÇÐèÒª¿¼ÂǵÄ
:
Ò»°ãÀ´Ëµ, ´ó¼ÒͬʱʹÓõķÖֻ֧ǰ½ø, ²»ºóÍË, ¼´²»ÄÜ´Û¸ÄÀúÊ·;
ÈôÕæµÄ´Û¸ÄÁËÀúÊ·, ÄÇô B ¹¦ÄܵĴúÂë¾Í´ÓÌá½»¼Ç¼ÉÏÏûʧÁË, ÍòÒ»ÐèÒªÔÙ´ÎÌí¼Ó B ¹¦ÄÜ, Õ⽫ÊDZ¯¾ç¡£
ÎÒÃÇ¿ÉÒÔ»»Ò»ÖÖ˼·À´´ïµ½ÏàͬµÄÄ¿µÄ: ¹¹ÔìÒ»¸ö²¹¶¡, ¸Ã²¹¶¡BÍêÈ«Ïà·´, ¼´°ÑBÔö¼ÓµÄÐÐɾ³ý, ÐÂÔöBɾ³ýµÄÐС£µ±È»,
ÕâÒ»Çж¼ÊÇ×Ô¶¯µÄ, ֻҪʹÓÃgit revert [B]ÃüÁî, ¼´¿É´´½¨Ò»¸öBµÄ·´ÏòÌá½»¡£ÏÔÈ», -B1ºÍC2µÄ¿ìÕÕ״̬ÊÇÒ»ÖµÄ,
¿ÉÒÔÓÃgit diffÃüÁîÑéÖ¤¡£
µ±ÒªÇó°Ñ B ¹¦ÄܼӻØÀ´Ê±, ÊǸüÀ³öÉñÆ÷ÁËÂð?
µ±È»²»ÊÇ, ÎÒÃÇ¿ÉÒÔÔÙÖÆ×÷Ò»¸ö-BµÄ·´Ïò²¹¶¡--B, ¸º¸ºµÃÕýÂï¡£²»¹ýÕâ¿´ÆðÀ´¹Ö¹ÖµÄ,
Èç¹ûÄܸ´ÖÆÒ»·ÝB²¹¶¡ÖØÐ´òÉϾͺÃÁË, git cherry-pick [B]ÕýÊÇÎÒÃÇÒªÕҵĴ𰸡£ÏÔÈ»,
--B1, B2, C3µÄ¿ìÕÕ״̬±ØÈ»ÊÇÒ»Öµġ£
×¢Òâ : ͨ¹ýgit cherry-pick¸´ÖƵÄBºÍÔÓеÄBÓв»Ò»ÑùµÄsha1,
¼´±ãÕâÁ½¸ö commit µÄÄÚÈÝÏàͬ¡£
¼ÈÈ»ÕâÈýÖÖ״̬Êǵȼ۵Ä, ÄÇô×÷ΪÇãÏòÓÚÍêÃÀÖ÷ÒåµÄÎÒÃÇ, ¸üÏ£ÍûÔÚ Git Ìá½»ÀúÊ·ÉÏÁôϵÄÊÇ×îºóÒ»Öָɾ»µÄ״̬.¡£µ«ÎÒÒѾÔÚB2״̬ÁË,
Ôõô²ÅÄÜʵÏÖC3? ÏàÐÅÄãÒѾÏëµ½Á˰취, »Øµ½×î³õµÄ¼ì³öµã, ͨ¹ýcherry-pickʰȡA,
B, C3¸ö²¹¶¡, ¼´¿É´´½¨Ò»¸ö¸É¾»µÄÌá½»ÀúÊ·¡£»òÐíÄ㻹Ìý˵¹ýgit rebase, ÕâÊÇÒ»¸ö·Ç³£Ç¿´óµÄÃüÁî,
ÎÒÃÇ»áÔÚºóÎÄÌÖÂÛ¡£
ÖØÐÂÈÏʶ·ÖÖ§
µ±Ìá³öA, B, CÈý¸öÐèÇóµÄʱºò, Èç¹û·ÖÅɸøÈý¸öÈË, ÿ¸öÈ˸ºÔðÒ»¸ö¹¦ÄÜ, ͬʱ»ùÓÚ×îеĴúÂ뿪·¢,
ÄÇô½«»á½øÈëÕâÖÖ״̬£º

µ«ÊÇ, Èç¹ûÎÒÃÇ×ñÑmaster, develop·ÖÖ§Ä£ÐÍ¿ª·¢, ÄÇôÓÀÔ¶²»»áÔÚ Git ·Ö֧ͼÉÏ¿´µ½ÕâÖÖ״̬¡£
ÎÒÃÇÖÕÓÚÌÖÂÛµ½·ÖÖ§ÁË, »òÐíÄãÒѾ·¢ÏÖ, ´ó¼ÒÔÚ̸ÂÛ Git µÄʱºò, ·ÖÖ§ËÆºõÊÇ×îÖØÒªµÄÊÂÇé,
¼¸ºõÈý¾ä²»Àë·ÖÖ§; ¶øÎÒÃÇ˵ÁËÕâô¶à, »¹Ã»ÓÐÌá¼°·ÖÖ§Õâ¼þÊÂ; ÉÏÃæËùÓеIJåͼÖÐ, ¾¡¹ÜÎÒ°ÑËû³Æ×÷·Ö֧ͼ,
ȴûÓзÖÖ§±ê¼Ç, Õâ²¢²»Ó°ÏìÎÒÃÇ¶Ô Git µÄÀí½â¡£
ÔÙ´ÎÖØÉêÒ»ÏÂ, ÎÒÃǵĹØ×¢µãÊÇcommit, ÓÃΨһµÄsha1±êʶ, ËûÓÐÁ½ÖÖº¬Òå¿ìÕպͲ¹¶¡¡£
µ«ÊÇ, sha1²»ÊÇÒ»¸öºÃ¼ÇµÄ±êʶ, ÎÒÃÇÐèÒª¸øÒ»Ð©ÖØÒªµÄcommit±ðÃû¡£ Ç°ÃæÎÒÃÇÒѾÌáµ½ÁËHEADÖ¸Õë,
ËûÖ¸Ïòµ±Ç°µÄcommit, Õâ¾ÍÊÇÒ»¸ö±êʶ. ³ý´ËÖ®Íâ, Git »¹ÓÐÁ½ÖÖÖØÒªµÄ±êʶ, ·ÖÖ§(branch)ºÍ±êÇ©(tag)¡£
·ÖÖ§ºÍ±êÇ©ÊÇij¸öcommitµÄ±ðÃû, Òò´Ë, ÔÚ Git ÃüÁîÖпÉÒÔʹÓ÷ÖÖ§ºÍ±êÇ©À´´úÌæcommitµÄsha1Öµ¡£±ÈÈçÇл»µ½Ä³¸ö·ÖÖ§,
git checkout [branch-name], Æäʵ¾ÍÊÇÇл»µ½ÁËÕâ¸öcommitµãµÄ¿ìÕÕ¡£
ʹÓ÷ÖÖ§Çл»ºÍʹÓÃsha1Çл»»áÓÐһЩ²îÒì, Git »áά³ÖÒ»¸ö Context, ¼Ç¼Á˵±Ç°¼¤»îµÄ·ÖÖ§,
Èç¹ûÄãµÄÃüÁîÌáʾ·ûÉÏÓÐ Git ·ÖÖ§µÄ±êʶ(macOSÖÕ¶ËĬÈÏÓиñêʶ), ½«»á¿´µ½ÕâÖÖ²îÒì¡£
·ÖÖ§ºÍ±êÇ©¶¼¿ÉÒÔ×÷ΪÈκÎÒ»¸öcommitµÄ±êʶ, ËûÃÇÇø±ðÔÚÓÚ:
·ÖÖ§(branch)¾ßÓÐǰ½ø¹¦ÄÜ, ¿ÉÒÔǰ½øµ½ÏÂÓÎcommit½ÚµãÉÏ;
±êÇ©(tag)½ö½ö°ó¶¨ÔÚÒ»¸öcommit, Ö÷ÒªÓ¦Óó¡¾°ÊÇ×÷Ϊ°æ±¾·¢²¼µÄ±êʶ¡£
ÎÒÃÇÖ÷ÒªÌÖÂÛ·ÖÖ§(branch). ·ÖÖ§ÔõÑùǰ½øÄØ?
µ±Ö´ÐÐgit commitºó, ·ÖÖ§¾Íǰ½øÁË;
Ö´ÐÐgit mergeºó, ·ÖÖ§»áǰ½ø¡£
µ± Git ¹ØÁªµ½Ô¶³Ì²Ö¿âʱ, ÿ¸ö·ÖÖ§¿ÉÒÔÉèÖÃÒ»¸öÔ¶³Ì×·×Ù·ÖÖ§git branch --set-upstream-to=[origin]/[branch],
µ±Ö´ÐÐgit fetch, git pull, git pushʱ, ĬÈ϶¼ÊÇÔÚ²Ù×÷¹ØÁªµÄÔ¶³Ì·ÖÖ§¡£
Ò»¸ö±¾µØ Git ²Ö¿â¿ÉÒÔ¹ØÁª¶à¸öÔ¶³Ì²Ö¿â, ϰ¹ßÉÏĬÈϲֿâ»òÕßÖ÷²Ö¿â½Ð×öorigin¡£
µ±±¾µØmaster·ÖÖ§ÂäºóÔ¶³Ìorigin/master·Ö֧ʱ, Ò»°ã»áÖ´ÐÐgit pullÃüÁî¸ú½ø,
µ«ÕâºóÃæµ½µ×·¢ÉúÁËʲô?
git pullÃüÁîÆäʵÊǸögit fetchºÍgit mergeµÄ×éºÏÃüÁî, git fetchÊǽö½öÀȡԶ³Ì·ÖÖ§µÄ½ø¶È,
ÉÏͼÕâÖÖ״̬, Ô¶³Ìorigin/master³¬Ç°Á˱¾µØmaster, ±ØÈ»ÊÇÖ´ÐÐÁËgit fetchºó²ÅÄÜ¿´µ½,
Ò»°ãÖ§³Ö Git µÄͼÐι¤¾ß»òÕß IDE »áÔÚºǫ́¶¨ÆÚ×öÕâÏ×÷, ÔÚÔ¶³Ì·ÖÖ§¸üкó¼°Ê±Í¨Öª¡£
µ±HEADÖ¸ÕëÔÚmasterʱ, Ö´ÐÐgit merge origin/master, master¼´»áǰ½øµ½origin/master¡£
Merge ²»ÊǺϲ¢·ÖÖ§Âð? Ôõô±ä³ÉÁË·Ö֧ǰ½ø?
ΣÏÕµÄ Merge
ÎÒ°Ñgit merge¶¨ÒåΪ¸ßΣ²Ù×÷! Ò»°ã¿ª·¢ÈËÔ±(·ÇÏîÄ¿leader)Ó¦¾¡¿ÉÄܱÜÃâʹÓÃÖ±½Ó»ò¼ä½ÓʹÓøÃÃüÁî¡£
Ìáµ½ Merge, »òÐíÏÂÃæµÄÕâÖÖ³¡¾°ÊÇÎÒÃǵÚһʱ¼äÏëµ½µÄ :
µ±ÎÒ´¦ÔÚmasterʱ, Ò²¾ÍÊÇHEADÖ¸ÕëÖ¸Ïòmaster, Ö´ÐÐgit
merge iss53 : ÈôÎÞ³åÍ», ¼´»áµÃµ½ÏÂͼ½á¹û; ÈôÓгåÍ», Ôò»áÌáʾÊÖ¶¯½â¾ö, È»ºó×÷Ϊһ´ÎеÄ
commit, ͬÑùÒ²»áµÃµ½ÏÂͼ½á¹û¡£
Ò²ÐíÄã·¢ÏÖÁË, ÕâÀï·Ö֧ͼ·ç¸ñ±ä»¯ÁË, ²»½ö½öÊÇ»·çµÄת±ä, ×îÖØÒªµÄÊǼýÍ··½Ïò.
ÕâÁ½ÕÅͼÊÇÎÒ´Ó Git ¹Ù·½Îĵµ¸´ÖƹýÀ´µÄ, ËùÒÔÇë²»ÒªÖÊÒÉËûµÄȨÍþ¡£ÄÇôÊÇÎÒ֮ǰµÄ¼ýÍ··½Ïò»´íÁËÂð?
Óо仰Ôõô˵À´×Å? ȨÍþ¾ÍÊÇÓÃÀ´ÖÊÒɵÄ! ²»¹ýÖÊÒÉ֮ǰ, ÎÒÃÇÏȳ¢ÊÔÀí½â¡£
µ±¼ýÍ·ÓÉÉÏÓνڵãÖ¸ÏòÏÂÓνڵã, ¾ÍÏñÎÒ×î³õµÄ²åͼÄÇÑù. ´ÓÕû¸ö·Ö֧ͼÉÏ, ÎÒÃÇÄÜ¿´µ½ÒòΪÍŶӵÄŬÁ¦,
·ÖÖ§ÕýÔÚǰ½ø, ÏîÄ¿ÕýÔÚ½øÕ¹. Ò²¾ÍÊÇ˵, ¸ü·ûºÏºê¹ÛÉϵÄÇ÷ÊÆ;
µ±¼ýÍ·ÓÉÏÂÓνڵãÖ¸ÏòÉÏÓνڵã, ¾ÍÏñ¹Ù·½ÎĵµµÄ²åͼÄÇÑù. »¹¼ÇµÃÿ¸öcommitµÄº¬ÒåÂð? ¿ìÕպͲîÒì,
ÊǸýڵãÓëÆäÉÏÓνڵãµÄ²îÒì, ËùÒÔÔÚ Git ÄÚ²¿´æ´¢Ê±, ÿ¸öcommitÒ»¶¨»á±£ÁôÒ»¸öÖ¸Õë, Ö¸ÏòÆäÉÏÓνڵã.
Ò²¾ÍÊÇ˵, ÕâÑùµÄÉè¼Æ¸üÄÜÌåÏÖ Git µÄÄÚ²¿Éè¼Æ.
ºÃÁË, ÎÒÃǸùØ×¢ Merge µ½µ××öÁËʲô:
¹¹ÔìÒ»¸ö½ÚµãC6, Õâ¸ö½Úµã½«»áÓÐÁ½¸öÉÏÓνڵã: C4, C5;
½«·ÖÖ§masterÓÉC4ÒÆ¶¯µ½C6¡£
Õâ¿´ÆðÀ´Ã»ÓÐʲôÄѵÄ, Git µÄdiff¹¦ÄÜ»á×Ô¶¯°ïÎÒÃǼÆËã²îÒì, Ê£ÏµĹ¤×÷Ò²ÊÇ Git ĬĬ°ïÎÒÃÇÍê³ÉµÄ¡£µ«ÊÇ,
Ä㻹¼ÇµÃÎÒÃǵÄÂÛÎİ汾¿ØÖÆÏµÍ³Âð?
Èç¹ûC4ºÍC5¶Ôͬһ¸öÐÐ×öÁËÐÞ¸Ä, ¸ÃÈ¡ÄĸöÄØ? È¡ÁËC4µÄ, ÄÇôC5ÆäËû´úÂ뻹Äܹ¤×÷Âð? »òÕß·´Ö®.
ÓÖ»òÕßÁ½Õß¶¼²»ÄÜÈ¡, ¶øÓ¦¸ÃÖØÐ´ÕâÐдúÂë, ÒÔ¼æÈÝÁ½ÕßµÄÐ޸ġ£
¼´±ãËûÃÇÐ޸ĵĵط½»¥²»½»²æ, ÄÇô»á²»»áÕÕ³ÉÕûÌåÉϵÄÂß¼´íÎóÄØ? ±ÈÈçC4ÐÞÕýÁËÒ»¸ö³ÉÔ±±äÁ¿µÄƴд´íÎó,
C5ÔÚÔöµÄ´úÂëÖл¹ÔÚÒýÓÃÔÓеıäÁ¿Ãû, Õâʱ¹¹ÔìC6ʱ²¢²»»áÓÐÈκγåÍ»ÌáÐÑ, µ«¹¹Ôì³öµÄ´úÂëÈ´ÊÇÎÞ·¨Í¨¹ý±àÒëµÄ¡£
»òÐíÄãÒѾϰ¹ß, ÿµ±ÎÒÃÇÓöµ½ÎÊÌâʱ, Git ¼¸ºõ¶¼ÄܸøÎÒÃÇÌṩ×Ô¶¯»¯µÄ½â¾ö·½°¸¡£ ±ÈÈç : µ±ÐèÒª¶Ô±È²îÒìʱ,
¿ÉÒÔʹÓÃgit diff; µ±ÐèÒªÖÆ×÷·´Ïò²¹¶¡Ê±, ¿ÉÒÔʹÓÃgit revert; µ±ÐèÒª¸´ÖƲ¹¶¡Ê±,
¿ÉÒÔʹÓÃgit cherry-pick¡£ÄÇô, ÏÖÔÚÕâÖÖ³¡¾°, Git ÓÐʲôÃüÁîÄܰïÖúÎÒÃÇÄØ? ºÜÒź¶,
ûÓÐ, Git ÄܸøÎÒÃǵĽö½öÊǵ±³öÏÖÐм¶³åͻʱ, ¸øÎÒÃÇÒ»¸ö conflict Ìáʾ, ³ý´ËÖ®Íâ,
Ö»ÄÜ¿¿ÎÒÃÇÀ´·¢Ïֺͽâ¾öÁË¡£
ÎÒÃÇÏàÐÅ, ÔÚÄã»òÄãµÄͬÊÂÌá½»C4, C5ʱ, ËûÃǶ¼ÊÇÒ»¸ö¿ÉÒÔ¹¤×÷µÄ°æ±¾, ÖÁÉÙÓ¦¸ÃÄܹ»Õý³£±àÒëºÍͨ¹ý²âÊÔÓÃÀý¡£µ«ÊÇÈç¹û´æÔÚÎÒÃÇÃèÊöµÄµÚ¶þÖÖ³¡¾°,
ºÏ²¢C6ʱûÓгåÍ», µ«È´ÎÞ·¨Í¨¹ý±àÒë¡£
ÒÔÉÏÕýÊÇÎÒ°Ñ merge ²Ù×÷¶¨ÒåΪ¸ßΣ²Ù×÷µÄÔÒò¡£
¼ÈÈ» Git ²»ÄܸøÓèÎÒÃǰïÖú, ÄDZØÐëҪѰÕÒ»º½â merge ´øÀ´µÄDZÔÚΣÏյĴëÊ©ÁË¡£
Ò»¸ö·½·¨ÊǰÑΣÏÕÅ׸ø¸üÓоÑéµÄÈ˵ġ£ ¾ÍÏñ±¾½Ú¿ªÊ¼Ìáµ½µÄÄÇÑù, Ò»°ã¿ª·¢ÈËÔ±(·ÇÏîÄ¿leader)Ó¦¾¡¿ÉÄܱÜÃâʹÓÃÖ±½Ó»ò¼ä½ÓʹÓøÃÃüÁî¡£ËûÃDzȹý¸ü¶àµÄ¿Ó,
Ôںϲ¢·Ö֧ʱ»á¿¼Âǵĸü¶à¸üÈ«Ãæ, ²¢ÇÒËûÃǽ«¶Ô±¾´ÎºÏ²¢µÄ³É¹û(¼´Ð嵀 commit, ¾ÍÏñÉÏͼÖеÄC6)¸ºÔð¡£
¼ÆËã»ú¹¤³ÌÖÐ×î²»¿É¿¿µÄ²¿·ÖÊÇÈ˼þ¡£ ÔÙϸÖµÄÈËÒ²Óз¸´íµÄʱºò, ²¢ÇÒÏà±ÈÓÚ¼ÆËã»úÀ´Ëµ, Õâ¸ö¸ÅÂÊÒªÔ¶Ô¶¸ßµÄ¶à,
Òò´Ë»¹Ó¦¸ÃÒýÈë×Ô¶¯»¯²âÊÔ»úÖÆ¡£±ÈÈç³ÖÐø¼¯³É(CI), ÿµ±Ò»´ÎºÏ²¢½áÊøºó, ×Ô¶¯´¥·¢±àÒëºÍ²âÊÔ, ²¢·¢ËͲâÊÔ±¨¸æ¡£
×ÜÊǰÑÕâЩ·çÏÕÍÆ¸øÓоÑéµÄÈË, ÕâÊDz»¹«Æ½µÄ¡£ ¿öÇÒ, ×÷Ϊ¾ÑéǷȱµÄÎÒÃÇ, ûÓлú»á´¦Àí·çÏÕ,
ÎÒÃÇÔõô»ýÀÛ¾ÑéÄØ? ×îÖØÒªµÄÊÇ, ÎÒÃÇÄÜ×öµÄ½ö½öÊÇʺ󲹾ÈÂð? Äܲ»ÄÜ´Ó¸ùÔ´ÉϱÜÃâÕâÖÖ·çÏÕ?
ÎÒÃÇÀ´¿´Ò»ÏÂÁíÒ»ÖÖ merge ³¡¾°:
²åͼ·ç¸ñÓÖ»»ÁË, Õâ´ÎµÄ²åͼÀ´×Ô ºï×Ó¶¼Äܶ®µÄ Git ÈëÃÅ
bugfix·ÖÖ§´Ómaster¼ì³ö, ºÜÐÒÔË, master·ÖÖ§»¹Ã»ÓиüÐÂ. Õâʱ, ½«bugfixºÏÈëmaster¡£
ÎÒÃÇÊ×ÏÈÈÃHEADÖ¸ÕëÖ¸Ïòmaster, È»ºóÖ´ÐÐgit merge bugfix --no-ff,
·Ö֧ͼ½«»á±ä³ÉÕâ¸öÑù×Ó¡£
ûÓÐÒâÍâ, Õâ¸ùÎÒÃÇÉÏÃæ¶Ô merge ÐÐΪµÄÃèÊöÊÇÒ»ÑùµÄ : ¹¹ÔìÒ»¸öÐ嵀 commit ½ÚµãC,
ÆäÉÏÓνڵã·Ö±ðΪBºÍY, È»ºó½«master·ÖÖ§±êǩָÏòC¡£Ïà½ÏÓÚÉÏÃæµÄ³¡¾°, ÕâÖÖÇé¿öϹ¹ÔìCÊÇÒ»¶¨²»»á²úÉú³åÍ»µÄ.¡£ÎªÊ²Ã´?
ÎÒÃÇ´Ó commit µÄ²¹¶¡ÊôÐÔÈëÊÖ, °ÑB->C¿´³ÉÒ»¸ö²¹¶¡, ÄÇôÎÒÃÇ¶Ô merge ¶¯×÷µÄÆÚÍû½á¹ûÓ¦¸ÃÊÇB->XºÍX->YÁ½¸ö²¹¶¡ÀÛ¼Æ×÷Óá£Ò²¾ÍÊÇ˵:
B->C = B->X + X->Y (1)
µ«ÊÇ´ÓͼÖÐ, ´ÓBµ½CÓÐÁ½Ìõ·¾¶, Ò»ÌõÊÇÖ±´ï, ÁíÒ»ÌõÊÇ·Ö²½:
B->C = B->X + X->Y + Y->C (2)
ÄÇôY->CÄØ? ÈôÏëÈÃÎÒÃÇµÄÆÚÍû(1)ºÍÊÂʵ(2)¶¼³ÉÁ¢, Y->C±ØÐëÊÇÊÇÒ»¸ö¿Õ²¹¶¡,
Ò²¾ÍÊÇ˵, CºÍYµÄ¿ìÕÕ״̬ÊÇÍêȫһÖµÄ, ¿ÉÒÔÓÃgit diff [C] [Y]ÑéÖ¤Ò»ÏÂÎÒÃǵÄÍÆÂÛ¡£
ΪʲôҪÓÐÕâ¸ö¿Õ²¹¶¡, Ö±½Ó½«Ê¹ÓÃY½Úµã²»ÐÐÂð? µ±È»¿ÉÒÔ!
¹Û²ìÒ»ÏÂÎÒÃÇµÄ merge ÃüÁî, ÓÐÒ»¸ö¸½¼Ó²ÎÊý--no-ff, Õâ¸ö²ÎÊýÇ¿ÖÆ¹ØµôÁË fast-forward
ÌØÐÔ. Èç¹ûÎÒÃDz»Ìí¼ÓÕâ¸ö²ÎÊý, Ö±½ÓÖ»ÓÃgit merge bugfix, ÄÇôµÃµ½µÄ½á¹û½«ÊÇÕâÑùµÄ:
masterÖ±½Ó±»Ö¸ÏòÁËY½Úµã¡£ »¹¼ÇµÃÂð, È÷Ö֧ǰ½øµÄµÚ¶þÖÖ·½·¨ÊÇʲôÀ´×Å? git merge,
Õâ²»ÊǾÍÀý×ÓÂï!
Ö´ÐÐgit merge [X]¶¯×÷ʱ, ÈôÎÞÐè¹¹ÔìÐ嵀 commit ½Úµã, Ö±½Ó½«µ±Ç°·ÖÖ§±êǩǰ½øµ½ÒªX½Úµã,
Õâ¾ÍÊÇËùνµÄ fast-forward ÌØÐÔ¡£
ÕâÖÖÇé¿öÏ嵀 merge ¶¯×÷È÷çÏÕ´ó´ó½µµÍ¡£ Ê×ÏÈ commit X, YµÄÌá½»ÕßÒª¶ÔÁ½´ÎÐ޸ĸºÔð,
ËûÃÇÓÐÔðÈα£Ö¤Ã¿´ÎÌá½»ºóµÄ´úÂëÊÇ¿ÉÒÔͨ¹ý±àÒëºÍ²âÊÔµÄ; Æä´Î, ÏîÄ¿¸ºÔðÈËÔÚ½«bugfix·ÖÖ§ºÏÈëmaster֮ǰ,
Ö»ÐèÈ·±£YµÄ¿ìÕÕ°æ±¾ÊÇÕýÈ·µÄ, ÒòΪ merge ¶¯×÷½«²»»á´øÀ´ÈκÎÔٴεıä¸ü, Ö»Êǽ«·Ö֧ǰ½øµ½YµÄ¿ìÕÕ,
Õâ´ó´ó½µµÍÁË merge µÄ·çÏÕ¡£
ÔÙ´ÎÌáÐÑ, É÷ÓÃgit pull, ÕâÌõÃüÁîÒþº¬ÁËgit fetch, git mergeÁ½ÌõÃüÁî¡£Ò»¸ö¸üºÃµÄ×ö·¨ÊÇÏÈgit
fetch»ñȡԶ³Ì·Ö֧״̬, µ±ÄãÈ·Èϱ¾µØ¹ØÁªµÄ·ÖÖ§ÄÜÓëÔ¶³Ì·ÖÖ§ÒÔfast-forwardºÏ²¢µÄʱºò,
ÔÙÖ´ÐÐgit merge»òÕßgit pull¡£
½¨ÖþÀíÏëµÄ³Ç±¤
ÀíÏëµÄ·Ö֧ͼ
ÎÒÃÇÒѾÕÒµ½ÁËÒ»ÖÖÀ´¾¡Á¿±ÜÃâ merge ·çÏյij¡¾°, ÔÚÕâÖÖ³¡¾°ÏÂ, ÎÒÃǻṹÔì³öÔõÑùµÄ·Ö֧ͼ?
Èç¹ûʹÓà fast-forward ÌØÐÔ, ½á¹û½«ÊÇÕâÑù:
Èç¹ûÎÒÃÇʹÓÃgit merge --no-ff²ÎÊý, ½á¹û½«ÊÇÕâÑùµÄ:
¿´µ½Çø±ðÁËÂð? fast-forward ½á¹û½«»áÊÇÒ»ÌõÒ»Ïß, ÕâÊÇ×î¸É¾»Õû½àµÄ·Ö֧ͼ, µ«ÊÇÏàÓ¦µÄ,
ÎÒÃÇÒѾÎÞ·¨Ò»Ä¿ÁËÈ»µÄÇø·Ö³öÄö commit ¹¹³ÉÒ»¸ö¹¦ÄÜ, ±ØÐëͨ¹ý¹æ·¶µÄ×¢ÊÍ(±ÈÈçÉÏͼÖÐÈ«²¿ÒÔ
JIRA ±àºÅ¿ªÍ·)À´×ö·ÖÇø; ¶ø--no-ff²ÎÊýËäÈ»È÷Ö֧ͼ±äµÃ¿´ÉÏÈ¥¸´ÔÓÁËÒ»µã¶ù, µ«È´·Ç³£Ö±¹ÛµØ±£ÁôÁË
commit ¼¯ºÏºÍ¹¦ÄܵĶÔÓ¦¹ØÏµ¡£
Á½ÖÖ·½Ê½Äĸö¸üºÃ? ÏñÎÄÕÂ×î³õ˵µÄÄÇÑù, ÎÒ²»ÊÇÒ»¸ö¼«¶ËÖ÷ÒåÕß, Á½ÖÖ¸÷ÓÐÓÅÁÓ, Òª·Ö³¡¾°¶Ô´ý¡£
¶ÔÓÚ³¬´ó¹æÄ£µÄ¿ªÔ´ÏîÄ¿À´½², ÿһ¸ö commit ¶¼²»ÊÇËæÒâµÄ, ±ØÐëÒªÓÐ JIRA, ÓʼþÁбí,
Github Issue ÁбíµÈÖîÈç´ËÀàµÄÌÖÂÛ, Ã÷È· commit µÄ¹¦ÄܺÍÓ°Ïì, È·±£Ã¿¸ö Commit
Ö»×öÒ»¼þÊÂ, ±ä¶¯×îС»¯, È»ºóͨ¹ý Pull Request ·½Ê½ÇëÇóºÏ²¢ÖÁÖ÷²Ö¿âµÄÖ÷Ïß·ÖÖ§¡£ÔÚÕâÖÖÇé¿öÏÂ,
ʹÓÃ--no-ffµÄ»°, ¼¸ºõÿ¸ö commit ¶¼»á²úÉúÒ»¸ö¿ÕµÄ merge ½Úµã, ·Ö֧ͼ¾Í±ä³ÉÁ˾â³Ý×´,
´øÀ´µÄÊÕÒæÎ¢ºõÆä΢; ¶ø¹æ·¶ commit ×¢ÊÍ, ²¢ÇÒʹÓà fast-forward »òÐíÊÇÒ»¸ö¸üºÃµÄÑ¡Ôñ¡£
¶ÔÓÚÐèÒª¿ìËÙÏìÓ¦±ä»¯µÄ»¥ÁªÍø¹«Ë¾À´Ëµ, ÿһ´Î¸Ä¶¯Ö®Ç°¶¼ÏȽ¨Á¢ JIRA »òÕß Issue, Õ⼸ºõ²»Ì«ÏÖʵ,
ͨ¹ý--no-ffµÄ½Úµã¼ÓÉÏÏà¶Ô¼ò½àÃ÷Á˵Ä×¢ÊÍ¿ÉÄÜÊÇÒ»¸ö¸üÃ÷ÖǵÄÑ¡Ôñ¡£
ÏÖʵÓëÀíÏëµÄ²î¾à
µ«¶àÊýÇé¿öÏÂ, ÏÖʵ³¡¾°²¢²»Âú×ãÕâÑùµÄ״̬, ÒòΪÏîÄ¿²»ÊÇÒ»¸öÈËÔÚ¿ª·¢, ÔÚÎÒÃÇÌá½»µÄͬʱ, ±ðÈËÒ²ÔÚÌá½»,
µ±ÎÒÃǵķÖÖ§×¼±¸ºÏÈëmasterʱ, masterÒѾǰ½øÁË, Óֻص½ÁË×î³õÄÇÖÖÔã¸âµÄ״̬. ÊÇÈ¥Ãæ¶ÔÔã¸âµÄ״̬,
»¹ÊDZÜÃâÔã¸âµÄ״̬, Ïë°ì·¨ÐÞÕýËü?
ÏòÀíÏ뿿£
Èç¹ûÎÒÃÇÔÚÏòÖ÷·ÖÖ§ºÏÈë֮ǰ, °ÑÕâÁ½¸öcommitͨ¹ýgit cherry-pickÃüÁî¼Þ½Óµ½×îеÄ
master ·ÖÖ§ÉÏ, ¿´ÆðÀ´Ò»Çж¼±äºÃÁË¡£µ±È», X'ºÍY'»á±»ÊÓ×÷ȫеÄcommit, ËûÃǶ¼»áÓÐеÄsha1¡£
²»¹ýÕâÀïÓиöÎÊÌâ, ǰÎÄÌá¹ý, ·ÖÖ§(branch)ÊÇÒ»¸ö¿ÉÒÔÏòǰ»¬¶¯µÄ±êÇ©, ´ÓYµ½Y'ËÆºõ²»ÄÜÖ±½Óǰ½ø,
ÎÒÃǵķÖÖ§±ê¼ÇÔõô²ÅÄÜ×ªÒÆµ½Y'ÉÏÄØ?
Ò»¸ö´Ö±©µÄ·½·¨ÊÇ, ÎÒÃÇ¿ÉÒÔÏÈɾµôbugfix·ÖÖ§, È»ºó´ÓY'´´½¨Ëü¡£²»¹ý, Git Ò²ÌṩÁ˽«·ÖÖ§±êǩָÏòÈÎÒâcommit½ÚµãµÄÃüÁî,
¼´git reset¡£
µ±HEADÖ¸ÕëÖ¸Ïòbugfix(Y)·Ö֧ʱ, Ö´ÐÐgit reset --hard [Y'], »á½«HEADÖ¸ÕëÖ¸Ïòbugfix·Ö֧ͬʱָÏòY'¡£(²ÎÊý--hard»áÇå¿Õ¹¤×÷ÇøºÍÔÝ´æÇø,
´ËÍ⻹ÓÐ--mixed, --softÑ¡Ïî, »á¶Ô¹¤×÷ÇøºÍÔÝ´æÇøÓв»Í¬µÄÓ°Ïì, Èç¹ûÄã²»Á˽â, Ò²ÐíÄãÐèҪѰÕÒÆäËûµÄ½Ì³Ì,
±¾ÎIJ»ÌÖÂÛÕâЩ)
ΪÁË´ïµ½ÕâÖÖÀíÏëµÄ·Ö֧״̬, ÎÒÃÇÒª¾³£Õâô¸É, ÕâÒ»Çй¤×÷ËÆºõ±äµÃÓеã¶ù·±Ëö, ÒªÖ´ÐÐÕâô¶à²½Öè²ÅÄÜ´ïµ½·ÖÖ§¼Þ½ÓµÄÄ¿µÄ¡£
¶ÔµÄ, Git ΪÎÒÃÇÌṩÁË×Ô¶¯»¯·½°¸, ÄǾÍÊÇÇ¿´óµÄ rebase¡£
Rebase Òë×÷±ä»ù, ´Ó×ÖÃæÉÏÀí½â, rebase ÃüÁî¿ÉÒԸı䵱ǰ·ÖÖ§µÄ»ùµã, ÎÒÃÇÏÖÔÚ½ö¹Ø×¢
rebase ¹¦ÄÜÆäÖеÄÒ»¸öÌØÐÔ, À´´ïµ½ÎÒÃÇ·ÖÖ§¼Þ½ÓµÄÄ¿µÄ¾Í×ã¹»ÁË¡£ »Øµ½×î³õµÄ³¡¾°, bugfix
·ÖÖ§»¹Ö¸ÏòY, ÕâÊÇÎÒÃÇÖ»ÒªÖ´ÐÐgit rebase master, ¼´¿É´ïµ½Ä¿µÄ¡£
ÎÒÃDZ¾µØµÄbugfixÒѾ±ä»ùÍê³É, ÈôËüÒѾ¹ØÁª¹ýÔ¶³Ì·ÖÖ§, ÄÇôorigin/bugfix»¹´¦ÔÚY,
ÎÒÃÇÒª°Ñ±¾µØµÄ״̬±ä¸üÍÆË͵½Ô¶³Ì, Èç¹û½Ó×ÅÖ´ÐÐgit push, ½«»á±¨´í :
¿ÉÒÔ¿´µ½, Git ·þÎñÆ÷¾Ü¾øÁËÎÒÃǵÄÍÆËÍÇëÇó, ²¢·µ»ØÁËһЩÌáʾÐÅÏ¢,
»òÐí¿´µ½Õâ³¡Ãæ, ÄãһϾͻÅÁË, ÎÒÐÁ¿àдµÄµÄ´úÂë²»»á¶ªµô°É! ÌáʾÀïÃæÓÐgit pullÃüÁî, ÎÒÊDz»ÊÇÓ¦¸ÃÖ´ÐÐ,
Íì¾ÈÒ»ÏÂ!
µ±ÕæÕýÖ´ÐÐÁËgit pullÃüÁîºó, Õâ²ÅÊÇÔã¸âµÄ³¡Ãæ!
±ðÍüÁË, git pull°µº¬git mergeÓïÒå, Õâ»áµ¼ÖÂÒ»´ÎºÏ²¢, ¹¹ÔìµÄÒ»¸öÐ嵀 commit
Z, ÉÏÓηֱðÊÇ bugfix Y'ºÍ origin/bugfix Y, bugfix Ö¸ÏòÁËZ.
Èç¹ûÕâʱÔÙÖ´ÐÐÁËgit pushÃüÁî, ÄÇôÕâÔã¸âµÄ·Ö֧ͼ¾ÍÍÆµ½ÁË·þÎñÆ÷ÉÏ, Õû¸öÍŶӽ«»á¿´µ½Äã°Ñ·Ö֧ͼ¸ãÂÒÁË,
Õâ»Ãæ¼òÖ±²»¿ÉÃèÊö! (Èç¹ûÄãÄÔ²¹²»³öÀ´Õâʱ·Ö֧ͼµÄÑù×Ó, ϸöʵ²Ù°¸ÀýÖлáÑÝʾ)
¼Çס, ²»Òª»Å, ÄãÒѾÁ˽âÁË Git µÄÔÀí, ÄãÓÐÄÜÁ¦ÕÆ¿Ø Git, ¶ø²»ÊDZ»Ò»Á½¸öĪÃûµÄ´íÎóÏÅÍËÁË¡£»¹¼ÇµÃ¸Õ¸ÕʹÓõÄgit
resetÃüÁîÂð? Ëû¿ÉÒÔ°Ñ·ÖÖ§Ç¿ÖÆÖ¸ÏòÈÎÒ»commit, ÎÒÃÇʹÓÃgit reset --hard
[Y'] ²»¾Í»Øµ½¸Õ²ÅµÄ״̬ÁËÂð?
ºÃÁË, ¼Ù×°¸Õ²Åʲô¶¼Ã»·¢Éú, ÎÒÃÇ×Ðϸ¿´¿´·þÎñÆ÷·µ»ØµÄ´íÎó, ²¢ÇÒ˼¿¼Ò»ÏÂÎÊÌâµ½µ×³öÔÚÄÄÀï?
Ê×ÏÈ, git pushµ½µ×ÔÚ×öʲô? pull ºÍ push ÊÇÒ»¶Ô·´Òå´Ê, git pullÊǰÑÔ¶³Ì·ÖÖ§½ø¶Èͬ²½µ½±¾µØ,
È»ºó³¢ÊÔ½«Ô¶³Ì·ÖÖ§ºÏ²¢µ½¹ØÁªµÄ±¾µØ·ÖÖ§; git pushÔÚ×öÀàËÆµÄÊÂÇé, ²»¹ýÊÇÏà·´µÄ, Ëû»áÏȰѱ¾µØ·Ö֧ͬ²½µ½Ô¶³Ì,
È»ºó³¢ÊÔ½«±¾µØ·ÖÖ§ºÏ²¢µ½¹ØÁªµÄÔ¶³Ì·ÖÖ§¡£µ«ÊÇ, µ±ÎÞ·¨Âú×ã fast-forward Ìõ¼þʱ, git
push»áÖ±½Ó±¨´í, ¶ø²»Êdz¢ÊÔ¹¹ÔìÒ»¸öеÄcommit£¬ Õâ¾ÍÊÇÎÒÃǸոÕÓöµ½µÄ´íÎ󳡾°¡£
µ«ºÜÏÔÈ», ÎÒÃÇÔÚ±¾µØµ÷ÕûÁË·ÖÖ§, ²¢ÇÒÆÚÍû°Ñµ÷ÕûºóµÄ×´Ì¬ÍÆË͵½Ô¶³Ì, ¸²¸ÇÔ¶³Ì·ÖÖ§ÔÓеÄ״̬.
ÕâʱÐèÒªÌí¼ÓÒ»¸ö²ÎÊýgit push --force, Ç¿ÖÆ¸²¸ÇÔ¶³Ì¹ØÁª·ÖÖ§¡£ÏÖÔÚÔ¶³ÌµÄ bugfix
·ÖÖ§ºÍ±¾µØ bugfix ±£³Öͬ²½ÁË, ¶¼Ö¸ÏòÁËY'¡£team leader ¿ÉÒÔ review ´úÂë,
È»ºóºÏÈë master ÁË¡£
¶ÔÖ÷·ÖÖ§±£³Ö¾´Î·
ÉÏÃæµÄgit rebase, git push --force¿´ÆðÀ´ºÜÓÐЧ¹û¡£µ«ÊÇ, ÕâÔÚÐ×÷ÖÐËÆºõ»áÕÕ³ÉÒ»¸öÎÊÌâ
: Èç¹û´ó¼Ò¶¼ÔÚ force push, ÄÇÆñ²»¾ÍÂÒÌ×ÁË?
ËùÒÔ, Ó¦¸ÃÖÆ¶¨Ò»¸öÔ¼¶¨ : ¹«¹²·ÖÖ§²»ÔÊÐí force push¡£Ò²¾ÍÊÇ˵, ¹«¹²·ÖÖ§Ö»ÄÜǰ½ø¡£
ÔÚ³£ÓÃµÄ Git ·þÎñÆ÷ÉÏ, ±ÈÈçÂëÔÆ, GitLab, Github¶¼Ö§³Ö·ÖÖ§±£»¤¹¦ÄÜ, ÎÒÃÇÖÁÉÙÒªÉ趨һ¸ö±£»¤·ÖÖ§(ÒÔ
master ΪÀý), ×÷Ϊ¹¦ÄÜ·ÖÖ§¡£ ¸Ã·ÖÖ§Ó¦¸ÃÓÐÒÔÏÂÌØÐÔ:
Ö»ÄÜǰ½ø, Ò²¾ÍÊDz»ÔÊÐí force push;
²»ÔÊÐíÖ±½Ó commit, Ö»ÄÜͨ¹ý merge ¶¯×÷ʹ·Ö֧ǰ½ø;
ÊÕ½ô merge ȨÏÞ, Ö»ÔÊÐí²¿·Ö¸ß¼¶¹¤³ÌʦִÐÐ merge;
Ö»ÔÊÐí merge Âú×ã fast-forward Ìõ¼þµÄ commit;
ÿ´Î merge ǰ, ±ØÐë½øÐÐ code review ºÍ³ÖÐø¼¯³É(CI);
Commit Ìá½»Õß, code review Õß, merge Õß¶¼Òª¶Ô´úÂë±ä¸ü¸ºÔð.
ÔÚÕâÖÖģʽÏÂ, ËùÓÐÍŶӳÉÔ±ÒÔ master ·Ö֧ΪºËÐĽøÐпª·¢¡£ ÿ¸öÈ˽ӵ½¿ª·¢ÐèÇóºó:
´Ó×îеÄÔ¶³Ì master ·ÖÖ§¼ì³ö×Ô¼ºµÄ¿ª·¢·ÖÖ§;
¿ª·¢;
¿ª·¢½áÊøºó, ÒÔ×îеÄÔ¶³Ì master Ϊ»ùµã, Ö´ÐÐ rebase ²Ù×÷, ½â¾öµô³åÍ»;
ÏòÓÐ merge ȨÏÞµÄÈËÌá½»ºÏ²¢ÇëÇó(ÂëÔÆºÍ Github ³Æ×÷ Pull Request, Gitlab
³Æ×÷ Merge Request)£»
Code review ºÍ CI£»
ÈôµÚ5²½Í¨¹ý, Ìá½»±»ºÏ²¢, master ǰ½ø; ·ñÔò»Øµ½µÚ2²½£»
Òѱ»ºÏÈëµÄ¿ª·¢·ÖÖ§ÉúÃüÖÜÆÚ½áÊø, ±»É¾³ý¡£
¹ØÓÚµÚ7²½, Äãû¿´´í, Ò»¸ö·ÖÖ§µÄÉúÃüÖÜÆÚ¾ÍÊÇÕâô¶ÌÔÝ! ÕâÈ¡¾öÓÚÒ»¸öÌØÐԵĴóС, ¿ÉÄÜÖ»Óм¸·ÖÖÓ,
»òÐíÓм¸Ìì, ¶ø²»ÊÇÏñ master ·ÖÖ§Ò»ÑùÓÀÔ¶´æÔÚ¡£
ÿ¸öÈËÔÚ¿ª·¢¹ý³ÌÖж¼Ó¦¸ÃÓÐ×Ô¼ºµÄ·ÖÖ§, (ÎÒÍÆ¼öÒÔÄãµÄÃû×Ö½áβ, ÕâÑù±ãÓÚ±êʶ), ÕâÌõ·ÖÖ§ÊÇÄãµÄ˽ÓзÖÖ§.
ÄãÓ¦¸Ã¶Ô master ·ÖÖ§±£³Ö¾´Î·, µ«¶ÔÓÚÄãµÄ˽ÓзÖÖ§, Äã¿ÉÒÔÈÎÒâµÄ force push,
rebase, ÉõÖÁÄã²»°ÑËû·Åµ½ÏîÄ¿µÄ¹«Óвֿâ, ·Åµ½×Ô¼º fork µÄ˽ÓвֿâÀï, Õâ¾ÍÊÇÒ»ÕŲݸåÖ½!
ÈÃÎÒÃÇ´Û¸ÄÀúÊ·°É!
ÔÚÎÒÃÇ×Ô¼ºµÄ·ÖÖ§(²Ý¸åÖ½)ÉÏ, ÎÒÃÇ¿ÉÒÔÏà¶ÔËæÒâµØÐÞ¸Ä, µ«Êǵ±Ìá½» PR ʱ, ±ØÐëÕûÀí³öÒ»·Ý¸É¾»Õû½àµÄÌá½»¼Ç¼,
Õâ±ØÈ»Éæ¼°µ½ commit ÀúÊ·µÄÐ޸ġ£ »¹¼ÇµÃÉÏÎÄÌáµ½µÄÒ»¸öÇ¿´óÃüÁîÂð? ¶ÔµÄ, ¾ÍÊÇgit rebase!

ÔÚmacOSÖÕ¶ËÉÏͨ¹ýgit log --oneline --graph --all¿ÉÒÔ´òÓ¡³öÉÏÃæµÄ·Ö֧ͼ,
ÕâÊÇÎÒ×î³£ÓõÄÒ»¸öÃüÁî, ÔÚlinuxÉϵıíÏÖÐÐΪ¿ÉÄÜ»áÓеã¶ùÇø±ð, »òÐíÄã¿ÉÒÔ³¢ÊÔgit log
--oneline --graph --all --decorate=short | less -r,
»òÕ߲ο¼git log --help½øÐе÷Õû, À´´ïµ½ÄãÏëÒªµÄ´òӡЧ¹û¡£µ±È», ʹÓÃͼÐÎÈí¼þ²é¿´·Ö֧ͼҲÊÇÒ»¸öºÜºÃµÄÑ¡Ôñ¡£
¿´, ÎÒÔÚ¿ª·¢Ò»¸ö¶©µ¥¹¦ÄÜ, µ±ÎÒ¿ªÊ¼¿ª·¢µÄʱºò, master ÔÚc80dc1eÕâ¸öÌá½»µã, ÎÒͨ¹ýgit
checkout -b feature-order-pancheng¼ì³öÒ»¸ö×Ô¼ºµÄ¿ª·¢·ÖÖ§¡£
ÎÒÔÚ¿ª·¢¹ý³ÌÖÐ, ×öÁË7´Î commit, µ«ÊÂʵÉÏÖ»ÓÐ4¸öÊÇÓÐÒâÒåµÄ, ÆäËûµÄ¼¸¸ö½ö½öÊÇÎÒÔÚÌá½»ºóÁ¢¿Ì¾Í·¢ÏÖÁ˺ÜÃ÷ÏԵĴíÎó,
È»ºóÐÞÕý¹ýÀ´ÁË, Õâ¿´ÆðÀ´¾ÍÊǸö²Ý¸å, Èç¹ûͬÊ review ÎҵĴúÂë, ¿´µ½Èç´ËµÍ¼¶µÄ´íÎó, ËÆºõ²»Ì«ºÃ¡£
ÕâÀï×îºÃµÄ×ö·¨¾ÍÊÇ´Û¸Ä Git Ìá½»ÀúÊ·, °Ñ fix ÀàÐ굀 commit ÓëÉÏÒ»¸ö commit
ºÏ²¢¡£
ÎÒÃÇÏÖÔÚÖ´ÐÐgit rebase -i c80dc1e, -i´ú±í½»»¥Ä£Ê½
:

½øÈëÁËÒ»¸ö vim ½çÃæ(Ò²¿ÉÄÜÊÇ nano, È¡¾öÓÚÄãÅäÖõÄĬÈÏ±à¼Æ÷),
ÉÏÃæÁгöÁËÎÒÃǵÄÿ´ÎÌá½»¡£×¢Òâ, ÕâÀïÊÇ´ÓÉÏÍùÏÂÅÅÁеÄ, ÉÏÒ»¸ö·Ö֧ͼÖÐʱ´ÓÏÂÍùÉÏÅÅÁеÄ, ÔÚ²»Í¬µÄÃüÁî»òÈí¼þÖÐ,
·½Ïò¿ÉÄܲ»Ò»Ñù¡£
ÿ¸ö commit ×îÇ°Ãæ¶¼ÊÇ pick ÃüÁî, Õâ¾ÍÓëÎÒÃÇÇ°ÃæÊ¹ÓÃµÄ cherry-pick ÃüÁî×÷ÓÃÏàËÆ,
ÏÂÃæÓжÔËùÓÐÃüÁîµÄ½âÊÍ, Äã¿ÉÒÔ×ÔÐг¢ÊÔ¡£
ÎÒÃÇ¿´µ½, ÓÐÒ»¸ö fixup ÃüÁîËÆºõÕýÊÇÎÒÃÇÏëÒªÕÒµÄ:

±£´æÍ˳ö, Ôٴβ鿴·Ö֧ͼ :

¹þ! ÎÒÃǵĺÚÀúÊ·ÔÚ±¾µØµÄ feature-order-pancheng
·ÖÖ§±»Ä¨µôÁË! È»ºó°ÑËüÍÆË͵½Ô¶³Ì¡£

²»³öÒâÍâ, Git ·þÎñÆ÷¾Ü¾øÁËÎÒÃǵÄÍÆËÍÇëÇó, ÒòΪ²»Âú×ã fast-forward
Ìõ¼þ¡£ ÏÖÔÚÄãÓ¦¸Ã²»»á»ÅÁ˰É! ÎÒÃǼÙ×°»ÅÒ»°Ñ, "¸ù¾ÝÌáʾ"Ö´ÐÐgit pull:

¹þ! Ë«·ÝÌá½»! ±»ÀÏ´ó¿´¼û˵²»¶¨Òª°¤ÅúµÄ! »¹¼ÇµÃÕâʱºòÓ¦¸Ã×öʲôÂð?
ÏȻص½ merge ǰµÄ״̬, Ö´ÐÐgit reset --hard 395ef39:

È»ºóÖ´ÐÐgit push -f :

֮ǰµÄ origin/feature-order-pancheng ·ÖÖ§Ëù´¦µÄµã´ÓͼÉÏÏûʧÁË, ÎÒÃÇ»¹ÓпÉÄÜÕÒ»ØËûÂð?
Ŷ¶ÔÁË, ·ÖÖ§ÃûÖ»ÊǸö±êÇ©¶øÒÑ, ÎÒ»¹¼ÇµÃÄǸöµã֮ǰµÄsha1ÊÇccce49d, Ö´ÐÐgit checkout
ccce49d, ·ÖÖ§ÓÖ»ØÀ´ÁË, ÔÀ´Ö»ÊÇÒþ²ØÁË! ÎÒÃǰÑÕâÖÖûÓÐÈκαêÇ©µÄ·ÖÖ§³ÆÎ½ÓÎÀë·ÖÖ§, ËûĬÈϲ»»áÔÚ·Ö֧ͼÖÐÏÔʾ,
²¢ÇÒ»áÔÚÒ»¶Îʱ¼äºóÓÉ Git ½øÐÐÀ¬»ø»ØÊÕ, ²Å»áÕæÕýµÄÏûʧ, ÔÚ´Ë֮ǰ, ÎÒÃÇ¿ÉÒÔͨ¹ýgit reglogÕÒµ½ËûÃǵÄsha1,
»Øµ½ÄǸö¿ìÕÕ¡£
¶©µ¥¹¦ÄÜ¿ª·¢ºÃÁË, ¿ÉÒÔÏòÖ÷·ÖÖ§ÌáºÏ²¢ÇëÇóÁË, Ŷ, ¶ÔÁË, master ÒѾǰ½øÁË, ÎÒÃÇÌá
PR ֮ǰ±ØÐëÏȸú½ø¡£Ö´ÐÐgit rebase master, git push -f, È»ºóÔٲ鿴·Ö֧ͼ
:

Õâʱ¾Í¿ÉÒÔÈ¥Ìá½» Pull Request ÁË¡£


µ± PR ͨ¹ýºó, ÄãµÄ·ÖÖ§½«±»ºÏÈë master ·ÖÖ§, Ö´ÐÐgit
fetchÀȡԶ³Ì·ÖÖ§ÐÅÏ¢, È»ºó²é¿´·Ö֧ͼ :

àÅ, Ò»´ÎÓä¿ìµÄ¿ª·¢½áÊøÁË¡£
Èç¹û´ó¼Ò¶¼×ñÊØÕâ¸öÔ¼¶¨, ÄÇôÎÒÃǵķÖ֧ͼ½«»áÊÇÕâÑù :

ËäÈ»ÎÒÃÇÔÚ master ·ÖÖ§ºÏ²¢ÉÏʹÓÃÁË--no-ff·½Ê½, µ«ÊÇËüµÈ¼ÛÓÚÊÇÒ»ÌõÖ±Ïß, Õâ¶Ô code
review ºÍÐ×÷¿ª·¢½«Ê®·ÖÓѺá£
ÄÇô·¢°æÄØ?
Ïà±ÈÓÚÍù master ÉÏ merge Ìá½», ÏîÄ¿·¢°æÊÇÒ»¸ö¸ü½÷É÷µÄ»°Ìâ¡£
ÎÒÃÇÉÏÃæÒѾÌáµ½³ÖÐø¼¯³É(CI), ÕâÊÇÒ»ÖÖ×Ô¶¯»¯µÄ´ò°üºÍ²âÊÔ»úÖÆ, ÍùÍù»áÓë³ÖÐø½»¸¶(CD)Ò»ÆðÐ×÷¡£ÎÒÃÇ¿ÉÒÔ½«
Git µÄijЩÐÐΪ×÷Ϊ CI/CD µÄ´¥·¢Ìõ¼þ, À´´ïµ½×Ô¶¯»¯´ò°ü, ²âÊÔ, ²¿ÊðµÄÄÜÁ¦¡£
ÎÒÃǶԷÖÖ§×öÒÔϹ淶:
master Ö÷¹¦ÄÜ·ÖÖ§;
feature-xxx-[developer name] ÌØÐÔ¿ª·¢·ÖÖ§;
fix-xxx-[developer name] ·Ç½ô¼±bugÐÞ¸´·ÖÖ§;
hotfix-xxx-[developer name] ÏßÉϽô¼±bugÐÞ¸´·ÖÖ§;
dev-[date] ¿ª·¢»·¾³·¢²¼·ÖÖ§(»òtag);
test-[date] ²âÊÔ»·¾³·¢²¼·ÖÖ§(»òtag);
uat-[date] ×¼Éú²ú»·¾³·¢²¼·ÖÖ§(»òtag);
release-[date] ÏßÉÏ·¢²¼·ÖÖ§(»òtag)¡£
ÔÚ Git ·þÎñÆ÷ÖÐ, ¼¸ºõ¶¼»áÌṩ CI/CD ¹¦ÄÜ, CI/CD ´¥·¢Ìõ¼þ¸ù¾ÝÕýÔò±í´ïʽƥÅäbranch»òtag,
×Ô¶¯´¥·¢ÏîÄ¿µÄ±àÒë, ´ò°ü, ²âÊÔ, ²¿ÊðµÈÐÐΪ¡£
ÔÚ·ÖÖ§¹ÜÀíÖÐ, dev-[date]·ÖÖ§¿ÉÒÔÓÉÈÎÒ⿪·¢ÈËÔ±ËæÊ±¼ì³ö·¢²¼µ½¿ª·¢»·¾³Áªµ÷; test-[date],
uat-[date], release-[date]ÔÔòÉϱØÐë´ÓmasterÉÏÖð¼¶¼ì³ö, ·Ö±ð²âÊÔ,
Èô·¢ÏÖÎÊÌâ, ½øÐÐ bugfix¡£

¿´, ÎÒÃÇ´Ó75a8e22¼ì³ötest-20190623·ÖÖ§, µ±ÍÆË͵½·þÎñÆ÷ÉÏʱ, CI/CD
»á×Ô¶¯´¥·¢, ×îÖÕÏîÄ¿±»²¿Êðµ½²âÊÔ·þÎñÆ÷ÉÏ. ÎÒÃÇÔÚ²âÊÔÉÏ·¢ÏÖÒ»¸ö bug, ÔÚÕæÕýÉÏÏßǰ·¢ÏÖµÄ bug
×ܱÈÉÏÏߺóºÃ¡£bugfix ºó, ÎÒÃÇÈÏΪûÓÐÎÊÌâÁË, ¼ì³örelease-20190623·ÖÖ§,
´¥·¢ CI/CD, ²¿Êðµ½Éú²ú»·¾³. °ëÌìºó, ÎÒÃÇ·¢ÏÖÒ»¸ö½ô¼±µÄÏßÉÏ bug, ÎÒÃǽô¼±´´½¨ÁË hotfix
·ÖÖ§, ÔÚ CI ͨ¹ýºó, ½«ÆäºÏÈëµ½release-20190623·ÖÖ§, È»ºóɾ³ý hotfix
·ÖÖ§¡£
¿´ÉÏÈ¥Õâ´Î·¢°æ³É¹¦ÁË, ÄÇôÕâÁ½¸ö bugfix commit ÔõôºÏÈëµ½ master ÄØ?
»¹¼ÇµÃÎÒÃÇ˵ master ·ÖÖ§µÄ merge ÔÔòÂð? Ö»ÔÊÐí merge Âú×ã fast-forward
Ìõ¼þµÄ commit. ÔÚÎÒÃÇ¿ªÊ¼²âÊÔºó, master ÒѾǰ½ø, bugfix commit(¼´ÔÚtest-[date],
uat-[date], release-[date]É쵀 hotfix) ¾Í²»ÄÜÖ±½ÓºÏ²¢µ½ master,
²¢ÇÒ·¢²¼µã rebase ÊÇÓзçÏÕµÄ, Õâʱ¾ÍÖ»ÄÜͨ¹ý cherry-pick À´°Ñ²¹¶¡ÊÖ¶¯´ò»Øµ½
master ·ÖÖ§ÉÏÁË!
ÎÒÃÇ´Ó×îРmaster ÇгöÒ»¸ö fix ·ÖÖ§, ²¢°ÑÁ½¸ö²¹¶¡Í¨¹ý
cherry-pick ÒÆÖ²¹ýÀ´:

½ÓÏÂÀ´¾ÍÊÇ PR Á÷³Ì, µ±ºÏÈë master ºó, ɾ³ý¸Ã fix
·ÖÖ§:

àÅ, ÕâÆªÎÄÕÂǰºó´óԼдÁËÒ»¸öÀñ°Ý, ÊÇʱºòÌá PR ÁË, ÎÒҪȥ
rebase ÁË¡£
|