Becoming a Git Master - Nicola Paolucci

  • View
    1.108

  • Download
    2

  • Category

    Software

Preview:

DESCRIPTION

Wrapped in a single session, you'll find the concepts and techniques that convert the average Git practitioner into a master of the craft. We'll go from technical topics like "efficient conflict resolution" and "effective code cleanup," to the often-asked "how to handle project dependencies with Git" and "how to manage massive repositories." And much more.

Citation preview

#atlassian

NICOLA PAOLUCCI • DEVELOPER ADVOCATE • ATLASSIAN • @DURDN

Becoming a Git Master:Concepts and Techniques to convert you

into a master of the DVCS craft

NICOLA PAOLUCCI • DEVELOPER ADVOCATE • ATLASSIAN • @DURDN

Becoming a Git Master:Concepts and Techniques to convert you

into a master of the DVCS craft

I'm George. George McFly. I'm your density… I mean,

your destiny

Stefan SaasenTim Pettersen

Marcus BertrandSarah Goff Dupont

Let’s Become Git Pros!

C O N F L I C T R E S O L U T I O N T I P S

H I D I N G S T U F F

Here you’ll learn:

P O L I S H Y O U R C O D E

P R E V E N T TA M P E R I N G

P R O J E C T D E P E N D E N C I E S

P R O A L I A S E S & P R O M P T

A pro command prompt

P R O A L I A S E S & P R O M P T

Everyone has their favorite, but!Liquid prompt is awesome

http://bit.do/liquid-prompt

P R O A L I A S E S & P R O M P T

Everyone has their favorite, but!Liquid prompt is awesome

http://bit.do/liquid-prompt

Crafting Awesome Aliases

Aliases are stored in .gitconfig

In a section prefixed: [alias]

P R O A L I A S E S & P R O M P T

Basic Alias FormVery simple:

ls = log --oneline[vagrant@vagrant-ubuntu-trusty-64:/home/vagrant/buildstep] master ± git ls 90aa814 Merge pull request #85 from marqu3z/master f1eb16b overwrite source.list e6b9d16 change repo before prepare task 8bc10c0 Fix for deprecated repository e34d861 Link to buildpacks.txt instead 4502635 Merge pull request #76 from elia/fix-72-no-buildpack-bundle-install 38be796 Bundle install ain't needed against the buildpack

P R O A L I A S E S & P R O M P T

You can do great things with just this

For example: amend the last commit with everything I have here uncommitted and new

caa = commit -a --amend -C HEAD

