ãHabrahabrãã®èªè
ã«ãã Gitã§ã®çã¿ã®ãªãããŒãžç«¶å解決 ãã®ç¿»èš³ãæäŸããŸãã
ããã°blog.wuwon.id.auããã
ç§ã®æ¥ã
ã®ä»äºã§ã¯ãå€ãã®gitãã©ã³ããé »ç¹ã«åŠçããå¿
èŠããããŸãã ãããã¯ãäžéãªãªãŒã¹ã®ãã©ã³ããäžéšã®ã¯ã©ã€ã¢ã³ãã§ãµããŒããããŠããå€ãAPIã®ãã©ã³ãããŸãã¯å®éšçãªããããã£ã®ãã©ã³ãã§ãã Gitã¢ãã«ã§ã®ãã©ã³ãäœæã®å®¹æãã«ãããéçºè
ã¯ãŸããŸãå€ãã®ãã©ã³ããäœæããããã«ãªããååãšããŠãããããã¹ãŠã®ãã©ã³ããç¶æããä»ã®ãã©ã³ããšå®æçã«ããŒãžããå¿
èŠãããå Žåãå€æ°ã®ãã©ã³ãã®è² æ
ãéåžžã«é¡èã«ãªããŸãã
ããŒãžã¯ã³ãŒããææ°ã®ç¶æ
ã«ä¿ã€ããã«éåžžã«éèŠã§ãããååãšããŠãããŒãžäžã®ãã¹ã¯åçŽãªã³ãããã§ã®ãã¹ãããå€ãã®é çã®çš®ã«ãªããŸãã æ®å¿µãªããšã«ãããŒãžãšã©ãŒã¯çãããããŸãããããããããŒãžã«ã¯ããã€ãã®èŠªãã©ã³ããããããã§ãã ãã©ã³ãã®ããŒãžã®å±¥æŽãåæããå Žåã§ãã競åã解決ããããã«ã©ã®ãããªå€æŽãè¡ãããããç解ããããšã¯éåžžã«å°é£ã§ãã 第äºã«ã倱æããå䜵ããã£ã³ã»ã«ãããš ã倧ããªé çã®çš®ã«ãªããŸãã 第äžã«ããã©ã³ãã®æŠå¿µãã®ãã®ã«ã¯å€ãã®ãŠãŒã¶ãŒãé¢ä¿ããŠãããããããŒãžã®ç«¶åã®ã»ãšãã©ã¯ä»ã®èª°ãã®ã³ãŒããæäœãããšãã«çºçããŸã åžžã«å䜵ã¯ã1ã€ãŸãã¯å¥ã®ãã©ã³ãã§åããŠããåã人ã«ãã£ãŠè¡ãããŸãã çµè«ãšããŠãããŒãžãéåžžã«ç°¡åãªå Žåã«ãã¹ãç¯ããšãä¿®æ£ããã®ãé£ãããªããèŠã€ããã®ãé£ãããªããŸãã ãããã£ãŠããã©ã³ããããŒãžããããã»ã¹ã®ç 究ãšç解ã«è²»ãããæéã¯ãèå³ãæã£ãŠå ±ãããŸãã
é©ãã¹ãããšã«ãããŒãžã«äœ¿çšã§ããããŒã«ãšã€ã³ã¿ãŒãã§ã€ã¹ã®å€ãã¯ããã®ããã»ã¹ãå¹ççã«å®è¡ããããã®ååãªè£
åããªãããšãããããŸããã å€ãã®å Žåãããã°ã©ãã¯åã«git mergeããŒã ã圌ã®ããã«ãã¹ãŠã®ä»äºãããããšãæãã§ããŸãã ãã ãã競åãçºçããå ŽåãããŒãžæŠç¥ã¯éåžžã競åããè¡ã®åšãã®ã³ãŒãããã°ãã確èªãããã®ç¹å®ã®ã³ãŒããä»ã®ã³ãŒãããã奜ãŸãããšçŽæçã«æšæž¬ããŸãã
ãã®èšäºã§ã¯ã競å解決ã®ããã»ã¹ã段éçã«æ£ç¢ºã§ãããããã§äœããæšæž¬ããå¿
èŠããªãããšãå®èšŒããããšèããŠããŸãã
éããã©ïŒãã©ã¯éïŒ
ããªãã®ããŒã ãããããã®ç®çã®ããã«äºçŽããããªããžããªã«è©©ãæžãããäŸé Œããããšä»®å®ããŸãããã ïŒãªããŠæªå€¢ã§ãããïŒïŒãããŠãæãéèŠãªããšã¯ããªãã«å§ããããŸãã-ãã¹ã¿ãŒãã©ã³ãããã®æåŸã®ä¿®æ£ãããŒã¿ãã©ã³ãã«ããŒãžããããšã§ãã ãããã£ãŠãããŒã¿ãã©ã³ãã«åãæ¿ããŠã次ã®ã³ãã³ããå®è¡ããŸãã
$ git merge master Auto-merging roses.txt CONFLICT (content): Merge conflict in roses.txt Automatic merge failed; fix conflicts and then commit the result.
ãããŒãããã¯ççŸã§ãã gitãåç
§ãããã¡ã€ã«ã衚瀺ããããšã«ããŸããã
$ cat roses.txt <<<<<<< HEAD roses are
ãããïŒ ãªã¹ã1ã«ç€ºãããã«ããã¡ã€ã«å
šäœã競åç¶æ
ã«ãããŸãã ã©ã®ãã¡ã€ã«ãªãã·ã§ã³ãæ£ããã§ããïŒ äž¡æ¹ã®ãªãã·ã§ã³ãæ£ããèŠããŸãã äžäœããŒãžã§ã³ã¯ãHTMLã¹ã¿ã€ã«ã®èŠçŽ ãè²åããããå°æåã®ã¿ã䜿çšããããã«ãŒã¹ã¿ã€ã«ã§èšè¿°ãããŠããŸãã äžã®ããŒãžã§ã³ã¯ãå¥èªç¹ãšå€§æåã䜿çšããŠããèªç¶ã«èŠããŸãã
ããããããžã§ã¯ãã®å Žåã¯ã1ã€ã®ãªãã·ã§ã³ãéžæããŠãã®å䜵ãçµäºã§ããŸãã ãããåé¡ã¯ããããããªãã®è©©ã§ã¯ãªãããšã§ããããªãã¯ãã®è©©ãèªãã ããšããªããå·çãç·šéã®è²¬ä»»ãè² ããŸããããŸããééã£ã決å®ã®å Žåã誰ãã®èŠåŽãå¿ãå»ãããå¯èœæ§ãããããšãå®å
šã«ç解ããŠããŸãã ãã ãããããã®ãã©ã³ããããŒãžãã責任ã¯ããªãã«ãããŸãã ã©ãããïŒ
ããŒã¹ã«æ»ã
ç§Theã¯ããªã¹ã1ãæ£ããããŒãžãå®äºããããã«å¿
èŠãªå®å
šãªæ
å ±ãæäŸããªãããšã§ãã å®éãå䜵ããã»ã¹ã«ã¯4ã€ã®éèŠãªæ
å ±ïŒç¶æ
ïŒãé¢ä¿ããŠããŸããããã®ãã¡3ã€ã¯çŽäºã®è§£æ±ºã«å¿
èŠãªãã®ã§ãã ãªã¹ã1ã®å ŽåãGitã¯2ã€ã®ç¶æ
ã®ã¿ãæäŸããŸããã
次ã®å³ã¯ããããã®4ã€ã®ç¶æ
ã瀺ããŠããŸãã

