blog記事: http://alpha.mixi.co.jp/entry/20150513
Learn You a Gitfor Great Good!
View Slide
ͦͦɺGitͬͯԿͷͨΊʹ͋ΔΜͩΖ͏ʁ
GitɺνʔϜͰͭͷ։ൃʹऔΓΉ͜ͱΛՄೳʹ͠·͢ʂ
Git͕ແ͍ͱʜʜԿ͕มΘ͔͔ͬͨΜͳ͍ʂٸʹಈ͔ͳ͘ͳͬͨΜ͚ͩͲʜʜࠓ͔Βࢲ͕։ൃ͢ΔͷͰɺΈΜͳ։ൃΛࢭΊͯʂ͜ͷίʔυ୭͕ॻ͍ͨΜͩΖ͏ʁ
ਖ਼ਏ͍ʂ
Git͕͋Εʂ;Ή;Ήɺ͜͏͍ͬͨมߋ͕ՃΘͬͨͷ͔ʂಈ͔ͳ͘ͳ͚ͬͨͲɺ͙͢ʹલʹͤͨʂඦਓͰҰॹʹ։ൃͰ͖ΔΑʂ͜ͷΫιίʔυΛॻ͍ͨͷɺ˓˓͞Μ͔ʜʜ
ΈΜͳͰ։ൃͰָ͖͍ͯ͠ʂ✌ Т✌ࡾ✌ Т✌ࡾ ✌`Т✌
w ͱΓ͋͑ͣͬͯΈΑ͏ʂw ίϛοτͱϒϥϯνʹ͍ͭͯਖ਼͘͠ཧղ͠Α͏w ྺ࢙ΛऔΓࠐΉw མึर͍ࠓͷ༧ఆ
ͬͯΈΑ͏ʂͷͦͷલʹ$ git config --global user.name "Amy Mikushi"$ git config --global user.email "[email protected]"Gitʹࣗݾհ͜͜Ͱొͨ͠ใ͕(JUͷૢ࡞ʹ͍ͭͯճΔʂ
͡ΊͯΈΑ͏$ mkdir books$ cd books$ git initGitϦϙδτϦΛ࡞͠Α͏ϦϙδτϦɺόʔδϣϯཧ͢ΔͨΊͷஷଂݿͷ͜ͱͰ͢
$ find .Α͘Ͱ͖·ͨ͠ʂ͜ΕͰbooks
ঢ়ଶͷ֬ೝ$ git statusgit
ϑΝΠϧͷՃUntracked
ՃΛ֬ೝChanges
͡ΊͯͷίϛοτεςʔδϯάΤϦΞʹஔ͍ͨϑΝΠϧΛεφοϓγϣοτͱͯ͠ɺGit
εςʔδϯάΤϦΞͱϦϙδτϦSherlock.txtCrusoe.txt࡞ۀσΟϨΫτϦ εςʔδϯάΤϦΞ (JUϦϙδτϦgit addίϛοτ͢Δ४උ͕Ͱ͖ͨΒgit
Sherlock.txtCrusoe.txt࡞ۀσΟϨΫτϦ εςʔδϯάΤϦΞ (JUϦϙδτϦgit commitadd
ྺ࢙ΛΈΑ͏มߋΛอଘͰ͖ΔΑ͏ʹͳΓ·ͨ͠ʂมߋΛίϛοτͱͯ͠ͲΜͲΜੵΈॏͶ͍ͯ͘͜ͱ͕େࣄͰ͢ͲΜͳมߋ͖͚ͯͨͬ͠ʜʁͱͳͬͨΒྺ࢙ΛৼΓฦΓ·͠ΐ͏ʂ$ git logաڈͷมߋ ίϛοτ͕ҰཡͰ͖·͢ผͷϑΝΠϧΛՃ͢ΔίϛοτΛߦ͍ɺ࠶
ϦϞʔτϦϙδτϦΛͬͯΈΔಉ͡ঢ়ଶ͕ϦϞʔτʹอଘͰ͖·͍ͭ͢ͰͤΔ͠ɺଞͷਓҾͬுͬͯ͜Ε·͢·ͣɺGitHubͰϕΞϦϙδτϦΛ࡞͠Α͏ʂhttps://github.com/newϕΞϦϙδτϦ࡞ۀ༻σΟϨΫτϦΛ࣋ͨͳ͍.gitͷΈͷϦϙδτϦͰ͢
ϦϞʔτϦϙδτϦΛొ͢ΔϕΞϦϙδτϦΛ࡞ͨ͠ΒϦϞʔτϦϙδτϦͱͯ͠ొ͠Α͏$ git remote add origin \[email protected]:/books.gitొͨ͠ϦϞʔτϦϙδτϦɺ$
खݩͷมߋΛ্͛ͯΈΑ͏$ git push -u origin masterϦϞʔτϒϥϯνΛࣗಈͰ͢ΔΑ͏ʹઃఆ͢Δ͔࣍Βpull
ڞಉ։ൃ͜ͱ͡Ί$ cd ..$ git clone [email protected]:/books.git alt_booksGitΛ͏͜ͱͰෳਓͰ͔ΜͨΜʹ։ൃͰ͖·͢ʂࠓ͔Βผਓ ͷؾ࣋ͪʹͳͬͯମݧͯ͠Έ·͠ΐ͏·ͣϦϞʔτϦϙδτϦΛखݩʹऔΓࠐΈ·͢alt_booksͱ͍͏໊લͰϦϙδτϦΛෳ(clone)Ͱ͖ͨʂ
ڞಉ։ൃ͜ͱ͡Ί$ cd alt_books$ vim Crusoe.txt$ git add Crusoe.txt$ git commit$ git pushͰɺalt_booksͰ࡞ۀΛ͍͖ͯ͠·͠ΐ͏pushͨ͠ΒɺGitHubͰ֬ೝͯ͠ΈΑ͏ʂ
มߋΛऔΓࠐΉ$ cd ../books$ git pullଞਓͷߦͬͨ࡞ۀ alt_booksͰߦͬͨ࡞ۀΛbooksʹऔΓࠐΜͰΈ·͠ΐ͏ͦΕʹpull
มߋΛ֬ೝʂ$ vim Sherlock.txt$ git diffdiff
มߋΛ֬ೝʂ1BSU$ git add Sherlock.txt$ git diff --stagedͨͩ୯ʹgit
ݩʹ͢$ git reset Sherlock.txtૉΒ͍͠ʂमਖ਼ՕॴΛ͙͢ʹ֬ೝ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳΓ·ͨ࣍͠ݩʹ͢ํ๏Λ֮͑·͠ΐ͏addΛऔΓফ͢ʹgit
ݩʹ͢$ vim Sherlock.txt$ git checkout -- Sherlock.txt͜ΕͰ͖ͳ͚ͩBEEΛͨ͠ΓɺBEEΛऔΓফͨ͠ΓͰ͖·࣍͢ϑΝΠϧࣗମΛલճͷίϛοτঢ়ଶʹ͢ํ๏Ͱ͢ίϛοτͯ͠ͳ͍มߋফ͑ͪΌͬͯݩʹͤͳ͍ʂ
ϒϥϯνΛ࡞Ζ͏Gitͷ͍ํΛ΄ͱΜͲϚελʔ͠·ͨ͠ʂ࠷ޙʹGitͷϒϥϯνػೳΛֶͼ·͠ΐ͏ϒϥϯνɺݱࡏͷίϐʔΛ࡞͢ΔػೳͰ͢ػೳՃόάमਖ਼ͷࡍϒϥϯνΛͬͯ࡞ۀΛਐΊ·ͬͨ͢ϒϥϯν͔Β͍ͭͰݩͷmasterϒϥϯνʹͬͯ͘Δ͜ͱ͕Ͱ͖·͢masterσϑΥϧτͷϒϥϯν໊Ͱ͢
ϒϥϯνΛ࡞Ζ͏$ git branch clean_upϒϥϯνΛΔʹɺgit
ϒϥϯνΛΓସ͑ͯΈΑ͏$ git checkout clean_upclean_up
ϑΝΠϧͷআ$ git rm '*.txt'$ git commit -m "Remove all files"clean_up
ϒϥϯνͰߦͬͨ࡞ۀΛऔΓࠐ͏$ git checkout masterclean_up
ϒϥϯνͰߦͬͨ࡞ۀΛऔΓࠐ͏$ git merge clean_upclean_up
ϒϥϯνͷআ$ git branch -d clean_upඞཁͷͳ͘ͳͬͨclean_upϒϥϯνΛআ͠Α͏git
࠷ޙͷpush$ git push࠷ޙʹࠓ·ͰߦͬͨมߋΛGitHubʹөͤ͞Α͏ʂGit͕͑ΔΑ͏ʹͳͬͨʂ
ίϛοτͱϒϥϯνͬͯͲ͏͍͏ΈͳΜͩΖ͏ʁ
ίϛοτͱϒϥϯνΛཧղ͢Δ͜ͱͰGitΛγϯϓϧʹཧղͰ͖·͢
ίϛοτͱʁίϛοτ༷ʑͳใΛ͍࣋ͬͯ·͢w ϦϏδϣϯw Tree
ίϛοτʹ͕͍ΔͭલͷίϛοτͷϦϏδϣϯΛ࣋ͭͷͰίϛοτʹ͕͍Δʂ ৽͍͠ίϛοτ͔Βݹ͍ίϛοτ؆୯ʹ୧ΕΔ
࠷ݹͷίϛοτ·Ͱ୧ΕΔίϛοτΛ୧͍ͬͯ͘ͱඞͣҰ൪࠷ݹͷίϛοτ·Ͱ୧Γண͚Δʂ࠷ݹ͋ΔͭͷίϛοτΛݟΕɺͦͷྺ࢙͕͔Δ
ίϛοτ͔͚ͬͨͲϒϥϯνʁ
୯ͳΔಛఆͷίϛοτΛࢦͨ͠ϙΠϯλͷΑ͏ͳͷͰ͢ʂ
ϒϥϯνσϑΥϧτͷϒϥϯν໊masterϒϥϯνͷઌ಄Λࢦ͢ϦϑΝϨϯεɺςΩετͰϦϏδϣϯ SHA-1͕อଘ͞Ε͍ͯ·͢
ϒϥϯν৽ͨͳnewͱ͍͏໊લͷϒϥϯνΛ࡞ͯ͠ΈΔ$ git branch new
ϒϥϯν$ git branch new ৽͍͠ͷ͕ग़དྷͨʂ৽ͨͳnewͱ͍͏໊લͷϒϥϯνΛ࡞ͯ͠ΈΔ
ϒϥϯνͷجຊ͜Ε͚ͩʂ୯ͳΔϙΠϯλͳͷͰɺϒϥϯν໊͕͑ΔॴϦϏδϣϯ͕͑Δͦ͠ͷٯવΓ
ϒϥϯνͷࢬ͔Ε ͜ͷঢ়ଶ͔ΒOFXʹίϛοτ͍ͯ͘͠ͱʜʜ
ϒϥϯνͷࢬ͔Ε Μʁ
ϒϥϯνͷࢬ͔Ε ࢬ͔Εͨ͠ʂ
ϒϥϯνͷࢬ͔Εnewϒϥϯν͚ͩมߋ͞ΕmasterϒϥϯνʹӨڹ͕ͳ͍ʂ
ࢲͲ͜ʹ͍ΔΜͰ͠ΐ͏͔ʜʜgit
HEADϦϑΝϨϯε $ git checkout master
HEADϦϑΝϨϯεHEADͷҐஔ͕ΓସΘͬͨʂHEAD͕͍͍ͯΔϒϥϯνಛघͳಈ͖Λ͢Δ͔Γ͍͢Α͏ʹ·ͣଞʹϒϥϯνΛͬͯΈΔ $ git branch other
HEADϦϑΝϨϯε͜͜Ͱίϛοτͯ͠ΈΔͱʜʜ master
HEADͰࢀর͞Ε͍ͯΔϒϥϯνίϛοτ͢ΔͨͼʹҠಈ͢Δ
ίϛοτͱϒϥϯνʹ͍͔ͭͯͬͨʂ
ྺ࢙ΛऔΓࠐΉϚʔδͬͯͲ͏͍͏࣌ʹ͏ΜͩΖ͏ʁ
ΘΓͱͲ͜Ͱ͏ʂ
ɾνʔϜͰ։ൃ͍ͯ͠Δ࣌ʹଞͷਓͷมߋΛऔΓࠐΉͱ͖ɾਓͰ։ൃ͍ͯ͠Δ࣌ʹෳͷϒϥϯνΛͭʹ·ͱΊΔͱ͖
ΘΓͱΑ͋͘ΔύλʔϯΑʔ͠ɺमਖ਼ऴΘͬͨ͠αʔόʹpush
push
ͳͥpushͰ͖ͳ͍ʁremote repo my repo͢Ͱʹ৽͍͠ίϛοτ͕ʂ
͜ͷঢ়ଶͰpushͰ͖·ͤΜͲͷίϛοτ͕masterϒϥϯνͷ࠷৽͔͔Βͳ͘ͳΔ͔ΒͰ͢ҎԼͷΑ͏ͳঢ়ଶΛ࡞Δ͜ͱग़དྷ·ͤΜ
Ͳ͏ͨ͠Β͍͍ͷʁҰखݩʹremote
มߋΛऔΓࠐΉremote repo my repo$ git pull origin master
remote repomy repoมߋ͕औΓࠐ·Εͨʂ
remote repomy repo$ git push origin master
remote repo my repopushͰ͖ͨʂ
ΈΜͳͰ։ൃͭͷϒϥϯνΛผʑʹมߋͨ࣌͠ɺଞਓͷมߋΛϚʔδͯ͠push
͍Ζ͍Ζͳྺ࢙ͷऔΓࠐΈํΘΓͱ͍Ζ͍ΖͳॴͰ͏ϚʔδͰ͕͢ɺ࣮͍Ζ͍Ζͳྺ࢙ͷऔΓࠐΈํ͕͋Γ·͢ʂ• merge
merge
$ git merge topic --ffmerge
தͷਓʮtopicϒϥϯνͬͯmasterͷࠩશ෦ɹؚΜͰΔ͠ɺҰॹʹͪ͠Ό͑Α͘Ͷʁʯmerge
தͷਓʮϚʔδͨ͠Αʔʯ merge
$ git merge topic --squashmerge
தͷਓʮtopicͷมߋ༰Λѹॖ͠Α͏ʂʯதͷਓʮͭͷύονʹѹॖͰ͖ͨʂʯ merge
Ϛʔδ͢Δ༰Λѹॖ͠ɺࠩΛݱࡏͷίϛοτʹ͚ͬΔʂࠩεςʔδϯάΤϦΞʹͤΒΕΔ͚ͩͳͷͰɺίϛοτࣗͰΔඞཁ͕͋Δmerge
ϦϕʔεͬͯԿʁϚʔδͱԿ͕ҧ͏ͷʁ
rebase '͜Ε͕Ϧϕʔεʂ
࣮ࡍϦϕʔε͕Ͳ͏͍͏͜ͱΛ͢Δͷ͔ͭͣͭݟ͍ͯ͜͏
rebasetopicϒϥϯνΛrebase͍ͨ͠
rebase $ git rebase master
'rebase·ͣίϛοτͷมߋ༰ΛͦΕͧΕύονʹ͢Δ
rebasetopicϒϥϯνΛmasterͱಉ͡ҐஔʹҠಈͤ͞Δ
rebase࡞͓͍ͯͨ͠ύονΛͭͣͭॱʹద༻ͯ͠ίϛοτ͍ͯ͘͠
rebaseࠩΛద༻ͯ͠ίϛοτ
rebase'
ରͷϒϥϯνͷ্ʹݱࡏͷϒϥϯνΛ࡞Γ͠·͢rebaseʹΑͬͯ࡞ΒΕͨίϛοτಉ͡༰͚ͩͲผͷίϛοτʹͳΔͷͰҙͰ͢ʂgit
ผͷίϛοτʹͳΔw ϦϏδϣϯw Tree
͍͚ͬͯͳ͍rebaseίϛοτͷใ͕มΘͬͯ͠·͏ͷͰɺطʹpush͞Ε͍ͯΔϒϥϯνΛrebase͍͚ͯ͠·ͤΜଞਓ͕push
Gitͷ৭ʑͳٕΛֶ΅͏ʂ
͜Ε͚֮ͩ͑Α͏$ git
gitίϚϯυͰɺGitͷΑ͘͏ίϚϯυΛҰཡ͢Δ͜ͱ͕ग़དྷ·͢ίϚϯυͷৄࡉͳઆ໌Λݟ͍ͨ࣌ɺmanΛར༻͠·͠ΐ͏ྫ͑ɺmergeίϚϯυʹ͍ͭͯৄ͘͠Γ͍ͨͱ͖ϋΠϑϯͰܨ͛ͯೖྗ͠·͢$ man git-merge͜Ε͚֮ͩ͑Α͏
git
Ϛʔδ͢Δ࣌ʹ(JU͚ͩͰղܾͰ͖ͳ͍͜ͱ͕͋Γ·ͦ͢Ε͕ίϯϑϦΫτͰ͢ίϯϑϦΫτͨ͠߹ਓ͕ؒղܾ͢Δඞཁ͕͋Γ·͢ίϯϑϦΫτ͏͍ͩೣղܾ͠ͳ͍
ίϯϑϦΫτͨ͠ϑΝΠϧɺboth
ίϯϑϦΫτΛमਖ਼ͯ͠ɺίϛοτ͠·͢ίϯϑϦΫτ͏͍ͩb<<<<<<< HEADccc=======c>>>>>>> topicdbcccdίϯϑϦΫτղܾ࣌ʹɺίϯϑϦΫτղܾҎ্ͷ͜ͱΛ͍͚ͯ͠·ͤΜͲͷʹݱΕͳ͍มߋΛ͍ͯ͠ΔϚʔδΛevil
Φϓγϣϯͳ͠ͷgit
ͦΕʹgit
Ͳ͏͠Α͏ͳ͘ͳͬͨؒҧͬͯϒϥϯνΛফͯ͠͠·ͬͨదʹreset
ㅤ ㅤ ㅤ
גࣜձࣾϛΫγΟͰ΄ͱΜͲͷ෦ॺ͕͍ͬͯ·͢
GitHubͷPull
ྡͷਓͷGitHubͷϓϩδΣΫτΛϑΥʔΫ͠·͢ ϑΥʔΫͨ͠ϦϙδτϦΛखݩʹΫϩʔϯ͠·͢ ࡞ۀ༻ϒϥϯνΛ࡞͠·͢ มߋΛՃ͑ͯίϛοτͯ͠ϓογϡ͠·͢ GitHub͔ΒPull
w (JU#PPLw ͜Θ͘ͳ͍(JUw (JUͷΈ ͖ͤ͜ͷٕज़هw ݟ͑ͳ͍νΧϥʲ༁ʳ(JUΛϘτϜΞοϓ͔Βཧղ͢Δw $PEF4DIPPM5SZ(JUࢀߟจݙΈΜͳಡΜͰΈΑ͏ʂ