gitåå¿è
ãžã®é Level 4
åç»å Žããã³ãã³ã: branch, tag, merge, cherry-pick, rebase
ãã©ã³ããäœã£ãŠã¿ãŸãããã
$ git branch lesson master
äœæãããã©ã³ãã«ç§»åããŸãããã
$ git checkout lesson
ãã©ã³ãã®äžèЧã確èªããŸãããã
$ git branch
* lesson
master
äœãã³ãããããŠã¿ãŸãããã
$ git commit -m "lessonãã©ã³ãã§ã³ããã"
å±¥æŽã確èªããŸãããã
$ git log
å
ãããã©ã³ã(master)ã«æ»ã£ãŠã¿ãŸãããã
$ git checkout master
å±¥æŽã確èªããŸãããã
$ git log
masterãã©ã³ãã®å±¥æŽã«ã¯ãlessonãã©ã³ãã§ã³ãããããå±¥æŽããããŸããã
ãã®ããã«ãå±¥æŽã®æåãããããŠç®¡çããäºãã§ããŸãã
A---B---C---D master
\
E lesson
ãã®æç¹ã§ã¯ãmasterãã©ã³ãããæŽŸçããlessonãã©ã³ãã¯ã
masterãã©ã³ãã®ã³ãããããã¹ãŠæã£ãŠããããšã«ãªããŸãã
ãã®ãããªç¶æ
ãfast-fowardãšãããŸãã
ããã§masterãã©ã³ãã«æ°ããä¿®æ£(F)ãã³ããããããšã
masterãã©ã³ãã«ã¯ãlessonãã©ã³ããç¥ããªãã³ããããå±¥æŽãšããŠè¿œå ãããããšã«ãªããŸãã
ãã®ãããªç¶æ
ãnon-fast-fowardãšãããŸãã
A---B---C---D---F master
\
E lesson
ãã©ã³ããšã¯ãäžèšã®ããã«ãå±¥æŽãåå²ãããŠç®¡çãããæ©èœã§ãã
éçºãè¡ãäžã§ããœãŒã¹ã³ãŒãã«ã¯æ§ã
ãªä¿®æ£ãå ããããŸãã
æ©èœè¿œå ããã°ãã£ãã¯ã¹ãæ€èšŒçšããã¹(!)ãªã©ãªã©ã
ããããäžã€ã®å±¥æŽã§ç®¡çããããšãæ³åããŠãã ãããç¡çã²ãŒã§ãããã
ãªãªãŒã¹çã®ãœãŒã¹ã³ãŒãã«æ€èšŒçšã®ã³ãŒããå
¥ãã
Aã®æ©èœè¿œå äžã«Bã®æ©èœè¿œå ã®ã³ãŒããå
¥ãã
æãå¥ã®æãŠã«ã¯ãã¹ã®ããã³ãŒããå
¥ãâŠ
ãã®ãããªè€éãªç®¡çãå®å
šã«è¡ãããã«ãå±¥æŽãæåããããããã©ã³ããšããŠåå¥ã®å±¥æŽãäœããŸãã
A---B---C ãªãªãŒã¹ãã©ã³ã
\
D---E éçºãã©ã³ã
\
F---G---H æ©èœè¿œå ãã©ã³ã
\
I æ©èœè¿œå ãã©ã³ãããã®æŽŸçãã©ã³ã(æ€èšŒçš)
gitã§ã®ãã©ã³ãã®éçšæ¹æ³ã¯ããããè°è«ã®ãããšããã§ããã
äžè¬çãªéçºã«ãããŠã¯ãVincent Driessenããã®æå±ãããA successful Git branching modelããšãããã©ã³ãã¢ãã«ãè©å€ã®ããã§ãã
A successful Git branching model >> nvie.com
http://nvie.com/posts/a-successful-git-branching-model/
ãã®ã¢ãã«ãå°å
¥ãããgit-flowãšããgitã®ãã©ã°ã€ã³ãååšããŸãã
git-flow cheatsheet
http://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html
3. ãã©ã³ããåé€ãã
ãã©ã³ãã®åé€ãè¡ããŸãã
$ git branch -d <branchname>
4. ãã©ã³ãåã倿Žãã
$ git branch -m <branchname> <newname>
5. ãã©ã³ãã®ãã°ãå·®åãèŠã
ç¹å®ã®ãã©ã³ãã®ãã°ã確èªããŸãã
$ git log <branchname>
ãã©ã³ãéã®å·®åã確èªããŸãã
$ git diff <branchA> <branchB>
ãã©ã³ãåãšããã®ã¯ãå±¥æŽã®æã«ã€ããããååã§ãã
ãã©ã³ããç§»åããã®ã¯ãåçŽã«ãã®å±¥æŽã®å
é ã«ç§»åãããšããããšã
åæ§ã«ãç¹å®ã®ãªããžã§ã³ã«ååãä»ããäºãã§ããŸããgit tag ã³ãã³ãã䜿ããŸãã
$ git tag <tagname> <revision>
ããšãã°ããªãªãŒã¹ãªããžã§ã³ã«ããŒãžã§ã³åãã€ããŠç®¡çãããããŸãã
$ git tag v1.1.0 460ac4
7. ãã©ã³ããããŒãžãã
ããŒãžãšããèšèã¯æ§ã
ãªçšéã§äœ¿ãããŸããã
ãã©ã³ãã«å¥ã®ãã©ã³ãã®å€æŽãåã蟌ãäºããã©ã³ãã®ããŒãžãšèšããŸãã
A---B---C---D master
\
E---F lesson
masterãã©ã³ãã«lessonãã©ã³ãã®å€æŽãããŒãžããå Žåã¯ã次ã®ããã«ããŸãã
$ git checkout master
$ git merge lesson
ããã§ãlessonãã©ã³ãã®å€æŽ(E,F)ããmasterã®å±¥æŽã«åã蟌ãŸããmasterãã©ã³ããšlessonãã©ã³ãã¯åãå±¥æŽãæã€äºã«ãªããŸãã
A---B---C---D---E---F master, lesson
8. ç°ãªãå±¥æŽãæã€ãã©ã³ããããŒãžãã
ç°ãªãå±¥æŽãæã€ãã©ã³ãå士ã®ããŒãžãèããŸãããã
A---B---C---D---G master
\
E---F lesson
ååã®ããŒãžã§ã¯ãlessonãã©ã³ãã®å±¥æŽã«è¿œå ãããä¿®æ£ããmasterãã©ã³ãã®å
é ã«è¿œå ããã ãã§ãã¿ãŸããã
ã§ã¯ãmasterãã©ã³ãã«ãç¬èªã®ä¿®æ£(G)ã远å ãããŠããå Žåã¯ã©ããªãã§ãããã
$ git checkout master
$ git merge lesson
ããŒãžã®æ¹æ³ã¯åãã§ãã
A---B---C---D---G---H master
\ /
E---F lesson
ãã®å Žåãlessonãã©ã³ãã®ä¿®æ£(E, F)ããmasterãã©ã³ãã«ããŒãžãã(H)ãšããã³ãããã远å ãããŸãã
masterãã©ã³ãã®ãã°ã«ã¯ãlessonãã©ã³ãã®ä¿®æ£(E,F)ãå«ãŸããŸãã
$ git log --oneline
8a9bca6 H
dffdcb5 F
24ec04a G
128601a E
4b55f65 D
f1fda71 C
cab6f6b B
bc73968 A
ããã§ãæ¬¡ã®æäœã詊ããŠã¿ãŸãããã
$ git checkout HEAD^
$ git checkout HEAD^^
$ git checkout <Fã®ãªããžã§ã³>
å±¥æŽã®æåããããã®ãŸãŸä¿æãããŠããäºãåãããšæããŸãã
git log ã§æåããã®æ
å ±ã確èªããã«ã¯ã--graph ãªãã·ã§ã³ã䜿ããŸãã
$ git log --oneline --graph
* 8a9bca6 H
|\
| * dffdcb5 F
* | 24ec04a G
| * 128601a E
|/
* 4b55f65 D
* f1fda71 C
* cab6f6b B
* bc73968 A
ãã©ã³ãåã衚瀺ãããå Žåã¯ã--decorateãªãã·ã§ã³ã远å ããŸãããã
9. ã³ã³ããªã¯ãã解決ãã
ç°ãªãå±¥æŽãããŒãžããéãããããã®ãã©ã³ãã§åãéšåã«ä¿®æ£ããããšã©ããªãã§ãããïŒ
äŸãã°æ¬¡ã®ãããªããã¹ããã¡ã€ã«ã«ããã©ã³ãAããã©ã³ãBã§ä¿®æ£ãå
¥ãããšããŸãã
ããã¹ããã¡ã€ã«.txt
hoge1
hoge2
ãã©ã³ãAã§ã®ä¿®æ£
hoge1
piyo
hoge2
ãã©ã³ãBã§ã®ä¿®æ£
hoge1
fuga
hoge2
ãã®ããã«ãåãéšåã«ä¿®æ£ãå
¥ããå Žåãªã©ãä¿®æ£ãã©ãåæ ããã°ãããgitã倿ã§ããªãå Žåãã
ã³ã³ããªã¯ã(ç«¶å)ãçºçãããšãããgitã¯ã³ã³ããªã¯ãã®è§£æ±ºããŠãŒã¶ã«ãã ããŸãã
$ git merge ãã©ã³ãB
Auto-merging ããã¹ããã¡ã€ã«.txt
CONFLICT (content): Merge conflict in ããã¹ããã¡ã€ã«.txt
Automatic merge failed; fix conflicts and then commit the result.
statusã確èªãããšæ¬¡ã®ããã«ãªã£ãŠããŸãã
$ git status
# On branch ãã©ã³ãA
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: ããã¹ããã¡ã€ã«.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
ããã¹ããã¡ã€ã«.txtãéããŠã¿ãŸãããã
hoge1
<<<<<<< HEAD
piyo
=======
fuga
>>>>>>> ãã©ã³ãB
hoge2
ããã¯ã<<<<<<< HEAD ãã======= ãŸã§ã®éããèªåèªèº«(ãã©ã³ãA)ã®å€æŽã
======= ããã>>>>>>> ãã©ã³ãB ãŸã§ã®éãããã©ã³ãBã®å€æŽã§ãããšããç¶æ
ã衚ããŠããŸãã
piyoãæ£ããã®ããfugaãæ£ããã®ãããããšãäž¡æ¹å¿
èŠãªã®ããé çªã¯ã©ã¡ããäžãªã®ãããªã©ã®æ
å ±ã¯ãã³ãŒããæžããŠããæ¬äººã«ããåãããŸããããã
ãã®ãããªå ŽåããŠãŒã¶ã<<<<<<< HEAD ãªã©ã®èšå·ãæ¶ããæ£ããç¶æ
ã«ããŠã³ãããããŠããå¿
èŠããããŸãã
ãšãã£ã¿ã§æ¬¡ã®ããã«ä¿®æ£ããã³ãããããŸãããã
hoge1
piyo
fuga
hoge2
$ git commit -a
èªåçã«ãããŒãžããŸãããšããæšã®ã³ãããã¡ãã»ãŒãžãæ¿å
¥ãããŸãã
ãã©ã³ãéçšã«ãã³ã³ããªã¯ãã¯ã€ããã®ã§ããããããªãããããŒãžã®éã«ããŸãã«ããããã®ã³ã³ããªã¯ããçºçãããšãæ£ç¢ºãªããŒãžãé£ãããªã£ãŠããŸãããã©ã³ãã®ç²åºŠãå°ãããããªã©ãéçšã«ã¯å·¥å€«ãå¿
èŠã§ãã
10. ç¹å®ã®ã³ãããã ããããŒãžãã
ãã©ã³ãå士ã®ããŒãžã§ã¯ãªãããšããå¥ã®ãã©ã³ãã®ãç¹å®ã®ã³ãããã ããåã蟌ã¿ãããªãŒãªããŠããšããããŸãã
ãã®å Žåã¯ãgit cherry-pick ã䜿ããŸããã€ãŸã¿é£ãã§ããã
$ git cherry-pick <revision>
ããŒãžã®æäœã¯ãã©ã³ãã®ããŒãžãšåæ§ã§ãã
11. 掟çå
ã®ãã©ã³ãã®ä¿®æ£ãåã蟌ã
masterãã©ã³ãããæŽŸçããlessonãã©ã³ãã§äœæ¥äžãmasterãã©ã³ãã«æ°ããä¿®æ£(G)ãã³ããããããŸããã
A---B---C---D---G master
\
E---F lesson
ãã®ãšããlessonãã©ã³ãã«ãä¿®æ£(G)ãåã蟌ã¿ãããšæããŸãã
git merge ã䜿ããšã次ã®ããã«åã蟌ãäºãã§ããŸãã
$ git checkout lesson
$ git merge master
ãã®ããã«ãlessonãã©ã³ãã«ãmasterãã©ã³ããããŒãžãããšããã³ãããã远å ãããŸãã
A---B---C---D------G master
\ \
E---F--H lesson
ããã«ãããããããããã®ãã©ã³ãã«ä¿®æ£ãå
¥ããããããä»åºŠã¯masterãã©ã³ãã«ããŒãžããããšãèããŸãããã
A---B---C---D------G---J---K master
\ \ /
E---F--H---I lesson
éåžžã«è€éã«ãªããŸããã
gitã«ã¯git rebase ãšããã³ãã³ãããããŸãã
$ git checkout lesson
$ git rebase master
ããŒãžã¯ãlessonãã©ã³ãã«masterãã©ã³ãã®ä¿®æ£ã远å ããããšããã€ã¡ãŒãžã§ãããã
rebaseã¯ãmasterãã©ã³ãã®å
é ã«ãlessonã®ä¿®æ£ã远å ãçŽãããšããã€ã¡ãŒãžã§ãã
A---B---C---D---G master
\
E---F lesson
A---B---C---D---G master
\
E'---F' lesson
ããããããšã§ãlessonãã©ã³ãã¯ææ°ã®ç¶æ
ã®masterãã©ã³ãããæŽŸçããããšã«ãªããå±¥æŽãã¹ãããªããŸããã
泚ç®ãã¹ãã¯ãrebaseåŸã®lessonãã©ã³ãã®å±¥æŽããE'ãF'ãšãªã£ãŠããããšã§ãã
å®éã«ç°ãªããªããžã§ã³çªå·ãä»äžãããŠãããšæããŸããã€ãŸããä¿®æ£ã®å
容ã¯åãã§ãããç°ãªãã³ããããšããŠåæ ãããŠãããšããäºã§ãã
å±¥æŽãæžãæãããšããããšãäœãæå³ããã®ãããã£ããçè§£ããäžã§äœæ¥ããŠãã ããã
âããã§ããã
rebaseã§ã¯äœãè¡ãããŠããã®ããšãããšã
ãŸããEã®å·®åãFã®å·®åãpatchã«ããŸãã
ãããŠãmasterã®ææ°ã®å±¥æŽã«ãEã®patchãFã®patchã®é ã«patchãåœãŠãŠè¡ãäœæ¥ãè¡ããŸãã
patchãåœãŠããã³ã«ãã³ã³ããªã¯ããçºçããå Žåã¯è§£æ±ºã®å¿
èŠããããŸãã
$ git rebase master
Eã®patchåæ -> ã³ã³ããªã¯ãçºç -> ãšãã£ã¿ã§ä¿®æ£
$ git add .
$ git rebase --continue
Fã®pathcåæ -> ã³ã³ããªã¯ãçºç -> ãšãã£ã¿ã§ä¿®æ£
$ git add .
$ git rebase --continue
éäžã§ãããããããªããªã£ãŠæåããããçŽãããå Žåã¯ã--abort ãªãã·ã§ã³ãæå®ããŸãã
$ git rebase --abort
[INDEX](https://gist.github.com/yatemmma/6486028#file-git-lesson-md ) | [TOP](https://gist.github.com/yatemmma/6486028#file-git-lesson4-md )