ç¶æ
ïŒBïŒãšÂ©ã¯ããããããã¹ã¿ãŒãã©ã³ããšããŒã¿ãã©ã³ãã®çŸåšã®äœçœ®ïŒãããïŒã«é¢é£ããŠããŸããããã2ã€ã®ç¶æ
ã¯ãªã¹ã1ãšãŸã£ããåãã§ããç¶æ
ïŒDïŒã¯ããŒãžã®çµæã§ãæçµçã«ååŸ/çæãããã®ïŒã»ãšãã©ã®å ŽåãGitã¯èªåçã«ç¶æ
ïŒDïŒãçæããŸãïŒã äžçªäžã®ç¶æ
ïŒAïŒã¯ããã¹ã¿ãŒãã©ã³ããšããŒã¿ãã©ã³ããããŒãžããããã®ããŒã¹ïŒåºæ¬ïŒã§ãã ããŒãžããŒã¹ïŒAïŒã¯ããã¹ã¿ãŒãã©ã³ããšããŒã¿ãã©ã³ãã®æåŸã®å
±éã®ç¥å
ã§ãããçŸæç¹ã§ã¯ããã®ããŒãžããŒã¹ãäžæã§ãããšä»®å®ããŸãã åŸã§èŠãããã«ãç¶æ
ïŒAïŒã¯çŽäºè§£æ±ºã«ãããŠéèŠãªåœ¹å²ãæãããŸãã å³ã§ã¯ãããããç¶æ
ïŒAïŒ-ïŒBïŒãšïŒAïŒ-©ã®éã®å€åãè¡šããã«ã¿1ãš2ãåæ ããŠããŸãã ç¶æ
ïŒAïŒãïŒBïŒããã³Â©ãã«ã¿1ããã³2ãç¥ãããšã¯ç°¡åã«ååŸïŒèšç®ïŒã§ããŸãã ãã«ã¿1ãš2ã¯ãè€æ°ã®ã³ãããã§æ§æã§ããããšã«æ³šæããŠãã ããã ãã ããããã§ã¯ããã¹ãŠã®ãã«ã¿ãã¢ããªã·ãã¯ã§ãããšæ³å®ããŠããŸãã
ç¶æ
ïŒDïŒãååŸããæ¹æ³ãç解ããã«ã¯ãããŒãžæäœãäœãããããšããŠããããç解ããå¿
èŠããããŸãã ç¶æ
ïŒDïŒã¯ãããããmasterãã©ã³ããšbetaãã©ã³ãã«å ããããå€æŽã®çµã¿åããã§ããå¿
èŠããããŸãã ã€ãŸã èšãæããã°ããã«ã¿1ãš2ã®çµã¿åããã§ãããã®èãæ¹ã¯è¡šé¢äžã¯åçŽã§ããããã«ã¿ããã¡ã€ã«ã®éå±€åïŒéè€ïŒéšåã«åœ±é¿ããç¹å¥ãªå Žåãé€ããã»ãšãã©ã®å Žåã人éã®ä»å
¥ã¯å¿
èŠãããŸããã ãã®ç¶æ³ã§ã¯ããã«ã¿1ãš2ãæ¯èŒããŠããã·ã³ãçµæïŒDïŒãçæããã®ãæ¯æŽããå¿
èŠããããŸãã
éããç¹å®ãã
åãã©ã³ãã«å ããããå€æŽãèŠã€ããã«ã¯ãç¶æ
ïŒAïŒã®ããŒãžããŒã¹ãã©ã®ããã«èŠããããç¥ãå¿
èŠããããŸãã ããŒãžããŒã¿ããŒã¹ã«é¢ããæ
å ±ãååŸããæãç°¡åãªæ¹æ³ã¯ãmerge.conflictstyleãªãã·ã§ã³ãdiff3ã«èšå®ããããšã§ã
$ git config merge.conflictstyle diff3
ãã®ãªãã·ã§ã³ãæå¹ã«ããåŸãå床ããŒãžãè©Šã¿ïŒgit reset --hard; git merge masterïŒã競åãããã¡ã€ã«ãå床æ€æ»ããŸãã
$ cat roses.txt <<<<<<< HEAD roses are
äžå€®ã«3çªç®ã®ãã©ã°ã¡ã³ãããããŸããããã¯ãå䜵ãŸãã¯ç¶æ
ã®åºç€ã§ãïŒAïŒã å€æŽã¯ã¯ã£ãããšèŠããŸãïŒããŒã¿ïŒHEADïŒãã©ã³ãã§ã¯ã人éã®è²ã®ååãHTMLã³ãŒãã«çœ®ãæãããã倧æåãšå¥èªç¹ããã¹ã¿ãŒãã©ã³ãã«è¿œå ãããŸããã ãã®ç¥èã«åºã¥ããŠãçµæã«å€§æåãå¥èªç¹ãHTMLã«ã©ãŒã³ãŒããå«ãŸããããšãããããŸããã
åççã«ã¯ãçµæãéæããããããããã¯å®äºã§ããã¯ãã§ãã ããããããè¯ã解決çããããŸãã
ã°ã©ãã£ã«ã«ãªããŒãžïŒGUIããŒãžïŒ
ããŒãžç«¶åã®åçŽãªããã¹ãè¡šçŸã¯ãåçŽãªå Žåã«ã¯ãã®åœ¹å²ãæãããŸãããå®éã«ã¯ç«¶åã¯ããéæ¿ã§è€éã«ãªãå¯èœæ§ããããŸãã ãã®ãããªå Žåãã°ã©ãã£ã«ã«ããŒã«ã圹ç«ã¡ãŸãã ç§ãéžãã ã®ã¯ã meldãšåŒã°ããPythonã§æžãããã·ã³ãã«ãªããŒã«ã§ãããã3å圢åŒã§ããŒãžã衚瀺ã§ããä»ã®ã°ã©ãã£ã«ã«ããŒã«ãç»å ŽããŸãã
ã°ã©ãã£ã«ã«ããŒã«ïŒã€ã³ã¹ããŒã«ããå¿
èŠããããŸãïŒã䜿çšããã«ã¯ãgitã競åãããããšã蚎ããåŸã次ã®ã³ãã³ããå
¥åããŸãã
$ git mergetool
ããã«ããã䜿çšããããŒãžããã°ã©ã ãå°ããããŸããmeldãšå
¥åããŠEnterããŒãæŒããŸãã ããã°ã©ã ãŠã£ã³ããŠã®å€èŠ³ã¯æ¬¡ã®ãšããã§ãïŒæé»çãªãªãã·ã§ã³merge.conflictstyleã¯æå¹ã«ãªã£ãŠããŸããïŒã

