Slide 1

Slide 1 text

1 Git on the front line Nicola Iarocci

Slide 2

Slide 2 text

2 Who Am I Nicola Iarocci, a weirdo Python by Night I am the author and maintainer of a few Python open source projects: python-eve.org, python-cerberus.organd more. Microsoft MVP MongoDB Master I also happen to be a Microsoft MVP for Visual Studio and Development Technologies and a MongoDB Master. Communities I run DevRomagna, a developers community, and CoderDojo Ravenna, a coding club for kids. http:/ /devromagna.org C# by Day I am the author of Sofware Gestionali Amica, a line of accounting and invoicing applications for Italian small businesses. Check it out at http:/ /gestionaleamica.com

Slide 3

Slide 3 text

3 one size does not fit all git workflows

Slide 4

Slide 4 text

4 the main branch where the source code of HEAD always reflects a production-ready state origin/master main branch where HEAD always holds the latest delivered development changes, ready for next release origin/develop feature, release and hotfix branches. these always have a limited life time, since they will be removed eventually supporting branches an elegant mental model well suited for packaged software. Not ideal for frequent release cycles such as those we have in modern web development summary Git Flow a successful git branching model http:/ /nvie.com/posts/a-successful-git-branching-model/

Slide 5

Slide 5 text

5 the main branch where the source code of HEAD always reflects a production-ready state origin/master to work on something new, create a descriptively named branch off of master branch feature branch when you need feedback or help, or you think the branch is ready for merging, open a pull request pull request & review a lightweight, branch-based workflow that supports teams and projects where deployments are made regularly summary GitHub Flow widely adopted by the open source community http:/ /scottchacon.com/2011/08/31/github-flow.html

Slide 6

Slide 6 text

6 Streamline your git experience aliases

Slide 7

Slide 7 text

7 git status, succinctly $ git st ## work M README.md $ git config —-global alias.st ‘status -sb’

Slide 8

Slide 8 text

8 show last commit $ git last commit c828339f02f832818f868bbfe457e64bfcc3e64a Author: Nicola Iarocci Date: Thu Oct 19 10:28:42 2017 +0200 first commit $ git config —-global alias.last ‘log -1 HEAD’

Slide 9

Slide 9 text

9 quick branch checkout $ git co mybranch switched to branch ‘mybranch’ $ git config —-global alias.co ‘checkout’ Hint: git co - works like cd - but between branches (git checkout - works, too)

Slide 10

Slide 10 text

10 checkout to a new branch $ git cob newbranch switched to a new branch ‘mybranch’ $ git config —-global alias.cob ‘checkout -b’ branch is created on the fly

Slide 11

Slide 11 text

11 amend last commit $ git amend $ git config —-global alias.amend ‘commit —-amend’

Slide 12

Slide 12 text

12 add staged changes to last commit $ git add . $ git fixup $ git config —-global alias.fixup ‘commit —-amend —-noedit’ skip editing the commit message

Slide 13

Slide 13 text

13 unstage changes $ git st ## work M README.md $ git unstage README.md Unstaged changes after reset: M README.md $ git config —-global alias.unstage ‘reset HEAD’ pass no filename to unstage all, or use wildcard

Slide 14

Slide 14 text

14 show staged changes $ git diffc diff —git a/README.md b/README.md index 2fd9bc4..889c3dc 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ TITLE +test $ git config —-global alias.diffc ‘diff —-cached’

Slide 15

Slide 15 text

15 undo last commit and keep changes $ git r1 Unstaged changes after reset: M README.md $ git config —-global alias.r1 ‘reset HEAD^’ changes are left unstaged

Slide 16

Slide 16 text

16 undo last commit, discard changes $ git rh1 HEAD is now at c828339 first commit $ git config —-global alias.rh1 ‘reset -—hard HEAD^’ use with caution

Slide 17

Slide 17 text

17 add all changes including untracked, and commit with message $ git cm “my commit message” [mybranch ea88184] my commit message 1 file changed, 1 insertion(+), 1 deletion(-) !git add -A && git commit -m

Slide 18

Slide 18 text

