Post on 10-May-2015
transcript
Git Some LerninHow To Git For Great Good
Why Version Control?
• Because I Say So.
Why Git?
• Because I Say So.
Vocabulary• Repository -- Holds the history of all changes
• Commit -- A point in time snapshot of your repo
• Reference -- Something that makes it so you don't have to remember a 40 hexadecimal digit sha1 hash
• Branch -- A pointer to the head of a group of commits
• Remote -- A thing you push to and pull from
• Pull Request -- How you get your code reviewed (unless you're on kernel)
• Github -- Magic
Porcelain
1. Fork a project
2. Clone your fork
3. Branch
4. Edit some files
5. Commit
6. Repeat 4 and 5 until feature/bug is complete
7. REBASE to create a history that I won't mind reading through
8. Pull any changes that have happened on non-forked master in the interim and rebase on top of those if you want a linear history otherwise do nothing for this step
9. Open pull request from your branch on your fork into the canonical repo's master branch
10. Profit
How To Branch
• git checkout -b improvement/unicorns
• git branch bug/voldemort && git checkout bug/voldemort
How To Commit
• Edit Some Stuff
• git add -p and git add (DO NOT GIT ADD * or .)
• Review what is in staging with git diff --cached and git status
• git commit
Commit Messages
• Start with bug number and short description <70 characters
• Longer description after one blank line
Index == Staging
• STAGE EVERYTHING
• Save time later by staging only some logical changes now
Demo
Refs• N^ goes up N parents (HEAD^, HEAD^100)
• ~ selects merge parents (HEAD~, HEAD~2)
• Mix and match (don't actually though)
• HEAD is hard coded and always points to the current head of whatever branch you have checked out
• Almost everything can be treated as a ref
Remotes
[remote "origin"] url = git@github.com:ranman/fancy-project.git fetch = +refs/heads/*:refs/remotes/origin/*
Everything is an object(content addressable storage)
• Blob (zlib compressed bytes representing a file)
• Tree (a tree where the leaf nodes are blobs)
• Commit (a pointer to: a tree, n parent commits)
• Tag (a pointer to a commit)
• (IGNORE THIS) something something packfiles
You're just moving some pointers around.
Dat Network
Fancy Random Things
Find Lost Stuff
• git reflog
• git fsck [--lost-found]
• git log -G
• git branch --contains SHA-1
Find Bugs
• git bisect
tig
git log branchA ^branchB
git log branchA..branchB git log branchB..branchA git log branchA...branchB
Undo
• git reset --soft HEAD^
• git reset --hard HEAD^
Config
• git config --global help.autocorrect 1
• git config --global rerere.enabled 1
• git config --global color.ui 1
• git diff --word-diff
gitshots