第一回 GitHub Kaigi で発表した資料です。
ೖॻʹࡌͬͯͳ͍ Git&GitHub Tips ·ͨɺ͍͔ʹͯ͠ʑPRΛ͍͍ͯ͞Δ͔ߴڮါٱʢgh:yuku-tʣ
View Slide
ߴڮါٱ͔ͨ͠ Ώ͏͘yuku_t yuku-tGitHub ͱͷೃΕॳΊ2013/02 GitHubۀऀ&CIOͱژ؍ޫΛָ͠Ή2013/07 GitHubͷϓϥΠϕʔτϧʔϜͰେϦʔά؍ઓ͢Δ2014/06 GitHub KaigiͰ͢CTO @ Increments
ఏڙ
OAuth ͏͙͢ 200004
͢͜ͱ&Δ͜ͱ● Qiitaʹࡌͬͯͨ● GitHub Cheat Sheetʹࡌͬͯͳ͍● ʮೖ Gitʯʹग़ͯ͜ͳ͍● ͋ͱGitHubΛͬͨσϞ5ʘ ࡌͬͯͳ͍Α ʗ
Conflict
ίϯϑϦΫτൃੜ࣌ͷ% git merge master7HEADmaster<<<<<<< HEADtopic branch=======master>>>>>>> master!!!ίϯϑϦΫτ͢ΔͱHEADͱϚʔδର͕ॻ͖ग़͞ΕΔ➡ͱͷঢ়ଶ͕͔Βͳͯ͘ࠔΔ͜ͱ͕͋Δ
ڞ௨ͷઌͷใΛॻ͖ग़͢8http://qiita.com/hchbaw/items/1191c2627307a4673b1b<<<<<<< HEADtopic branch||||||| merged common ancestorsoriginal=======master>>>>>>> masterHEADmaster● ڞ௨ͷઌͷঢ়ଶॻ͖ग़͞ΕΔΑ͏ʹͳΔ- ௨ৗͷΤσΟλͰίϯϑϦΫτղফͯ͠Δਓʹศར- mergetoolΛ͍ͬͯΔਓʹಛʹϝϦοτͳ͍% git config --global merge.conflictstyle diff3
git stash
git stash save / pop● indexͷใ͕ܽམ➡ file͕શମ͕unstagedʹ10● track͞Ε͍ͯͳ͍ϑΝΠϧ ͞ΕΔ➡ readme͕͍ͬͯΔ● indexͨ͠ͷstash͞ΕΔ➡ fileʹaddͨ͠෦stash‣ -q,--quiet ඪ४ग़ྗΛ੍͢Δ
--all --include-untracked --keep-index-u, --include-untracked• track͞Ε͍ͯͳ͍ ϑΝΠϧstash͢Δ➡ readmestash͞ΕΔ-a, --all• ignoredͳϑΝΠϧશ෦11-k, --keep-index• index treeΛͦͷ··͢➡ fileͷadd͞ΕͨՕॴ͕͍ͬͯΔhttp://qiita.com/ton1517/items/9888a78f6b063e748558
git stash pop --index--index• working tree͚ͩͰͳ͘index tree෮ݩ͢Δ➡ fileͷadd͞Εͨঢ়ଶ͕෮ݩ͞Ε͍ͯΔ12http://qiita.com/ton1517/items/9888a78f6b063e748558
શ͘৽͍͠working directory͕ཉ͍͠● git stash -uͰશͯstashͰ͖Δ͚Ͳɺ1͔Β ৽͍͠working directory͕ཉ͘͠ͳΔͱ͖͋Δ!● .gitσΟϨΫτϦͷத͕γϯϘϦοΫϦϯΫͰ ͭͳ͕͍ͬͯΔͷͰશͯͷΦϒδΣΫτ͕ಉظ͢Δ➡ stashಉظ͢ΔͷͰnew-workdirͰॻ͍ͨίʔυΛstash popͰ؆୯ʹऔΓࠐΊΔʦ༨ஊʧgit-core/contribʹศརͳεΫϦϓτ͕৭ʑ๏ ಛʹdiff-highlightͬͯͳ͍ਓਓੜଛͯ͠Δ13http://qiita.com/yuya_presto/items/dcebbebc6b3d9cf6f542% ln -s /path/to/git-core/contrib/workdir/git-new-workdir ~/bin% git-new-workdir . ../new-workdir% cd ../new-workdir # ৽͍͠working directory
git diff & apply
ۭനͷҧ͍͚ͩͷߦΛআ͍ͯadd✓ ۭനҧ͍͚ͩͷίϛοτ͕ผͩͱͪΐͬͱخ͍͠-w, --ignore-all-space• ࠩܭࢉ࣌ʹۭനจࣈΛແࢹ͢Δɻ!--cached• working treeΛ৮ΒͣʹindexͷΈߋ৽͢Δ15% git diff -w% git apply --cached < patch% git diff -w | git apply --cachedhttp://qiita.com/yuya_presto/items/dcebbebc6b3d9cf6f542※ ۭനͷมߋͱଞͷมߋ͕ۙ͘ʹ͋ΔͱίϯϑϦΫτ͕ൃੜͯ͑͠·ͤΜ
git fsck
ͦͦgit fsckͱʁ● gitͷ࣮ମάϥϑ- ݸʑͷϊʔυsha1Λ͕࣋ͭ…● ͏ίϛοτʹ໊લ(ref)Λ͚ͭΔ- HEAD, branch, tagͳͲͳͲ● refs͔ΒḷΕͳ͍ͷΰϛ● git fsckΰϛΛఆˍྻڍ͢Δ17ref % git fsckdangling commit ͷsha1※ ࣮ࡍʹΰϛΛফ͢ͷgit prune
addͯ͠commitͤͣʹreset --hardͨ͠● ΰϛఆ͞ΕͨΦϒδΣΫτΛॻ͖ग़͢- .git/lost-found/commit/- .git/lost-found/other/ # ͬͪ͜● ॻ͖ͩ͞ΕͨϑΝΠϧΛgrepͯͯ͠ͷϑΝΠϧΛ୳ͯ͠෮ݩ͢Δ18http://qiita.com/yoshiori/items/6da867aa6871be694996% git fsck --lost-found
ޡͬͯgit stash clearͨ͠● git fsck͕ग़ྗ͢ΔϚʔδίϛοτͰsubjectʹWIPΛؚΉͷΛྻڍ͢Δ!● ͯͷsha1͕͔ͬͨΒgit stash applyͰ ద༻Ͱ͖Δ19% git fsck | grep commit | cut -d' ' -f3 |xargs git log --merges --no-walk --grep=WIP% git stash apply
GitHub & Review
hub● CLI͔ΒGitHubΛૢ࡞͢ΔͨΊͷπʔϧ!- ݱࡏͷϦϙδτϦΛϒϥβͰ։͘!- current branchΛϓϧϦΫΤετʹ͢Δ21http://qiita.com/yaotti/items/a4a7f3f9a38d7d3415e3% hub pull-request% hub browse
ۭͷPullRequestΛ࡞ͬͯ࡞ۀΛՄࢹԽ● GitHubϑΝΠϧมߋແ͠ͷPullRequestΛ࡞ΕΔ- ࡞ۀΛ࢝ΊͨΒͱΓ͋͑ͣ࡞ͬͯcommit͢Δʹpush͍ͯ͘͠- આ໌ʹλεΫΛྻڍ- पΓ͕ঢ়گΛѲ͍͢͠22http://qiita.com/a-suenami/items/129e09f8550f31e4c2da% git checkout -b projectx% git commit --allow-empty -m ProjectX% git push% hub pull-request # or WebUIͰPR࡞
ۭͷPullRequestΛ࡞ͬͯΩϦ൪ήοτ23https://twitter.com/naoya_ito/status/467245029434478592
git rebase -i --autosquash● ؾܰͳpush -fΛې͍ͯ͡ΔͱɺඍௐͷͨΊͷ ࠣࡉͳίϛοτ͕ͨ͘͞Μ࡞ΒΕͯϩά͕͔Γʹ͘͘ͳΔ- “squash! squashରίϛοτͷίϝϯτ” ͱίϛοτ͢Δͱinteractive rebase࣌ʹࣗಈతʹ͍͍ײ͡ʹͯ͘͠ΕΔ● શͯͷ࡞ۀ͕ྃͨ͠ஈ֊Ͱautosquashͯ͠ ʢपΓͱҙࢥૄ௨ΛऔΓͭͭʣpush -f24http://qiita.com/kyanro@github/items/818012c1b1827ed48277
autosquashΛָʹ͢Δ● ৗʹautosquash͢Δ‣ git rebase࣌ʹࣗಈͰ--autosquashΦϓγϣϯΛՃ͢ΔΑ͏ʹͳΔ‣ --autosquash--interactive࣌ͷΈӨڹ͢ΔͷͰͱΓ͋͑ͣtrueͰಛʹͳ͍ʢͣʣ● ίϛοτϝοηʔδͷࣗಈੜ‣ autosquash༻ͷϝοηʔδΛࣗಈੜͯ͘͠ΕΔ‣ --fixup ΦϓγϣϯͰfixupͰ͖Δ25http://qiita.com/kyanro@github/items/818012c1b1827ed48277% git config --global rebase.autosquash true% git commit --squash
ϒϥϯν໊ΛௐΔͷ͕໘͍͘͞● ϨϏϡʔΛґཔ͞ΕͨϒϥϯνΛϩʔΧϧʹcheckout͢Δͷʹ໊લΛௐΔͷ͕໘!● GitHub APIͰϓϧϦΫΤετΛऔಘͯ͠ߜΓࠐΉ26% prfetch|percol|cut -f3|xargs git checkouthttp://qiita.com/yuku_t/items/f53a9d3ea92614b0927d͜͜Λؤுͬͯίϐϖͯͨ͠….
alias.branch-root● τϐοΫϒϥϯνͷࠜຊͷsha1͕͔ΔͱҰ࿈ͷίϛοτʹߜΓࠐΜΉ͜ͱ͕Ͱ͖Δ!‣ τϐοΫϒϥϯνͷൣғͰgit log!‣ τϐοΫϒϥϯνͰinteractive rebase27[alias]branch-root = merge-base master HEAD% git log $(git branch-root)..HEAD% git rebase -i $(git branch-root)http://qiita.com/yuku_t/items/5cf770157380952e9476
ϨϏϡʔϩʔΧϧͰ● ϨϏϡʔ࣌৭ʑͳใΛࢀর͢ΔͨΊɺGitHubͷWeb UIͩͱ͗͢ΔʢGH:EͲ͏͔ͩΓ·ͤΜʣ✓ ݸਓతʹtigਪ͠28[alias]review = !tig --reverse -w $(git branch-root)..HEAD[tig “bind”]main = B @hub browse -- commit/%(commit)diff = B @hub browse -- commit/%(commit)tree = B @hub browse -- tree/%(commit)/%(directory)blob = B @hub browse -- tree/%(commit)/%(file)- ϨϏϡʔରΛtigͰಡΈࠐΉalias‣ --reverse Λ͚ͭΔͱGitHubͷUIͱฒͼํ͕ಉ͡ʹͳͬͯخ͍͠- ίϝϯτWebUIͰߦ͏͔͠ͳ͍ͷͰ֘ϖʔδҠಈ͢ΔΩʔόΠϯυඞਢ
ఏڙWE ARE HIRING!!http://increments.co.jp/jobs