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

Git Anti Patterns

Git Anti Patterns

These are the slides that I presented at XP Days Ukraine on Nov 10, 2017.

Lemi Orhan Ergin

November 10, 2017
Tweet

More Decks by Lemi Orhan Ergin

Other Decks in Programming

Transcript

  1. $ git anti-patterns how to mess up with git and

    love it again LEMi ORHAN ERGiN Agile Software Craftsman, iyzico /lemiorhan @lemiorhan lemiorhanergin.com bit.ly/lemiorhan
  2. /lemiorhan lemiorhanergin.com @lemiorhan LEMi ORHAN ERGiN agile software craftsman @

    iyzico ex-Sony, ex-eBay founder of Turkish Software Craftsmanship Community
  3. git is powerful but you have to know using it

    properly because of its internal structure
  4. Are you using git if all you do is commit-push-pull

    use dropbox instead ANTIPATTERN DANGER as if it is dropbox ? 1 DROPBOX-ISH GIT ANTI-PATTERN
  5. the way it keeps FILES & FOLDERS .git folder, aka

    repository working copy staging area objects database the way it keeps REFERENCES directed acyclic graph keeping snapshots traversing graph branches, tags, heads git has 2 mechanisms
  6. Source Code Working Copy $ git init Object Database .git

    Folder / Object Database Cache Staging Area / The Index initializing repo
  7. Source Code Working Copy $ git init --bare Object Database

    .git Folder / Object Database Cache Staging Area / The Index Remote Upstream Repo / Remote Repo Server initializing bare repo
  8. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy $ git add . preparing commits
  9. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy $ git add . preparing commits
  10. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy $ git commit -m “initial commit” commi!ing
  11. $ git commit -m “initial commit” commi!ing folder folder folder

    file file file commit branch HEAD For more details, refer to book Git Internals by Scott Chacon
  12. folder folder folder file file file commit $ git commit

    -m “second commit” commi!ing folder commit branch HEAD folder file folder For more details, refer to book Git Internals by Scott Chacon
  13. folder folder folder file file file commit $ git commit

    -m “third commit” commi!ing folder commit folder file folder folder commit branch HEAD file For more details, refer to book Git Internals by Scott Chacon
  14. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy $ git commit -m “initial commit” commi!ing
  15. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy $ git remote add origin http://upstream.repo $ git push -u origin master pushing to remote
  16. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy new changes from others are pushed
  17. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy $ git fetch fetching changes
  18. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy $ git merge FETCHED_HEAD updating working copy
  19. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy $ git pull git fetch + git merge ge!ing changes to source code
  20. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy want to update last commit
  21. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy $ git reset --soft $ git commit --amend / so" reseting cannot be reached Only the cache for the commit you reseted is removed from staging area for your current branch
  22. folder folder folder file file file commit folder commit folder

    file folder folder commit branch HEAD file For more details, refer to book Git Internals by Scott Chacon $ git reset --soft $ git commit --amend / so" reseting
  23. folder folder folder file file file commit folder commit folder

    file folder folder commit branch HEAD file For more details, refer to book Git Internals by Scott Chacon $ git reset --soft $ git commit --amend / so" reseting
  24. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy want to squash or change last commits
  25. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy $ git reset --mixed mixed reseting cannot be reached entries for commits, files and folders are removed from staging area
  26. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy want to get rid of last commits
  27. Object Database .git Folder / Object Database Cache Staging Area

    / The Index Remote Upstream Repo / Remote Repo Server Source Code Working Copy $ git reset --hard hard reseting cannot be reached removed from staging area removed from working copy
  28. are you brave enough to jump to any commit ?

    jump to a branch create a branch from a commit create a branch from a tag ANTIPATTERN DANGER $ git checkout feature/PA-121 $ git checkout -b fix/missing-sign-parameter 2449be8 $ git checkout -b hotfix/v1.1 tags/v1 2 BROKEN TIME MACHINE ANTI-PATTERN
  29. before merging do you validate commits back to source ?

    ANTIPATTERN DANGER code review, continuous integration, automated testing… 4 TOO LATE TO VALIDATE ANTI-PATTERN
  30. merge and unmerge do you o!en need to just before

    releases ? ANTIPATTERN DANGER 5 CHERRY-PICK OBSSESSION ANTI-PATTERN
  31. merge and unmerge do you o!en need to just before

    releases ? master HEAD TAG/v13 version 14 $ git cherry-pick Every-Single-Commit-We-Want-To-Deploy
  32. the commit graph ? do you fully understand topic and

    shared branches, tracking branches, tags, HEADs, merge commits, reverted commits…
  33. STEP 0 split your big feature into mini shippable tasks

    master HEAD TOPIC ORIGIN/master refactorings tasks, like rest endpoints red-green-refactor each task will have a branch, not a feature
  34. STEP 1 commit early commit o!en no need to compile

    no need for CI it’s only for versioning do not push master HEAD TOPIC ORIGIN/master
  35. always pull with rebase $ git pull --rebase origin master

    to get forced pushes securely to rebase your commits master HEAD TOPIC STEP 2 ORIGIN/master and do it o!en!
  36. $ git pull --rebase origin master master HEAD TOPIC STEP

    2 ORIGIN/master always pull with rebase to get forced pushes securely to rebase your commits and do it o!en!
  37. $ git pull --rebase origin master master HEAD TOPIC STEP

    2 ORIGIN/master if you branch is pushed already $ git push -f always pull with rebase to get forced pushes securely to rebase your commits and do it o!en!
  38. $ git pull --rebase origin master master HEAD TOPIC STEP

    2 ORIGIN/master if you branch is pushed already $ git push -f Sync source branch a!erwards $ git fetch origin master:master always pull with rebase to get forced pushes securely to rebase your commits and do it o!en!
  39. perfect later make it single commit $ git reset HEAD~3

    $ git rebase -i HEAD~3 $ git merge --squash HEAD TOPIC STEP 3 ORIGIN/master tests are passing app is working code is reviewed (*) master
  40. HEAD TOPIC STEP 3 ORIGIN/master perfect later make it single

    commit tests are passing app is working code is reviewed (*) master $ git reset HEAD~3 $ git rebase -i HEAD~3 $ git merge --squash
  41. Use feature flags/toggles HEAD TOPIC STEP 4 ORIGIN/master if feature

    should be disabled merge back to source $ git checkout master $ git merge topic master
  42. Use feature flags/toggles master HEAD TOPIC STEP 4 ORIGIN/master if

    feature should be disabled merge back to source $ git checkout master $ git merge topic
  43. Continuous Integration validates master branch continuously master HEAD TOPIC ORIGIN/master

    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 TRUNK-BASED DEVELOPMENT let's make git great again 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
  44. 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 7 ANTIPATTERN DANGER
  45. stop adding prevent commits from being big ball of muds

    every change OMNIBUS BILL ANTI-PATTERN 8 ANTIPATTERN DANGER
  46. stop adding prevent commits from being big ball of muds

    every change local change sets at JetBrains IDEs
  47. messages are read! # WHAT # <issue id> (this commit

    will...) <subject> # 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 com t m i F*CKING COMMIT MESSAGES ANTI-PATTERN 9 ANTIPATTERN DANGER
  48. TOPIC master c1 c2 c3 c4 c7 HEAD c5 c6

    c5 c6 git:(topic) $ git rebase master rebase how really works command
  49. TOPIC master c1 c2 c3 c4 c7 HEAD c5 c6

    c5 c6 git:(topic) $ git rebase master rebase how really works command
  50. TOPIC master c1 c2 c3 c4 c7 HEAD c5 c6

    c5 c6 git:(topic) $ git rebase master rebase how really works command
  51. TOPIC master c1 c2 c3 c4 c7 HEAD c5 c6

    c5 c6 c5' REPLAY #1 git:(topic) $ git rebase master orig_HEAD rebase how really works command
  52. TOPIC master c1 c2 c3 c4 c7 c5 c6 c5

    c6 c5' c6 c6' git:(topic) $ git rebase master HEAD REPLAY #2 orig_HEAD rebase how really works command
  53. TOPIC master c1 c2 c3 c4 c7 HEAD c5 c6

    c5 c6 c5' c6 c6' git:(topic) $ git rebase master REWIND orig_HEAD rebase how really works command
  54. master c1 c2 c3 c4 c7 c5' c6 c6' git:(topic)

    $ git rebase master TOPIC HEAD REWIND rebase how really works command
  55. master HEAD TOPIC $ git merge topic merge to branches:

    merge with squash: squash and rebase: $ git merge topic --squash $ git reset HEAD~8 $ git commit $ git rebase master
  56. 1. DROPBOX-ISH GIT 2. BROKEN TIME MACHINE 3. LONG LIVING

    BRANCHES 4. TOO LATE TO VALIDATE 5. CHERRY-PICK OBSSESSION 6. DEATH ON COMMIT GRAPH 7. BUTTON ADDICT 8. TRASH HOUSE 9. OMNIBUS BILL 10. F*CKING 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. LIVING AT DETACHED HEAD STATE
  57. master TAG/v1.1 login HEAD DETACHED HEAD STATE $ git checkout

    cecd95914 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. LIVING AT DETACHED HEAD STATE ANTI-PATTERN 11 ANTIPATTERN DANGER
  58. master TAG/v1.1 login DETACHED HEAD STATE $ git rebase (and

    conflicts happen) $ git checkout HEAD~2 $ git checkout 43e3ab01 $ git checkout tags/v1.1 WHEN IT HAPPENS HEAD
  59. master TAG/v1.1 login HEAD $ 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
  60. $ git reflog 630ddad6e the one we are searching for

    master TAG/v1.1 login HEAD 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
  61. LEMi ORHAN ERGiN agile software craftsman @ iyzico /lemiorhan lemiorhanergin.com

    @lemiorhan ANTIPATTERN DANGER thank you all! Feedback: bit.ly/lemiorhan