Slide 1

Slide 1 text

Lemi Orhan Ergin Agile Software Craftsman & Co-Founder, Craftbase GIT ANTI PATTERNS 10 YOU SHOULD BE AWARE OF

Slide 2

Slide 2 text

LEMi ORHAN ERGiN agile software craftsman co-founder @ craftbase ex Sony, eBay, ACM, iyzico founder & co-organizer of SCTurkey 
 Turkish Software Craftsmanship Community /lemiorhan lemiorhanergin.com @lemiorhan

Slide 3

Slide 3 text

Do you push every commit just a!er you create ?

Slide 4

Slide 4 text

ANTIPATTERN DANGER TORTURING GIT BY PUSH ANTI-PATTERN Do you push every commit just a!er you create ?

Slide 5

Slide 5 text

ANTIPATTERN DANGER if all you do is commit and immediate push you lose the opportunity to organize your commits via reset, rebase, commit with amend safely and you have to use force push at every time you organize your commits TORTURING GIT BY PUSH ANTI-PATTERN

Slide 6

Slide 6 text

are you brave enough to jump to any commit ?

Slide 7

Slide 7 text

are you brave enough to jump to any commit ? ANTIPATTERN DANGER BROKEN TIME MACHINE ANTI-PATTERN Nope. Usually tests do not pass, the application does not work, even the code does not compile in majority of commits.

Slide 8

Slide 8 text

are you brave enough to jump to any commit ? BROKEN TIME MACHINE ANTI-PATTERN Do you want me to help you about finding the last commit that finalizes the feature?

Slide 9

Slide 9 text

do you have loooooong living topic branches ?

Slide 10

Slide 10 text

do you have loooooong living topic branches ? ANTIPATTERN DANGER LONG LIVING BRANCHES ANTI-PATTERN

Slide 11

Slide 11 text

LONG LIVING BRANCHES ANTI-PATTERN do you have loooooong living topic branches ? welcome to merge hell LONG LIVING BRANCHES ANTI-PATTERN

Slide 12

Slide 12 text

cherry-pick do you use to prepare releases ?

Slide 13

Slide 13 text

cherry-pick do you use to prepare releases ? ANTIPATTERN DANGER CHERRY-PICK OVERDOSE ANTI-PATTERN

Slide 14

Slide 14 text

master HEAD TAG/v13 version 2.0 $ git cherry-pick Every-Single-Commit-We-Want-To-Deploy CHERRY-PICK OVERDOSE ANTI-PATTERN FEATURE 12 FEATURE 14 FEATURE 13

Slide 15

Slide 15 text

the commit graph ? do you fully understand when you read

Slide 16

Slide 16 text

ANTIPATTERN DANGER LOST IN COMMIT GRAPH ANTI-PATTERN the commit graph ? do you fully understand when you read

Slide 17

Slide 17 text

LOST IN COMMIT GRAPH ANTI-PATTERN the commit graph ? do you fully understand topic and shared branches, tracking branches, tags, HEADs, merge commits, reverted commits… LOST IN COMMIT GRAPH ANTI-PATTERN when you read

Slide 18

Slide 18 text

Cure?

Slide 19

Slide 19 text

Commit Early, Commit O!en Perfect Later, Publish Once PS: There are more than one way to achieve this

Slide 20

Slide 20 text

split your big feature into mini shippable tasks HEAD TOPIC refactorings tasks, like rest endpoints red-green-refactor each task will have a branch, not a feature master ORIGIN/master STEP 0 Our very first step is defining a strategy to keep branches short

Slide 21

Slide 21 text

commit early commit o!en no need to compile no need for CI it’s only for versioning do not push HEAD TOPIC master ORIGIN/master STEP 1

Slide 22

Slide 22 text

$ git fetch origin master:master HEAD TOPIC Sync source branch with one simple command master ORIGIN/master STEP 2

Slide 23

Slide 23 text

$ git fetch origin master:master HEAD TOPIC Sync source branch with one simple command master ORIGIN/master STEP 2

Slide 24

Slide 24 text

$ git merge master HEAD TOPIC Get incoming change sets from source to topic branch via merge master ORIGIN/master STEP 3

Slide 25

Slide 25 text

$ git merge master HEAD TOPIC Get incoming change sets from source to topic branch via merge master ORIGIN/master STEP 3

Slide 26

Slide 26 text

$ git merge master Get incoming change sets from source to topic branch via merge master ORIGIN/master HEAD TOPIC REGULARLY STEP 3

Slide 27

Slide 27 text

