README.md 9.4 KB
Newer Older
M
Mislav Marohnić 已提交
1 2
git + hub = github
==================
C
readme  
Chris Wanstrath 已提交
3

M
Mislav Marohnić 已提交
4 5
hub is a command line tool that wraps `git` in order to extend it with extra
features and commands that make working with GitHub easier.
C
readme  
Chris Wanstrath 已提交
6

M
Mislav Marohnić 已提交
7 8
~~~ sh
$ hub clone rtomayko/tilt
C
readme  
Chris Wanstrath 已提交
9

M
Mislav Marohnić 已提交
10 11 12
# expands to:
$ git clone git://github.com/rtomayko/tilt.git
~~~
C
Chris Wanstrath 已提交
13

M
Mislav Marohnić 已提交
14 15
hub is best aliased as `git`, so you can type `$ git <command>` in the shell and
get all the usual `hub` features. See "Aliasing" below.
C
tweak  
Chris Wanstrath 已提交
16

C
Chris Wanstrath 已提交
17

M
Mislav Marohnić 已提交
18 19
Installation
------------
C
Chris Wanstrath 已提交
20

M
Mislav Marohnić 已提交
21
Dependencies:
C
Chris Wanstrath 已提交
22

M
Mislav Marohnić 已提交
23 24
* **git 1.7.3** or newer
* **Ruby 1.8.6** or newer
C
tweak  
Chris Wanstrath 已提交
25

M
Mislav Marohnić 已提交
26
### Homebrew
C
tweaks  
Chris Wanstrath 已提交
27

M
Mislav Marohnić 已提交
28
Installing on OS X is easiest with Homebrew:
C
readme  
Chris Wanstrath 已提交
29

M
Mislav Marohnić 已提交
30 31 32
~~~ sh
$ brew install hub
~~~
C
readme  
Chris Wanstrath 已提交
33

C
Chris Wanstrath 已提交
34 35
### Standalone

M
Mislav Marohnić 已提交
36
`hub` is easily installed as a standalone script:
C
Chris Wanstrath 已提交
37

M
Mislav Marohnić 已提交
38 39 40 41
~~~ sh
$ curl http://defunkt.io/hub/standalone -sLo ~/bin/hub &&
  chmod +x ~/bin/hub
~~~
C
Chris Wanstrath 已提交
42

M
Mislav Marohnić 已提交
43
Assuming "~/bin/" is in your `$PATH`, you're ready to roll:
C
Chris Wanstrath 已提交
44

M
Mislav Marohnić 已提交
45 46 47 48 49
~~~ sh
$ hub version
git version 1.7.6
hub version 1.8.3
~~~
50

51
### RubyGems
C
Chris Wanstrath 已提交
52

M
Mislav Marohnić 已提交
53
Though not recommended, hub can also be installed as a RubyGem:
C
Chris Wanstrath 已提交
54

M
Mislav Marohnić 已提交
55 56 57
~~~ sh
$ gem install hub
~~~
C
Chris Wanstrath 已提交
58

59 60
(It's not recommended for casual use because of the RubyGems startup
time. See [this gist][speed] for information.)
61

M
Mislav Marohnić 已提交
62
#### Standalone via RubyGems
63

M
Mislav Marohnić 已提交
64 65 66 67
~~~ sh
$ gem install hub
$ hub hub standalone > ~/bin/hub && chmod +x ~/bin/hub
~~~
68 69

This installs a standalone version which doesn't require RubyGems to
M
Mislav Marohnić 已提交
70
run, so it's faster.
71

C
Chris Wanstrath 已提交
72 73
### Source

C
Chris Wanstrath 已提交
74
You can also install from source:
C
readme  
Chris Wanstrath 已提交
75

M
Mislav Marohnić 已提交
76 77
~~~ sh
$ git clone git://github.com/defunkt/hub.git
78 79
$ cd hub
$ rake install prefix=/usr/local
M
Mislav Marohnić 已提交
80
~~~
C
readme  
Chris Wanstrath 已提交
81

C
Chris Wanstrath 已提交
82 83 84 85 86 87 88
### Help! It's Slow!

Is your prompt slow? It may be hub.

1. Check that it's **not** installed using RubyGems.
2. Check that RUBYOPT isn't loading anything shady:

M
Mislav Marohnić 已提交
89
        $ echo $RUBYOPT
C
Chris Wanstrath 已提交
90 91 92

3. Check that your system Ruby is speedy:

