Git ã®ä»çµã¿ (2) - ã³ãããã»ãã©ã³ãã»ã¿ã°
Git ã®ä»çµã¿ã·ãªã¼ãºã®2åç®ã§ããç®æ¬¡ãããã«ããã¾ãã
ååã®è¨äºã§ã¯ãGit ãªãã¸ã§ã¯ãã¨ãªãã¡ã¬ã³ã¹ã大ããªããªã¼æ§é ã«ãªã£ã¦ãããã¨ã説æãã¾ããã

ã¾ããGit ãªãã¸ã§ã¯ããã©ã®ããã«è¨é²ããã¦ãããã

ãã¡ã¤ã«ããªã¼ã®å¤æ´ãã«ã¼ã tree ãªãã¸ã§ã¯ãã® ID ã«åæ ãããä»çµã¿ãªã©ãè¦ã¦ãã¾ããã

ä»å㯠commit ãªãã¸ã§ã¯ãããã©ã³ããã¿ã°ãstash ã®ä»çµã¿ã«ã¤ãã¦èª¬æãã¾ãã
å®éã®ãã¼ã¿ãè¦ããã¨ãã¯ãGit Object Browser ã«ã¢ã¯ã»ã¹ãã¦ã¿ã¦ãã ããã

5. commit ãªãã¸ã§ã¯ã
å ã«èª¬æããéããGit ãªãã¸ã§ã¯ããã¼ã¿ãã¼ã¹ã«ã¯ãè¤æ°ã®ãã¡ã¤ã«ããªã¼ãä¿åã§ãã¾ãã
åã
ã®ãã¡ã¤ã«ããªã¼ã¯ãæä¸ä½ (ã«ã¼ã) ã«ãã tree ãªãã¸ã§ã¯ãã® ID ã§åºå¥ãããã¨ãã§ãã¾ãããã¡ã¤ã«ããªã¼ã¯ã大æµã®å ´åãéå»ã®ãã¡ã¤ã«ããªã¼ã¨ tree blob ãªãã¸ã§ã¯ããå
±æãã¦ãã¾ãã
ããã©ãããããã®ãã¡ã¤ã«ããªã¼ãã©ããªé çªã§ä½ããããã¯ããã¡ã¤ã«ããªã¼ãè¦ã¦ããããã¾ããã
ä¾ãã° A 㨠B ã®2ã¤ã®ãã¡ã¤ã«ããªã¼ããã£ãã¨ãã¦ãA ã«ãã¡ã¤ã«ã追å ã㦠B ã«ãªã£ãã®ããB ãããã¡ã¤ã«ãåé¤ã㦠A ã«ãªã£ãã®ãã¯ããã¡ã¤ã«ããªã¼ããã§ã¯å¤å¥ãä»ãã¾ããã
ããã¤ãã ããããªããã¡ã¤ã«ããªã¼ãå¤ããããã管çããã®ã¯ã commit ãªãã¸ã§ã¯ãã®å½¹å²ã§ããcommit ãªãã¸ã§ã¯ãã¯ã次ã®ããã«ããã¹ãã§æ¸ããã¦ãã¾ãã
tree 3db13f863b338b2dbaa12f564a2a63841396e59c parent 44c68b1afc3ae211b248a9385f89b5061cbf2f94 author KOSEKI Kengo <[email protected]> 1370766628 +0900 committer KOSEKI Kengo <[email protected]> 1370766628 +0900 ãã¹ã±ãããå¢ããé大ãªãã°ãä¿®æ£ãã
commit ãªãã¸ã§ã¯ãã«ã¯ã
treeâ¦â¦ 1ã¤ã®treeãªãã¸ã§ã¯ãã® IDparentâ¦â¦ 0å以ä¸ã®è¦ªcommitãªãã¸ã§ã¯ãã® IDauthor, committerâ¦â¦ 夿´ã»ã³ãããããã¦ã¼ã¶ã®ååãã¡ã¼ã«ã¢ãã¬ã¹ã夿´æ¥æ- ã³ãããã¡ãã»ã¼ã¸
ãªã©ãæ¸ãã¦ããã¾ãã
commit ãªãã¸ã§ã¯ãã¯ãparent ã«æ¸ããã ID ã§ã³ãããããªã¼ãå½¢æãã¾ãã

tree ãªãã¸ã§ã¯ãã¨ã¯éã«ãcommit ãªãã¸ã§ã¯ãã¯åã親ãåç
§ãã¾ãã親ã¯èªåã®åãç¥ãã¾ããã
Git ã¯ãæ°ããã³ãããããå¤ãã³ãããã¸ã¨ããã®ã¼ãæãããã®éã¯é£ããä»çµã¿ã«ãªã£ã¦ãã¾ããåã親ãè¦ã¤ããã®ã¯ç°¡åã§ãããå ¨ãªãã¸ã§ã¯ããèªã¾ãªãéãã親ãå ¨ã¦ã®åãè¦ã¤ãããã¨ã¯ã§ãã¾ããã
Github ãè¦ãã¨ããåã®ã³ããã (parent)ãã«ã¯ãªã³ã¯ãã¦ãã¦ãããæ¬¡ã®ã³ããããã¸ã®ãªã³ã¯ã¯è¦å½ãããªããã¨ããããã¾ãã