$ git merge master Get incoming change sets from source to topic branch via merge master ORIGIN/master HEAD TOPIC REGULARLY STEP 3

Slide 28

Slide 28 text

master ORIGIN/master HEAD TOPIC merge back to source by squashing all commits in topic branch $ git checkout master $ git merge --squash topic STEP 4

Slide 29

Slide 29 text

master ORIGIN/master HEAD TOPIC Delete the topic branch $ git branch -D topic STEP 5

Slide 30

Slide 30 text

master ORIGIN/master HEAD Delete the topic branch $ git branch -D topic STEP 5

Slide 31

Slide 31 text

master ORIGIN/master HEAD Delete the topic branch $ git branch -D topic Now you can push STEP 5

Slide 32

Slide 32 text

Continuous Integration validates master branch continuously Pull requests can be used to review code and to validate before merging back to master Scrum tasks are mapped to commits, not stories Github Flow can be used to govern overall Feature flags should be used whenever possible Commit early & o!en perfect later, publish once philosophy Deliver frequently be prepared to send every single commit Deleting branches a!er merge will make your commit graph readable TRUNK-BASED DEVELOPMENT let's make git king again

Slide 33

Slide 33 text

Git commands? is it hard to learn

Slide 34

Slide 34 text

use terminal GUIs are prison balls of developers it’s ok to use GUIs while checking diffs, resolving conflicts and viewing commit graph BUTTON ADDICT ANTI-PATTERN ANTIPATTERN DANGER

Slide 35

Slide 35 text

does each of your commit have or you commit anything you have changed one special purpose?

Slide 36

Slide 36 text

stop adding prevent commits from being big ball of muds every change BIG BALL OF MUD ANTI-PATTERN ANTIPATTERN DANGER

Slide 37

Slide 37 text

BIG BALL OF MUD ANTI-PATTERN stop adding prevent commits from being big ball of muds every change local change sets at JetBrains IDEs BIG BALL OF MUD ANTI-PATTERN

Slide 38

Slide 38 text

stop adding every change partial add : git add -p

Slide 39

Slide 39 text

commit messages? do you really understand what’s wri!en in

Slide 40

Slide 40 text

# WHAT # (this commit will...) # WHY and HOW # Explain why this change is being made # RELATED # Provide links or keys to any relevant issues or other resources # REMEMBER # use lower case in the subject line # start with a verb in imperative tone in the subject line # do not end the subject line with a period # separate subject from body with a blank line # use the body to explain what and why vs. how # can use multiple lines with "-" for bullet points in body $ git config --global commit.template ~/.git-commit-template.txt $ git config --global commit.cleanup strip use git commit templates to create be!er commit messages messages are commit documents! ANTIPATTERN DANGER AMBIGIOUS COMMIT MESSAGES ANTI-PATTERN

Slide 41

Slide 41 text

git rebase git push --force A B C D git merge git pull Which of the following commands can cause duplicate commits in the commit graph?

Slide 42

Slide 42 text

ANTIPATTERN DANGER Which of the following commands can cause duplicate commits in the commit graph? git rebase git push --force A B C D git merge git pull DUPLICATE COMMITS ANTI-PATTERN

Slide 43

Slide 43 text

UPSTREAM LOCAL master c1 c2 c3 c4 c7 c5 c6 c5 c6 FIX HEAD master c1 c2 c3 c4 c7 c5 c6 c5 c6 FIX REBASE & FORCE PUSH $ git rebase master $ git push -f

Slide 44

Slide 44 text

UPSTREAM LOCAL master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX HEAD master c1 c2 c3 c4 c7 c5 c6 c5 c6 FIX REBASE & FORCE PUSH $ git rebase master $ git push -f

Slide 45

Slide 45 text

UPSTREAM LOCAL master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX HEAD master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX REBASE & FORCE PUSH $ git rebase master $ git push -f

Slide 46

Slide 46 text

UPSTREAM LOCAL master c1 c2 c3 c4 c7 c5 c6 c5 c6 FIX HEAD master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX PULL A FORCE-PUSHED BRANCH $ git pull

Slide 47

Slide 47 text

UPSTREAM LOCAL master c1 c2 c3 c4 c7 c5 c6 c5 c6 FIX HEAD master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX c5 c6 c5’ c6’ ORIGIN/FIX PULL A FORCE-PUSHED BRANCH $ git pull

Slide 48

Slide 48 text

UPSTREAM LOCAL c1 c2 c3 c4 c7 c5 c6 c5 c6 master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX c5 c6 c5’ c6’ c8 master FIX HEAD ORIGIN/FIX PULL A FORCE-PUSHED BRANCH $ git pull

