README.md 9.2 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
* **git 1.7.3** or newer
C
tweak  
Chris Wanstrath 已提交
24

O
Owen Ou 已提交
25 26 27 28 29
### 2.x

Starting from 2.2.0, `hub` is [powered by Go](https://github.com/github/hub/issues/475).
It should maintain a high backward compatibility with 1.x. Note that 2.x is in preview.

30 31 32 33 34 35 36 37 38
#### Homebrew

`hub` 2.x can be installed through Homebrew. Since it's in preview, you need to compile
from HEAD:

~~~ sh
$ brew install --HEAD hub
~~~

O
Owen Ou 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
#### Standalone

`hub` 2.x can be easily installed as an executable. Download the latest
[complied binaries](https://github.com/github/hub/releases) and put it anywhere in your executable path.

#### Source

To install `hub` 2.x from source, you need to have a [Go development environment](http://golang.org/doc/install),
version 1.1 or better:

~~~ sh
$ git clone https://github.com/github/hub.git
$ cd hub
$ ./script/build
$ cp hub YOUR_BIN_PATH
~~~

### 1.x

#### Homebrew
C
tweaks  
Chris Wanstrath 已提交
59

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

M
Mislav Marohnić 已提交
62 63 64
~~~ sh
$ brew install hub
~~~
C
readme  
Chris Wanstrath 已提交
65

66
Now you should be ready to roll:
C
Chris Wanstrath 已提交
67

M
Mislav Marohnić 已提交
68 69 70 71 72
~~~ sh
$ hub version
git version 1.7.6
hub version 1.8.3
~~~
73

C
readme  
Chris Wanstrath 已提交
74

C
Chris Wanstrath 已提交
75 76
Aliasing
--------
C
readme  
Chris Wanstrath 已提交
77

M
Mislav Marohnić 已提交
78 79
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 已提交
80

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

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

M
Mislav Marohnić 已提交
86
~~~ sh
87
eval "$(hub alias -s)"
M
Mislav Marohnić 已提交
88
~~~
C
tweaks  
Chris Wanstrath 已提交
89

90 91 92 93 94
### Shell tab-completion

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

M
Mislav Marohnić 已提交
95 96
* [hub bash completion](https://github.com/github/hub/blob/master/etc/hub.bash_completion.sh)
* [hub zsh completion](https://github.com/github/hub/blob/master/etc/hub.zsh_completion)
97

C
readme  
Chris Wanstrath 已提交
98

C
Chris Wanstrath 已提交
99
Commands
C
readme  
Chris Wanstrath 已提交
100 101
--------

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

C
readme  
Chris Wanstrath 已提交
105 106 107
### git clone

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

C
readme  
Chris Wanstrath 已提交
110
    $ git clone -p schacon/ticgit
C
Chris Wanstrath 已提交
111
    > git clone git@github.com:schacon/ticgit.git
C
readme  
Chris Wanstrath 已提交
112

113
    $ git clone resque
114
    > git clone git@github.com/YOUR_USER/resque.git
115

C
readme  
Chris Wanstrath 已提交
116 117 118
### git remote add

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

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

124 125 126
    $ git remote add origin
    > git remote add origin git://github.com/YOUR_USER/CURRENT_REPO.git

127 128 129 130 131 132 133 134 135 136 137
### 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

138 139 140 141 142 143 144 145 146 147 148 149 150 151
### 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

152
### git am, git apply
153 154

    $ git am https://github.com/defunkt/hub/pull/55
155
    [ downloads patch via API ]
156 157 158
    > git am /tmp/55.patch

    $ git am --ignore-whitespace https://github.com/davidbalbert/hub/commit/fdb9921
159
    [ downloads patch via API ]
160 161
    > git am --ignore-whitespace /tmp/fdb9921.patch

162
    $ git apply https://gist.github.com/8da7fb575debd88c54cf
163
    [ downloads patch via API ]
164 165
    > git apply /tmp/gist-8da7fb575debd88c54cf.txt

166 167 168
### git fork

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

172 173
### git pull-request

174
    # while on a topic branch called "feature":
175 176
    $ git pull-request
    [ opens text editor to edit title & body for the request ]
177
    [ opened pull request on GitHub for "YOUR_USER:feature" ]
178

179
    # explicit title, pull base & head:
180
    $ git pull-request -m "Implemented feature X" -b defunkt:master -h mislav:feature
181

182 183
### git checkout

184
    $ git checkout https://github.com/defunkt/hub/pull/73
185
    > git remote add -f -t feature mislav git://github.com/mislav/hub.git
186
    > git checkout --track -B mislav-feature mislav/feature
187

188 189 190 191 192 193 194
    $ 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...'
195

196 197 198
### git create

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

202 203 204 205 206 207 208 209 210 211 212
    # 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 已提交
213 214
### git init

C
Chris Wanstrath 已提交
215
    $ git init -g
C
Chris Wanstrath 已提交
216
    > git init
217
    > git remote add origin git@github.com:YOUR_USER/REPO.git
C
Chris Wanstrath 已提交
218

219 220 221 222 223 224 225
### git push

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

226 227
### git browse

228
    $ git browse
J
Justin Quick 已提交
229
    > open https://github.com/YOUR_USER/CURRENT_REPO
230

231 232 233
    $ git browse -- commit/SHA
    > open https://github.com/YOUR_USER/CURRENT_REPO/commit/SHA

234
    $ git browse -- issues
J
Justin Quick 已提交
235
    > open https://github.com/YOUR_USER/CURRENT_REPO/issues
236

R
Richard Littauer 已提交
237 238 239
    $ git browse -- issues/10
    > open https://github.com/YOUR_USER/CURRENT_REPO/issues/10

240
    $ git browse schacon/ticgit
241
    > open https://github.com/schacon/ticgit
242

243 244 245
    $ git browse schacon/ticgit commit/SHA
    > open https://github.com/schacon/ticgit/commit/SHA

246
    $ git browse resque
247
    > open https://github.com/YOUR_USER/resque
248

249
    $ git browse resque network
250
    > open https://github.com/YOUR_USER/resque/network
251

J
Joshua Roesslein 已提交
252 253 254
### git compare

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

257
    $ git compare 1.0..1.1
258
    > open https://github.com/CURRENT_REPO/compare/1.0...1.1
J
Joshua Roesslein 已提交
259 260

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

263
    $ git compare other-user patch
264
    > open https://github.com/other-user/REPO/compare/patch
J
Joshua Roesslein 已提交
265

J
Justin Ridgewell 已提交
266
### git submodule
267

268
    $ git submodule add wycats/bundler vendor/bundler
J
Justin Ridgewell 已提交
269 270
    > git submodule add git://github.com/wycats/bundler.git vendor/bundler

271
    $ git submodule add -p wycats/bundler vendor/bundler
J
Justin Ridgewell 已提交
272 273
    > git submodule add git@github.com:wycats/bundler.git vendor/bundler

274
    $ git submodule add -b ryppl --name pip ryppl/pip vendor/pip
275
    > git submodule add -b ryppl --name pip git://github.com/ryppl/pip.git vendor/pip
J
Justin Ridgewell 已提交
276

277 278
### git ci-status

279
    $ git ci-status [commit]
M
Mislav Marohnić 已提交
280
    > (prints CI state of commit and exits with appropriate code)
281 282
    > One of: success (0), error (1), failure (1), pending (2), no status (3)

J
Justin Ridgewell 已提交
283

C
Chris Wanstrath 已提交
284 285 286 287
### git help

    $ git help
    > (improved git help)
C
Chris Wanstrath 已提交
288 289
    $ git help hub
    > (hub man page)
C
readme  
Chris Wanstrath 已提交
290 291


M
Mislav Marohnić 已提交
292 293 294
Configuration
-------------

295
### GitHub OAuth authentication
C
Chris Wanstrath 已提交
296

297 298
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 已提交
299

300 301 302
To avoid being prompted, use **GITHUB_USER** and **GITHUB_PASSWORD** environment
variables.

B
Bruno Binet 已提交
303
### HTTPS instead of git protocol
C
Chris Wanstrath 已提交
304

305 306 307 308
If you prefer the HTTPS protocol for GitHub repositories, you can set
"hub.protocol" to "https". This will affect `clone`, `fork`, `remote add`
and other operations that expand references to GitHub repositories as full
URLs that otherwise use git and ssh protocols.
309 310 311

"hub.protocol" only applies when the "OWNER/REPO" shorthand is used instead of
a full git URL.
C
Chris Wanstrath 已提交
312

313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
    # default behavior
    $ git clone defunkt/repl
    < git clone >

    # opt into HTTPS:
    $ git config --global hub.protocol https
    $ git clone defunkt/repl
    < https clone >

### GitHub Enterprise

By default, hub will only work with repositories that have remotes which
point to github.com. GitHub Enterprise hosts need to be whitelisted to
configure hub to treat such remotes same as github.com:

    $ git config --global --add hub.host my.git.org

The default host for commands like `init` and `clone` is still
github.com, but this can be affected with the <GITHUB_HOST> environment
variable:
C
readme  
Chris Wanstrath 已提交
333

334
    $ GITHUB_HOST=my.git.org git clone myproject
C
readme  
Chris Wanstrath 已提交
335

C
Chris Wanstrath 已提交
336 337
Meta
----
C
readme  
Chris Wanstrath 已提交
338

M
Mislav Marohnić 已提交
339 340 341
* Home: <https://github.com/github/hub>
* Bugs: <https://github.com/github/hub/issues>
* Authors: <https://github.com/github/hub/contributors>
M
Mislav Marohnić 已提交
342 343

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

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

348
* [hub in Ruby](https://github.com/github/hub/tree/1.12-stable) (previous implementation)
M
Mislav Marohnić 已提交
349 350
* [eg](http://www.gnome.org/~newren/eg/)
* [github-gem](https://github.com/defunkt/github-gem)