æ
å ±ã䞊ãã§è¡šç€ºãããŠãããšããäºå®ã«ããããããããªã¹ã2ã«ãã£ãå¿
èŠãªãã©ã°ã¡ã³ãã¯è¡šç€ºãããŸãããããã§ã¯ããã®ãã¡ã€ã«roses.txt.LOCAL.2760.txtã衚瀺ãããããŒãžããŒã¹ã®ãã©ã°ã¡ã³ãïŒç¶æ
ïŒAïŒïŒã¯è¡šç€ºãããŸãããå·Šã®åãšå³ã®åã®ãã¡ã€ã«roses.txt.REMOTE.2760.txtãšäžå€®ã®ãã¡ã€ã«ã¯å€±æããããŒãžã§ãã ã€ãŸã å®éãç¶æ
ïŒBïŒã©ãããã³å€±æããç¶æ
ïŒDïŒã衚瀺ãããŸããããç¶æ
ïŒAïŒã¯ãããŸãã...
æ¬åœã«è¡æ¹äžæã§ããïŒ å€ãè¯ã端æ«ããã§ãã¯ã€ã³ããŸãããïŒ
$ ls -1 roses.txt roses.txt.BACKUP.2760.txt roses.txt.BASE.2760.txt roses.txt.LOCAL.2760.txt roses.txt.REMOTE.2760.txt
é¢å¿ã®ãããã¡ã€ã«ïŒroses.txt.BASE.2760.txtã衚瀺ãããŸãã ããã¯ããŒãžããŒã¿ããŒã¹ãã¡ã€ã«ã§ãã ããã§ãããŒã¿ããŒã¹ã«é¢é£ããŠmasterãã©ã³ããšbetaãã©ã³ãã«å ããããå€æŽãèŠã€ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãmeldãžã®2ã€ã®å¥åã®åŒã³åºãã䜿çšããŸãã
$ meld roses.txt.LOCAL.2760.txt roses.txt.BASE.2760 & $ meld roses.txt.BASE.2760 roses.txt.REMOTE.2760.txt &
ïŒèª°ããæåã®åŒã³åºãã§åŒæ°ã®é åºãå€æŽããŠãã©ã¡ãã®å Žåã§ãããŒã¿ããŒã¹ãã¡ã€ã«ãå·Šã®åã«ãªãããã«ããæ¹ãåççã§ããããšã«æ°ä»ããããããŸãããããã®é åºã¯ãããŒã¹ãäžå€®ã«æ®ã3åã®ãã¥ãŒã®é¡äŒŒæ§ãä¿æããŸãã ïŒå®è¡ã®çµæã¯ã次ã®ããã«2ã€ã®ãŠã£ã³ããŠã«ãªããŸãã


