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

Git and GitHub Secrets

Git and GitHub Secrets

This talk covers both Git and GitHub: different tricks I've picked up after two 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.

http://zachholman.com/talk/git-github-secrets

Zach Holman

May 22, 2012
Tweet

More Decks by Zach Holman

Other Decks in Programming

Transcript

  1. GIT&GITHUB&SECRETS

    View Slide

  2. NO
    FORKING
    HOLMAN
    @
    LOST
    YO QUIT READING THIS SHIT

    View Slide

  3. githu

    View Slide

  4. I AM DEFINITELY
    NOT A SMART GUY

    View Slide

  5. LUCKILY I HANG
    AROUND THIS CREW A LOT

    View Slide

  6. THIS IS MOSTLY
    WHAT GETS DISCUSSED

    View Slide

  7. BUT SOMETIMES ALSO GIT THINGS

    View Slide

  8. LEMME THROW A BUNCH
    AT YOU ALL AT ONCE

    View Slide

  9. SECRETS

    View Slide

  10. SOMETIMES
    FEATURES
    DON’T MAKE
    IT INTO THE UI

    View Slide

  11. HIDDEN HTML
    DIFF TOOLS
    EMAIL HACKS
    DEEP LINKING
    CLEVER APIS
    MEANING OF LIFE

    View Slide

  12. EXPERIMENTATION

    View Slide

  13. I’d use this all the time!
    But Holman,

    WHY DON’T YOU JUST ADD A BUTTON?
    You ass.”

    View Slide

  14. lemme mock that up for u

    View Slide

  15. View Slide

  16. aim for simplicity
    BUT STAY FLEXIBLE

    View Slide

  17. GITHUB

    View Slide

  18. .DIFF & .PATCH

    View Slide

  19. ADD OR TO URLS:
    .DIFF .PATCH
    COMPARE VIEWS
    PULL REQUESTS
    COMMIT PAGES
    .DIFF & .PATCH

    View Slide

  20. IGNORE WHITESPACE
    ADD TO ANY DIFF URL
    ?w=1

    View Slide

  21. SUBVERSION
    EVERY GIT REPOSITORY
    SVN REPOSITORY
    is also a

    View Slide

  22. SUBVERSION
    SVN/GIT SERVICE LAYER

    View Slide

  23. SUBVERSION
    SVN CALLS
    TRANSLATE INTO
    GIT CALLS ON OUR SERVERS

    View Slide

  24. SUBVERSION
    SVN CHECKOUT GITHUB.COM/HOLMAN/BOOM

    View Slide

  25. HTTP & SSH
    ZOMG SNEAKY
    STEALTH CHANGES

    View Slide

  26. HTTP & SSH
    PREVIOUSLY

    View Slide

  27. HTTP & SSH
    NEW HOTNESS

    View Slide

  28. HTTP & SSH
    WE USE SMART HTTP
    (EFFICIENT SERVERSIDE PACKFILE GENERATION)

    View Slide

  29. HTTP & SSH
    WE USE SMART HTTP
    (EFFICIENT SERVERSIDE PACKFILE GENERATION)
    CORPORATE FIREWALLS
    (OH NUTS)

    View Slide

  30. HTTP & SSH
    WE USE SMART HTTP
    (EFFICIENT SERVERSIDE PACKFILE GENERATION)
    CORPORATE FIREWALLS
    (OH NUTS)
    NO KEY GENERATION
    (WINDOWS, NON-NECKBEARDS)

    View Slide

  31. HTTP & SSH
    LOLWAT I DONT CARE

    View Slide

  32. HTTP & SSH
    › git push origin master
    Username for 'github.com':
    FUUUUUUUUUUUUUUUUU

    View Slide

  33. HTTP & SSH
    CREDENTIAL CACHING IN GIT 1.7.9
    HELP.GITHUB.COM/ARTICLES/SET-UP-GIT
    (INSTALLED BY HOMEBREW)

    View Slide

  34. HTTP & SSH
    STICKY SELECTOR
    CLICK THIS,
    GITHUB REMEMBERS

    View Slide

  35. GIT CLONE HTTPS://GITHUB.COM/HOLMAN/BOOM
    CLONING WITHOUT .GIT
    GIT CLONE HTTPS://GITHUB.COM/HOLMAN/BOOM.GIT

    View Slide

  36. GITHUB HD™
    WITH OUR NEW ICON SET, WE’RE
    SUPER-ZOOMABLE
    (⌘++ on a Mac or pinch on iOS)

    View Slide

  37. GITHUB HD™

    View Slide

  38. GITHUB HD™

    View Slide

  39. GITHUB HD™

    View Slide

  40. GITHUB HD™

    View Slide

  41. AUDITING
    PUBLIC KEYS
    GITHUB.COM/SETTINGS/SECURITY
    REPOSITORIES
    ·

    View Slide

  42. OCTOCAT
    CHEAP
    ISTOCKPHOTO
    ILLUSTRATION FOR
    OUR ERROR PAGE

    View Slide

  43. OCTOCAT
    THEN PEOPLE
    LIKED HIM

    View Slide

  44. OCTOCAT
    BECAME SORT OF A
    GITHUB MASCOT

    View Slide

  45. OCTOCAT
    HOLY CRAP WE
    SHOULD GET
    EXCLUSIVE RIGHTS

    View Slide

  46. OCTOCAT
    DOZENS OF OCTOCATS
    OCTODEX.GITHUB.COM

    View Slide

  47. GIT.IO
    GITHUB.COM URL SHORTENER

    View Slide

  48. GIT.IO
    git.io/nxVVig
    SHELL SCRIPT

    View Slide

  49. GIT.IO
    › gitio
    USAGE
    http://git.io/nxVVig

    View Slide

  50. OS X 

    View Slide

  51. WINDOWS

    View Slide

  52. LINGUIST
    LANGUAGE
    detection
    syntax highlighting
    vendored files

    View Slide

  53. LINGUIST
    GITHUB.COM/GITHUB/LINGUIST
    OPEN SOURCE AT:

    View Slide

  54. EMAIL REPLIES
    REPLY TO AN EMAIL! SRSLY!

    View Slide

  55. ABUSING GIST

    View Slide

  56. ABUSING GIST
    AIN’T JUST FOR SNIPPETS

    View Slide

  57. @NRRRDCORE
    Julie Horvath
    ABUSING GIST
    DESIGNERS

    View Slide

  58. ABUSING GIST
    DESIGNERS

    View Slide

  59. ABUSING GIST
    DESIGNERS
    PROTOTYPING TOOL
    COMMENTS
    SCREENSHOTS
    CODE

    View Slide

  60. ABUSING GIST
    DEVELOPERS

    View Slide

  61. ABUSING GIST
    DEVELOPERS
    GISTS ARE FULL REPOS

    View Slide

  62. jeffkreeftmeijer.com/2011/microgems-five-minute-rubygems
    ABUSING GIST
    DEVELOPERS
    MICROGEMS

    View Slide

  63. aka GEM IN A GIST
    INCLUDE A GEMSPEC IN YOUR GIST
    ABUSING GIST
    DEVELOPERS

    View Slide

  64. gem 'test-spec-mini',
    :git => 'git://gist.github.com/1806986.git'
    GEMFILE
    ABUSING GIST
    DEVELOPERS

    View Slide

  65. git.io/mini
    EXAMPLE
    ABUSING GIST
    DEVELOPERS

    View Slide

  66. ABUSING GIST
    DEVELOPERS
    QUICK,
    DISPOSABLE
    PROJECTS

    View Slide

  67. IMAGE VIEW MODES
    COMPARE IMAGE REVISIONS

    View Slide

  68. IMAGE VIEW MODES
    SWIPE TO SEE DIFFERENCES

    View Slide

  69. IMAGE VIEW MODES
    SWIPE TO SEE DIFFERENCES

    View Slide

  70. HUB
    COMMAND LINE GITHUB

    View Slide

  71. HUB
    brew install hub
    INSTALL

    View Slide

  72. HUB
    hub clone holman/boom
    FANCY CLONING

    View Slide

  73. HUB
    hub push origin,staging
    MULTI-REMOTE PUSHES

    View Slide

  74. HUB
    hub pull-request -i
    ATTACH A PULL REQUEST TO AN ISSUE

    View Slide

  75. HUB
    alias git=hub
    ALIASING FTW

    View Slide

  76. HUB
    GITHUB.COM/DEFUNKT/HUB
    OPEN SOURCE AT:

    View Slide

  77. ERROR PAGES

    View Slide

  78. ACCELEROMETERS!

    View Slide

  79. KEYBOARD SHORTCUTS
    tFILE FINDER

    View Slide

  80. KEYBOARD SHORTCUTS

    View Slide

  81. KEYBOARD SHORTCUTS
    w
    BRANCH SELECTOR

    View Slide

  82. KEYBOARD SHORTCUTS

    View Slide

  83. KEYBOARD SHORTCUTS
    SQUICK SEARCH

    View Slide

  84. KEYBOARD SHORTCUTS
    ?ALL COMMANDS

    View Slide

  85. SUBSCRIBING PEOPLES
    MOST OF
    OUR ISSUES
    END WITH
    MENTIONS

    View Slide

  86. SUBSCRIBING PEOPLES
    MENTIONED USERS
    GET SUBSCRIBED TO
    ALL SUBSEQUENT
    NOTIFICATIONS

    View Slide

  87. SUBSCRIBING PEOPLES
    ALSO MENTION
    TEAMS DIRECTLY
    @ORG/TEAM

    View Slide

  88. AUTOLINKED SHAS
    GITHUB FLAVORED MARKDOWN
    MENTION SHA, WE AUTOLINK

    View Slide

  89. AUTOLINKED CROSS-REPO SHAS
    GITHUB FLAVORED MARKDOWN
    USER@SHA1 USER/REPO@SHA1

    View Slide

  90. AUTOLINKED CROSS-REPO ISSUES
    GITHUB FLAVORED MARKDOWN
    #1 USER#1
    · USER/REPO#1
    ·

    View Slide

  91. FENCED CODE HIGHLIGHTING
    ```ruby
    require 'redcarpet'
    markdown = Redcarpet.new("Hello World!")
    puts markdown.to_html
    ```
    SPECIFY YOUR LANGUAGE
    GITHUB FLAVORED MARKDOWN

    View Slide

  92. FENCED CODE HIGHLIGHTING
    require 'redcarpet'
    markdown = Redcarpet.new("Hello World!")
    puts markdown.to_html
    RENDERED README OUTPUT
    GITHUB FLAVORED MARKDOWN

    View Slide

  93. AUTO-CLOSING ISSUES
    CLOSES/CLOSED/CLOSE #1
    FIXES/FIXED/FIX #1

    View Slide

  94. COMMITS BY AUTHOR
    github.com/play/play/commits/master
    REPOSITORY COMMITS

    View Slide

  95. COMMITS BY AUTHOR
    ?author=holman
    AUTHOR QUERY PARAM

    View Slide

  96. BRANCH-TO-BRANCH
    PULL REQUESTS
    PULLS NEEDN’T
    BE FROM A FORK

    View Slide

  97. BRANCH-TO-BRANCH
    PULL REQUESTS
    WE ONLY WORK
    OFF BRANCHES

    View Slide

  98. BRANCH-TO-BRANCH
    PULL REQUESTS
    SIMPLE PERMISSIONS
    SIMPLE GIT COMMANDS

    View Slide

  99. USE SCREENSHOTS
    PULL REQUESTS
    MARKDOWN
    ![title](http://example.com/image.png)

    View Slide

  100. CONVERT ISSUE TO PULL
    PULL REQUESTS
    POST /repos/:user/:repo/pulls
    {
    "issue": "5",
    "head": "octocat:new-feature",
    "base": "master"
    }

    View Slide

  101. EMOJI!
    EMOJI-CHEAT-SHEET.COM
    SHIPIT +1 -1 RAGE2 SHIT
    HEART FIRE
    :EMOJI:

    View Slide

  102. LINE LINKING
    CLICK A LINE ADDS #L16 TO URL

    View Slide

  103. LINE LINKING
    ALSO ACCEPTS RANGES #L16-25

    View Slide

  104. ADVANCED COMPARE VIEW
    github.com/user/repo/compare/{range}
    {RANGE} = MASTER...MY-BRANCH

    View Slide

  105. ADVANCED COMPARE VIEW
    {RANGE} IS SMART

    View Slide

  106. ADVANCED COMPARE VIEW
    MASTER@{1.day.ago}...MASTER

    View Slide

  107. ADVANCED COMPARE VIEW
    MASTER@{yesterday}...MASTER

    View Slide

  108. ADVANCED COMPARE VIEW
    MASTER@{2012-02-25}...MASTER

    View Slide

  109. GIT

    View Slide

  110. COMMITLESS COMMITS
    --allow-empty

    View Slide

  111. COMMITLESS COMMITS
    › git commit \
    -m “LOOK AT ME TROLOLOL” \
    --allow-empty
    [master 1a3fbce] LOOK AT ME TROLOLOL

    View Slide

  112. STAGING HUNKS
    diff --git a/README.md b/README.md
    index e69de29..a224a77 100644
    --- a/README.md
    +++ b/README.md
    @@ -0,0 +1,5 @@
    +# THE README
    +
    +## A quality story by @holman
    Stage this hunk [y,n,q,a,d,/,e,?]?
    git add -p

    View Slide

  113. STAGING HUNKS
    Stage this hunk [y,n,q,a,d,/,e,?]? ?
    y - stage this hunk
    n - do not stage this hunk
    q - quit; do not stage this hunk nor any of the remaining ones
    a - stage this hunk and all later hunks in the file
    d - do not stage this hunk nor any of the later hunks in the file
    g - select a hunk to go to
    / - search for a hunk matching the given regex
    j - leave this hunk undecided, see next undecided hunk
    J - leave this hunk undecided, see next hunk
    k - leave this hunk undecided, see previous undecided hunk
    K - leave this hunk undecided, see previous hunk
    s - split the current hunk into smaller hunks
    e - manually edit the current hunk
    ? - print help
    git add -p

    View Slide

  114. STAGING HUNKS
    git add -p
    SMALL, LOGICAL COMMIT SETS

    View Slide

  115. LAST MATCHED COMMIT SEARCH
    git show :/query

    View Slide

  116. LAST MATCHED COMMIT SEARCH
    › git show :/stupid
    commit 76f4b2b15722d05c7acf7ec12b3ea98d6fb4c213
    Author: Aman Gupta
    Date: Fri Apr 27 16:34:55 2012 -0700
    stupid hacks around rails Logger monkey patching

    View Slide

  117. GO BACK
    › git checkout -
    Switched to branch 'master'
    › git checkout -
    Switched to branch 'master'
    › git checkout -
    Switched to branch 'next'
    › cd -

    View Slide

  118. MERGED BRANCHES
    › git branch --merged
    * master
    change_email
    auth

    View Slide

  119. MERGED BRANCHES
    › git branch --no-merged
    date-fix
    test-speed

    View Slide

  120. MERGED BRANCHES
    › git branch --contains 838ad46
    date-fix

    View Slide

  121. CONTENT COPY
    › git checkout BRANCH -- path/to/file.rb
    COPIES file.rb AT BRANCH
    WITHOUT SWITCHING BRANCHES

    View Slide

  122. REACHABLE COMMITS
    › git log branchA ^branchB
    COMMITS IN A THAT AREN’T IN B

    View Slide

  123. FINDING LOST COMMITS
    › git fsck −−lost-found
    dangling blob 517b8fc32153761aadc15a96947911938f809a28
    dangling commit e4fb392355bf37db17f2f601ca68a208a7c16a1d
    dangling commit f53b6771ed929896eca1149e741084930262b9fb
    dangling blob 61bd82962fc470543b17ce6adee37c184cae63cf
    dangling commit 9cbd3ff21acbd8673259969efaa0a9762fe75046
    ...

    View Slide

  124. DIFFSTATS
    › git diff HEAD^ --stat
    README.md | 2 +-
    1 files changed, 1 insertions(+), 1 deletions(-)

    View Slide

  125. BLAME
    › git blame
    ^b649495 (Zach Holman 1) class User
    ^b649495 (Zach Holman 2) def name
    c8c05b6e (Zach Holman 3) 'Foucault'
    ^b649495 (Zach Holman 4) end
    ^b649495 (Zach Holman 5) end

    View Slide

  126. BLAME
    › git blame
    ^b649495 (Zach Holman 1) class User
    ^b649495 (Zach Holman 2) def name
    c8c05b6e (Zach Holman 3) 'Foucault'
    ^b649495 (Zach Holman 4) end
    ^b649495 (Zach Holman 5) end

    View Slide

  127. BLAME
    › git blame -w
    ^b649495 (Zach Holman 1) class User
    ^b649495 (Zach Holman 2) def name
    ^b649495 (Zach Holman 3) 'Foucault'
    ^b649495 (Zach Holman 4) end
    ^b649495 (Zach Holman 5) end
    IGNORE WHITESPACE

    View Slide

  128. BLAME
    › git blame -M
    A
    B
    DETECT MOVES

    View Slide

  129. BLAME
    › git blame -M
    B
    A
    DETECT MOVES

    View Slide

  130. BLAME
    › git blame -M
    DETECT MOVES
    BLAMES ORIGINAL COMMIT,
    NOT THE MOVE COMMIT

    View Slide

  131. BLAME
    › git blame -C
    DETECT MOVES OVER FILES
    LIKE -M, BUT LOOKS AT OTHER
    FILES IN THAT SAME COMMIT

    View Slide

  132. BLAME
    › git blame -CC
    DETECT MOVES OVER FILES
    ALSO LOOKS AT THE COMMIT
    THE FILE WAS CREATED IN

    View Slide

  133. BLAME
    › git blame -CCC
    DETECT MOVES OVER FILES
    ALSO LOOKS AT ALL COMMITS

    View Slide

  134. MULTI-REMOTE FETCHES
    › git config remotes.mygroup 'remote1 remote2'
    › git fetch mygroup

    View Slide

  135. A BETTER STATUS
    › git status
    › git status
    # On branch master
    # Changes not staged for commit:
    # (use "git add <file>..." to update what will be committed)
    # (use "git checkout -- <file>..." to discard changes in working directory)
    #
    # modified: README.md
    #
    no changes added to commit (use "git add" and/or "git commit -a")

    View Slide

  136. A BETTER STATUS
    › git status -sb
    ## master
    M README.md

    View Slide

  137. WORD DIFFING
    › git diff HEAD^
    index 37ebc1b..2589f44 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,3 +1,3 @@
    # This is a repository
    -There are many like it, but this one is mine.
    +There are many like it, but this one is prolly mine.

    View Slide

  138. WORD DIFFING
    › git diff HEAD^ --word-diff
    index 37ebc1b..2589f44 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,3 +1,3 @@
    # This is a repository
    There are many like it, but this one is {+prolly+} mine.

    View Slide

  139. CONFIG: SPELLING
    › git comit
    git: 'comit' is not a git command. See 'git --help'.
    Did you mean this?
    commit

    View Slide

  140. CONFIG: SPELLING
    › git comit
    WARNING: You called a Git command named 'comit', which does not exist.
    Continuing under the assumption that you meant 'commit'
    in 0.1 seconds automatically...
    › git config --global help.autocorrect 1

    View Slide

  141. CONFIG: GIT RERERE
    › git config --global rerere.enabled 1
    REUSE RECORDED RESOLUTION
    REMEMBERS AND RECORDS
    MERGE CONFLICTS
    LONG-RUNNING BRANCHES

    View Slide

  142. CONFIG: COLOR!
    › git config --global color.ui 1

    View Slide

  143. ALIAS: GIT-AMEND
    › git commit --amend -C HEAD
    › git-amend

    View Slide

  144. ALIAS: GIT-UNDO
    › git reset --soft HEAD^
    (RETAINS COMMIT AS STAGED)

    View Slide

  145. ALIAS: GIT-COUNT
    › git shortlog -sn
    500 Zach Holman
    42 Jon Maddox
    29 Jason Costello
    18 Joey Wendt
    17 Aman Gupta
    13 Michael Edwards
    10 Ben Bleikamp
    9 medwards
    6 Paul Betts
    5 Tom Bell
    ...

    View Slide

  146. SCRIPT: GIT-CREDIT
    › git commit --amend --author "$1 <$2>" -C HEAD
    › git credit "Zach Holman" [email protected]
    SETS HEAD’S AUTHOR
    AS SOMEONE ELSE

    View Slide

  147. Whew.

    View Slide

  148. Also,
    AN OCTOCAT:
    4 LEGS
    1 TAIL

    View Slide

  149. THANKS&THANKS

    View Slide

  150. ZACHHOLMAN
    ZACHHOLMAN.COM/TALKS
    @HOLMAN

    View Slide