You can’t pass parameters to simple aliases :(

Or can you?!

muahahhahahhahahahahahahahahhahahahhahahahah!

P R O A L I A S E S & P R O M P T

For multiple commands or complex parameters use a bash function!You can escape to a shell with ! like this:

my_alias = "!f() { <command> }; f”

P R O A L I A S E S & P R O M P T

Some useful shortcuts and variablesMore in any bash manual

$@ - all command line parameters passed

$1 - first command line parameter

$2 - second command line parameter

Ma, it’s the mini-DSL I always wanted!

P R O A L I A S E S & P R O M P T

What can you do with this?Cool cool things, for example add a Bitbucket remote:

git remote add $1 https://bitbucket.org/$2.git;

P R O A L I A S E S & P R O M P T

ra = "!f() { \ \ }; f"

What can you do with this?Cool cool things, for example add a Bitbucket remote:

git remote add $1 https://bitbucket.org/$2.git;

P R O A L I A S E S & P R O M P T

ra = "!f() { \ \ }; f"

What can you do with this?Cool cool things, for example add a Bitbucket remote:

git remote add $1 https://bitbucket.org/$2.git;

git ra jsmith jsmith/prj

P R O A L I A S E S & P R O M P T

ra = "!f() { \ \ }; f"

What can you do with this?Cool cool things, for example add a Bitbucket remote:

git remote add $1 https://bitbucket.org/$2.git;

git ra jsmith jsmith/prj

P R O A L I A S E S & P R O M P T

Get all the alias goodness on Bitbuckethttp://bit.do/git-aliases

© http://www.amigosdosbichos.org/

Powers of invisibility

© http://www.amigosdosbichos.org/

Powers of invisibility

Tell git which files or folders to ignore

in .gitignore

What if the file is already committed?!

muahahhahahhahahahahahahahahhahahahhahahahah!

Hide files fromDifferent from .gitignore, it hides committed files

P O W E R S O F I N V I S I B I L I T Y

git update-index --assume-unchanged <file>

very useful with git-svn

Hide files fromRevert it with:

P O W E R S O F I N V I S I B I L I T Y

git update-index --no-assume-unchanged <file>

remember to add --no

P O W E R S O F I N V I S I B I L I T Y

List assumed unchanged files

git ls-files -v | grep ^h

Useful as alias (see alias list from before)

Conflict Resolution Tips

Conflict Resolution Tips

What is a conflict?

P R O A L I A S E S & P R O M P T

A word on terminology

Current checked out branch

!!!--ours

What do ours and theirs mean when solving conflicts?

P R O A L I A S E S & P R O M P T

A word on terminology

Current checked out branch

!!!--ours

What do ours and theirs mean when solving conflicts?

Commit coming in (i.e. via merge)

!!!--theirs

P R O A L I A S E S & P R O M P T

A word on terminology

Current checked out branch

!!!--ours

What do ours and theirs mean when solving conflicts?

Commit coming in (i.e. via merge)

!!!--theirs

P R O A L I A S E S & P R O M P T

Basics for easy conflict resolutionThe common commands are:

$ git checkout --ours/--theirs <file> Check back out our own/their own version of the file

P R O A L I A S E S & P R O M P T

Basics for easy conflict resolutionThe 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

P R O A L I A S E S & P R O M P T

Aliases for easy conflict resolutionAdd these to [alias] in .gitconfig:

git checkout --ours $@ && git add $@;

P R O A L I A S E S & P R O M P T

Aliases for easy conflict resolutionAdd these to [alias] in .gitconfig:

ours = "!f() { \ \ }; f" git checkout --ours $@ && git add $@;

P R O A L I A S E S & P R O M P T

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

P R O A L I A S E S & P R O M P T

Sample output rerere

$ git add hello.rb $ git commit Recorded resolution for 'hello.rb'. [master 68e16e5] Merge branch 'i18n'

P R O A L I A S E S & P R O M P T

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.

Cover your tracks(aka polish your code)

Cover your tracks(aka polish your code)

P O L I S H Y O U R C O D E

What is a rebase?It’s a way to replay commits, one by one,

on top of a branch

MASTER

FEATURE

P O L I S H Y O U R C O D E

What is a rebase?It’s a way to replay commits, one by one,

on top of a branch

MASTER

FEATURE

P O L I S H Y O U R C O D E

What is a rebase?It’s a way to replay commits, one by one,

on top of a branch

MASTER

FEATURE

P O L I S H Y O U R C O D E

What is a rebase?It’s a way to replay commits, one by one,

on top of a branch

MASTER

FEATURE

P O L I S H Y O U R C O D E

What is a rebase?It’s a way to replay commits, one by one,

on top of a branch

MASTER

FEATURE

Don’t use!

P O L I S H Y O U R C O D E

What is a rebase?Correct way to use rebase to update a

feature branch

MASTER

FEATURE

P O L I S H Y O U R C O D E

What is a rebase?Correct way to use rebase to update a

feature branch

MASTER

FEATURE

P O L I S H Y O U R C O D E

What is an --interactive rebase?It’s a way to replay commits, one by one,

deciding interactively what to do with each

PICK!

SQUASH

REWORD!

FIXUP

EDIT !

EXEC

P O L I S H Y O U R C O D E

--autosquashAutomatically modify the todo list of

rebase --interactive by annotating commits

$ git config --global rebase.autosquash true Turns on the feature

P O L I S H Y O U R C O D E

--autosquashYou can prepend commit messages with:

git commit -m “squash! …"

git commit -m “fixup! …"

git commit -m “reword! …"

etc…

Rebase task list will be then prepopulated

CUSTOMARY WARNING!

rebase rewrites history!

Treat this power with great care. Only rewrite history of local branches or…

Prevent tampering

Always a balancing act

Security DevSpeed

P R E V E N T TA M P E R I N G

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,Git project has already an update hook ‘update-paranoid’ that is designed to reject history rewriting updates

Luke

http://bit.do/update-paranoid

Reject force push,Luke

Reject force push,Luke

P R E V E N T TA M P E R I N G

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

P R E V E N T TA M P E R I N G

Finally you can sign/verify tags

git tag -s <tag_name> -m “message”Sign a tag with your GPG key

git tag -v <tag_name>Verifies that the signature is valid

Signing release tags is often all you need

P R E V E N T TA M P E R I N G

Aside on GPGThe GNU Privacy Guard

GnuPG allows to encrypt and sign your data and communication, features a versatile key management system.

P R E V E N T TA M P E R I N G

Harden up by signing things

Sample gpg commands to get you started:

P R E V E N T TA M P E R I N G

Harden up by signing things

Sample gpg commands to get you started:

gpg --gen-keyGenerate your GPG keys

P R E V E N T TA M P E R I N G

Harden up by signing things

Sample gpg commands to get you started:

gpg --gen-keyGenerate your GPG keys

gpg -kList your keys

P R E V E N T TA M P E R I N G

Harden up by signing things

Sample gpg commands to get you started:

gpg --gen-keyGenerate your GPG keys

gpg -kList your keys

gpg -a --export <keyid>Export your key

P R E V E N T TA M P E R I N G

The way the Linux kernel hackers do itHide files in raw objects

git hash-object -w <file>

P R E V E N T TA M P E R I N G

The way the Linux kernel hackers do itHide files in raw objects

actually writes into the object db

git hash-object -w <file>

P R E V E N T TA M P E R I N G

The way the Linux kernel hackers do itHide files in raw objects

actually writes into the object db

git hash-object -w <file>

Remember to associate a tag to it or it will be garbage collected

P R E V E N T TA M P E R I N G

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

P R E V E N T TA M P E R I N G

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 65704f3…Tag the raw object with a label

P R E V E N T TA M P E R I N G

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 65704f3…Tag the raw object with a label

raw object id

P R E V E N T TA M P E R I N G

Import other public keys

git cat-file -p tims-key | gpg --import

Import a GPG key from a tag

P R E V E N T TA M P E R I N G

Finally you can sign/verify tags

git tag -s <tag_name> -m “message”Sign a tag with your GPG key

git tag -v <tag_name>Verifies that the signature is valid

and Project Dependencies

How do you handle project dependencies

with ?

Splitting up a project is painful, for so many

reasons

Use a build/dependency tool instead of

G I T A N D P R O J E C T D E P E N D E N C I E S

I’ll give you an incomplete list of examples!

Java

Nodejs

Javascript

Python Pip easy-install

Ruby

G I T A N D P R O J E C T D E P E N D E N C I E S

I’ll give you an incomplete list of examples! (2)

C#

C++ c-make

Objective C

PHP

Go godep

Another possibility: use git submodule

Another possibility: use git subtree

Use other build and cross-stack

dependency tools

G I T A N D P R O J E C T D E P E N D E N C I E S

•Android Repo (http://bit.do/android-repo)•Repobuild (chrisvana / repobuild)•Chromium depot_tools (http://bit.do/depot-tools)•Facebook Buck (http://facebook.github.io/buck/)•Twitter Pants (http://bit.do/twitter-pants)

For example you can check out:

P R O A L I A S E S & P R O M P T

Review these ideas onlinehttp://bit.do/git-deps

Thank you!

NICOLA PAOLUCCI • DEVELOPER ADVOCATE • ATLASSIAN • @DURDN

P O W E R S O F I N V I S I B I L I T Y

Hide files from • Level One• Level Two• Level Two• Level Two

• Level One

CODE FONT: <html xmlns="http://www.w3.org/1999/xhtml">

P O W E R S O F I N V I S I B I L I T Y

Page title here• Level One• Level Two• Level Two• Level Two

• Level One

Page title here

• Level One• Level Two• Level Two• Level Two

• Level One

Page title here

• Level One• Level Two• Level Two• Level Two

• Level One

Page Title Here

• Level One• Level Two• Level Two• Level Two

• Level One

Page title here

Caption goes here

Just text by itself, for impact.

Just text by itself, for impact.

Just text by itself, for impact.

Just text by itself, for impact.

Just text by itself, for impact.

Type Quote Here And Move Both Quotation Marks To The Beginning And End Of The Quote. Lorem Ipsum Dolor Sit Amet, Conse Cetur Ading Elit. D AV I D H A N D LY, G L O B O C H E M

Big cool statistic

2,569Add-Ons in Marketplace

0

15

30

45

60

2007 2008 2009 2010

Region 1 Region 2 Region 3

Page title here

40%

30%

20%

10%

2007 2008 2009 2010

Page title here

Content Content

Content Content

Content Content

Content Content

Content Content

Page title here

C O L U M N T I T L E C O L U M N T I T L E C O L U M N T I T L E

Recommended