æåã®ãŠã£ã³ããŠãå³ããå·Šã«ã2çªç®ã®ãŠã£ã³ããŠãå·Šããå³ã«èªããšãåãã©ã³ãã§ã©ã®ãããªå€æŽãçºçãããã1æ¥ãšããŠæ確ã«ãªããŸãã meldã¯ãã¹ãŠã®å€æŽã芪åã«åŒ·èª¿ããŠããã®ã§ã现ããç®ç«ã€ç·šéãã¹ãããããããšã¯ã»ãšãã©äžå¯èœã§ãïŒç«¶å解決ãªã¹ã1ãŸãã¯ãªã¹ã2ã®ããã¹ãè¡šçŸã衚瀺ãããšãã«ãå眮è©ãã®ãã®è¿œå ã«æ°ã¥ãã人ã¯ããŸããïŒïŒ
ãã®ç¥èãæŠåšã«ã3å衚瀺ã«æ»ã£ãŠå€æŽãå ããããšãã§ããŸãã æåããŒãžã®ç§ã®æŠç¥ã¯ãããéèŠãªå€æŽïŒãã®å Žåã¯master / REMOTEã€ãŸãããŒã¿ïŒãããã©ã³ããããã¹ãŠã®ããã¹ããååŸãããã®äžã§ã¹ããããã€ã¹ãããã®ç·šéãè¡ãããšã§ãã å¥ã®ãã©ã³ãïŒãã¹ã¿ãŒïŒã§å€æŽãè¡ããŸãã èµ·ãã£ãããšã¯æ¬¡ã®ãšããã§ãã

