Ninja Git: Save Your Master


Published on

Dear Ninja Git Apprentice, your training will be short but it will be dense and fierce. I will teach you how to lock down your master's fortress from tampering and infiltration, how to become invisible and hide data in a repository, how to resist any attacks and recover your committed and uncommitted files, how to be fast as a fox to cover your tracks and resolve conflicts. Save the master!

Published in: Technology
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Ninja Git: Save Your Master

  1. 1. Ninja master Nicola Paolucci! Developer Advocate / Evangelist with! Save your
  2. 2. pirateninjazombie
  3. 3. Nicola Paolucci @durdn Bio pictures: the subtle pleasure of embarrassing yourself in front of hundreds of people
  4. 4. Lock your master’s fortress 1 2 Dear Ninja apprentice, here you’ll learn: Powers of invisibility Solve conflicts with power blows3 4 Cover your tracks
  5. 5. 1.Powers of invisibility ©
  6. 6. 1.Powers of invisibility ©
  7. 7. Hide files from git update-index --assume-unchanged very useful with git-svn Different than .gitignore, it hides commited files
  8. 8. Hide files from git update-index --no-assume-unchanged Revert it with: remember to add --no
  9. 9. List assumed unchanged files git ls-files -v | grep ^h Useful as alias (see alias list later)
  10. 10. Hide files in raw objects actually writes into the object db git hash-object -w <file>
  11. 11. CUSTOMARY WARNING! if you get in trouble, don’t come to me :D Treat this power with great care. ! And if you’re unsure, please refrain from experiments!
  12. 12. Delete branch or commits and retrieve it later git branch -D <branch> git reset --hard HEAD~20
  13. 13. What is the reflog? It’s a log of all the places where your HEAD has been garbage collected every 90 days
  14. 14. Recollect your goods $ git reflog ! 00af1b3 HEAD@{2}: reset: moving to refexp da5b154 HEAD@{3}: rebase finished: returning … da5b154 HEAD@{4}: pull: checkout da5b154dfa71… e10671f HEAD@{8}: pull origin master: checkout Just list the HEAD moves using the reflog and pick the one to restore
  15. 15. Don’t expire the reflog [gc "refs/remotes/*"] reflogExpire = never reflogExpireUnreachable = never If you hide stuff in objects not referenced, be sure they won’t be garbage collected!
  16. 16. If some traitor deleted files git log -1 -- [path] lists where a file was deleted git log --diff-filter=D --summary lists all deleted files
  17. 17. 2. Lock your master’s fortress
  18. 18. Always a balancing act Security DevSpeed
  19. 19. Lock down your repo # no rewriting history denyNonFastForwards = true ! # no deleting history denyDeletes = true ! # check object consistency fsckObjects = true Edit .git/config in the [receive] section:
  20. 20. Reject force push, Luke Git project has already an update hook ‘update-paranoid’ that is designed to reject history rewriting updates
  21. 21. Reject force push, Luke
  22. 22. Impersonating Authors is easy with . $ git commit -m "I'm Luke" $ git commit --author "Elvis <>" -m "I'm elvis" commit a9f0967cba236465d6cb68247.. Author: Elvis <> Date: Mon Apr 22 18:06:35 2013 -0500 ! I'm Elvis ! commit d6eb7572cbb4bdd8e2aaa5c90.. Author: Luke <> Date: Mon Apr 22 18:04:54 2013 -0500 ! I'm Luke
  23. 23. Harden up by signing things Sample gpg commands to get you started: gpg --gen-key Generate your GPG keys gpg -k List your keys gpg -a --export <keyid> Export your key
  24. 24. Store your signature in Simple! Add a tag referencing your public key gpg -a --export <keyid> | git hash-object -w --stdin ! ! Store your public key in a raw object git tag nicks-key 187ysg Tag the raw object with a label
  25. 25. git tag -s <tag_name> -m “message” Sign a tag with your GPG key Finally you can sign/verify tags git tag -v <tag_name> Verifies that the signature is valid
  26. 26. git cat-file -p tims-key | gpg --import Import a GPG key from a tag Import other public keys
  27. 27. Always a balancing act Security DevSpeed
  28. 28. 3. Solve conflicts with power blows
  29. 29. A word on terminology Current checked out branch ! ! !--ours What do ours and theirs mean when solving conflicts? Any merge/rebase coming in ! ! !--theirs
  30. 30. Basics for easy conflict resolution The common commands are: $ git checkout --ours/--theirs <file> Check back out our own/their own version of the file $ git add <file> Add the change to the index will resolve the conflict
  31. 31. Aliases for easy conflict resolution [alias] ours = "!f() { git checkout --ours $@ && git add $@; }; f” ! theirs = ... Add these to .gitconfig
  32. 32. Where do I get that awesome alias?
  33. 33. rerere resolve! Reuse Recorded Resolution will help you when dealing with repetitive and similar merge conflicts. $ git config --global rerere.enabled true Turns it on and forget about it
  34. 34. Sample output rerere $ git add hello.rb $ git commit Recorded resolution for 'hello.rb'. [master 68e16e5] Merge branch 'i18n' Auto-merging hello.rb CONFLICT (content): Merge conflict in hello.rb Resolved 'hello.rb' using previous resolution.
  35. 35. 4. Cover your tracks
  36. 36. MASTER FEATURE What is a rebase? It’s a way to replay commits, one by one, on top of a branch
  37. 37. MASTER FEATURE What is a rebase? It’s a way to replay commits, one by one, on top of a branch
  38. 38. MASTER FEATURE What is a rebase? It’s a way to replay commits, one by one, on top of a branch
  39. 39. MASTER FEATURE What is a rebase? It’s a way to replay commits, one by one, on top of a branch Don’t use!
  40. 40. Correct way to use rebase to update a feature branch What is a rebase? MASTER FEATURE
  41. 41. Correct way to use rebase to update a feature branch What is a rebase? MASTER FEATURE
  42. 42. What is a --interactive rebase? PICK! SQUASH REWORD! FIXUP EDIT ! EXEC It’s a way to replay commits, one by one, deciding interactively what to do with each
  43. 43. --autosquash $ git config --global rebase.autosquash true Turns on the feature Automatically modify the todo list of ! rebase --interactive by annotating commits
  44. 44. git commit -m “squash! …" You can prepend commit messages with: git commit -m “fixup! …" git commit -m “reword! …" etc… Rebase task list will be then prepopulated --autosquash
  45. 45. CUSTOMARY WARNING! rebase rewrites history! Treat this power with great care. ! Only rewrite history of local branches or…
  46. 46. like-a-ninja/! Bonus: greppling like a Ninja
  47. 47. git grep is amazing It searches your whole project at blazing speed. Let’s make it more awesomer! git config --global grep.extendRegexp true Turn on extended regular expressions git config --global grep.lineNumber true Include line numbers
  48. 48. git grep is amazing And the final touch, pack it in an alias git config --global alias.g ”grep --break --heading —line-number" ! Make it group output like Ack
  49. 49. Much more on git
  50. 50. Nicola Paolucci @durdn Thank you!
  51. 51. Q&A
  52. 52. Git Repository Management for Enterprise Teams Free Git Code Hosting for Small Teams Free Git Desktop client for Mac or Windows