ãå³è§£ã§æ¯èŒãGit merge vs rebase â å±¥æŽçµ±åã®éãã培åºè§£èª¬
Git䜿ã£ãŠããšmergeãšrebaseã£ãŠããèããã©ãã©ã£ã¡ãããã©ã³ããçµ±åãããã£ãŠããšã§ããïŒäœãéãã®ïŒ
ãã質åã ããã©ã¡ãããã©ã³ãã®å€æŽãåã蟌ãæäœã ãã©ãã³ãããå±¥æŽã®æ®ãæ¹ããŸã£ããéããã ããmergeã¯ãåæµããããšããèšé²ãæ®ããã©ãrebaseã¯ãæåããããã§äœæ¥ããŠãŸããããšãã圢ã«å±¥æŽãæžãæãããã ã
å±¥æŽãæžãæããã£ãŠããªãã ãã¡ãã£ãšæããâŠãmergeã®ã»ããå®å šãªã®ïŒ
mergeã¯æ¢åã®ã³ããããäžå倿Žããªããããå®å šæ§ã¯é«ãããfeatureãã©ã³ããmainã«mergeãããšãäž¡æ¹ã®å±¥æŽãåæµããããããŒãžã³ããããã1ã€äœããããã ããã ããã©ã³ããå€ããããžã§ã¯ãã ãšå±¥æŽãã¹ãã²ããã£ã¿ããã«å ¥ãçµãã§ããŸãã®ããã¡ãªããã ãã
ãããrebaseã ãšå±¥æŽããã¬ã€ã«ãªãã£ãŠããšïŒ
ãã®ãšãããrebaseã¯featureãã©ã³ãã®ã³ãããããmainãã©ã³ãã®å 端ã«ãèŒãæ¿ãããã€ã¡ãŒãžã ããçµæçã«äžçŽç·ã®å±¥æŽã«ãªããããgit logããšãŠãèªã¿ããããªããã ããã ããã³ãããã®ããã·ã¥ãå šéšå€ããããæ³šæãå¿ èŠã ãã
ããã·ã¥ãå€ãããšäœãå°ãã®ïŒ
ãã§ã«ãªã¢ãŒãã«pushãããã©ã³ããrebaseãããšãä»ã®ã¡ã³ããŒãæã£ãŠãã³ããããšé£ãéã£ãŠããŸããã ããã ããããŸã pushããŠããªãããŒã«ã«ã®ã³ãããã ãrebaseããããšããã®ãéåã ããpushããåŸã«rebaseããŠforce pushãããšãããŒã ã¡ã³ããŒã®äœæ¥ãå£ããå¯èœæ§ããããã ã
ãªãã»ã©âŠãããŒã ã§äœ¿ããšãã¯ã©ã䜿ãåããã®ãããã®ããªïŒ
ãããããã¿ãŒã³ã¯ãmainãžã®çµ±åã¯mergeãããŒã«ã«ã®æŽçã¯rebaseãã ããfeatureãã©ã³ãã§äœæ¥äžã«mainãé²ãã ããgit rebase mainã§èªåã®ãã©ã³ããææ°ã«è¿œåŸããããæçµçã«mainã«å ¥ãããšãã¯mergeïŒãŸãã¯ãã«ãªã¯ãšã¹ãïŒã䜿ãããããäžçªãã©ãã«ãå°ãªãããæ¹ã ãã
ã³ã³ããªã¯ããèµ·ãããšãã®å¯ŸåŠã£ãŠãmergeãšrebaseã§éãã¯ããã®ïŒ
mergeã ãšã³ã³ããªã¯ãã®è§£æ±ºã¯1åã§æžããã ãã©ãrebaseã ãšã³ãããã1ã€ãã€èŒãæ¿ãããããã³ãããããšã«ã³ã³ããªã¯ããçºçããå¯èœæ§ããããã5ã€ã³ããããããã°æå€§5å解決ãå¿ èŠã«ãªãããšããããã ãã ããã³ããããå€ããšãã¯mergeã®ã»ããæ¥œãªå Žåããããã
rebaseã«ã¯ã€ã³ã¿ã©ã¯ãã£ãã¢ãŒãã£ãŠããã®ãããã£ãŠèãããã©ãããã¯äœïŒ
git rebase -i ã䜿ããšãã³ãããã®é çªãå ¥ãæ¿ããããè€æ°ã®ã³ãããã1ã€ã«ãŸãšãããïŒsquashïŒãã³ãããã¡ãã»ãŒãžãæžãæãããã§ãããã ãããã«ãªã¯ãšã¹ããåºãåã«ãWIPãããtypoä¿®æ£ãã¿ãããªçްããã³ããããæŽçããã®ã«æé©ã ãã
ããã䟿å©ããïŒããã©ã³ã®äººãã¡ã¯ã©ã䜿ãåããŠãã®ïŒ
å®ã¯ãGitHubã®ãã«ãªã¯ãšã¹ãã«ã¯ãSquash and mergeããšãRebase and mergeããšãããªãã·ã§ã³ããã£ãŠãããã䜿ãã°ãã©ã³ãäžã®ã³ããããmainåŽã§èªåçã«æŽçã§ãããã ããLinuxã«ãŒãã«ã®éçºã§ã¯rebaseãç©æ¥µçã«äœ¿ã£ãŠå±¥æŽãçŸããä¿ã€æåããããã©ãå€§èŠæš¡ããŒã ã§ã¯merge commitãæ®ããŠããã€ã»èª°ãã»ã©ã®PRã§å ¥ããããã远跡ããããããæ¹éã®ãšãããå€ããã ã
ãããžã§ã¯ãã®æ¹éã«ãã£ãŠæ£è§£ãå€ããã£ãŠããšã ãïŒ
ãŸãã«ãããããäžã€äžçŽè åãã®è©±ããããšãgit rerereãšããæ©èœãæå¹ã«ããŠãããšãäžåºŠè§£æ±ºããã³ã³ããªã¯ãã®ãã¿ãŒã³ãGitãèšæ¶ããŠãããŠãrebaseäžã«åãã³ã³ããªã¯ããåºããèªåã§è§£æ±ºããŠããããã ããrebaseãå€çšããããŒã ã§ã¯git config rerere.enabled trueãèšå®ããŠãããšãããªãäœæ¥ã楜ã«ãªããã
rerereãªããŠåããŠèããïŒGitã£ãŠå¥¥ãæ·±ããâŠã
Gitã¯ãå±¥æŽãã©ã管çããããã«å¯Ÿããå²åŠãè©°ãŸã£ãããŒã«ã ãããããŸãã¯ããŒã«ã«ã§rebaseããªã¢ãŒããžã¯mergeãšããåºæ¬ãæŒãããŠãæ £ããŠãããã€ã³ã¿ã©ã¯ãã£ãrebaseãrerereã詊ããŠã¿ããšãããã倧äºãªã®ã¯ãããŒã ã§æ¹éãæãããããšã ãã