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

The Git Historian

The Git Historian

Your git repository’s log wants to tell you a story, with valuable clues about how your software became the thing of beauty (or horrible mess) that it is today. You just need to know how and where to look. In this talk, we’ll dig into a project’s history to learn how it evolved, using only the git command line utility to search through commits–no extra software required! To close, we’ll discuss how to leave good clues for future historians.

Aaron Sumner

May 13, 2017
Tweet

More Decks by Aaron Sumner

Other Decks in Programming

Transcript

  1. The Git Historian
    Aaron Sumner

    View Slide

  2. View Slide

  3. Disclaimers
    • Mileage may vary
    • You probably know something I don’t!
    • Links to slides and references at the end

    View Slide

  4. Based on a true story.

    View Slide

  5. for development with backup from Webrick"
    $n=Module.new{extend
    Rack;a,D,S,q=Rack::Builder.new,Object.method(:
    define_method),/@@ *([^\n]+)\n(((?!@@)
    [^\n]*\n)*)/m
    %w[get post put delete].map{|m|D.(m){|u,&b|
    a.map(u){run->(e){[200,{"Content-Type"=>"text/
    html"},[a.instance_eval(&b)]]}}}}
    Tilt.mappings.map{|k,v|D.(k){|n,*o|$t||
    =(h=$u._jisx0301("hash,
    please");File.read(caller[0][/^[^:]
    +/]).scan(S){|a,b|h[a]=b};h);v[0].new(*o)
    {n=="#{n}"?n:$t[n.to_s]}.render(a,o[0].try(:
    [],:locals)||{})}}
    %w[set enable disable configure helpers use
    register].map{|m|D.(m){|*_,&b|b.try :
    []}};END{Rack::Handler.get("webrick").run(a,Po
    rt:$z){|s|$r=s}}
    !

    View Slide

  6. git blame lib/framework.rb

    View Slide

  7. 55a43a7 Fix some stuff
    "

    View Slide

  8. View Slide

  9. View Slide

  10. #

    View Slide

  11. commit
    55a43a73b1f7be5f410f81e58ec1df24a1792bd5
    Author: Aaron Sumner
    Date: Mon Mar 20 19:32:25 2017 -0500
    Fix some stuff
    $

    View Slide

  12. What went wrong?

    View Slide

  13. %
    %

    View Slide

  14. %

    View Slide

  15. What’s the story?

    View Slide

  16. The Git Historian
    &
    '

    View Slide

  17. Digging through
    history '

    View Slide

  18. thoughtbot/clearance

    View Slide

  19. git blame file
    git show SHA

    View Slide

  20. View Slide

  21. View Slide

  22. View Slide

  23. View Slide

  24. View Slide

  25. git log

    View Slide

  26. View Slide

  27. View Slide

  28. View Slide

  29. View Slide

  30. View Slide

  31. View Slide

  32. View Slide

  33. View Slide

  34. View Slide

  35. View Slide

  36. View Slide

  37. View Slide

  38. View Slide

  39. View Slide

  40. View Slide

  41. View Slide

  42. View Slide

  43. View Slide

  44. Useful flags for git log
    git log --reverse
    git log --oneline
    git log --patch (-p)
    git log -p path/to/file
    git log -p -S term
    git log --grep term
    git log --stat
    man git-log

    View Slide

  45. Pager (less -S)

    View Slide

  46. View Slide

  47. View Slide

  48. View Slide

  49. View Slide

  50. View Slide

  51. View Slide

  52. View Slide

  53. View Slide

  54. Searching git log
    /pattern
    ?pattern
    n for next instance
    N for previous instance
    j/k one line down/up
    gg beginning of output
    G end of output
    /^commit
    man less

    View Slide

  55. Leaving a trail
    &

    View Slide

  56. Atomic commits

    View Slide

  57. git add -am “fix it”
    %

    View Slide

  58. git add -p
    git commit
    (

    View Slide

  59. View Slide

  60. View Slide

  61. View Slide

  62. View Slide

  63. View Slide

  64. View Slide

  65. View Slide

  66. Tips for a clean commit
    • Include the code, corresponding documentation,
    and corresponding test coverage
    • Separate out refactoring that could obfuscate the
    feature change
    • Keep other corrections in separate commits

    View Slide

  67. “The seven rules of a great
    commit message”
    1. Separate subject from body with a blank line
    2. Limit the subject line to 50 characters
    3. Capitalize the subject line
    4. Do not end the subject line with a period
    5. Use the imperative mood in the subject line
    6. Wrap the body at 72 characters
    7. Use the body to explain what and why vs. how

    View Slide

  68. Rebasing

    View Slide


  69. View Slide

  70. git rebase commit
    git rebase branch
    git rebase tag

    View Slide

  71. git rebase --interactive
    commit

    View Slide

  72. git rebase --interactive
    --autosquash commit

    View Slide

  73. View Slide

  74. View Slide

  75. View Slide

  76. View Slide

  77. View Slide

  78. View Slide

  79. View Slide

  80. View Slide

  81. View Slide

  82. View Slide

  83. View Slide

  84. View Slide

  85. View Slide

  86. View Slide

  87. View Slide

  88. View Slide

  89. View Slide

  90. View Slide

  91. View Slide

  92. View Slide

  93. View Slide

  94. View Slide

  95. View Slide

  96. View Slide

  97. View Slide

  98. git rebase --interactive
    --autosquash
    git commit --fixup sha
    git commit --squash sha -m “Additional
    information.”

    View Slide

  99. Summary

    View Slide

  100. ' git blame
    git show
    git log

    View Slide

  101. git add -p
    git rebase
    good messages!
    &

    View Slide

  102. speakerdeck.com/ruralocity
    www.aaronsumner.com

    View Slide

  103. References
    • https://everydayrails.com/2017/01/02/git-command-line-log-search.html
    • http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
    • https://chris.beams.io/posts/git-commit/
    • http://johnkary.net/blog/git-add-p-the-most-powerful-git-feature-youre-not-
    using-yet/
    • https://technosorcery.net/blog/2010/02/fun-with-the-upcoming-1-7-release-of-
    git-rebase-interactive-autosquash/
    • https://github.com/rkh/almost-sinatra
    • https://github.com/thoughtbot/clearance
    • http://emojipedia.org/

    View Slide