18 add all changes excluding untracked, then commit as WIP $ git wip [mybranch ea88184] WIP 1 file changed, 1 insertion(+), 1 deletion(-) !git add -u && git commit -m WIP

Slide 19

Slide 19 text

19 add all changes including untracked, then commit as SAVEPOINT $ git save [mybranch ea88184] SAVEPOINT 1 file changed, 1 insertion(+), 1 deletion(-) !git add -A && git commit -m SAVEPOINT

Slide 20

Slide 20 text

20 resume work after WIP or SAVEPOINT $ git undo Unstaged files after reset: M README.md $ git config —-global alias.undo ‘reset HEAD^ —-mixed’ functionally identical to ‘r1’ but makes more sense semantically

Slide 21

Slide 21 text

21 add changes to commit, then wipe that commit $ git wipe HEAD is now at 8da9860 my commit message $ git reflog 8da9860 HEAD@{0}: reset: moving to HEAD~1 4998619 HEAD@{1}: commit: WIPE SAVEPOINT $ git reset —hard 4998619 HEAD is now at 4998619 WIPE SAVEPOINT !git add -A && git commit -qm 'WIPE SAVEPOINT' && git reset HEAD~1 --hard now working dir is clean, but I can still go back if need arises (via reflog)

Slide 22

Slide 22 text

22 hierarchical, git-powered grep $ git g “event hooks” CHANGES 1077:- [new] pre_ and ``pre__`` event hooks are now docs/features.rst 1216:Database event hooks 1219:Database event hooks work like request event hooks $ git config —-global alias.g ‘grep --break --heading --line-number’ faster than standard grep

Slide 23

Slide 23 text

23 show a tree with all branches $ git tree * bbde45f (HEAD -> expand_cerberus_registries) WIP * 3a25ea7 (origin/master, master) Merge branch ‘use_ordereddict_from_backport_collections_#1070’ |\ | * 9fb1a66 Changelog for #1070 | * fa8da19 use OrderedDict from backport_collections |/ * cee2f7e Merge branch 'support_for_decimal_type_#1048' |\ | * 46af495 Minor changelog fixes for #1048 | * 3bf1930 Support Decimal type MongoDB |/ !git log --graph --decorate --all --oneline which brings us to the next topic…

Slide 24

Slide 24 text

24 push/unpush current branch to remote $ git publish $ git unpublish In .gitconfig: branch-name = "!git rev-parse --abbrev-ref HEAD" publish = "!git push -u origin $(git branch-name)" unpublish = "!git push origin :$(git branch-name)" and set it to track upstream branch

Slide 25

Slide 25 text

25 delete branches already merged to master $ git delete-merged-branches Deleted branch add_new_user_gravatar_links Deleted branch assign_unique_key_to_uploads Deleted branch remember_the_last_activity_per_user Deleted branch update_kaminari_to_thread_safe_version “!git branch —-merged master | grep -v '\\*' | xargs -n 1 git branch -d"

Slide 26

Slide 26 text

26 shortcut to .config file $ git ec $ git config —-global alias.ec ‘config —global —e’

Slide 27

Slide 27 text

27 get my dotfiles https:/ /github.com/nicolaiarocci/dotfiles

Slide 28

Slide 28 text

28 keep your history clean and consistent rebase Demo a documentation project

Slide 29

Slide 29 text

29 reuse recorded resolutions to solve hunk conflicts rerere $ git config —-global rerere.enabled true https:/ /git-scm.com/blog/2010/03/08/rerere.html

Slide 30

Slide 30 text

30 shows all non-common commits in two branches (@antirez) rx script

Slide 31

Slide 31 text

31 Aliases Streamline your workflow. Don’t Repeat Yourself. Consider sharing with team. Rebase Keep project history clean, compact and consistent. Not as hard as you thought. Keep Learning Study more advanced git features. Consider building your own scripts. Pick a Workflow Don’t be afraid to customize it just to suit your use case, project, and team. You Are a Craftsman sharpen your tools

Slide 32

Slide 32 text

32 nicolaiarocci.com nicola@nicolaiarocci.com @nicolaiarocci Thank You! Send feedback or get in touch at