ãã®ç¹ã§ãç§ã¯ã¹ããŒãªãŒãã©ãŒãšããŠèªåèªèº«ããã¹ãããBitbucketã®æè¡çãªåŽé¢ã«è§Šããããšã«ããŸããã ç§ã¯ãã®ç®æšããŸã£ããè¿œæ±ããŠããªãã®ã§ãåºåã®è©Šã¿ãšããŠã®ç§ã®æå³ãèæ ®ããªããããé¡ãããŸãã ãã®èšäºãèªè ã®èå³ãåŒãå Žåããããã¯ãäœæãã質åã«çããŠã¿ãŠãã ããã
ãŸããTim Pettersen ã®èšäºãA better pull requestãã翻蚳ããŠãããã«å²ãåœãŠãããã¿ã¹ã¯ãæãå¹æçã«è§£æ±ºããããã«ããã«ãªã¯ãšã¹ããã©ã®ããã«èŠããã¹ããã説æããŸãã
çšèªã«é¢ããäœè«
ããŒãžã§ã³ç®¡çã·ã¹ãã ã«é¢é£ãããã·ã¢èªã®æè¡èšäºïŒãšããã§ãITé¢é£ã®ãããã¯ã®å€§éšåïŒã§ã¯ãèè
ã¯ç¹å®ã®çšèªã䜿çšããå¿
èŠã«çŽé¢ããŠããŸããããã¯ãã·ã¢èªã«ç¿»èš³ãããå Žåãšãããªãå ŽåããããŸãã 人çã§ã¯ããããã®çšèªã®ã»ãšãã©ã¯ç¿»èš³ãããŠããããããã®ãŸãŸãã®èšèã«ããã³ãã¥ãã±ãŒã·ã§ã³ã§ã¯äœ¿çšãããŠããŸãããå®éãé³èš³ãããŠããŸãã å³å¯ã«èšãã°ããããã¯æžé¢ã§ç¿»èš³ããå¿
èŠããããŸããããã®å Žåãçšèªã¯ãã°ãã°è±èªçãšå®å
šã«äžèŽããªããªããããèªè
ã«ããèªèãéåžžã«è€éã«ãªããŸãã
ç§ã¯éåžžã®ååãæžé¢ã§äœ¿ããããšæããŸãããããã€ãã®çšèªãé³èš³ããããšããããŸããã äžæ¹ã§ãç§ã¯æ¹å€ãææ¡ãåãå ¥ããŠããŸãã®ã§ããã®çšèªããã®çšèªãè¡šçŸããããè¯ãæ¹æ³ããããšæãããå Žåã¯ããããã®èããå ±æããŠãã ããã ããããšã
ç§ã¯éåžžã®ååãæžé¢ã§äœ¿ããããšæããŸãããããã€ãã®çšèªãé³èš³ããããšããããŸããã äžæ¹ã§ãç§ã¯æ¹å€ãææ¡ãåãå ¥ããŠããŸãã®ã§ããã®çšèªããã®çšèªãè¡šçŸããããè¯ãæ¹æ³ããããšæãããå Žåã¯ããããã®èããå ±æããŠãã ããã ããããšã
Gitã䜿çšããå Žåã¯ããããããã«ãªã¯ãšã¹ãã䜿çšããŸãã ãããã¯ãåæ£ããŒãžã§ã³ç®¡çã·ã¹ãã ã®åºçŸä»¥æ¥ãäœããã®åœ¢ã§ååšããŠããŸããã BitbucketãšGitHubã䟿å©ãªWebã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããåã¯ããã«ãªã¯ãšã¹ãã¯ãã¢ãªã¹ããã®ç°¡åãªé»åã¡ãŒã«ã§ããããªããžããªããããã€ãã®å€æŽãååŸããããã«æ±ããŠããŸããã 䟡å€ãããå Žåã¯ãããã€ãã®ã³ãã³ããå®è¡ããŠãããã®å€æŽãã¡ã€ã³ãã¹ã¿ãŒãã©ã³ãã«ããã·ã¥ã§ããŸãã
$ git remote add alice git://bitbucket.org/alice/bleak.git $ git checkout master $ git pull alice master
ãã¡ãããèŠãã«Aliceããã®å€æŽãmasterã«å«ããããšã¯è¯ãèãã§ã¯ãããŸãããçµå±ã masterã«ã¯é¡§å®¢ã«é ä¿¡ããã³ãŒããå«ãŸããŠãããããããããäœãå ¥ããã泚ææ·±ãç£èŠããå¿ èŠããããŸãã ãã¹ã¿ãŒã«å€æŽãåã«å«ãããããæ£ããæ¹æ³ã¯ãæåã«ããããå¥ã®ãã©ã³ãã«ããŒãžããããããåæããŠãããã¹ã¿ãŒã«ããŒãžããããšã§ãïŒ
$ git fetch alice $ git diff master...alice/master
3ãã€ã³ãã®æ§æãæã€æå®ãããgit diffã³ãã³ã ïŒä»¥äžãããªãã«ããããgit diff ïŒã¯ã ã¢ãªã¹/ãã©ã³ããã©ã³ãã®æäžéšãšãã®ããŒãžããŒã¹ãšã®éã®å€æŽã衚瀺ããŸãã æ¬è³ªçã«ããããã¯ãŸãã«ã¢ãªã¹ãã¡ã€ã³ãã©ã³ãã«å«ããããã«ç§ãã¡ã«èŠæ±ããå€æŽã§ãã

