$30 off During Our Annual Pro Sale. View Details »

More Git and GitHub Secrets

More Git and GitHub Secrets

This talk covers both Git and GitHub: different tricks I've picked up after three years at GitHub, helpful advice on common gripes I've seen in support tickets and tweets, and just general nifty things that make you a faster, more capable technologist.

Zach Holman

July 24, 2013
Tweet

More Decks by Zach Holman

Other Decks in Programming

Transcript

  1. secrets
    Git
    GitHub
    &

    View Slide

  2. View Slide

  3. git branch -D local-branch
    git push origin :local-branch

    View Slide

  4. Much like
    James Cameron’s Avatar™,
    Git doesn’t make any
    goddamn sense

    View Slide

  5. This talk throws
    a ton of stuff at you

    View Slide

  6. This talk throws
    a ton of stuff at you
    (Not unlike James Cameron’s Avatar™, btw)

    View Slide

  7. Learn the bits that make you
    more productive

    View Slide

  8. View Slide


  9. View Slide

  10. secrets
    Git
    GitHub
    &

    View Slide

  11. merge strategies

    View Slide

  12. strategy defaults:
    one head: recursive
    multiple heads: octopus
    merge strategies

    View Slide

  13. merge strategies
    git merge master -s strategy

    View Slide

  14. git merge master -s ours
    merge strategies

    View Slide

  15. git merge master -s ours
    “Give me master, but my final state
    should match my current branch”
    merge strategies

    View Slide

  16. git merge master -s ours
    Great for when your long-running
    branch will supersede master
    merge strategies

    View Slide

  17. git merge master \
    -s recursive
    merge strategies

    View Slide

  18. git merge master \
    -s recursive -X patience
    merge strategies
    Be er line matching for logical groups

    View Slide

  19. merge strategies — patience
    {
    :a => :b
    }

    View Slide

  20. {
    :a => :b
    }
    {
    :c => :d
    }
    merge strategies — patience

    View Slide

  21. {
    :a => :b
    +}
    +
    +{
    + :c => :d
    }
    merge strategies — patience

    View Slide

  22. {
    :a => :b
    }
    +{
    + :c => :d
    +}
    merge strategies — patience

    View Slide

  23. git merge master \
    -s recursive -X patience
    merge strategies
    Can also set as a global option

    View Slide

  24. merge strategies
    › man git-merge
    # look at “Merge Strategies”

    View Slide

  25. The
    second-order-diff
    trick

    View Slide

  26. the second-order-diff trick
    Tom Moertel
    ( cl.ly/QNaG )

    View Slide

  27. the second-order-diff trick
    Goal: transform strings
    with a regex in project

    View Slide

  28. the second-order-diff trick
    Approach: re-run git diff
    and git reset until the regex
    is correct

    View Slide

  29. the second-order-diff trick
    Problem: it sucks to
    review the diff each time

    View Slide

  30. the second-order-diff trick
    Solution: stash, then
    diff against stash{0}

    View Slide

  31. the second-order-diff trick
    › git status
    # clean

    View Slide

  32. the second-order-diff trick
    › ./run-regex-script

    View Slide

  33. the second-order-diff trick
    › git diff
    # review and check output

    View Slide

  34. the second-order-diff trick
    › git stash
    # stash your reviewed diff

    View Slide

  35. the second-order-diff trick
    › ./run-regex-script

    View Slide

  36. the second-order-diff trick
    › git diff stash{0}
    # only incremental changes

    View Slide

  37. the second-order-diff trick
    Find and replace in projects
    without worrying

    View Slide

  38. emoji diffs

    View Slide

  39. emoji diffs
    Yeah this is
    important

    View Slide

  40. emoji diffs
    Git diffs
    unicode poorly:

    View Slide

  41. emoji diffs

    View Slide

  42. emoji diffs
    Git uses less
    as its pager

    View Slide

  43. emoji diffs
    git --no-pager diff

    View Slide

  44. emoji diffs

    View Slide

  45. emoji diffs

    View Slide

  46. emoji diffs

    View Slide

  47. emoji diffs

    View Slide

  48. git stripspace

    View Slide

  49. git stripspace
    Fixes horrible coworkers
    and contributors

    View Slide

  50. git stripspace
    Strips trailing whitespace,
    collapses newlines,
    adds a final newline

    View Slide

  51. git stripspace
    git stripspace < file

    View Slide

  52. git stripspace
    echo “hi \n” | git stripspace

    View Slide

  53. git stripspace
    Run this in your editor
    a er file saves

    View Slide

  54. git diff --check

    View Slide

  55. git diff --check
    Fixes horrible you.

    View Slide

  56. run.sh:1: trailing whitespace.
    +echo “hi” .
    git diff --check

    View Slide

  57. run.sh:1: space before tab in indent.
    + ls -la
    git diff --check

    View Slide

  58. git diff --cached

    View Slide

  59. git diff --cached
    git diff only diffs
    unstaged changes

    View Slide

  60. git diff --cached
    Shows staged
    (but uncommi ed)
    changes

    View Slide

  61. HOT, HOT,
    TRIVIA
    BREAK

    View Slide

  62. Which of these
    commit messages
    actually happened
    on GitHub?

    View Slide

  63. 1. A reasoned argument,
    citing sources
    2. A 500MB db dump

    View Slide

  64. 1. A reasoned argument,
    citing sources
    2. A 500MB db dump

    View Slide

  65. “Why is my
    repository slow?”

    View Slide

  66. git merge --abort

    View Slide

  67. git merge --abort
    Aborts a conflicted merge

    View Slide

  68. git merge --abort
    Resets your tree

    View Slide

  69. git merge -m “message”

    View Slide

  70. git merge -m
    Like commit -m but
    populates the merge
    commit

    View Slide

  71. git merge --no-commit

    View Slide

  72. git merge --no-commit
    Merges without a
    commit message

    View Slide

  73. git status --ignored

    View Slide

  74. git status --ignored
    Shows the status of
    everything you’re
    ignoring

    View Slide

  75. --assume-unchanged

    View Slide

  76. --assume-unchanged
    Temporarily
    ignore a file

    View Slide

  77. --assume-unchanged
    git update-index \
    --assume-unchanged \
    path_to_file

    View Slide

  78. --assume-unchanged
    git update-index \
    --no-assume-unchanged \
    path_to_file

    View Slide

  79. proper messages

    View Slide

  80. proper messages
    Linus has thoughts on
    your commit messages

    View Slide

  81. proper messages
    git commit -m “fixes shit”

    View Slide

  82. proper messages
    git commit -m “fixes shit”
    is not what he had in mind

    View Slide

  83. proper messages
    A good commit has:

    View Slide

  84. proper messages
    Short summary (title)
    A longer description of
    the change follows.

    View Slide

  85. proper messages
    Short summary (title) < 50c

    View Slide

  86. proper messages
    Short summary (title)
    A longer description of
    the change follows.
    < 50c

    View Slide

  87. proper messages
    Short summary (title)
    A longer description of
    the change follows.
    < 50c
    wrap at 72c

    View Slide

  88. proper messages

    View Slide

  89. proper messages
    git-commit helps you
    write perfect messages

    View Slide

  90. proper messages

    View Slide

  91. proper messages
    50c

    View Slide

  92. proper messages

    View Slide

  93. proper messages
    wraps at 72c

    View Slide

  94. proper messages
    Assumes your
    $EDITOR is vim

    View Slide

  95. proper messages
    export EDITOR=vim

    View Slide

  96. proper messages
    Assumes you have
    syntax highlighting on

    View Slide

  97. proper messages
    syntax on
    ~/.vimrc

    View Slide

  98. proper messages
    Assumes you have
    plugin indenting on

    View Slide

  99. proper messages
    filetype indent plugin on
    ~/.vimrc

    View Slide

  100. secrets
    Git
    GitHub
    &

    View Slide

  101. canonical URLs

    View Slide

  102. View Slide

  103. View Slide

  104. y
    press

    View Slide

  105. press y

    View Slide

  106. y
    This page
    won’t change,
    even if the branch does

    View Slide

  107. curlable
    public keys

    View Slide

  108. h ps:/
    / /holman.keys

    View Slide

  109. Plaintext,
    non-authed
    access to public keys
    /user.keys

    View Slide

  110. Programmatically
    add SSH keys
    /user.keys

    View Slide

  111. fetching pulls

    View Slide

  112. fetching pulls
    Accepting a Pull Request:
    Add a remote, fetch branch, merge

    View Slide

  113. fetching pulls
    Lots of boring commands

    View Slide

  114. fetching pulls
    GitHub stores all Pull Requests
    in your repository

    View Slide

  115. fetching pulls
    This means we can track code
    even if the fork is deleted

    View Slide

  116. fetching pulls
    You can abuse this, too!

    View Slide

  117. fetching pulls
    git fetch origin pull/id/head:name

    View Slide

  118. fetching pulls
    git fetch origin pull/12/head:pr

    View Slide

  119. fetching pulls
    git fetch origin pull/12/head:pr
    fetches Pull Request #12 into a
    branch named “pr”

    View Slide

  120. fetching pulls
    Automate this within
    helper scripts or an alias

    View Slide

  121. live updates

    View Slide

  122. View Slide

  123. View Slide

  124. View Slide

  125. View Slide

  126. HOT, HOT,
    TRIVIA
    BREAK

    View Slide

  127. Most frequent
    Emoji used on
    GitHub:

    View Slide

  128. #5
    :clap:

    View Slide

  129. #4
    :+1:

    View Slide

  130. #3
    :-1:

    View Slide

  131. #2
    :sparkles:

    View Slide

  132. #1
    :shipit:

    View Slide

  133. quick quotes

    View Slide

  134. quick quotes
    Markdown uses .
    for blockquotes
    >

    View Slide

  135. quick quotes

    View Slide

  136. quick quotes
    r
    Highlight and press .

    View Slide

  137. quick quotes

    View Slide

  138. quick quotes

    View Slide

  139. browse stars

    View Slide

  140. h p:/
    / /stars / brianmario

    View Slide

  141. View Slide

  142. web flow

    View Slide

  143. web flow
    You can do a lot without
    leaving the browser

    View Slide

  144. web flow
    Documentation, prose,
    quick fixes, switching
    away from nosql

    View Slide

  145. web flow

    View Slide

  146. web flow

    View Slide

  147. web flow

    View Slide

  148. web flow

    View Slide

  149. web flow

    View Slide

  150. web flow

    View Slide

  151. web flow
    Frees you from git clone

    View Slide

  152. issue autocomplete

    View Slide

  153. issue autocomplete
    Type , get a search
    #

    View Slide

  154. View Slide

  155. View Slide

  156. View Slide

  157. View Slide

  158. repo redirects

    View Slide

  159. repo redirects
    Rename your repository
    and GitHub will redirect
    old URLs

    View Slide

  160. in-repo licensing

    View Slide

  161. View Slide

  162. in-repo licensing
    You can add licenses to
    existing repos, too

    View Slide

  163. in-repo licensing

    View Slide

  164. in-repo licensing

    View Slide

  165. in-repo licensing
    (also works for .gitignore)

    View Slide

  166. file finder

    View Slide

  167. file finder
    Type , find in project
    t

    View Slide

  168. file finder

    View Slide

  169. task lists

    View Slide

  170. task lists
    Use issues and pulls as
    todo lists

    View Slide

  171. task lists
    - [ ] Use NoSQL
    - [ ] Use today's trendiest language
    - [ ] Do what our VC tells us
    - [ ] Comment on Hacker News
    - [ ] Profit

    View Slide

  172. task lists

    View Slide

  173. task lists

    View Slide

  174. task lists
    - [x] Use NoSQL
    - [x] Use today's trendiest language
    - [x] Do what our VC tells us
    - [x] Comment on Hacker News
    - [ ] Profit

    View Slide

  175. task lists

    View Slide

  176. fork URLs

    View Slide

  177. fork URLs

    View Slide

  178. View Slide

  179. fork URLs
    h ps:/
    / /user / repo / fork

    View Slide

  180. View Slide

  181. fork URLs
    README links

    View Slide

  182. fork URLs

    View Slide

  183. Remember:

    View Slide

  184. Git is probably terrible

    View Slide

  185. But it’s also neato

    View Slide

  186. Thanks!

    View Slide