6. ãªãã¡ã¬ã³ã¹ã¨ãã©ã³ã
Git ãçè§£ããä¸ã§ãcommit ãªãã¸ã§ã¯ãã¨ãªãã¡ã¬ã³ã¹ãåºå¥ãããã¨ã¯ãã¨ã¦ã大åã§ãã
commit ãªãã¸ã§ã¯ãã¯ãã³ãããããªã¼ãå½¢æããä¸åº¦ä½ããããæ±ºãã¦å¤åãããããç°¡åã«ã¯æ¶ãã¾ããã
䏿¹ããªãã¡ã¬ã³ã¹ã¯ãã³ãããããªã¼ã®ä¸ãåãåãåçãªãã¼ã¿ã§ãé »ç¹ã«æ¸ãæããããä¸è¦ã«ãªã£ããåé¤ããã¾ãã
ãã©ã³ã
Git ã®ãã©ã³ãã¯ããã©ã³ãã®å é ãæããªãã¡ã¬ã³ã¹ã¨ããã®ãªãã¡ã¬ã³ã¹ãã辿ãã Git ãªãã¸ã§ã¯ãã®éåã§åºæ¥ã¦ãã¾ãã

ãªãã¡ã¬ã³ã¹ãæãã®ã¯ãå¿ ãããã³ãããããªã¼ã®æã®å 端ã¨ã¯éãã¾ããããªãã¡ã¬ã³ã¹ã¯ãã³ãããããªã¼ã®ã©ããç¹å®ã®ä½ç½®ãæãã¾ããããªã¼ã®éä¸ãæ ¹å ãæåãããã¦ãããã¨ãããã¾ãã

ãã©ã³ãå é ãæããªãã¡ã¬ã³ã¹
ãã©ã³ãã®å
é ãæããªãã¡ã¬ã³ã¹ã¯ .git/refs/heads ãã£ã¬ã¯ããªã«ä¿åããã¾ãã
ãã¨ãã° master ãã©ã³ãã®å
é ãæããªãã¡ã¬ã³ã¹ã¯ã.git/refs/heads/master ãã¡ã¤ã«ã«ä¿åããã¾ãããªãã¡ã¬ã³ã¹ã«ã¯ commit ãªãã¸ã§ã¯ãã® ID ããããã¹ãã§æ¸ãã¦ããã¾ãã
20baf26a647734601c3a02e20ee128bc26600c29
ãã©ã³ãå
é ã®ãªãã¡ã¬ã³ã¹ã¯ãcommit ã pull ã³ãã³ãã§æ¸ããããã¾ããã¾ããreset ã³ãã³ãã使ã£ã¦ãèªåã§å¥½ããªä½ç½®ã«æ¸ãæãããã¨ãã§ãã¾ãã

ãªãã¡ã¬ã³ã¹ãããã©ã£ã¦ã
- ãªãã¡ã¬ã³ã¹ â
commit commitâ 親commitcommitâ ã«ã¼ãtree- ã«ã¼ã
treeâtreeblob
ã¨ãã£ãå ·åã«ãèã¥ãå¼ã«ãªãã¸ã§ã¯ããå¼ãåºãã¾ãã

ãªãã¡ã¬ã³ã¹ããªãã¨ã糸å£ã«ãªã commit ãè¦ã¤ããã®ã¯é£ãããªã£ã¦ãã¾ãã¾ããGit ãªãã¸ã§ã¯ãã¯ãå¤è¦ããã¯åºå¥ãä»ããªãããã§ãã
ãªãã¡ã¬ã³ã¹ãä»ã®ãªãã¸ã§ã¯ãããåç §ãããªããªã£ããªãã¸ã§ã¯ãã¯ã2é±éç¨åº¦ã§åé¤åè£ã«ãªãã¾ãã*1
åç
§ãããªããªã£ããªãã¸ã§ã¯ããåé¤ãããããªãã¸ã§ã¯ãã `Pack` å½¢å¼ã«ã¾ã¨ãç´ãå¦çã gcãã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ (ã´ãåå) ã¨å¼ã³ã¾ãã`gc` ã¯ããªãã¸ããªãä¹±éã«ãªã£ã¦ããã¨èªåã§å®è¡ããã¾ããã¾ãã$ git gc ã³ãã³ãã使ã£ã¦ãæåã§å®è¡ãããã¨ãã§ãã¾ãã
HEAD ãªãã¡ã¬ã³ã¹
ä»ãã§ãã¯ã¢ã¦ããã¦ãããã©ã³ã㯠.git/HEAD ã¨ããç¹å¥ãªãªãã¡ã¬ã³ã¹ã«è¨é²ããã¦ãã¾ããHEAD ãªãã¡ã¬ã³ã¹ã¯ git checkout ã³ãã³ãã§æ¸ãæããã¾ãã