git diff master ... alice / master㯠git diff AB ãšåçã§ã
äžèŠãããšãããã¯ãã«ãªã¯ãšã¹ãã®å€æŽããã§ãã¯ããåççãªæ¹æ³ã®ããã«æããŸãã å®éããããæžããŠããæç¹ã§ã¯ãããã¯ãŸãã«gitãªããžããªã®ãã¹ãã£ã³ã°ãæäŸããã»ãšãã©ã®ããŒã«ã§ãã«ãªã¯ãšã¹ãã®å®è£ ã«äœ¿çšãããŠããçš®é¡ã®æ¯èŒã¢ã«ãŽãªãºã ã§ãã
ããã«ããããããã ããªãã«ãããgit diffã䜿çšããŠãã«ãªã¯ãšã¹ãã®å€æŽãåæããå Žåãããã€ãã®åé¡ããããŸãã å®éã®ãããžã§ã¯ãã§ã¯ãã¡ã€ã³ãã©ã³ãã¯æ©èœãã©ã³ãïŒä»¥äžã æ©èœãã©ã³ã ïŒãšã¯å€§ããç°ãªãå¯èœæ§ããããŸãã ã¿ã¹ã¯ã®äœæ¥ã¯å¥ã ã®ãã©ã³ãã§å®è¡ãããæåŸã«masterã«ããŒãžãããŸãã masterãåæ¹ã«ç§»åãããšã æ©èœãã©ã³ãã®æäžéšããããŒãžããŒã¹ãŸã§ã®åçŽãªgit diffã¯ããããã®ãã©ã³ãéã®å®éã®éãã衚瀺ããã®ã«ååã§ã¯ãªããªããŸãã以åã®ç¶æ ã®masterã® 1ã€ã®ã¿ãšæ©èœãã©ã³ãã®æäžéšã®éãã衚瀺ããŸã

masterãã©ã³ãã¯ãæ°ããå€æŽã®æ³šå ¥ãéããŠæšé²ãããŠããŸãã git diff master ... alice / masterã®çµæã¯ããããã®å€æŽãmasterã«åæ ããŸããã
ãã«ãªã¯ãšã¹ãã®åæäžã«ãããã®å€æŽã確èªã§ããªãããšãåé¡ãªã®ã¯ãªãã§ããïŒ ããã«ã¯2ã€ã®çç±ããããŸãã
競åã®ããŒãž
ããããæåã®åé¡ãå®æçã«çºçããŸã-ããŒãžã®ç«¶åã åæã«æ©èœãå€æŽãããæ©èœãã©ã³ãã®ãã¡ã€ã«ãå€æŽããå Žåã git diffã¯æ©èœãã©ã³ãã§è¡ã£ãå€æŽã®ã¿ã衚瀺ããŸãã ãã ãã git mergeãå®è¡ããããšãããšããšã©ãŒãçºçããŸãïŒgitã¯äœæ¥ã³ããŒã®ãã¡ã€ã«ã«ç«¶åããŒã«ãŒãé 眮ããŸããããŒãžããããã©ã³ãã«ã¯ç«¶åããå€æŽããããããgitã¯é«åºŠãªããŒãžæŠç¥ã䜿çšããŠã解決ã§ããªãããã§ãã

