Understanding git
Transcript of Understanding git
Understanding git
Avik DasVida Engineering
A quick refresher on graphsBackground:
A
B
D C
A
B
D C
Nodes + Edges = Graph
A
B
D C
Nodes + Edges = Graph
A
B
D C
Nodes + Edges = Graph
A
B
D C
Nodes + Edges = Graph
A
B
D C
A
B
D C
A
B
D C
Directed Edges → Directed Graph
A
B
D C
Directed Edges → Directed Graph
A
B
D C
A
B
D C
cycle
A
B
D C
A
B
D C
A
B
D C
No cycles → Directed Acyclic Graph
A
B
D C
No cycles → Directed Acyclic Graph
A
B
D C
DAG
ABD C
ABD C
DAG → Linearizable
Git objects
BLOB
BLOB
def factorial(x):if x == 0:return 1else:return x * factorial(x - 1)print factorial(6)
BLOB
def factorial(x):if x == 0:return 1else:return x * factorial(x - 1)print factorial(6)
066681188100ef24b1ce91a3a3596baffb620051
BLOB
def factorial(x):if x == 0:return 1else:return x * factorial(x - 1)print factorial(6)
BLOB
def factorial(x): if x == 0: return 1 else: return x * factorial(x - 1)print factorial(6)
066681188100ef24b1ce91a3a3596baffb620051 59d8c4d1b5e8561375aa819adc513529b7ea19b8
TREE
TREE
blob 5b1d3 READMEtree 03e78 libtree cdc8b testblob cba0a test.pyblob 911e7 xdiff
TREE
blob 5b1d3 READMEtree 03e78 libtree cdc8b testblob cba0a test.pyblob 911e7 xdiff
BLOB
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi efficitur ex ex, ac lobortis velit scelerisque
BLOB
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi efficitur ex ex, ac lobortis velit scelerisque
BLOB
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi efficitur ex ex, ac lobortis velit scelerisque
TREE
blob 5b1d3 READMEtree 03e78 libtree cdc8b testblob cba0a test.pyblob 911e7 xdiff
TREE
blob 5b1d3 READMEtree 03e78 libtree cdc8b testblob cba0a test.pyblob 911e7 xdiff
TREE
blob 5b1d3 READMEtree 03e78 libtree cdc8b testblob cba0a test.pyblob 911e7 xdiff
BLOB
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi efficitur ex ex, ac lobortis velit scelerisque
BLOB
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi efficitur ex ex, ac lobortis velit scelerisque
BLOB
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi efficitur ex ex, ac lobortis velit scelerisque
TREE
blob 5b1d3 READMEtree 03e78 libtree cdc8b testblob cba0a test.pyblob 911e7 xdiff
TREE
blob 5b1d3 READMEtree 03e78 libtree cdc8b testblob cba0a test.pyblob 911e7 xdiff
ac72efa71e90424bdb41dc795609d572ddd88643
COMMIT
COMMIT
tree ac72e parent 84ce1 author Avik Dascommitter Avik Das
Commit message
COMMIT
tree ac72e parent 84ce1 author Avik Dascommitter Avik Das
Commit message
COMMIT
tree ac72e parent 84ce1 author Avik Dascommitter Avik Das
Commit message
COMMIT
tree ac72e parent 84ce1 author Avik Dascommitter Avik Das
Commit message
COMMIT
tree ac72e parent 84ce1 author Avik Dascommitter Avik Das
Commit message
TREE
blob 5b1d3 READMEtree 03e78 libtree cdc8b testblob cba0a test.pyblob 911e7 xdiff
COMMIT
tree ac72e parent 84ce1 author Avik Dascommitter Avik Das
Commit message
COMMIT
tree ac72e parent 84ce1 author Avik Dascommitter Avik Das
Commit message
TREE
blob 5b1d3 READMEtree 03e78 libtree cdc8b testblob cba0a test.pyblob 911e7 xdiff
3f34c01a210400daf86c479b243fe50078c279c1
Working directory → staging → repository
C3C1 C2
HEAD
master
STAGING/INDEXWORKING DIRECTORY COMMANDS
origin/master
C3C1 C2
HEAD
master
STAGING/INDEXWORKING DIRECTORY
README (V1)
COMMANDS
vim README
origin/master
C3C1 C2
HEAD
master
STAGING/INDEXWORKING DIRECTORY
README (V1)
COMMANDS
vim READMEgit add README
origin/master
C3C1 C2
HEAD
master
STAGING/INDEXWORKING DIRECTORY
README (V1)
COMMANDS
vim READMEgit add READMEvim README
README (V2)
origin/master
C3C1 C2
HEAD
master
STAGING/INDEXWORKING DIRECTORY
README (V2)
COMMANDS
vim READMEgit add READMEvim READMEgit add README
origin/master
C3C1 C2
HEAD
master
STAGING/INDEXWORKING DIRECTORY
README (V2)
COMMANDS
vim READMEgit add READMEvim READMEgit add READMEvim READMEREADME (V3)
origin/master
C3C1 C2
HEAD
master
STAGING/INDEXWORKING DIRECTORY
README (V2)
COMMANDS
git diff # between V2 and V3
README (V3)
origin/master
C3C1 C2
HEAD
master
STAGING/INDEXWORKING DIRECTORY
README (V2)
COMMANDS
git diff # between V2 and V3git diff --staged # between V2 # and empty
README (V3)
origin/master
C3C1 C2
HEAD
STAGING/INDEXWORKING DIRECTORY COMMANDS
git commit
README (V3)
C4
masterorigin/master
C3C1 C2
HEAD
STAGING/INDEXWORKING DIRECTORY COMMANDS
git commitgit push# or git push origin master
README (V3)
C4
masterorigin/master
Branching
A B
git clone <url>
origin/master
master
HEAD
A B
git clone <url>git pull
origin/master
master
HEAD
C
A B
git clone <url>git pullgit checkout -b mine
origin/master
master
HEAD
C
mine
A B
git clone <url>git pullgit checkout -b minegit commit
origin/master
master
HEAD
C
mine
X
A B
git clone <url>git pullgit checkout -b minegit commitgit commit
origin/master
master
HEAD
C
mine
X Y
A B
git clone <url>git pullgit checkout -b minegit commitgit commitgit checkout master
origin/master
master
C
mine
X Y
HEAD
A B
git clone <url>git pullgit checkout -b minegit commitgit commitgit checkout mastergit pull
origin/mastermaster
C
mine
X Y
HEAD
D E
A B
git clone <url>git pullgit checkout -b minegit commitgit commitgit checkout mastergit pull
git checkout mine
origin/mastermaster
C
mine
X Y
D E
HEAD
A B
git clone <url>git pullgit checkout -b minegit commitgit commitgit checkout mastergit pull
git checkout minegit merge master
origin/mastermaster
C
X Y
D E
M
mine HEAD
A B
git clone <url>git pullgit checkout -b minegit commitgit commitgit checkout mastergit pull
git checkout minegit merge mastergit commit
origin/mastermaster
C
X Y
D E
M Z
mine HEAD
A B
git clone <url>git pullgit checkout -b minegit commitgit commitgit checkout mastergit pull
git checkout mine
origin/mastermaster
C
mine
X Y
D E
HEAD
A B
git clone <url>git pullgit checkout -b minegit commitgit commitgit checkout mastergit pull
git checkout minegit rebase master
origin/mastermaster
C
X Y
D E
X’
mine
Y’
HEAD
A B
git clone <url>git pullgit checkout -b minegit commitgit commitgit checkout mastergit pull
git checkout minegit rebase mastergit commit
origin/mastermaster
C
X Y
D E
X’ Y’
mine
Z
HEAD
A B
git clone <url>git pullgit checkout -b minegit commitgit commitgit checkout mastergit pull
git checkout minegit rebase mastergit commit
origin/mastermaster
C
X Y
D E
X’ Y’
mine
Z
HEADOnly reachable by SHA1
Rewriting history
A B
master
C1 C2 C3 C4 C5
mine
A B
master
C1 C2 C3 C4 C5
mine
Main changes, split up over two WIP commits
A B
master
C1 C2 C3 C4 C5
mine
Main changes, split up over two WIP commits
Needs some minor touch ups
A B
master
C1 C2 C3 C4 C5
mine
Main changes, split up over two WIP commits
Needs some minor touch ups
Not actually
needed anymore
A B
master
C1 C2 C3 C4 C5
mine
Main changes, split up over two WIP commits
Needs some minor touch ups
Commit message needs work
Not actually
needed anymore
A B
master
C1 C2
git rebase -i master
C3 C4 C5
mine
Main changes, split up over two WIP commits
Needs some minor touch ups
Commit message needs work
Not actually
needed anymore
pick 8af53d3 main feature WIPpick 76d8150 Refactorpick dd69f0c main feature WIP 2pick 974b13e On second thought, not neededpick 508fe0d Build on top of refactor
pick 8af53d3 main feature WIPpick 76d8150 Refactorpick dd69f0c main feature WIP 2pick 974b13e On second thought, not neededpick 508fe0d Build on top of refactor
pick 8af53d3 main feature WIPpick 76d8150 Refactorpick dd69f0c main feature WIP 2pick 508fe0d Build on top of refactor
pick 8af53d3 main feature WIPpick 76d8150 Refactorpick dd69f0c main feature WIP 2pick 508fe0d Build on top of refactor
pick 8af53d3 main feature WIPpick dd69f0c main feature WIP 2pick 76d8150 Refactorpick 508fe0d Build on top of refactor
pick 8af53d3 main feature WIPsquash dd69f0c main feature WIP 2pick 76d8150 Refactorpick 508fe0d Build on top of refactor
pick 8af53d3 main feature WIPsquash dd69f0c main feature WIP 2edit 76d8150 Refactorpick 508fe0d Build on top of refactor
pick 8af53d3 main feature WIPsquash dd69f0c main feature WIP 2edit 76d8150 Refactorreword 508fe0d Build on top of refactor
# This is a combination of 2 commits# The first commit's message is:
main feature WIP
# This is the 2nd commit's message:
main feature WIP
# Please enter the commit message for your changes.
SQUASH
Implement main feature
Usual explanation
# Please enter the commit message for your changes.
SQUASH
Stopped at 56b3bb2562e9ee1a0a984b45e7f2220f1148d189... To be editedYou can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
EDIT
Build on top of refactor
# Please enter the commit message for your changes.
REWORD
Build on top of refactor
Add some clarifying explanation.
# Please enter the commit message for your changes.
REWORD
A B
master
C1 C2 C3 C4 C5
mine
A B
master
C1 C2 C3 C4 C5
X C2’ C5’
mine
A B
master
C1 C2 C3 C4 C5
X C2’ C5’
mine
Combination of commits C1 + C3
A B
master
C1 C2 C3 C4 C5
X C2’ C5’
mine
Combination of commits C1 + C3Edited from
C2
A B
master
C1 C2 C3 C4 C5
X C2’ C5’
mine
Combination of commits C1 + C3Edited from
C2
Reworded from C5
A B
master
C1 C2
git push --force
C3 C4 C5
X C2’ C5’
mine
Combination of commits C1 + C3Edited from
C2
Reworded from C5
git-rev-parse
git rev-parse HEAD
git rev-parse HEADgit rev-parse HEAD^
git rev-parse HEADgit rev-parse HEAD^git rev-parse HEAD^^
git rev-parse HEADgit rev-parse HEAD^git rev-parse HEAD^^git rev-parse HEAD^^^
git rev-parse HEAD^^^
git rev-parse HEAD~3
git rev-parse master
git rev-parse mastergit rev-parse master^
git rev-parse 757e4cf
Other useful commands
git showgit show <ref>
git resetgit reset --hardgit reset --soft
git add -p
git log <ref>
git reflog
git config
git <verb> --helpgit help <verb>man git-<verb>
Questions?