ãããŠä»ããã¹ãŠäžç·ïŒAll Together NowïŒ
ãã®3ãŠã£ã³ããŠã®ç«¶å解決æ¹æ³ããç§ãèŠã€ããã®ãšåãããã䟿å©ã§ããããšãé¡ã£ãŠããŸãã ãã ãã競åã解決ãããã³ã«æ°ããmeldåŒã³åºããæåã§èµ·åããããšã¯ããŸã䟿å©ã§ã¯ãããŸããã æ¹æ³ã¯ãgit mergetoolã³ãã³ããåŒã³åºããããšãã«3ã€ã®ãŠã£ã³ããŠãã¹ãŠãèªåçã«éãããã«gitãæ§æããããšã§ãã ãããè¡ãã«ã¯ãPATHç°å¢å€æ°ïŒããšãã°ã$ HOME / bin / gitmergeïŒã«é
眮ããå¿
èŠãããå®è¡å¯èœã¹ã¯ãªãããã次ã®å
容ã§äœæã§ããŸãã
#!/bin/sh meld $2 $1 & sleep 0.5 meld $1 $3 & sleep 0.5 meld $2 $4 $3
ãããŠã以äžãã/ .gitconfigãã¡ã€ã«ã«è¿œå ããŸãïŒ
[merge] tool = mymeld [mergetool "mymeld"] cmd = $HOME/bin/gitmerge $BASE $LOCAL $REMOTE $MERGED
ããã§ã次ågit mergetoolã³ãã³ããå®è¡ããŠç«¶åã解決ãããšã3ã€ã®ãŠã£ã³ããŠããã¹ãŠéããŸãã
BASE LOCAL BASE REMOTE -
åè¿°ã®3ã€ã®ãŠã£ã³ããŠã䜿çšããŠãã®ãããªç«¶åã®è§£æ±ºã«æ
£ãããšãããã»ã¹ããã系統çãã€æ©æ¢°çã«ãªã£ãŠããããšãããããŸãã ã»ãšãã©ã®å ŽåãããŒãžã«äœ¿çšãããªãã·ã§ã³ãç解ããããã«ãåãã©ã³ãã®ã³ãŒããèªãã§ç解ããå¿
èŠãããããŸããã ã³ãããã®æ£ç¢ºãã«ã¯ããã«èªä¿¡ãæã€ãããæšæž¬ããå¿
èŠããªããªããŸãã ãã®èªä¿¡ã®ããã«ãçŽäºè§£æ±ºã¯ãšããµã€ãã£ã³ã°ãªæŽ»åã«ãªã£ãŠãããšæããã§ãããã
翻蚳è
ããã®ããŒãã¹
tmuxããã³nïŒVimã䜿çšããŠããå Žåã¯ã次ã®gitmergeã¹ã¯ãªããããå§ãããŸãã
#!/bin/sh sn=gitmerge tmux new-session -d -s "$sn" -n "diff3" "nvim -d $2 $4 $3" tmux split-window -t "$sn:1" -v "nvim -d $2 $1" tmux split-window -t "$sn:1" -h "nvim -d $1 $3"
泚 ïŒã/ .tmux.confã§ãã®ãªãã·ã§ã³ã䜿çšããªãå ŽåãæåŸã®2è¡ã§"$sn:1"
ã"$sn:0"
ã«å€æŽããå¿
èŠããããŸã
ãããã£ãŠã以äžãã/ .gitconfigã«è¿œå ããŸã
[mergetool "gitmerge"] cmd = $HOME/bin/gitmerge \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\" [merge] tool = gitmerge
ã¯ãŒã¯ãããŒã®ç«¶å解決ã¯æ¬¡ã®ããã«ãªããŸãã