Slide 49

Slide 49 text

UPSTREAM LOCAL master c1 c2 c3 c4 c7 c5 c6 c5 c6 FIX HEAD master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX PULL WITH REBASE $ git pull --rebase

Slide 50

Slide 50 text

UPSTREAM LOCAL master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX HEAD master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX PULL WITH REBASE $ git pull --rebase

Slide 51

Slide 51 text

1. TORTURING GIT BY PUSH 2. BROKEN TIME MACHINE 3. LONG LIVING BRANCHES 4. TOO LATE TO VALIDATE 5. CHERRY-PICK OVERDOSE 6. LOST IN COMMIT GRAPH 7. BUTTON ADDICT 8. TRASH HOUSE 9. BIG BALL OF MUD 10. AMBIGIOUS COMMIT MESSAGES 11. ZOMBIE REBASE 12. CODE LOSING SYNDROME 13. MESS UP WITH THE ROLLBACK 14. CENTRALIZED GIT 15. MERGE FANATIC 16. BRANCH CEMETERY 17. UNCONTROLLED POWER 18. WEB OF REPOSITORIES 19. ORACLE SYNDROME 20. WAITING FOR HACKERS 21. EVIL MERGE 22. BRANCH OVERDOSE 23. CHUCKY THE COMMAND 24. NO HERO TO SAVE LIVES 25. DUPLICATE COMMITS 26. BIG FAT COMMIT 27. CONFLICT-FOBIA 28. MERGE HELL 29. F*UCK UP WITH FORCE PUSH 30. LIVING AT DETACHED HEAD STATE

Slide 52

Slide 52 text

RECAP what was really happened at that time? LET’S

Slide 53

Slide 53 text

master TAG/v1.1 login HEAD DETACHED HEAD STATE $ git checkout tags/v1.1 Note: checking out 'cecd95914'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. ANTIPATTERN DANGER

Slide 54

Slide 54 text

master TAG/v1.1 login HEAD my poor friend worked for 3 long days

Slide 55

Slide 55 text

master TAG/v1.1 login HEAD $ git checkout master when he moved to another branch, all commits were gone

Slide 56

Slide 56 text

master TAG/v1.1 login $ git reflog aa67e3a2c HEAD@{0}: rebase finished: returning to refs/heads/fix/java-sql-Date-violates-LSR aa67e3a2c HEAD@{1}: rebase: fixes UnsupportedOperationException while calling toIstant() method of java.sql.Date a45f3c4e5 HEAD@{2}: rebase: checkout develop 630ddad6e HEAD@{3}: checkout: moving from develop to fix/java-sql-Date-violates-LSR b26cf7a1a HEAD@{4}: rebase: checkout develop 630ddad6e HEAD@{5}: checkout: moving from develop to fix/java-sql-Date-violates-LSR b26cf7a1a HEAD@{6}: pull: Fast-forward 8b59f8f50 HEAD@{7}: checkout: moving from fix/java-sql-Date-violates-LSR to develop HEAD

Slide 57

Slide 57 text

$ git reflog 630ddad6e the one we are searching for master TAG/v1.1 login aa67e3a2c HEAD@{0}: rebase finished: returning to refs/heads/fix/java-sql-Date-violates-LSR aa67e3a2c HEAD@{1}: rebase: fixes UnsupportedOperationException while calling toIstant() method of java.sql.Date a45f3c4e5 HEAD@{2}: rebase: checkout develop 630ddad6e HEAD@{3}: checkout: moving from develop to fix/java-sql-Date-violates-LSR b26cf7a1a HEAD@{4}: rebase: checkout develop 630ddad6e HEAD@{5}: checkout: moving from develop to fix/java-sql-Date-violates-LSR b26cf7a1a HEAD@{6}: pull: Fast-forward 8b59f8f50 HEAD@{7}: checkout: moving from fix/java-sql-Date-violates-LSR to develop HEAD

Slide 58

Slide 58 text

master typofix TAG/v1.1 login $ git branch typofix 630ddad6e HEAD

Slide 59

Slide 59 text

master typofix TAG/v1.1 login $ git branch typofix 630ddad6e KEEP CALM, NOTHING WILL BE LOST HEAD

Slide 60

Slide 60 text

LEMi ORHAN ERGiN agile software craftsman co-founder @ craftbase /lemiorhan lemiorhanergin.com @lemiorhan ANTIPATTERN DANGER thank you all! Feedback: bit.ly/lemiorhan