Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
git-inside
Search
Hiroyuki Morita
May 16, 2017
Programming
0
230
git-inside
.git の中身を見るという内々勉強会用の資料です
(画像などは入っていないので後日差し替え予定)
Hiroyuki Morita
May 16, 2017
Tweet
Share
More Decks by Hiroyuki Morita
See All by Hiroyuki Morita
Rubyistなら知っておきたい継承の話 / The inheritance for Rubyist
chiastolite
4
1.3k
esaを使って暗黙知を減らす取り組み
chiastolite
2
3.8k
vagrant-itamae
chiastolite
1
1.4k
sushi for common people
chiastolite
0
320
Social Coding with GitHub
chiastolite
0
110
Low Level Git
chiastolite
0
78
about Immutable Infrastructure
chiastolite
0
82
Other Decks in Programming
See All in Programming
GitHub Copilot Tips and Tricks
yuichielectric
26
7.4k
自作ソフト(VMagicMirror)がVRMA対応してる話+実装のTips
bakudreameater
0
110
Go1.22からの疑似乱数生成器について/go-122-pseudo-random-generator
convto
1
160
Compiling Python to WebAssembly with py2wasm
syrusakbary
0
130
もうすぐ新年度、Babylon.jsがお勧めな3個の理由
hideg
0
160
C# 大統一理論推進委員会 会員のための Unity Package Manager プロジェクト構成案
monry
PRO
0
580
[スクリプト] Swiftの型推論を学ぼう
omochi
0
110
両面どころかインフラもTSでできるよ ~ 全方位TypeScriptによるプロダクト開発 ~
myfinder
8
2.2k
Data Contracts In Practice With Debezium and Apache Flink (Kafka Summit London)
gunnarmorling
2
280
document.write再考
brn
5
2.5k
CSRF対策のやり方、そろそろアップデートしませんか / Update your knowledge of CSRF protection
hiro_y
25
14k
TCAの Shared Stateって どういう仕組みになってんの?
yimajo
0
330
Featured
See All Featured
Six Lessons from altMBA
skipperchong
19
2.9k
Optimising Largest Contentful Paint
csswizardry
7
2.3k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
12
1.4k
Building Applications with DynamoDB
mza
88
5.6k
Adopting Sorbet at Scale
ufuk
66
8.5k
Done Done
chrislema
178
15k
Become a Pro
speakerdeck
PRO
8
4.4k
The World Runs on Bad Software
bkeepers
PRO
60
6.6k
Code Review Best Practice
trishagee
54
15k
BBQ
matthewcrist
78
8.7k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
153
14k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
58
14k
Transcript
࣮ߦ͠ͳ͕ΒΈΔ .gitͷத
త • gitͷΦϒδΣΫτཧͷΈΛཧղ͢Δ • ίϛοτ͔ΒͭΒͳΔάϥϑߏ • branch/tagͳͲͷϦϑΝϨϯεߏ • ߏΛΘ্͔ͬͨͰίϚϯυΛݟΔ͜ͱͰཧղ͕ਂ·Δ •
Կ͕͓͖͍ͯΔ͔Θ͔Δ͔Βɺݩʹ͢ํ๏Θ͔Δ
git init ΛΈΔ
git initޙͷ.git $ git init $ ls -p .git/ HEAD
config description hooks/ info/ objects/ refs/ $ find .git/objects .git/objects .git/objects/info .git/objects/pack
git add & commitΛΈΔ $ echo 'Hello world!' > hello_world.txt
$ git add hello_world.txt $ git commit -m 'First Commit' [master (root-commit) 27baa2b] First Commit 1 file changed, 1 insertion(+) create mode 100644 hello_world.txt
.git/objectsͷத $ find .git/objects .git/objects .git/objects/27 .git/objects/27/baa2b9da21b4485966c2a97268876b189331e9 .git/objects/9b .git/objects/9b/e385e79f8f3e0870e48474809dab293843aece .git/objects/cd
.git/objects/cd/0875583aabe89ee197ea133980a9085d08e497 .git/objects/info .git/objects/pack 3ͭϑΝΠϧ͕૿Ճ
3ͭϑΝΠϧ͕૿͑ͨ • 1͓ͭͦΒ͘ςΩετϑΝΠϧ • Γͷ2ϑΝΠϧʹԿ͕?
Ͱݟ͍͖ͯ·͢
# ίϛοτޙͷϝοηʔδ [master (root-commit) 27baa2b] First Commit ~~~~~~~ 1 file
changed, 1 insertion(+) create mode 100644 hello_world.txt # .gitҎԼͷϑΝΠϧ .git/objects/27/baa2b9da21b4485966c2a97268876b189331e9 ~~~~~~~~ SHA-1͕Ұக͍ͯ͠Δ
27baa2b(ུ)ͷதΛݟͯΈΔ $ git cat-file -t 27baa2b9da21b4485966c2a97268876b189331e9 commit ͜ͷϑΝΠϧͷλΠϓcommit
27baa2b(ུ)ͷதΛݟͯΈΔ தʹ͜Μͳใ͕อଘ͞Ε͍ͯΔ $ git cat-file -p 27baa2b9da21b4485966c2a97268876b189331e9 tree 9be385e79f8f3e0870e48474809dab293843aece author
chiastolite <
[email protected]
> 1494611014 +0900 committer chiastolite <
[email protected]
> 1494611014 +0900 First Commit
27baa2b(ུ)ͷதΛݟͯΈΔ • author ͱ λΠϜελϯϓ • commiter ͱ λΠϜελϯϓ •
ίϛοτϝοηʔδ • tree?
# commitΦϒδΣΫτͷத tree 9be385e79f8f3e0870e48474809dab293843aece # .gitҎԼͷϑΝΠϧ .git/objects/9b/e385e79f8f3e0870e48474809dab293843aece ·ͨSHA-1͕Ұக͍ͯ͠Δ
9be385e(ུ)ͷதΛݟͯΈΔ $ git cat-file -t 9be385e79f8f3e0870e48474809dab293843aece tree ͜ͷϑΝΠϧͷλΠϓtree
9be385e(ུ)ͷதΛݟͯΈΔ $ git cat-file -p 9be385e79f8f3e0870e48474809dab293843aece 100644 blob cd0875583aabe89ee197ea133980a9085d08e497 hello_world.txt
9be385e(ུ)ͷதΛݟͯΈΔ • mode • ύʔϛογϣϯͱ͔ͦ͏͍͏ͷ • ϑΝΠϧ໊ • SHA-1 •
blob?
# treeΦϒδΣΫτͷத 100644 blob cd0875583aabe89ee197ea133980a9085d08e497 hello_world.txt # .gitҎԼͷϑΝΠϧ .git/objects/cd/0875583aabe89ee197ea133980a9085d08e497 ·ͨSHA-1͕Ұக͍ͯ͠Δ
cd08755(ུ)ͷதΛݟͯΈΔ $ git cat-file -t cd0875583aabe89ee197ea133980a9085d08e497 blob ͜ͷϑΝΠϧͷλΠϓblob
cd08755(ུ)ͷதΛݟͯΈΔ $ git cat-file -p cd0875583aabe89ee197ea133980a9085d08e497 Hello world! Α͏͘தʹḷΓ͍ͭͨ
͜͜·Ͱͷ·ͱΊ git • 3छྨͷλΠϓͷΦϒδΣΫτͰཧͯ͠Δ • commmit • tree •
blob • ֤ΦϒδΣΫτSHA-1Ͱཧ͞Ε͍ͯͯΦϒδΣΫτಉ࢜Λ ࢀর͍ͯ͠Δ
ਤʹ͢Δͱ͜Μͳײ͡
࣍ʹ # ϑΝΠϧΛαϒσΟϨΫτϦʹίϐʔ $ mkdir subdir $ cp hello_world.txt subdir/sample.txt
$ git add subdir/sample.txt # ݩϑΝΠϧΛॻ͖͑ $ echo 'Hello world!!' > hello_world.txt $ git add -u hello_world.txt $ git commit -m'update'
ࠓͷঢ়ଶ !"" hello_world.txt #=> Hello world!! #"" subdir #"" sample.txt
#=> Hello world!
commitͷத $ git cat-file -p HEAD tree 95aaf923a1c8171c9ec05225a3911a0dbeb53d6f parent 27baa2b9da21b4485966c2a97268876b189331e9
author chiastolite <
[email protected]
> 1494611946 +0900 committer chiastolite <
[email protected]
> 1494611946 +0900 update • parent͕Ճ͞Ε͍ͯΔ • 1ͭલͷcommitͷSHA-1
treeͷத git cat-file -p 95aaf923a1c8171c9ec05225a3911a0dbeb53d6f 100644 blob b297683f36d0557a8ef83506beda7b80e233723d hello_world.txt 040000
tree 601df7ed8aabbd875614ba3a301fe344e5c45ae2 subdir • த͕มΘͬͨhello_world.txtͷSHA-1͕มԽ • treeͷதʹtree͕
αϒπϦʔͷத git cat-file -p 601df7ed8aabbd875614ba3a301fe344e5c45ae2 100644 blob cd0875583aabe89ee197ea133980a9085d08e497 sample.txt •
sample.txt࠷ॳͷίϛοτͷhello_world.txtͱಉ͡SHA-1
͜͜·Ͱ • commitΛ͢Δͱݩcommitͷࢀর͕͓͖Δ • 1όΠτϑΝΠϧ͕มΘΕSHA1͕มΘΔ • SHA1͕Ͱ͖Δͱ͍͏͜ͱΦϒδΣΫτ͕1ͭੜ͞Ε͍ͯ Δ • gitͰࠩͰཧ͕͞Ε͍ͯͳ͍
• ϑΝΠϧ໊͕มΘͬͯத͕ҰॹͳΒSHA1มΘΒͳ͍
ਤʹ͢Δͱ͜Μͳײ͡
SHA-1ͷ͖·Γ͔ͨ • த(+ΦϒδΣΫτͷtype)͔Β Ұҙʹ ܾ·͍ͬͯΔ • ͩΕ͕ͲͷλΠϛϯάͰHello world!ͯ͠SHA-1 cd0875583aabe89ee197ea133980a9085d08e497 $
git hash-object -t blob <(echo 'Hello world!') cd0875583aabe89ee197ea133980a9085d08e497 ৄ͘͠ Gitsha1ͷܭࢉΛͲͷΑ͏ʹ͍ͬͯΔͷ͔ · DQNEO ىۀه ͕ৄ͍͠
refs
refs • master • branch • tag • HEAD(=@) •
ORIG_HEAD ͳͲͳͲ
.git/HEAD ݱࡏࢀর͍ͯ͠Δͱ͜Ζ $ cat .git/HEAD ref: refs/heads/master ࠓmasterϒϥϯνΛݟ͍ͯΔΆ͍
$ cat .git/refs/heads/master 2e7a843cd5706b128e13f06cf7572cda27afa0a7 $ git log commit 2e7a843cd5706b128e13f06cf7572cda27afa0a7 (HEAD
-> master) • Ұக • masterϒϥϯν͕ͲͷίϛοτΛࢦ͍ͯ͠Δ͔ܾΊ͍ͯΔ
ͨΊ͠ʹ $ mv .git/refs/heads/{master, hogehoge} $ cat 'ref: refs/heads/hogehoge' >
.git/HEAD ͱΔͱ git branch -m hogehoge͕Ͱ͖Δ
branch $ git branch test_branch $ cat .git/refs/heads/test_branch 2e7a843cd5706b128e13f06cf7572cda27afa0a7 •
ϒϥϯνΛ͚ͬͨͩͩͱSHA-1͔ΘΒͳ͍ • ͜ͷ࣌ͰmasterͱԿҧ͍͕ͳ͍ • ϒϥϯνͲͪΒ͔ͱ͍͏ͱϙΠϯλʔϥϕϧతײ֮ • ݴ͏΄ͲࢬΆ͘ͳ͍
branchΛࢀর͍ͯ͠Δঢ়ଶͰίϛοτΛͯ͠ΈΔ $ git checkout test_branch Switched to branch 'test_branch' $
git rm -r subdir rm 'subdir/sample.txt' $ git commit -m'Remove sub dir'
$ cat .git/refs/heads/test_branch 508b59bff7ae9af5b516d873eea32c9446540c09 $ git cat-file -p 686bcfe77bf1c43eb8d4e2aa75075e6d6e7e961e tree
19e6ae1b6538047780cd1d44a10fdb0685f15705 parent 2e7a843cd5706b128e13f06cf7572cda27afa0a7 author chiastolite <
[email protected]
> 1494613438 +0900 committer chiastolite <
[email protected]
> 1494613438 +0900 Remove sub dir ίϛοτ͢Δref͕มߋ͞ΕΔ
mergeͯ͠ΈΔ $ git checkout test_branch $ git merge test_branch --no-ff
Removing subdir/sample.txt Merge made by the 'recursive' strategy. subdir/sample.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 subdir/sample.txt
$ git cat-file -p master tree 19e6ae1b6538047780cd1d44a10fdb0685f15705 parent 2e7a843cd5706b128e13f06cf7572cda27afa0a7 parent
508b59bff7ae9af5b516d873eea32c9446540c09 author chiastolite <
[email protected]
> 1494613595 +0900 committer chiastolite <
[email protected]
> 1494613595 +0900 Merge branch 'test_branch' • parent͕2ͭ • masterͩͬͨͱ͜Ζ • test_branch
ਤ
rebaseͯ͠ΈΔ (͜ͷ··ͩͱ্ख͍͔͘ͳ͍ͷͰmasterΛmergeલʹͯ͠ί ϛοτΛՃ͓ͯ͘͠)
$ git rebase master First, rewinding head to replay your
work on top of it... Applying: Remove sub dir $ cat .git/refs/heads/test_branch 0957492b728dbf7854f46c30be6670fcf29b61a6 ৽͍͠SHA-1
rebaseલͷίϛοτ? $ git log 508b59bff7ae9af5b516d873eea32c9446540c09 commit 508b59bff7ae9af5b516d873eea32c9446540c09 Author: chiastolite <
[email protected]
>
Date: Sat May 13 03:23:58 2017 +0900 Remove sub dir ී௨ʹΞΫηεͰ͖Δ rebaseͯ͠ίϛοτ͕ফ͑ͨΓ͠ͳ͍
ਤ
͓͖͍֮͑ͯͨ͜ͱ • gitͰίϛοτ͕ফ͑Δ͜ͱͳ͍ • (ྫ֎తʹ)git gcίϚϯυͷΈ • ͳͷͰؾܰʹrebasemerge͔ͯͬͨ͠Βͦ͏
ϦϞʔτͷѻ͍ • gitͰϦϞʔτϦϙδτϦͷૢ࡞Λग़དྷΔͷҎԼͷίϚϯυͷ Έ (set-remote ઃఆ͢Δ͚ͩͳͷͰૢ࡞Ͱ͖ͳ͍) • fetch • push
• pull෦Ͱfetch + (merge or rebase) ΛݺΜͰ͍Δ
• fetch • ϦϞʔτϦϙδτϦͷঢ়ଶΛϩʔΧϧʹ࣋ͬͯ͘Δ • push • ϩʔΧϧͷ༰Λࢦఆͨ͠ϒϥϯνʹૹΔ
git remote ײ֮తʹϨΠϠʔߏͱࣅͯΔؾ͕ͯ͠Δ • ϩʔΧϧͱϦϞʔτͱ͍͏ϨΠϠʔ • fetch͢Δ͜ͱͰϩʔΧϧͷϦϙδτϦϨΠϠʔʹϦϞʔτͷ ༰Λө͢ΔΈ͍ͨͳ • ౷߹͡Όͳ͍ͷ͕ҧ͏ͱ͜Ζ
ਤʹ͢Δͱ͜Μͳײ͡?
origin/masterͱorigin masterͷҧ͍ • origin master • originʹઃఆͨ͠ϦϞʔτϦϙδτϦͷmasterϒϥϯν • ϦϞʔτͷ •
origin/master • originʹઃఆͨ͠ϦϞʔτϦϙδτϦͷmasterϒϥϯνͷref Λखݩʹίϐʔͨ͠ͷ • ϩʔΧϧͷ
• origin/master࠷ޙʹfetchͨ͠ͱ͖ͷ origin ͷ masterͷঢ়ଶ ͳͷͰϦϞʔτͷ࠷৽ͱݶΒͳ͍ • ϦϞʔτʹै͠Α͏ͱ rebase origin/master͢Δ߹
ࣄ લʹfetchͨ͠΄͏͕Α͍
Α͘͏Φϓγϣϯ • add • -u • -p • commit •
--ammend • -C • -v
Α͘͏Φϓγϣϯ • stash • --keep-index • push • --force-with-lease •
rebase • -i • --autosquash(git commit --fixupલఏ)
Conditional configuration(>= Git 2.13) $ cat ~/.gitconfig [includeIf "gitdir:~/work/"] path
= .gitconfig-work [includeIf "gitdir:~/play/"] path = .gitconfig-play $ cat ~/.gitconfig-work [user] name = Hiroyuki Morita email =
[email protected]
$ cat ~/.gitconfig-play [user] name = chiastolite email =
[email protected]
ࣄͱϓϥΠϕʔτɺࣄͱOSSͷઃఆΛ͚ΒΕΔ