ä»ã®ãšããã質åãç¡èŠãïŒããŒãžã¯[y / n]ã«æåããŸãããïŒïŒãgitmergeãšåŒã°ããã»ãã·ã§ã³ã«åãæ¿ããŸãïŒTMUXPREFIX + sã®çµã¿åããïŒïŒ

1ã€ã®ç»é¢ã«3ã€ã®ãŠã£ã³ããŠã衚瀺ãããŸãã æ°åã¯ãtmuxã®åå²ïŒãã€ã³ïŒãç¶æ
ã«å¯Ÿå¿ããæåã瀺ããŸãã 競åã解決ããããã®ç·šéãã€ãŸã ç¶æ
ïŒDïŒãç·šéããŠä¿åããŸãã ãã®åŸãå
ã®tmux'aã»ãã·ã§ã³ã«æ»ããå䜵ãæåããããšã確èªããŸãã

git rebase master
å人çã«ã¯ãæåã«ããŒã¿ãã©ã³ãã§ãã¹ã¿ãŒããªããŒã¹ãããã®åŸãã¹ã¿ãŒã«åãæ¿ããŠããGitããŒãžããŒã¿ãå®è¡ããæ¹ãæ£ãããšèããŠããŸãã ååãšããŠã3ãŠã£ã³ããŠãã¥ãŒãé€ããŠãã¯ãŒã¯ãããŒã¯ããã»ã©å€ãããŸããã

gitmergeã»ãã·ã§ã³ã«åãæ¿ããŸã

ç¶æ
ïŒBïŒãšÂ©ãå
¥ãæ¿ãã£ãŠããããšã«æ³šæããŠãã ããã

ãªããžããªã®äŸãå°ãªããšã1åè©ŠããŠãäžèšã®ã¹ããŒã ã«åŸã£ãŠç«¶åã®è§£æ±ºãè¡ãããšããå§ãããŸã ã å人çã«ã¯ãã圌ããåãå
¥ããããŸãã¯ãããªããåãå
¥ããããéžæããã®ã¯ããäžæè°ã§ã¯ãããŸããã