Upgrade to Pro — share decks privately, control downloads, hide ads and more …

10 Git Anti Patterns You Should be Aware of

10 Git Anti Patterns You Should be Aware of

This is the slide deck I presented at ITAKE UnConf 2018.

Git is one of the most powerful tool in developers' toolbox. If you use it correctly, it dramatically increases productivity of developers and eliminates the waste products continuously. Developers cultivate a development culture on top Git most of the time.

It's powerful but its power is untamed. Many teams fall into several traps of misusing commands and therefore feel uncomfortable while using Git. We mess up Git history, the codebase and the whole preferred branching strategy in seconds. We use branches, merge/rebase strategies, creating commits in wrong ways. Even we never take committing paradigms into account while using Git.

As a software craftsman, I've been using Git for years and I've already educated Git to hundreds of developers in all levels. I'm so lucky; I had a chance to experience huge amount of anti-patterns in time. In this talk, I will talk about what those anti-patterns are and what should we do in order not to fall into them.

Lemi Orhan Ergin

June 07, 2018
Tweet

More Decks by Lemi Orhan Ergin

Other Decks in Programming

Transcript

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

    View full-size slide

  2. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  5. 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

    View full-size slide

  6. are you brave enough to
    jump to any commit ?

    View full-size slide

  7. 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.

    View full-size slide

  8. 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?

    View full-size slide

  9. do you have
    loooooong living
    topic branches ?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. cherry-pick
    do you use
    to prepare releases ?

    View full-size slide

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

    View full-size slide

  14. 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

    View full-size slide

  15. the commit graph ?
    do you fully understand
    when you read

    View full-size slide

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

    View full-size slide

  17. 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

    View full-size slide

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

    View full-size slide

  19. 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

    View full-size slide

  20. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  27. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  31. 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

    View full-size slide

  32. Git commands?
    is it hard to learn

    View full-size slide

  33. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  36. 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

    View full-size slide

  37. stop adding every change
    partial add : git add -p

    View full-size slide

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

    View full-size slide

  39. # 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

    View full-size slide

  40. 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?

    View full-size slide

  41. 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

    View full-size slide

  42. 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

    View full-size slide

  43. 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

    View full-size slide

  44. 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

    View full-size slide

  45. 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

    View full-size slide

  46. 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

    View full-size slide

  47. 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

    View full-size slide

  48. 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

    View full-size slide

  49. 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

    View full-size slide

  50. 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

    View full-size slide

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

    View full-size slide

  52. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  55. 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

    View full-size slide

  56. $ 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide