Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Ninja Git: Save Your Master

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!

  • Login to see the comments

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