HEAD ã¯ãé常ã¯ããªãã¡ã¬ã³ã¹ãåç
§ãããªãã¡ã¬ã³ã¹ã§ãã
ref: refs/heads/master
ãã ãä¾å¤ãããã¾ããHEAD ããä»ã®ãªãã¡ã¬ã³ã¹ã§ã¯ãªããç´æ¥ commit ãªãã¸ã§ã¯ããåç
§ãã¦ããç¶æ
ã§ããããããdetached HEAD (åé¢ããã) ã¨å¼ã³ã¾ãã
detached HEAD
detached HEAD ã¯ãgit checkout æã« commit ãªãã¸ã§ã¯ãã® ID ãæå®ãããããã¨çºçãã¾ããä¾ãã°ã
$ git checkout 20baf26
ã¨ããã¨ã.git/HEAD ãã¡ã¤ã«ã«ã¯
20baf26a647734601c3a02e20ee128bc26600c29
㨠ID ãæ¸ãããç¶æ ã«ãªãã¾ããããã detached HEAD ã§ããdetached HEAD ã«å ¥ãã¨ã
Note: checking out '20baf26'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b new_branch_name
ã¨ãã£ãè¦åãã§ã¾ãã
detached HEAD ç¶æ ã§ãã³ãããã¯ã§ãã¾ãããã ããHEAD 以å¤ã«ãã®ã³ããããåç §ãããªãã¡ã¬ã³ã¹ãç¡ãã®ã§ãå¥ã®ãã©ã³ãããã§ãã¯ã¢ã¦ãã㦠HEAD ãæ¸ãæããã¨ãã³ãããã¯ã©ããããåç §ãããªããªãã¾ãã

ã©ããããåç §ãããªããªãã¸ã§ã¯ãã¯ãæ¾ã£ã¦ããã¨ããããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã§æ¶ããã¦ãã¾ãã¾ãã
detached HEAD ä¸ã®ã³ããããæ®ãã«ã¯ãä»ã®ãã©ã³ãã«ãã¼ã¸ããããæ°ãã«ãã©ã³ãã使ããå¿
è¦ãããã¾ãã
7. 2種é¡ã®ã¿ã°
Git ã«ã¯2種é¡ã®ã¿ã°ãããã¾ãã軽éã¿ã°ã¨ã¢ããã¼ãã¿ã°ã§ãã
軽éã¿ã°ã¯ãã³ããããç´æ¥åç §ãããªãã¡ã¬ã³ã¹ã§ãããã©ã³ãã¨åãããã ã®ãªãã¡ã¬ã³ã¹ãªã®ã§ãåå以å¤ã®æ å ±ãæã¡ã¾ããã
ã¢ããã¼ãã¿ã°ã¯ãtag ãªãã¸ã§ã¯ããæããªãã¡ã¬ã³ã¹ã§ããtag ãªãã¸ã§ã¯ã㯠commit ãªãã¸ã§ã¯ããåç
§ãã¾ããtag ãªãã¸ã§ã¯ãã«ã¯ãtag ãä½ã£ãæ¥ä»ãã¦ã¼ã¶åãã³ã¡ã³ããªã©ãå«ãããã¨ãã§ãã¾ãã

8. ä¸æå¾ é¿ (stash)
Git ã«ã¯ãã¾ã ã³ããããã¦ããªããã¡ã¤ã«ã䏿çã«éé¿ããã git stash ã¨ããã³ãã³ããããã¾ãã
git stash ã¯æ¯å 2ã¤ã® commit ãªãã¸ã§ã¯ãã使ãã¾ãã
- ç¾å¨ã®
indexãä¿åããcommitãªãã¸ã§ã¯ã (親㯠HEAD) - 使¥ãã£ã¬ã¯ããªãä¿åãã
commitãªãã¸ã§ã¯ã (親ã¯ä¸ã®ã³ããã)
ã®2ã¤ã§ãã
stash ã index ã«åæ ããã«ã¯ git stash pop --index ã®ããã« --index ãªãã·ã§ã³ãæå®ãã¾ãã
2ã¤ä½ããã commit ãªãã¸ã§ã¯ãã®å
ãå¾è
ãæããªãã¡ã¬ã³ã¹ã .git/refs/stash ãã¡ã¤ã«ã«ä¿åããã¾ãã
.git/refs/stash ã«è¨é²ãããã®ã¯ãä¸çªæè¿ã® stash ã ãã§ããæã® stash ã¯ããã° .git/logs/refs/stash ã«è¨é²ããã¦ãã¾ãã
(ç¶ãã¾ã)
*1:è¨äºå ¬éå½åãåç §ãããªããªã£ããªãã¸ã§ã¯ãã¯ã2é±éç¨åº¦çµã¤ã¨ Git ãèªåçã«åé¤ãããã¨ãã風ã«èª¬æãã¦ãã¾ãããããã¯æ£ããããã¾ããã§ãããä¸åº¦ä½ã£ããªãã¸ã§ã¯ãã¯ã大æµã¯ãã£ã¨é·ãæ®ãããã§ãã