Speaker Deck
Speaker Deck Pro
Sign in
Sign up
for free
すごいGit楽しく学ぼう
mixi_engineers
May 12, 2015
Programming
47
27k
すごいGit楽しく学ぼう
blog記事:
http://alpha.mixi.co.jp/entry/20150513
mixi_engineers
May 12, 2015
Tweet
Share
More Decks by mixi_engineers
See All by mixi_engineers
mixi_engineers
0
60
mixi_engineers
0
110
mixi_engineers
0
72
mixi_engineers
0
210
mixi_engineers
0
560
mixi_engineers
3
2.6k
mixi_engineers
1
230
mixi_engineers
10
2.6k
mixi_engineers
3
3k
Other Decks in Programming
See All in Programming
anchorcable
1
120
kenmaz
1
100
decoc
1
320
horie1024
1
330
mizdra
7
4.7k
fkubota
1
390
e10dokup
0
430
rshindo
2
290
malvinstn
1
610
line_developers_tw
0
340
akkeylab
0
320
masayaaoyama
4
520
Featured
See All Featured
nonsquared
81
3.3k
jasonvnalue
82
8k
robhawkes
52
2.8k
bermonpainter
342
26k
afnizarnur
176
14k
danielanewman
1
470
keithpitt
401
20k
kneath
294
39k
searls
204
35k
phodgson
87
3.9k
tanoku
258
24k
holman
288
130k
Transcript
Learn You a Git for Great Good!
ͦͦɺGitͬͯ ԿͷͨΊʹ͋ΔΜͩΖ͏ʁ
GitɺνʔϜͰͭͷ։ൃʹ औΓΉ͜ͱΛՄೳʹ͠·͢ʂ
Git͕ແ͍ͱʜʜ Կ͕มΘ͔͔ͬͨΜͳ͍ʂ ٸʹಈ͔ͳ͘ͳͬͨΜ͚ͩͲʜʜ ࠓ͔Βࢲ͕։ൃ͢ΔͷͰɺΈΜͳ։ൃΛࢭΊͯʂ ͜ͷίʔυ୭͕ॻ͍ͨΜͩΖ͏ʁ
ਖ਼ਏ͍ʂ
Git͕͋Εʂ ;Ή;Ήɺ͜͏͍ͬͨมߋ͕ՃΘͬͨͷ͔ʂ ಈ͔ͳ͘ͳ͚ͬͨͲɺ͙͢ʹલʹͤͨʂ ඦਓͰҰॹʹ։ൃͰ͖ΔΑʂ ͜ͷΫιίʔυΛॻ͍ͨͷɺ˓˓͞Μ͔ʜʜ
ΈΜͳͰ։ൃͰָ͖͍ͯ͠ʂ ✌ Т✌ ࡾ✌ Т ✌ࡾ ✌`Т ✌
w ͱΓ͋͑ͣͬͯΈΑ͏ʂ w ίϛοτͱϒϥϯνʹ͍ͭͯਖ਼͘͠ཧղ͠Α͏ w ྺ࢙ΛऔΓࠐΉ w མึर͍ ࠓͷ༧ఆ
w ͱΓ͋͑ͣͬͯΈΑ͏ʂ w ίϛοτͱϒϥϯνʹ͍ͭͯਖ਼͘͠ཧղ͠Α͏ w ྺ࢙ΛऔΓࠐΉ w མึर͍ ࠓͷ༧ఆ
ͬͯΈΑ͏ʂͷͦͷલʹ $ git config --global user.name "Amy Mikushi" $ git
config --global user.email "amy@mixi.co.jp" Gitʹࣗݾհ ͜͜Ͱొͨ͠ใ͕(JUͷૢ࡞ʹ͍ͭͯճΔʂ
͡ΊͯΈΑ͏ $ mkdir books $ cd books $ git init
GitϦϙδτϦΛ࡞͠Α͏ ϦϙδτϦɺόʔδϣϯཧ͢ΔͨΊͷ ஷଂݿͷ͜ͱͰ͢
$ find . Α͘Ͱ͖·ͨ͠ʂ ͜ΕͰbooks
ঢ়ଶͷ֬ೝ $ git status git
ϑΝΠϧͷՃ Untracked
ՃΛ֬ೝ Changes
͡Ίͯͷίϛοτ εςʔδϯάΤϦΞʹஔ͍ͨϑΝΠϧΛεφοϓγϣο τͱͯ͠ɺGit
εςʔδϯάΤϦΞͱϦϙδτϦ Sherlock.txt Crusoe.txt ࡞ۀσΟϨΫτϦ εςʔδϯάΤϦΞ (JUϦϙδτϦ git add ίϛοτ͢Δ४උ͕Ͱ͖ͨΒgit
εςʔδϯάΤϦΞͱϦϙδτϦ Sherlock.txt Crusoe.txt ࡞ۀσΟϨΫτϦ εςʔδϯάΤϦΞ (JUϦϙδτϦ git add ίϛοτ͢Δ४උ͕Ͱ͖ͨΒgit
Sherlock.txt Crusoe.txt ࡞ۀσΟϨΫτϦ εςʔδϯάΤϦΞ (JUϦϙδτϦ git commit add
Sherlock.txt Crusoe.txt ࡞ۀσΟϨΫτϦ εςʔδϯάΤϦΞ (JUϦϙδτϦ git commit add
ྺ࢙ΛΈΑ͏ มߋΛอଘͰ͖ΔΑ͏ʹͳΓ·ͨ͠ʂ มߋΛίϛοτͱͯ͠ͲΜͲΜੵΈॏͶ͍ͯ͘͜ͱ͕େࣄͰ͢ ͲΜͳมߋ͖͚ͯͨͬ͠ʜʁͱͳͬͨΒྺ࢙ΛৼΓฦΓ·͠ΐ͏ʂ $ git log աڈͷมߋ ίϛοτ ͕ҰཡͰ͖·͢
ผͷϑΝΠϧΛՃ͢ΔίϛοτΛߦ͍ɺ࠶
ϦϞʔτϦϙδτϦΛͬͯΈΔ ಉ͡ঢ়ଶ͕ϦϞʔτʹอଘͰ͖·͢ ͍ͭͰͤΔ͠ɺଞͷਓҾͬுͬͯ͜Ε·͢ ·ͣɺGitHubͰϕΞϦϙδτϦΛ࡞͠Α͏ʂ https://github.com/new ϕΞϦϙδτϦ࡞ۀ༻σΟϨΫτϦΛ࣋ͨͳ͍ .gitͷΈͷϦϙδτϦͰ͢
ϦϞʔτϦϙδτϦΛొ͢Δ ϕΞϦϙδτϦΛ࡞ͨ͠ΒϦϞʔτϦϙδτϦͱͯ͠ ొ͠Α͏ $ git remote add origin \ git@github.com:<your
account>/books.git ొͨ͠ϦϞʔτϦϙδτϦɺ$
खݩͷมߋΛ্͛ͯΈΑ͏ $ git push -u origin master ϦϞʔτϒϥϯνΛࣗಈͰ͢ΔΑ͏ʹઃఆ͢Δ ͔࣍Βpull
ڞಉ։ൃ͜ͱ͡Ί $ cd .. $ git clone git@github.com:<your account>/books.git alt_books
GitΛ͏͜ͱͰෳਓͰ͔ΜͨΜʹ։ൃͰ͖·͢ʂ ࠓ͔Βผਓ ͷؾ࣋ͪ ʹͳͬͯମݧͯ͠Έ·͠ΐ͏ ·ͣϦϞʔτϦϙδτϦΛखݩʹऔΓࠐΈ·͢ 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 diff diff
มߋΛ֬ೝʂ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_up clean_up
ϑΝΠϧͷআ $ git rm '*.txt' $ git commit -m "Remove
all files" clean_up
ϒϥϯνͰߦͬͨ࡞ۀΛऔΓࠐ͏ $ git checkout master clean_up
ϒϥϯνͰߦͬͨ࡞ۀΛऔΓࠐ͏ $ git merge clean_up clean_up
ϒϥϯνͷআ $ git branch -d clean_up ඞཁͷͳ͘ͳͬͨclean_upϒϥϯνΛআ͠Α͏ git
࠷ޙͷpush $ git push ࠷ޙʹࠓ·ͰߦͬͨมߋΛGitHubʹөͤ͞Α͏ʂ Git͕͑ΔΑ͏ʹͳͬͨʂ
w ͱΓ͋͑ͣͬͯΈΑ͏ʂ w ίϛοτͱϒϥϯνʹ͍ͭͯਖ਼͘͠ཧղ͠Α͏ w ྺ࢙ΛऔΓࠐΉ w མึर͍ ࠓͷ༧ఆ
ίϛοτͱϒϥϯνͬͯ Ͳ͏͍͏ΈͳΜͩΖ͏ʁ
ίϛοτͱϒϥϯνΛཧղ͢Δ͜ͱͰ GitΛγϯϓϧʹཧղͰ͖·͢
ίϛοτͱʁ ίϛοτ༷ʑͳใΛ͍࣋ͬͯ·͢ w ϦϏδϣϯ w Tree
ίϛοτͱʁ ίϛοτ༷ʑͳใΛ͍࣋ͬͯ·͢ w ϦϏδϣϯ w Tree
ίϛοτʹ͕͍Δ ͭલͷίϛοτͷϦϏδϣϯΛ࣋ͭͷͰίϛοτʹ ͕͍Δʂ ৽͍͠ίϛοτ͔Βݹ͍ίϛοτ؆୯ʹ୧ΕΔ
࠷ݹͷίϛοτ·Ͱ୧ΕΔ ίϛοτΛ୧͍ͬͯ͘ͱඞͣҰ൪࠷ݹͷίϛοτ·Ͱ ୧Γண͚Δʂ ࠷ݹ ͋ΔͭͷίϛοτΛݟΕɺͦͷྺ࢙͕͔Δ
ίϛοτ͔͚ͬͨͲ ϒϥϯνʁ
୯ͳΔಛఆͷίϛοτΛࢦͨ͠ ϙΠϯλͷΑ͏ͳͷͰ͢ʂ
ϒϥϯν σϑΥϧτͷϒϥϯν໊master ϒϥϯνͷઌ಄Λࢦ͢ϦϑΝϨϯεɺ ςΩετͰϦϏδϣϯ SHA-1 ͕อଘ͞Ε͍ͯ·͢
ϒϥϯν ৽ͨͳnewͱ͍͏໊લͷϒϥϯνΛ࡞ͯ͠ΈΔ $ git branch new
ϒϥϯν $ git branch new
৽͍͠ͷ͕ग़དྷͨʂ ৽ͨͳnewͱ͍͏໊લͷϒϥϯνΛ࡞ͯ͠ΈΔ
ϒϥϯνͷجຊ͜Ε͚ͩʂ ୯ͳΔϙΠϯλͳͷͰɺϒϥϯν໊͕ ͑ΔॴϦϏδϣϯ͕͑Δ͠ ͦͷٯવΓ
ϒϥϯνͷࢬ͔Ε ͜ͷঢ়ଶ͔ΒOFXʹίϛοτ͍ͯ͘͠ͱʜʜ
ϒϥϯνͷࢬ͔Ε Μʁ
ϒϥϯνͷࢬ͔Ε ࢬ͔Εͨ͠ʂ
ϒϥϯνͷࢬ͔Ε newϒϥϯν͚ͩมߋ͞Ε masterϒϥϯνʹӨڹ͕ͳ͍ʂ
ࢲͲ͜ʹ͍ΔΜͰ͠ΐ͏͔ʜʜ git
HEADϦϑΝϨϯε $
git checkout master
HEADϦϑΝϨϯε $
git checkout master
HEADϦϑΝϨϯε HEADͷҐஔ͕ΓସΘͬͨʂ HEAD͕͍͍ͯΔϒϥϯνಛघͳಈ͖Λ͢Δ ͔Γ͍͢Α͏ʹ·ͣଞʹϒϥϯνΛͬͯΈΔ
$ git branch other
HEADϦϑΝϨϯε ͜͜Ͱίϛοτͯ͠ΈΔͱʜʜ
master
HEADͰࢀর͞Ε͍ͯΔϒϥϯν ίϛοτ͢ΔͨͼʹҠಈ͢Δ
ίϛοτͱϒϥϯνʹ͍ͭͯ ͔ͬͨʂ
w ͱΓ͋͑ͣͬͯΈΑ͏ʂ w ίϛοτͱϒϥϯνʹ͍ͭͯਖ਼͘͠ཧղ͠Α͏ w ྺ࢙ΛऔΓࠐΉ w མึर͍ ࠓͷ༧ఆ
ྺ࢙ΛऔΓࠐΉϚʔδͬͯ Ͳ͏͍͏࣌ʹ͏ΜͩΖ͏ʁ
ΘΓͱͲ͜Ͱ͏ʂ
ɾνʔϜͰ։ൃ͍ͯ͠Δ࣌ʹ ଞͷਓͷมߋΛऔΓࠐΉͱ͖ ɾਓͰ։ൃ͍ͯ͠Δ࣌ʹෳͷ ϒϥϯνΛͭʹ·ͱΊΔͱ͖
ΘΓͱΑ͋͘Δύλʔϯ Αʔ͠ɺमਖ਼ऴΘͬͨ͠αʔόʹ push
push
ͳͥpushͰ͖ͳ͍ʁ remote
repo my repo ͢Ͱʹ৽͍͠ ίϛοτ͕ʂ
͜ͷঢ়ଶͰpushͰ͖·ͤΜ Ͳͷίϛοτ͕masterϒϥϯνͷ࠷৽͔͔Βͳ͘ͳ Δ͔ΒͰ͢ ҎԼͷΑ͏ͳঢ়ଶΛ࡞Δ͜ͱग़དྷ·ͤΜ
Ͳ͏ͨ͠Β͍͍ͷʁ Ұखݩʹremote
มߋΛऔΓࠐΉ remote
repo my repo $ git pull origin master
remote repo my repo
มߋ͕औΓࠐ·Εͨʂ
remote repo my repo
$ git push origin master
remote repo my repo
pushͰ͖ͨʂ
ΈΜͳͰ։ൃ ͭͷϒϥϯνΛผʑʹมߋͨ࣌͠ɺ ଞਓͷมߋΛϚʔδͯ͠push
͍Ζ͍Ζͳྺ࢙ͷऔΓࠐΈํ ΘΓͱ͍Ζ͍ΖͳॴͰ͏ϚʔδͰ͕͢ɺ ࣮͍Ζ͍Ζͳྺ࢙ͷऔΓࠐΈํ͕͋Γ·͢ʂ • merge
͍Ζ͍Ζͳྺ࢙ͷऔΓࠐΈํ ΘΓͱ͍Ζ͍ΖͳॴͰ͏ϚʔδͰ͕͢ɺ ࣮͍Ζ͍Ζͳྺ࢙ͷऔΓࠐΈํ͕͋Γ·͢ʂ • merge
merge
$
git merge topic --ff merge
தͷਓ
ʮtopicϒϥϯνͬͯmasterͷࠩશ෦ ɹؚΜͰΔ͠ɺҰॹʹͪ͠Ό͑Α͘Ͷʁʯ merge
தͷਓ ʮϚʔδͨ͠Αʔʯ
merge
merge
͍Ζ͍Ζͳྺ࢙ͷऔΓࠐΈํ ΘΓͱ͍Ζ͍ΖͳॴͰ͏ϚʔδͰ͕͢ɺ ࣮͍Ζ͍Ζͳྺ࢙ͷऔΓࠐΈํ͕͋Γ·͢ʂ • merge
merge
merge
merge
merge
merge
merge
͍Ζ͍Ζͳྺ࢙ͷऔΓࠐΈํ ΘΓͱ͍Ζ͍ΖͳॴͰ͏ϚʔδͰ͕͢ɺ ࣮͍Ζ͍Ζͳྺ࢙ͷऔΓࠐΈํ͕͋Γ·͢ʂ • merge
merge
$ git merge topic --squash merge
தͷਓ ʮtopicͷมߋ༰Λѹॖ͠Α͏ʂʯ தͷਓʮͭͷύονʹѹॖͰ͖ͨʂʯ merge
merge
merge
merge
merge
Ϛʔδ͢Δ༰Λѹॖ͠ɺࠩΛݱࡏͷίϛοτʹ ͚ͬΔʂ ࠩεςʔδϯάΤϦΞʹͤΒΕΔ͚ͩͳͷͰɺ ίϛοτࣗͰΔඞཁ͕͋Δ merge
͍Ζ͍Ζͳྺ࢙ͷऔΓࠐΈํ ΘΓͱ͍Ζ͍ΖͳॴͰ͏ϚʔδͰ͕͢ɺ ࣮͍Ζ͍Ζͳྺ࢙ͷऔΓࠐΈํ͕͋Γ·͢ʂ • merge
ϦϕʔεͬͯԿʁ ϚʔδͱԿ͕ҧ͏ͷʁ
rebase '
͜Ε͕Ϧϕʔεʂ
࣮ࡍϦϕʔε͕Ͳ͏͍͏͜ͱΛ ͢Δͷ͔ͭͣͭݟ͍ͯ͜͏
rebase topicϒϥϯνΛrebase͍ͨ͠
rebase
$ git rebase master
' rebase ·ͣίϛοτͷมߋ༰ΛͦΕͧΕύονʹ͢Δ
rebase topicϒϥϯνΛmasterͱ ಉ͡ҐஔʹҠಈͤ͞Δ
rebase ࡞͓͍ͯͨ͠ύονΛͭͣͭ ॱʹద༻ͯ͠ίϛοτ͍ͯ͘͠
rebase ࠩΛద༻ͯ͠ίϛοτ
rebase '
rebase '
rebase '
ରͷϒϥϯνͷ্ʹݱࡏͷϒϥϯνΛ࡞Γ͠·͢ rebaseʹΑͬͯ࡞ΒΕͨίϛοτಉ͡༰͚ͩͲผͷ ίϛοτʹͳΔͷͰҙͰ͢ʂ git
ผͷίϛοτʹͳΔ w ϦϏδϣϯ w Tree
͍͚ͬͯͳ͍rebase ίϛοτͷใ͕มΘͬͯ͠·͏ͷͰɺ طʹpush͞Ε͍ͯΔϒϥϯνΛrebase͍͚ͯ͠·ͤΜ ଞਓ͕push
w ͱΓ͋͑ͣͬͯΈΑ͏ʂ w ίϛοτͱϒϥϯνʹ͍ͭͯਖ਼͘͠ཧղ͠Α͏ w ྺ࢙ΛऔΓࠐΉ w མึर͍ ࠓͷ༧ఆ
Gitͷ৭ʑͳٕΛֶ΅͏ʂ
͜Ε͚֮ͩ͑Α͏ $ git
gitίϚϯυͰɺGitͷΑ͘͏ίϚϯυΛҰཡ͢Δ ͜ͱ͕ग़དྷ·͢ ίϚϯυͷৄࡉͳઆ໌Λݟ͍ͨ࣌ɺmanΛར༻͠· ͠ΐ͏ ྫ͑ɺmergeίϚϯυʹ͍ͭͯৄ͘͠Γ͍ͨͱ͖ ϋΠϑϯͰܨ͛ͯೖྗ͠·͢ $ man git-merge ͜Ε͚֮ͩ͑Α͏
git
git
Ϛʔδ͢Δ࣌ʹ(JU͚ͩͰղܾͰ͖ͳ͍͜ͱ͕͋Γ·͢ ͦΕ͕ίϯϑϦΫτͰ͢ ίϯϑϦΫτͨ͠߹ਓ͕ؒղܾ͢Δඞཁ͕͋Γ·͢ ίϯϑϦΫτ͏͍ͩ ೣղܾ͠ͳ͍
ίϯϑϦΫτͨ͠ϑΝΠϧɺboth
ίϯϑϦΫτΛमਖ਼ͯ͠ɺίϛοτ͠·͢ ίϯϑϦΫτ͏͍ͩ b <<<<<<< HEAD ccc ======= c >>>>>>> topic
d b ccc d ίϯϑϦΫτղܾ࣌ʹɺίϯϑϦΫτղܾҎ্ͷ͜ͱΛͯ͠ ͍͚·ͤΜ ͲͷʹݱΕͳ͍มߋΛ͍ͯ͠ΔϚʔδΛevil
git
Φϓγϣϯͳ͠ͷgit
git
ͦΕʹgit
Ͳ͏͠Α͏ͳ͘ͳͬͨ ؒҧͬͯϒϥϯνΛফͯ͠͠·ͬͨ దʹreset
git
ㅤ ㅤ ㅤ
גࣜձࣾϛΫγΟͰ ΄ͱΜͲͷ෦ॺ͕͍ͬͯ·͢
GitHubͷPull
ྡͷਓͷGitHubͷϓϩδΣΫτΛϑΥʔΫ͠·͢ ϑΥʔΫͨ͠ϦϙδτϦΛखݩʹΫϩʔϯ͠·͢ ࡞ۀ༻ϒϥϯνΛ࡞͠·͢ มߋΛՃ͑ͯίϛοτͯ͠ϓογϡ͠·͢ GitHub͔ΒPull
w (JU#PPL w ͜Θ͘ͳ͍(JU w (JUͷΈ ͖ͤ͜ͷٕज़ه w ݟ͑ͳ͍νΧϥʲ༁ʳ(JUΛϘτϜΞοϓ͔Βཧղ͢Δ
w $PEF4DIPPM5SZ(JU ࢀߟจݙ ΈΜͳಡΜͰΈΑ͏ʂ