More Related Content

Advanced Git Tutorial

  1. Advanced Git Tutorial by Sarah Sharp
  2. WARNING: I am a unique snowflake
  3. WARNING: This tutorial may make you lazy
  4. WARNING: Some Git features are dangerous!
  5. What is Git? ● Distributed ● Fast ● Flexible
  6. Git Basics ● See Everyday Git Tutorial: – s/everyday.html ● My git commands: – git add - git commit – git diff - git log - git show – git push - git pull – git fetch - git rebase
  7. Naming commits <Commitish> ● (Indirect) hash of repo files, current commit message, and ancestor commits. ● HEAD refers to the last commit ● ~ at the end means commit before that – e.g. HEAD~ – ^ is roughly equivalent to ~ ● A branch points to a specific commit ● see git rev-parse
  8. Git Philosophy
  9. Git Philosophy ● Commit early, commit often ● One commit represents one idea or one change. – Makes it easy to read patches – Easy to revert unwanted changes later ● Your working directory, index, and local repo are your scratch pads.
  10. Frequent Use Infrequent Use
  11. The Index, the staging area Front stage: Back stage: Changes to be committed Uncommited changes and unadded files
  12. Staging Changes ● git add <file> – adds a file to the Index ● git commit – commits added changes to the local repo ● But what about files not added to the Index?
  13. Staging Changes ● git add <file> – adds a file to the Index ● git commit – commits added changes to the local repo ● But what about files not added to the Index? – Answer: they aren't included in the commit. ● Key idea: You can add and commit files separately from other files. – This makes separating changes into small patches easier.
  14. What changed? ● git status ● git diff git diff HEAD local workspace repository git diff index git diff --cached
  15. Advanced Staging
  16. Advanced Staging ● git add --patch – try the "split" option to split across hunks ● git add -i – Very powerful tool with lots of options ● Key idea: You can add and commit different parts of a file separately.
  17. Unstaging changes ● Revert to the last commit – git reset --hard HEAD ● Remove all added changes from the index – git reset --mixed HEAD ● Remove some files added to index – git add -i and choose revert, or – git reset HEAD filename(s)
  18. Viewing History
  19. Viewing History ● git log ● git log <commit A>..<commit B> – shows history after commit A, up to commit B – can omit either commit – e.g. `git log` `git log origin..` `git log ..v2.6.30` ● git log -p – shows log as a series of patches ● git log --pretty=oneline –abbrev-commit
  20. Viewing old files ● Contents of a file at a particular commit – git show <commitish>:<path to file> ● Contents of a directory – git show <commitish>:<directory>
  21. Pointing Fingers: git blame
  22. Pointing Fingers ● git blame <file> – show who committed each line ● git blame <commit ID> <file> – show the line history before that commit
  23. Branches
  24. Branches ● Only one branch can be checked out – trunk ~= master ● show all branches – git branch -a ● switching branches – git checkout name ● creating new branches – git checkout -b name <commit>
  25. Advanced Branching ● Merge branches with git merge – creates a "merge commit" ● Rebase current branch against branch B – find a common ancestor commit – apply commits from branch B – apply commits from current branch ● Apply a commit from one branch – git cherry-pick
  26. Interacting with other people
  27. Interacting with other people ● Creating a patchset, starting at commitA – git format-patch -o directory commitA^ --cc=<cced-email> – use git send-email or `mutt -H <gitpatch>` ● Applying a patch – git am patchfile – can also take a mailbox or maildir or stdin ● Pushing a new branch – git push remote branch
  28. Changing History
  29. Changing History: DANGER, WILL ROBINSON! ● After a commit, often you will find bugs – could make a new bug fix commit – or you could "amend" the previous commit ● Fix your code ● git add <file> – This adds your code to the index ● git commit --amend – This modifies the commit in the local repo – useful to have vim git-commit script installed
  30. Changing History: DANGER, WILL ROBINSON! ● A total history rewrite: – git rebase -i <commit ID> ● Can reorder commits ● Can edit commits ● Can "squash" one commit into another ● May have merge conflicts – edit files, resolve conflicts surrounded by <<<< and >>>> – git add files, git rebase --continue
  31. git rebase -i --dontscrewme ● No such command ● git rebase -i the safe way: – git checkout -b master-rebase – use `git rebase -i` to move one patch – resolve any merge conflicts – squash that patch using `git rebase -i` – git diff master master-rebase – git branch -M master master-old – git branch -M master-rebase master
  32. Git Hooks
  33. Git Hooks ● Hooks are scripts found in .git/hooks/ ● Enable them with chmod a+x <file> ● Triggered by various git commands – e.g. git commit, git push – pre-commit, post-update ● Examples – shipped pre-commit hook checks for white space at the end of line, long lines, etc. – Checking for swear words?
  34. Git Hooks ● Example post-update hook on remote repo: #!/bin/sh cd /home/sarah/blog unset GIT_DIR git-fetch origin git-reset --hard origin/master ● Whenever I push to the remote repository, this goes into the server's checkout of my blog git repo and updates it unconditionally.
  35. Setting up a remote repository
  36. Setting up a remote repository ● Server needs git and sshd installed to use git+ssh to push to your repo ● Server needs webDAV installed to allow push to your repo over https ● will host your repo ● Next directions assume you have your own server with git installed
  37. Setting up a remote repository 1. Make local repo, commit stuff, etc. 2. ssh to the server: GIT_DIR=/path/to/repo git init --shared 3. Next, tell the local repo about the server: git remote add origin git+ssh://hostname/path/to/repo 4. Push to the server from the local repo: git push origin master 5. Clean up the local repo so that you can pull from the remote server: git config branch.master.remote origin git config branch.master.merge refs/heads/master
  38. Resources ● Git work flow diagrams: ● The Tangled Working Copy: ● ● Kernel module examples at ● vim git-commit script will display commit messages in a more useful manner. Script kept at – sudo aptitude install vim-scripts vim-addon-manager – vim-addons install git-commit
  39. Creative Commons Image Attributions ● GIT picture: ● Snowflake: Bentley.jpg ● Danger: ● Cat: ● Remote: ● Philosophy: ● Branches: ● Interacting with other people:
  40. Creative Commons Image Attributions ● Front stage: ● Back stage: ● Hooks: ● Blame: ● Ballet: ● Papyrus:
  41. Thank you! ● Sarah Sharp ● @sarahsharp ●