競åã®ããŒãž
誰ãããŒãžã®ç«¶åã«å¯ŸåŠããããšã¯æããªãã§ãããããå°ãªããšããã¡ã€ã«ã¬ãã«ã®ããã¯ããµããŒãããŠããªãããŒãžã§ã³ç®¡çã·ã¹ãã ã«ã€ããŠã¯ãããŒãžã§ã³ç®¡çã·ã¹ãã ãäžããããŠããŸãïŒå€ãã®åé¡ããããŸãïŒã
ãã ããããŒãžã®ç«¶åã¯ããã«ãªã¯ãšã¹ãã«ããªãã«ãããgit diffã䜿çšããå Žåãä»ã®åé¡ãšæ¯èŒããŠé¢åãªãã®ã§ã¯ãããŸããïŒç¹æ®ãªã¿ã€ãã®è«ççãªç«¶åã¯æ£åžžã«ããŒãžãããŸãããã³ãŒãããŒã¹ã«æœåšçãªãšã©ãŒãåŒãèµ·ããå¯èœæ§ããããŸãã
å䜵äžã«æ°ä»ãããªãè«ççãªç«¶å
éçºè ãç°ãªããã©ã³ãã®åããã¡ã€ã«ã®ç°ãªãéšåãå€æŽãããšããã®ãããªç«¶åãçºçããå¯èœæ§ããããŸãã å Žåã«ãã£ãŠã¯ãåå¥ã«æ©èœããããŒãžã§ã³ç®¡çã·ã¹ãã ã®èŠ³ç¹ãã競åããããšãªãå®å šã«ããŒãžãããããŸããŸãªå€æŽããäžç·ã«é©çšããããšãã«ã³ãŒãã«è«çãšã©ãŒãåŒãèµ·ããå¯èœæ§ããããŸãã
ããã¯ããŸããŸãªæ¹æ³ã§çºçããå¯èœæ§ããããŸãããæãäžè¬çãªã®ã¯ã2人ã®éçºè ã2ã€ã®ç°ãªããã©ã³ãã§åããšã©ãŒã誀ã£ãŠèªèããŠä¿®æ£ããå Žåã§ãã 以äžã®JavaScriptã³ãŒããèªç©ºåžã®ã³ã¹ããèšç®ããããšãæ³åããŠãã ããã
// flat fees and taxes var customsFee = 5.5; var immigrationFee = 7; var federalTransportTax = .025; function calculateAirfare(baseFare) { var fare = baseFare; fare += immigrationFee; fare *= (1 + federalTransportTax); return fare; }
ããã«ã¯æãããªééããå«ãŸããŠããŸããèè ã¯èšç®ã«é¢çšãå«ããã®ãå¿ããŠããŸããïŒ
次ã«ã2人ã®éçºè ãã¢ãªã¹ãšãããæ³åããŠãã ãããããããã®éçºè ã¯ãã®ãšã©ãŒã«æ°ã¥ãããã©ã³ãå ã®ä»ã®éçºè ãšã¯ç¡é¢ä¿ã«ä¿®æ£ããŸããã
ã¢ãªã¹ã¯ã immigrationFeeã® åã«ã¢ã«ãŠã³ãã£ã³ã°customsFeeã®è¡ãè¿œå ããŸããã
function calculateAirfare(baseFare) { var fare = baseFare; +++ fare += customsFee; // Fixed it! Phew. Glad we didn't ship that! - Alice fare += immigrationFee; fare *= (1 + federalTransportTax); return fare; }
ãããåæ§ã®ç·šéãè¡ããŸãããã immigrationFeeã® åŸã«é 眮ããŸãã ã
function calculateAirfare(baseFare) { var fare = baseFare; fare += immigrationFee; +++ fare += customsFee; // Fixed it! Gee, lucky I caught that one. - Bob fare *= (1 + federalTransportTax); return fare; }
ãããã®åãã©ã³ãã§ç°ãªãã³ãŒãè¡ãå€æŽãããŠãããããäž¡æ¹ããã¹ã¿ãŒã«ããŒãžãããšã次ã ã«æåããŸãã ãã ãã ãã¹ã¿ãŒã«ã¯è¿œå ãããäž¡æ¹ã®è¡ãå«ãŸããããã«ãªãããã顧客ã¯éé¢ææ°æã2åæ¯æãããšã«ãªããŸãã
function calculateAirfare(baseFare) { var fare = baseFare; fare += customsFee; // Fixed it! Phew. Glad we didn't ship that! - Alice fare += immigrationFee; fare += customsFee; // Fixed it! Gee, lucky I caught that one. - Bob fare *= (1 + federalTransportTax); return fare; }
ïŒãã¡ããããã¯äžèªç¶ãªäŸã§ãããéè€ããã³ãŒããããžãã¯ã¯éåžžã«æ·±å»ãªåé¡ãåŒãèµ·ããå¯èœæ§ããããŸããããšãã°ã iOSã§ã®SSL / TLSã®å®è£ ã«ç©Žã空ããªã©ã§ããïŒ
æåã«Aliceã®ãã«ãªã¯ãšã¹ãã®å€æŽãmasterã«ããŒãžãããšããŸãã ããªãã«ãããgit diffã䜿çšããå Žåãããã®ãã«ãªã¯ãšã¹ãã¯æ¬¡ã®ããã«ãªããŸãã
function calculateAirfare(baseFare) { var fare = baseFare; fare += immigrationFee; +++ fare += customsFee; // Fixed it! Gee, lucky I caught that one. - Bob fare *= (1 + federalTransportTax); return fare; }
å ±éã®ç¥å ãšæ¯èŒããŠå€æŽãåæããŠãããããããŒãžãã¿ã³ãã¯ãªãã¯ãããšãã«çºçãããšã©ãŒã®è åšã«é¢ããèŠåã¯ãããŸããã
å®éããã«ãªã¯ãšã¹ããåæããå ŽåãBobãã©ã³ãããã®å€æŽãããŒãžããåŸã ãã¹ã¿ãŒãã©ã®ããã«å€åãããã確èªããããšæããŸãã
function calculateAirfare(baseFare) { var fare = baseFare; fare += customsFee; // Fixed it! Phew. Glad we didn't ship that! - Alice fare += immigrationFee; +++ fare += customsFee; // Fixed it! Gee, lucky I caught that one. - Bob fare *= (1 + federalTransportTax); return fare; }
ããã¯æãããªåé¡ã§ãã ãã«ãªã¯ãšã¹ãã®ã¬ãã¥ãŒæ åœè ã¯ãè¡ã®éè€ã«æ°ä»ããã³ãŒãããã¡ã€ãã©ã€ãºããå¿ èŠãããããšãããã«éç¥ããããšã§ãé倧ãªãšã©ãŒããã¹ã¿ãŒã«ãæçµçã«ã¯æçµè£œåã«å±ããªãããã«ããŸãã
ãããã£ãŠãBitbucketã§ãã«ãªã¯ãšã¹ãã®å€æŽã®è¡šç€ºãå®è£ ããããšã«ããŸããã ãã«ãªã¯ãšã¹ãã衚瀺ãããšãããŒãžã®çµæãå®éã«ã©ã®ããã«èŠããããããããŸã ïŒã€ãŸããå®éã®çµæã®ã³ãããïŒã ãããå®çŸããããã«ããã©ã³ããå®éã«ããŒãžããçµæã®ã³ããããšã¿ãŒã²ãããã«ãªã¯ãšã¹ããã©ã³ãã®ããããšã®éãã瀺ããŸãã

git diff CD ïŒ Dã¯ããŒãžã³ãããïŒã¯ã2ã€ã®ãã©ã³ãéã®ãã¹ãŠã®éãã衚瀺ããŸã
èå³ãããå Žåã¯ãåããªããžããªãè€æ°ã®ãã¹ãã£ã³ã°ãµã€ãã«é 眮ããŠãæ¯èŒã¢ã«ãŽãªãºã ã®éãã«ã€ããŠèª¬æããŸãã
- ããªãã«ãããgit diffæ¯èŒã䜿çšãã GullHubãã«ãªã¯ãšã¹ã
- ããªãã«ãããgit diffæ¯èŒã䜿çšããGitLabãã«ãªã¯ãšã¹ã
- ããŒãžã³ãããæ¯èŒã䜿çšãã Bitbucketãã«ãªã¯ãšã¹ã
Bitbucketã§äœ¿çšãããããŒãžã³ãããã®æ¯èŒã¯ãããŒãžæã«é©çšãããå®éã®å€æŽã瀺ããŠããŸãã æ¬ ç¹ã¯ããã®ã¢ã«ãŽãªãºã ãå®è£ ããã®ãããé£ãããå®è¡ããã®ã«éåžžã«å€ãã®ãªãœãŒã¹ãå¿ èŠãšããããšã§ãã
æ¯åºããã¢ãŒã·ã§ã³
ãŸããããŒãžã³ãããDã¯å®éã«ã¯ãŸã ååšããŠãããããã®äœæã¯æ¯èŒçé«äŸ¡ãªããã»ã¹ã§ãã 次ã«ãã³ãããDãäœæããŠããã§çµäºããã ãã§ã¯ååã§ã¯ãããŸãããããŒãžã³ãããã®èŠªã³ãããã§ããBãšCã¯ãã€ã§ãå€æŽã§ããŸãã ããããã®èŠªãå€æŽãããšããã«ãªã¯ãšã¹ãã®ããŒãžã®çµæãšããŠé©çšãããå€æŽã»ãããæ¬è³ªçã«å€æŽããããããã«ãªã¯ãšã¹ãã®ã¹ã³ãŒããå€æŽãããšåŒã³ãŸãã ãã«ãªã¯ãšã¹ããmasterã®ãããªããŒãããããã©ã³ããã¿ãŒã²ããã«ããŠããå Žåãããããéåžžã«é »ç¹ã«ã¬ãã¥ãŒãããŸãã

ãã«ãªã¯ãšã¹ããã©ã³ããå€æŽããããã³ã«ãããŒãžã³ããããäœæãããŸã
å®éã誰ãããã«èŠæ±ããã¹ã¿ãŒãŸãã¯æ©èœãã©ã³ãã«ã³ããããŸãã¯ããŒãžãããã³ã«ãBitbucketã¯æ°ããããŒãžã³ããããäœæããŠããã«èŠæ±ã®ãã©ã³ãéã®å®éã®éãã衚瀺ããå¿ èŠããããŸãã
競ååŠçã®ããŒãž
ãã«ãªã¯ãšã¹ãã®ãã©ã³ãéã®éãã衚瀺ããããã«ããŒãžãå®è¡ãããšãã®å¥ã®åé¡ã¯ãããŒãžã®ç«¶åã«å¯ŸåŠããå¿ èŠãããå Žåãããããšã§ãã gitãµãŒããŒã¯éã€ã³ã¿ã©ã¯ãã£ãã¢ãŒãã§åäœããŠããããããã®ãããªç«¶åã解決ãã人ã¯ããŸããã ããã¯ã¿ã¹ã¯ãããã«è€éã«ããŸãããå®éã«ã¯å©ç¹ã§ããããšãããããŸããã Bitbucketã§ã¯ãããŒãžã³ãããDã«ç«¶åããŒã«ãŒãå«ãããã©ã³ãéã®éãã衚瀺ãããšãã«ãã©ã°ãç«ãŠãŠããã«ãªã¯ãšã¹ãã«ç«¶åãå«ãŸããŠããããšãæ瀺ããŸãã

ç·ã®ç·ãè¿œå ãããèµ€ã®ç·ãåé€ãããé»è²ã®ç·ã競åãæå³ããŸãã
ãããã£ãŠããã«ãªã¯ãšã¹ãã«ç«¶åãå«ãŸããŠããããšãäºåã«æããã«ããã ãã§ãªããã¬ãã¥ãŒæ åœè ããããã©ã®ããã«è§£æ±ºãã¹ãããè°è«ããããšãã§ããŸãã 競åã¯åžžã«å°ãªããšã2ã€ã®åŽé¢ã«åœ±é¿ããããããã«ãªã¯ãšã¹ãã¯ããã解決ããé©åãªæ¹æ³ãèŠã€ããã®ã«æé©ãªå Žæã§ãããšèããŠããŸãã
å®è£ ã®è€éããå¢ãã䜿çšãããã¢ãããŒãã®ãªãœãŒã¹éçŽæ§ã«ãããããããç§ãã¡ãBitbucketã§éžæããã¢ãããŒãã¯ãã«ãªã¯ãšã¹ããã©ã³ãéã§æãæ£ç¢ºã§å®çšçãªéããæäŸãããšèããŠããŸãã
å ã®èšäºã®èè ã§ããTim Pettersenã¯ãJIRAãFishEye / Crucibleãããã³Stashã®éçºã«åå ããŸããã 2013幎ã®åã以æ¥ã圌ã¯éçºããã»ã¹ãgitãç¶ç¶çãªçµ±åãšå±éãããã³éçºè ãç¹ã«Bitbucketåãã®AtlassianããŒã«ã«ã€ããŠèªã£ãŠããŸãã ãã£ã ã¯ãããã®ããšãä»ã®ããšã«ã€ããŠã®ã¡ã¢ã@kannonboyãšããä»®åã§Twitterã«å®æçã«æçš¿ããŠããŸãã
ãã®èšäºããããããããšãé¡ã£ãŠããŸãã 質åãã³ã¡ã³ãã«ãçãã§ããããšãå¬ããæããŸãã