ã¿ãªãããGit使ã£ã¦ã¾ããï¼åã¯ã¾ã ã¡ã¤ã³ã®VCSãSubversionãªã®ããã£ã¦ããªããªãæ £ãã¾ããããã£ããGitã使ã£ã¦ããã®ã«ãã¡ãã£ã¨ä¸ä¾¿ãªSubversionãããã®ä½ç½®ã¥ãã§ããã§ããåããããªç解度ã®äººã£ã¦å¤ãããããªãã§ããããã
ä¸æ¹ã§ãæè¿ã¯GitHub管çã®ãªã¼ãã³ã½ã¼ã¹ããã¸ã§ã¯ããå¢ãã¦ãã¾ããããã°ã¬ãã¼ããéãã«ãã¦ãpull request*1ãåæã®ãããªç©ºæ°ããããGitåå¿è ã«ã¯å°ãæ·å± ãé«ãå°è±¡ãããã¾ãã
ãããªåãå æ¥åpull requestããã¦ã¿ããã§ãããè²ã ãªå¤±æã®ç©ã¿éãã§æ®å¿µãªpull requestã«ãªã£ã¦ãã¾ãã¾ããããã®åçãå ã«ãæ¬ç¨¿ã§ã¯pull requestããéã®ãã¹ããã©ã¯ãã£ã¹ãç´¹ä»ãã¾ããããã¯ãGit Workflowãããã¼ã¹ã«ã³ãã³ãä¾ãªã©ãå çãããã®ã§ãã
æ¦è¦
pull requestããéã¯ã次ã®æµãã®ããã«ããã°ä¸å ¨ã§ãã
- GitHubã§forkãã¾ãã
- ããã§ã¯ https://github.com/octocat/Spoon-Knife *2 ãforkãã¦ã¿ã¾ãããã
- ã§ããforkããã¼ã«ã«ã«cloneãã¾ãã
$ git clone [email protected]:hnw/Spoon-Knife.git
- ä½æ¥ãã£ã¬ã¯ããªã«ç§»åãã¾ãã
$ cd Spoon-Knife
- ä½æ¥ç¨ãã©ã³ãã§ä½æ¥ãã¾ãï¼ãã¨ã§èª¬æãã¾ãï¼
- forkå ã®æ´æ°ã«è¿½éãã¾ãï¼ãã¨ã§èª¬æãã¾ãï¼
- commitã1ã¤ã«ã¾ã¨ãã¾ãï¼ãã¨ã§èª¬æãã¾ãï¼
- GitHubã«ãã©ã³ããpushãã¾ãã
$ git push origin myFeature
- GitHubããpull requestãéãã¾ãã
ããã§å¤§äºãªç¹ã強調ãã¦ããã¾ããã絶対ã«mainãã©ã³ãã§ä½æ¥ãã¦ã¯ããã¾ãããã¾ããmainãã©ã³ãããpull requestãéãã®ãããã¾ãããå¿ ãpull requestã®ããã®å¥ãã©ã³ãããéãããã«ãã¾ããããããã«ã¯ããã¤ãçç±ãããã®ã§ãããé ã追ã£ã¦èª¬æãã¦ããã¾ãã
ä½æ¥ç¨ã«spike/prototypeãã©ã³ããä½ã
ä¸è¨ã®æé 4ã«ã¤ãã¦èª¬æãã¾ããæé 7ã§pull requestç¨ã®ãã¼ã«ã«ãã©ã³ããpushãã¦ãã¾ããããããªãpull requestç¨ã®ãã©ã³ãã§ä½æ¥ããã®ã§ã¯ãªããä½æ¥ç¨ã«ããã«å¥ã®ãã©ã³ããä½ããã¨ããå§ããã¾ããç°¡åãªä¿®æ£ãããã¤ããã§ãã試è¡é¯èª¤ãã¦ä½åº¦ãcommitããããæåããããç´ãããããããããã¾ããããã®ããã®ä½æ¥ç¨ãã©ã³ããå¥ã«åã£ã¦ããã¨ããããã§ãã
ä½æ¥ç¨ãã©ã³ãã«ã¯ãspikeï¼XPç¨èªãã試ãå®è£ ã¨ãã£ãæå³ã ã¨ç解ãã¦ãã¾ãï¼ã¨ãprototypeã¨ãããåèªãå ¥ãã¦ããã¨ãGitHubãè¦ã¦ããä»ã®äººã«ããã©ã³ãã®æå³ãããããããã¦è¯ãã§ãããã
$ git checkout -b myFeatureSpike Switched to a new branch 'myFeatureSpike' $
ã§ã¯ããã¡ã¤ã«ãç·¨éãã¦æ¬¡ã®ããã«ãã¼ã«ã«ãªãã¸ããªã«commitãè¡ã£ãã¨ãã¾ãã
$ vi README $ git commit -a -m 'ææ³ã追è¨' [myFeatureSpike 12ca2a5] ææ³ãè¿½è¨ 1 files changed, 3 insertions(+), 1 deletions(-) $ vi README $ git commit -a -m 'ã³ããã³ãã³ãã«ã¤ãã¦READMEã«è¿½è¨ï¼ãã¿ãã¬ï¼' [myFeatureSpike bd66e17] ã³ããã³ãã³ãã«ã¤ãã¦READMEã«è¿½è¨ï¼ãã¿ãã¬ï¼ 1 files changed, 2 insertions(+), 0 deletions(-) $
ä¸éããã¼ã«ã«ã§ã®ä½æ¥ãæ¸ãã ãpushãã¾ãããããã¼ã«ã«ã®myFeatureSpikeãã©ã³ãã®å 容ãååã®ãªã¢ã¼ããã©ã³ãã¨ãã¦pushãã¾ãã
$ git push origin myFeatureSpike Counting objects: 8, done. Delta compression using up to 2 threads. Compressing objects: 100% (6/6), done. Writing objects: 100% (6/6), 789 bytes, done. Total 6 (delta 1), reused 0 (delta 0) To [email protected]:hnw/Spoon-Knife.git * [new branch] myFeatureSpike -> myFeatureSpike $
forkå ã®æ´æ°ã«è¿½éãã
ä½æ¥ä¸ã«forkå ã®ãªãã¸ããªãæ´æ°ããããã¨ãããããããã¾ãããããã«è¿½éããããã®æé ã¯æ¬¡ã®ããã«ãªãã¾ãã
- forkå
ãªãã¸ããªãupstreamã¨ããååã§ç»é²ï¼æåã®1åã ãï¼
$ git remote add upstream git://github.com/octocat/Spoon-Knife.git $
- commitåã®å·®åããããªãstashãã
$ git stash Saved working directory and index state WIP on myFeatureSpike: bd66e17 ã³ããã³ãã³ãã«ã¤ãã¦READMEã«è¿½è¨ï¼ãã¿ãã¬ï¼ HEAD is now at bd66e17 ã³ããã³ãã³ãã«ã¤ãã¦READMEã«è¿½è¨ï¼ãã¿ãã¬ï¼ $
- mainãã©ã³ãã«ç§»å
$ git checkout main Switched to branch 'main $
- ãã¼ã«ã«ã®mainãã©ã³ãã®å
容ãupstream/mainã«åæããã
$ git pull upstream main From git://github.com/octocat/Spoon-Knife * branch main -> FETCH_HEAD ï¼ç¥ï¼ $
- ä½æ¥ãã©ã³ãã«ç§»å
$ git checkout myFeatureSpike Switched to branch 'myFeatureSpike' $
- forkå
ã®ææ°çã¾ã§rebaseããï¼ã³ã³ããªã¯ããããé©å®ããã°ãï¼
$ git rebase main myFeatureSpike First, rewinding head to replay your work on top of it... Applying: ææ³ãè¿½è¨ Using index info to reconstruct a base tree... Falling back to patching base and 3-way merge... Auto-merging README Applying: ã³ããã³ãã³ãã«ã¤ãã¦READMEã«è¿½è¨ï¼ãã¿ãã¬ï¼ Using index info to reconstruct a base tree... Falling back to patching base and 3-way merge... Auto-merging README $
- åæã»rebaseããåãGitHubã«pushãã
$ git push origin main ï¼ç¥ï¼ $ git push -f origin myFeatureSpike ï¼ç¥ï¼ $
- spikeãã©ã³ããæ¢ã«pushããã¦ããå ´åã¯fast-forwardã§ãªããªããã-fã¯å¿ é ã§ãã
- å ¬éç¶æ ã®å±¥æ´ãæ¸ãæãããã¨ã«ãªãããè¤ãããããã¨ã§ã¯ããã¾ããããspikeã¨åä¹ã£ã¦ããã®ã§å¹³æ°ãªãã¨ã«ãã¾ãã
- -fãé¿ããããã«ããã«å¥ã®ãã©ã³ããåããã¨ãã§ãã¾ãããèªåèªèº«ãæ··ä¹±ããããªã®ã§åãªãããã¾ããã
- stashããåãå
ã«æ»ãã¦ä½æ¥ãç¶ç¶ï¼ã³ã³ããªã¯ããããé©å®ããã°ãï¼
$ git checkout myFeatureSpike Switched to branch 'myFeatureSpike' $ git stash pop ï¼ç¥ï¼ $
ä¸è¨ããã¼ã§ã¯ãmainãã©ã³ããforkå ã¸ã®è¿½éã®ããã«å©ç¨ãã¦ãã¾ãããããmainãã©ã³ãä¸ã§ä½æ¥ãããªãæ大ã®çç±ã ã¨è¨ããã§ãããã
ãã®ä½æ¥ãããªãã¦ãpull requestãããã¨ã¯ã§ãã¾ãããä¸ä¸ææ°çã¨ã³ã³ããªã¯ããããããªå ´åã¯å¯¾å¦ãä¸ã®äººã«ä»»ãããã¨ã«ãªã£ã¦ãã¾ãã¾ããä¸ã®äººã¯å¿ãããã¨ãå¤ãã§ããããããã§ããã ãææ°çã¾ã§rebaseãã¦ããpull requestãã¹ãã§ãã
pull requestç¨ã«éå»ã®commitã1ã¤ã«ã¾ã¨ãã
ãã¦ãã¤ãã«ä½æ¥ãã©ã³ãä¸ã«æºè¶³ã®ãããã¡ã¤ã«ãcommitã§ããã¨ãã¾ããããforkå ã®æ´æ°ã«ã追éã§ãã¦ãã¾ããæ©épull requestã ï¼ã¨è¨ãããã¨ããã§ããããã®åã«ä»ã¾ã§ã®ä½æ¥ã1commitã«ã¾ã¨ãããã©ã³ããä½ãç´ãã¾ãããã
ã¨ããã®ããä½æ¥ãã©ã³ãä¸ã§ã¯è©¦è¡é¯èª¤ãããforkå ã«è¿½éãããããè·¡ãè¤æ°commitã«åããã¦ããã¯ãã§ãããããããã®ã¾ã¾æ¬å®¶ããã¸ã§ã¯ãã§pullãã¦ãã¦ãã¾ãã¨ãè¤æ°commitå ¨ã¦ãæ¬å®¶ã®å±¥æ´ã¨ãã¦æ®ã£ã¦ãã¾ãã¾ããå¾ã§å·®åããã§ãã¯ãã人ã®ããã«ãããããããæ´çãã¦ããpull requestãã¹ãã§ããããããã¯æ¬¡ã®ãããªä½æ¥ã«ãªãã¾ãã
- ä½æ¥ãã©ã³ãã«ç§»å
$ git checkout myFeatureSpike Switched to branch 'myFeatureSpike' $
- ä½æ¥ãã©ã³ããå
ã«pull requestç¨ã®ãã©ã³ããä½æã»ç§»å
$ git checkout -b myFeature Switched to branch 'myFeature' $
- ä½æ¥ãã©ã³ãä¸ã®forkå
ããã®å·®åã1 commitã«ã¾ã¨ãã
$ git rebase -i main
git rebase -iã§å ¨å·®åã1 commitã«ã¾ã¨ããã«ã¯ã2åç®ä»¥éã®commitãå ¨é¨squashæå®ãã¾ãããã¨ãã°æ¬¡ã®ãããªå 容ãã¨ãã£ã¿ã«è¡¨ç¤ºãããã¨ãã¾ãããã
pick 12ca2a5 ææ³ãè¿½è¨ pick bd66e17 ã³ããã³ãã³ãã«ã¤ãã¦READMEã«è¿½è¨ï¼ãã¿ãã¬ï¼ # Rebase bdd3996..bd66e17 onto bdd3996 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. #
ãã®ãããªå ´åã次ã®ããã«ä¿®æ£ãã¦ã»ã¼ãã»çµäºãã¾ãã
pick 12ca2a5 ææ³ãè¿½è¨ squash bd66e17 ã³ããã³ãã³ãã«ã¤ãã¦READMEã«è¿½è¨ï¼ãã¿ãã¬ï¼ # Rebase bdd3996..bd66e17 onto bdd3996 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. #
ããã¨æ¬¡ã«2ååã1åã«ã¾ã¨ããcommitã®ãã°ãæ¸ãããæ±ãããã¾ãã®ã§ãé©å½ã«æ¸ãã¦ã»ã¼ããã¾ããããããã§myFeatureSpikeä¸ã®è¤æ°commitãmyFeatureãã©ã³ãä¸ã§ã¯1 commitã«ã¾ã¨ã¾ã£ãç¶æ ã«ãªãã¾ããã
pull requestãã
forkå ã®ææ°ç¶æ ã«è¿½éã§ãã¦ãã¦ãã¾ããï¼1 commitã«ã¾ã¨ãã¾ãããï¼ã§ã¯ãããããpull requestãã¾ãããã
- pull requestç¨ã®ãã©ã³ããGitHubã«push
$ git push origin myFeature ï¼ç¥ï¼ $
- GitHubããpull requestãã¾ããGitHubã®UIããé©åãªãã©ã³ããé¸ã³ã¾ãããã
- æ¬ä½ã«åãè¾¼ã¾ããã®ãå¾ ã¡ã¾ãããã³ã¼ãã£ã³ã°æ¨æºã«åããããããã¹ãæ¸ãããªã©ã®æå¥ãæ¥ããå¥écommitãã¾ãããï¼ã§ããã°æåãããã£ã¦ããã¾ãããï¼ã
pull requestã¯GitHubã®issue tracking systemã¨åæãã¦ãããpull requestã¨åæã«ãã±ããã起票ããã¾ãããµã ãã®ãã°ã¬ãã¼ãã¨åæ§ã«ãåé¡ç¹ã¨ãããã®æ¦è¦ãªã©ãç°¡åã«æ¸ãã°ããã§ãããã
1ç¹ã ããpull requestå¾ã®æ³¨æç¹ãããã¾ããpull requestã«ä½¿ã£ããã©ã³ãã§å¥ã®ä½æ¥ããã¦ã¯ããã¾ãããä¸ä¸ç¡é¢ä¿ãªcommitãpushãã¦ãã¾ãã¨ãpull requestã«ãåæ ããã¦ãã¾ãã¾ãã
ã¾ã¨ã
mainãã©ã³ãããã®pull requestã許ãããã®ã¯å°å¦çã¾ã§ã§ããåã®å¤±æè«ãç´¹ä»ããã¨ãããããã¸ã§ã¯ãã«2ã¤ã®ä¿®æ£ãããããpull requestããã¤ããã ã£ãã®ãã2åã¨ãmainä¸ã§ä½æ¥ãã¦ããããã2ã¤ã®ä¿®æ£ãæ··ãã£ãã«ãªã¹ãªpull requestãæãã¦ãã¾ãã¾ããããã³ãã«è¿·æããã§ããã
ä»åã®æé ã«å¾ãã¨ãããªãGitã£ã½ãä½æ¥ãã§ããã¯ãã§ããã¨ãããããä¸è¨ã¯Gitã§å調ä½æ¥ããã¨ãã®æµããpull requestã«åããã¦èª¬æãããã®ã ã¨è¨ãã¾ãï¼originã¨upstreamã¨ã§remoteã2åãããããé常ã®ãã¿ã¼ã³ãããè¤éã§ããï¼ã
é¢åãããã ãï¼ã¨æãã人ãããããããã¾ãããç¹ã«ãã©ã³ãå¨ãã¯Gitåç´è ãã¤ã¾ãããããå ´æã ã¨ããå°è±¡ãããã¾ãããSubversionã¨ã®éãããããã°ããã«æ £ããã¨æãã¾ãããã³ãã³ã«ã³ãã³ãªæ¹ã¯Pro Gitã®ãブランチとはãããããèªã¿é²ãã¦ã¿ã¦ãã ããã
åã¯å¿ è¦ã«ãªããªãã¨è¦ããªãæ§è³ªãªã®ã§ãä»åpull requestãã¦ã¿ã¦Gitã®ç解ãéåé²ãã æ°ããã¾ããçãããpull requestã®ã¤ãã§ã«Gitã®ç¥èãæ·±ãã¦ã¿ã¾ãããï¼
*1:èªåã®GitHubã¸ã®commitããã®ã¾ã¾æ¬å®¶ã«åãè¾¼ãã§ããã¨ãããªã¯ã¨ã¹ããBTSã¸ã®ç»é²ãåæã«è¡ããããGitHubç¨èªã
*2:ããã¯forkã®ãã¢ç¨ãªãã¸ããªã§ãGitHubã®ããã¥ã¡ã³ããFork A Repoãã®ä¸ã§ç´¹ä»ããã¦ãã¾ããGitHubã®fork数ランキング第3ä½ï¼2011/5/28æ¥ç¾å¨ï¼ã¨ãã大人æ°ããã¸ã§ã¯ãã§ãã