M
Mislav Marohnić 已提交
93
        $ time /usr/bin/env ruby -e0
C
Chris Wanstrath 已提交
94 95 96

If #3 is slow, it may be your [GC settings][gc].

C
readme  
Chris Wanstrath 已提交
97

C
Chris Wanstrath 已提交
98 99
Aliasing
--------
C
readme  
Chris Wanstrath 已提交
100

M
Mislav Marohnić 已提交
101 102
Using hub feels best when it's aliased as `git`. This is not dangerous; your
_normal git commands will all work_. hub merely adds some sugar.
C
readme  
Chris Wanstrath 已提交
103

104 105
`hub alias` displays instructions for the current shell. With the `-s` flag, it
outputs a script suitable for `eval`.
C
Chris Wanstrath 已提交
106

107
You should place this command in your `.bash_profile` or other startup script:
C
Chris Wanstrath 已提交
108

M
Mislav Marohnić 已提交
109
~~~ sh
110
eval "$(hub alias -s)"
M
Mislav Marohnić 已提交
111
~~~
C
tweaks  
Chris Wanstrath 已提交
112

113 114 115 116 117 118 119 120
### Shell tab-completion

hub repository contains tab-completion scripts for bash and zsh. These scripts
complement existing completion scripts that ship with git.

* [hub bash completion](https://github.com/defunkt/hub/blob/master/etc/hub.bash_completion.sh)
* [hub zsh completion](https://github.com/defunkt/hub/blob/master/etc/hub.zsh_completion)

C
readme  
Chris Wanstrath 已提交
121

C
Chris Wanstrath 已提交
122
Commands
C
readme  
Chris Wanstrath 已提交
123 124
--------

M
Mislav Marohnić 已提交
125
Assuming you've aliased hub as `git`, the following commands now have
C
Chris Wanstrath 已提交
126 127
superpowers:

C
readme  
Chris Wanstrath 已提交
128 129 130
### git clone

    $ git clone schacon/ticgit
C
Chris Wanstrath 已提交
131 132
    > git clone git://github.com/schacon/ticgit.git

C
readme  
Chris Wanstrath 已提交
133
    $ git clone -p schacon/ticgit
C
Chris Wanstrath 已提交
134
    > git clone git@github.com:schacon/ticgit.git
C
readme  
Chris Wanstrath 已提交
135

136
    $ git clone resque
137
    > git clone git@github.com/YOUR_USER/resque.git
138

C
readme  
Chris Wanstrath 已提交
139 140 141
### git remote add

    $ git remote add rtomayko
C
Chris Wanstrath 已提交
142 143
    > git remote add rtomayko git://github.com/rtomayko/CURRENT_REPO.git

K
Konstantin Haase 已提交
144
    $ git remote add -p rtomayko
C
Chris Wanstrath 已提交
145
    > git remote add rtomayko git@github.com:rtomayko/CURRENT_REPO.git
C
readme  
Chris Wanstrath 已提交
146

147 148 149
    $ git remote add origin
    > git remote add origin git://github.com/YOUR_USER/CURRENT_REPO.git

150 151 152 153 154 155 156 157 158 159 160
### git fetch

    $ git fetch mislav
    > git remote add mislav git://github.com/mislav/REPO.git
    > git fetch mislav

    $ git fetch mislav,xoebus
    > git remote add mislav ...
    > git remote add xoebus ...
    > git fetch --multiple mislav xoebus

161 162 163 164 165 166 167 168 169 170 171 172 173 174
### git cherry-pick

    $ git cherry-pick http://github.com/mislav/REPO/commit/SHA
    > git remote add -f mislav git://github.com/mislav/REPO.git
    > git cherry-pick SHA

    $ git cherry-pick mislav@SHA
    > git remote add -f mislav git://github.com/mislav/CURRENT_REPO.git
    > git cherry-pick SHA

    $ git cherry-pick mislav@SHA
    > git fetch mislav
    > git cherry-pick SHA

175
### git am, git apply
176 177 178 179 180 181 182 183 184

    $ git am https://github.com/defunkt/hub/pull/55
    > curl https://github.com/defunkt/hub/pull/55.patch -o /tmp/55.patch
    > git am /tmp/55.patch

    $ git am --ignore-whitespace https://github.com/davidbalbert/hub/commit/fdb9921
    > curl https://github.com/davidbalbert/hub/commit/fdb9921.patch -o /tmp/fdb9921.patch
    > git am --ignore-whitespace /tmp/fdb9921.patch

185 186 187 188
    $ git apply https://gist.github.com/8da7fb575debd88c54cf
    > curl https://gist.github.com/8da7fb575debd88c54cf.txt -o /tmp/gist-8da7fb575debd88c54cf.txt
    > git apply /tmp/gist-8da7fb575debd88c54cf.txt

189 190 191
### git fork

    $ git fork
192
    [ repo forked on GitHub ]
C
Chris Wanstrath 已提交
193
    > git remote add -f YOUR_USER git@github.com:YOUR_USER/CURRENT_REPO.git
194

195 196
### git pull-request

197
    # while on a topic branch called "feature":
198 199
    $ git pull-request
    [ opens text editor to edit title & body for the request ]
200
    [ opened pull request on GitHub for "YOUR_USER:feature" ]
201

202 203
    # explicit title, pull base & head:
    $ git pull-request "I've implemented feature X" -b defunkt:master -h mislav:feature
204

M
Mislav Marohnić 已提交
205
    $ git pull-request -i 123
206
    [ attached pull request to issue #123 ]
207

208 209
### git checkout

210 211 212
    $ git checkout https://github.com/defunkt/hub/pull/73
    > git remote add -f -t feature git://github:com/mislav/hub.git
    > git checkout --track -B mislav-feature mislav/feature
213

214 215 216 217 218 219 220
    $ git checkout https://github.com/defunkt/hub/pull/73 custom-branch-name

### git merge

    $ git merge https://github.com/defunkt/hub/pull/73
    > git fetch git://github.com/mislav/hub.git +refs/heads/feature:refs/remotes/mislav/feature
    > git merge mislav/feature --no-ff -m 'Merge pull request #73 from mislav/feature...'
221

222 223 224
### git create

    $ git create
225
    [ repo created on GitHub ]
226 227
    > git remote add origin git@github.com:YOUR_USER/CURRENT_REPO.git

228 229 230 231 232 233 234 235 236 237 238
    # with description:
    $ git create -d 'It shall be mine, all mine!'

    $ git create recipes
    [ repo created on GitHub ]
    > git remote add origin git@github.com:YOUR_USER/recipes.git

    $ git create sinatra/recipes
    [ repo created in GitHub organization ]
    > git remote add origin git@github.com:sinatra/recipes.git

C
readme  
Chris Wanstrath 已提交
239 240
### git init

C
Chris Wanstrath 已提交
241
    $ git init -g
C
Chris Wanstrath 已提交
242
    > git init
243
    > git remote add origin git@github.com:YOUR_USER/REPO.git
C
Chris Wanstrath 已提交
244

245 246 247 248 249 250 251
### git push

    $ git push origin,staging,qa bert_timeout
    > git push origin bert_timeout
    > git push staging bert_timeout
    > git push qa bert_timeout

252 253
### git browse

254
    $ git browse
J
Justin Quick 已提交
255
    > open https://github.com/YOUR_USER/CURRENT_REPO
256

257 258 259
    $ git browse -- commit/SHA
    > open https://github.com/YOUR_USER/CURRENT_REPO/commit/SHA

260
    $ git browse -- issues
J
Justin Quick 已提交
261
    > open https://github.com/YOUR_USER/CURRENT_REPO/issues
262

263
    $ git browse schacon/ticgit
264
    > open https://github.com/schacon/ticgit
265

266 267 268
    $ git browse schacon/ticgit commit/SHA
    > open https://github.com/schacon/ticgit/commit/SHA

269
    $ git browse resque
270
    > open https://github.com/YOUR_USER/resque
271

272
    $ git browse resque network
273
    > open https://github.com/YOUR_USER/resque/network
274

J
Joshua Roesslein 已提交
275 276 277
### git compare

    $ git compare refactor
278
    > open https://github.com/CURRENT_REPO/compare/refactor
J
Joshua Roesslein 已提交
279

280
    $ git compare 1.0..1.1
281
    > open https://github.com/CURRENT_REPO/compare/1.0...1.1
J
Joshua Roesslein 已提交
282 283

    $ git compare -u fix
284
    > (https://github.com/CURRENT_REPO/compare/fix)
J
Joshua Roesslein 已提交
285

286
    $ git compare other-user patch
287
    > open https://github.com/other-user/REPO/compare/patch
J
Joshua Roesslein 已提交
288

J
Justin Ridgewell 已提交
289
### git submodule
290

J
Justin Ridgewell 已提交
291 292 293 294 295 296
    $ hub submodule add wycats/bundler vendor/bundler
    > git submodule add git://github.com/wycats/bundler.git vendor/bundler

    $ hub submodule add -p wycats/bundler vendor/bundler
    > git submodule add git@github.com:wycats/bundler.git vendor/bundler

297
    $ hub submodule add -b ryppl ryppl/pip vendor/pip
J
Justin Ridgewell 已提交
298 299 300
    > git submodule add -b ryppl git://github.com/ryppl/pip.git vendor/pip


C
Chris Wanstrath 已提交
301 302 303 304
### git help

    $ git help
    > (improved git help)
C
Chris Wanstrath 已提交
305 306
    $ git help hub
    > (hub man page)
C
readme  
Chris Wanstrath 已提交
307 308


M
Mislav Marohnić 已提交
309 310 311
Configuration
-------------

312
### GitHub OAuth authentication
C
Chris Wanstrath 已提交
313

314 315
Hub will prompt for GitHub username & password the first time it needs to access
the API and exchange it for an OAuth token, which it saves in "~/.config/hub".
C
Chris Wanstrath 已提交
316

B
Bruno Binet 已提交
317
### HTTPS instead of git protocol
C
Chris Wanstrath 已提交
318

319 320
If you prefer using the HTTPS protocol for GitHub repositories instead of the git
protocol for read and ssh for write, you can set "hub.protocol" to "https".
C
Chris Wanstrath 已提交
321

M
Mislav Marohnić 已提交
322 323 324 325
~~~ sh
# default behavior
$ git clone defunkt/repl
< git clone >
C
Chris Wanstrath 已提交
326

M
Mislav Marohnić 已提交
327 328 329 330 331
# opt into HTTPS:
$ git config --global hub.protocol https
$ git clone defunkt/repl
< https clone >
~~~
C
readme  
Chris Wanstrath 已提交
332 333


C
Chris Wanstrath 已提交
334 335 336
Contributing
------------

337
These instructions assume that _you already have hub installed_ and aliased as
M
Mislav Marohnić 已提交
338
`git` (see "Aliasing").
M
Mislav Marohnić 已提交
339 340

1. Clone hub:  
M
Mislav Marohnić 已提交
341
    `git clone defunkt/hub && cd hub`
342 343
1. Ensure Bundler is installed:  
    `which bundle || gem install bundler`
M
Mislav Marohnić 已提交
344 345 346 347
1. Install development dependencies:  
    `bundle install`
2. Verify that existing tests pass:  
    `bundle exec rake`
M
Mislav Marohnić 已提交
348
3. Create a topic branch:  
M
Mislav Marohnić 已提交
349 350
    `git checkout -b feature`
4. **Make your changes.** (It helps a lot if you write tests first.)
M
Mislav Marohnić 已提交
351
5. Verify that tests still pass:  
M
Mislav Marohnić 已提交
352
    `bundle exec rake`
M
Mislav Marohnić 已提交
353 354 355
6. Fork hub on GitHub (adds a remote named "YOUR_USER"):  
    `git fork`
7. Push to your fork:  
M
Mislav Marohnić 已提交
356
    `git push -u YOUR_USER feature`
M
Mislav Marohnić 已提交
357 358 359
8. Open a pull request describing your changes:  
    `git pull-request`

C
Chris Wanstrath 已提交
360

C
Chris Wanstrath 已提交
361 362
Meta
----
C
readme  
Chris Wanstrath 已提交
363

M
Mislav Marohnić 已提交
364 365 366
* Home: <https://github.com/defunkt/hub>
* Bugs: <https://github.com/defunkt/hub/issues>
* Gem: <https://rubygems.org/gems/hub>
M
Mislav Marohnić 已提交
367 368 369
* Authors: <https://github.com/defunkt/hub/contributors>

### Prior art
C
Chris Wanstrath 已提交
370

M
Mislav Marohnić 已提交
371 372
These projects also aim to either improve git or make interacting with
GitHub simpler:
C
Chris Wanstrath 已提交
373

M
Mislav Marohnić 已提交
374 375
* [eg](http://www.gnome.org/~newren/eg/)
* [github-gem](https://github.com/defunkt/github-gem)
C
Chris Wanstrath 已提交
376 377


378
[speed]: http://gist.github.com/284823
C
Chris Wanstrath 已提交
379
[gc]: https://twitter.com/brynary/status/49560668994674688