Ninja Git: Save Your Master
-
Upload
durdn -
Category
Technology
-
view
383 -
download
0
description
Transcript of Ninja Git: Save Your Master
Ninja
masterNicola Paolucci!Developer Advocate / Evangelist
with!
Save your
pirateninjazombie
Nicola Paolucci@durdn
Bio pictures: the subtle pleasure of embarrassing yourself in front of hundreds of people
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
Hide files from
git update-index \ --assume-unchanged
very useful with git-svn
Different than .gitignore, it hides commited files
Hide files from
git update-index \ --no-assume-unchanged
Revert it with:
remember to add --no
List assumed unchanged files
git ls-files -v | grep ^hUseful as alias (see alias list later)
Hide files in raw objects
actually writes into the object db
git hash-object -w <file>
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!
Delete branch or commits and retrieve it later
git branch -D <branch>
git reset --hard HEAD~20
What is the reflog?It’s a log of all the places where your
HEAD has been
garbage collected every
90 days
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
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!
If some traitor deleted filesgit log -1 -- [path] lists where a file was deleted
git log --diff-filter=D --summary lists all deleted files
2. Lock your master’s fortress
Always a balancing act
Security DevSpeed
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:
Reject force push, Luke
atlss.in/update-paranoid
Git project has already an update hook ‘update-paranoid’ that is designed to reject history rewriting updates
Reject force push, Luke
Impersonating Authors is easy with .
$ git commit -m "I'm Luke" $ git commit --author "Elvis <[email protected]>" \ -m "I'm elvis" commit a9f0967cba236465d6cb68247.. Author: Elvis <[email protected]> Date: Mon Apr 22 18:06:35 2013 -0500 ! I'm Elvis !commit d6eb7572cbb4bdd8e2aaa5c90.. Author: Luke <[email protected]> Date: Mon Apr 22 18:04:54 2013 -0500 ! I'm Luke
Harden up by signing thingsSample gpg commands to get you started:
gpg --gen-keyGenerate your GPG keys
gpg -kList your keys
gpg -a --export <keyid>Export your key
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 187ysgTag the raw object with a label
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
git cat-file -p tims-key | gpg --import
Import a GPG key from a tag
Import other public keys
Always a balancing act
Security DevSpeed
3. Solve conflicts with power blows
A word on terminology
Current checked out branch
!!!--ours
What do ours and theirs mean when solving conflicts?
Any merge/rebase coming in
!!!--theirs
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
Aliases for easy conflict resolution
[alias] ours = "!f() { \ git checkout --ours $@ && git add $@;\ }; f” !
theirs = ...
Add these to .gitconfig
Where do I get that awesome alias?atlss.in/git-aliases
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
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.
4. Cover your trackshttps://www.youtube.com/watch?v=D22gbXIx-CE
MASTER
FEATURE
What is a rebase?
It’s a way to replay commits, one by one, on top of a branch
MASTER
FEATURE
What is a rebase?
It’s a way to replay commits, one by one, on top of a branch
MASTER
FEATURE
What is a rebase?
It’s a way to replay commits, one by one, on top of a branch
MASTER
FEATURE
What is a rebase?
It’s a way to replay commits, one by one, on top of a branch
Don’t use!
Correct way to use rebase to update a feature branch
What is a rebase?
MASTER
FEATURE
Correct way to use rebase to update a feature branch
What is a rebase?
MASTER
FEATURE
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
--autosquash
$ git config --global rebase.autosquash true Turns on the feature
Automatically modify the todo list of !rebase --interactive by annotating commits
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
CUSTOMARY WARNING!
rebase rewrites history!
Treat this power with great care. !Only rewrite history of local branches or…
http://travisjeffery.com/b/2012/02/search-a-git-repo-like-a-ninja/!
Bonus: greppling like a Ninja
git grep is amazingIt 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
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
Much more on gitatlassian.com/git
Nicola Paolucci@durdn
Thank you!
Q&A
Git Repository Management for Enterprise Teams
Free Git Code Hosting for Small Teams
Free Git Desktop client for Mac or Windows