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!
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
7. Hide files from
git update-index
--assume-unchanged
very useful with git-svn
Different than .gitignore, it hides commited files
8. Hide files from
git update-index
--no-assume-unchanged
Revert it with:
remember to add --no
9. List assumed unchanged files
git ls-files -v | grep ^h
Useful as alias (see alias list later)
10. Hide files in raw objects
actually writes into the object db
git hash-object -w <file>
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. Delete branch or commits
and retrieve it later
git branch -D <branch>
git reset --hard HEAD~20
13. What is the reflog?
It’s a log of all the
places where your
HEAD has been
garbage collected
every
90 days
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. 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. 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
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. 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
22. Impersonating Authors is easy
with .
$ git commit -m "I'm Luke"
$ git commit --author "Elvis <elvis@graceland.net>"
-m "I'm elvis"
commit a9f0967cba236465d6cb68247..
Author: Elvis <elvis@graceland.net>
Date: Mon Apr 22 18:06:35 2013 -0500
!
I'm Elvis
!
commit d6eb7572cbb4bdd8e2aaa5c90..
Author: Luke <luke@tatooine.com>
Date: Mon Apr 22 18:04:54 2013 -0500
!
I'm Luke
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. 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. 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. git cat-file -p tims-key | gpg --import
Import a GPG key from a tag
Import other public keys
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. 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. Aliases for easy
conflict resolution
[alias]
ours = "!f() {
git checkout --ours $@ && git add $@;
}; f”
!
theirs = ...
Add these to .gitconfig
32. Where do I get that awesome alias?
atlss.in/git-aliases
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. 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. 4. Cover your trackshttps://www.youtube.com/watch?v=D22gbXIx-CE
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. Correct way to use rebase to update
a feature branch
What is a rebase?
MASTER
FEATURE
41. Correct way to use rebase to update
a feature branch
What is a rebase?
MASTER
FEATURE
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. --autosquash
$ git config --global rebase.autosquash true
Turns on the feature
Automatically modify the todo list of !
rebase --interactive by annotating commits
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
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. 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