Gitのmanページとか読んでみよう

突然ですがみなさんgitの使い方に困った時、どうしてますか？"git force push しちゃった"とかいってググっちゃいますか？
10時間に渡るフライト中、読書もしたし昼寝もしたし、やることがなくなった時、どうしてますか？

そんな時は是非、gitのmanページとか読んでみましょう。

```bash
$ man git
GIT(1)                                                       Git Manual                                                      GIT(1)

NAME
       git - the stupid content tracker
       
```
まずは冒頭です。gitはバカ構成管理システムなんですね。知りませんでした。

```bash
SYNOPSIS
       git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]
           
```

manページの最初に必ず載っているのがこのSYNOPSISです。慣れないと何を言っているのかわからないかもしれませんが、下記のようなルールを押さえておくと読めると思います。

`[必須でないオプションや引数]`
`<必須の引数>`

ここを読むだけで、そのコマンドの使い方はだいたい分かってしまうというわけです。

```bash
DESCRIPTION
       Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides both
       high-level operations and full access to internals.
```

続いて概要の説明があります。何はともかくgitはサイコーであると言ってます。

```
       See gittutorial(7) to get started, then see giteveryday(7) for a useful minimum set of commands. The Git User's Manual[1]
       has a more in-depth introduction.

       After you mastered the basic concepts, you can come back to this page to learn what commands Git offers. You can learn more
       about individual Git commands with "git help command". gitcli(7) manual page gives you an overview of the command-line
       command syntax.

       Formatted and hyperlinked version of the latest Git documentation can be viewed at
       http://git-htmldocs.googlecode.com/git/git.html.
```

初学者がどうやってgitを習得すれば良いか、ドキュメントの場所も含めて丁寧に導いてくれています。素晴らしいですね。ドキュメントにこれだけ力を入れてくれていると知りたい情報にすぐにたどり着けるので、本当に助かります。
なお`gittutorial(7)` というのは`gittutorial`のsection-7のmanページという意味です。`gittutorial`のmanページはsection-7しかないようなので、`man gittutorial` で参照することができました。

---

続いて。

```bash
OPTIONS
       --version
           Prints the Git suite version that the git program came from.

       --help
           Prints the synopsis and a list of the most commonly used commands. If the option --all or -a is given then all available
           commands are printed. If a Git command is named this option will bring up the manual page for that command.

           Other options are available to control how the manual page is displayed. See git-help(1) for more information, because
           git --help ...  is converted internally into git help ....

```

ここから各オプションの説明に入っていきます。
`--version`はいいとして、`--help` をよく見てください。`--all`か`-a`を併用すると、すべてのコマンドが表示されるが、そうでなければ **一番よく使うコマンド** が一覧表示されると書いてあります。

実際にやってみましょう。

```bash
$ git --help
usage: git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone      Clone a repository into a new directory
   init       Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add        Add file contents to the index
   mv         Move or rename a file, a directory, or a symlink
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect     Use binary search to find the commit that introduced a bug
   grep       Print lines matching a pattern
   log        Show commit logs
   show       Show various types of objects
   status     Show the working tree status

grow, mark and tweak your common history
   branch     List, create, or delete branches
   checkout   Switch branches or restore working tree files
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   merge      Join two or more development histories together
   rebase     Forward-port local commits to the updated upstream head
   tag        Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch      Download objects and refs from another repository
   pull       Fetch from and integrate with another repository or a local branch
   push       Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
```

```bash
$ git --help -a
usage: git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

available git commands in '/usr/local/Cellar/git/2.6.3/libexec/git-core'

  add                       merge-index
  add--interactive          merge-octopus
  am                        merge-one-file
  annotate                  merge-ours
  apply                     merge-recursive
  archimport                merge-resolve
  archive                   merge-subtree
  bisect                    merge-tree
  bisect--helper            mergetool
  blame                     mktag
  branch                    mktree
  bundle                    mv
  cat-file                  name-rev
  check-attr                notes
  check-ignore              p4
  check-mailmap             pack-objects
  check-ref-format          pack-redundant
  checkout                  pack-refs
  checkout-index            patch-id
  cherry                    prune
  cherry-pick               prune-packed
  citool                    pull
  clean                     push
  clone                     quiltimport
  column                    read-tree
  commit                    rebase
  commit-tree               receive-pack
  config                    reflog
  count-objects             relink
  credential                remote
  credential-cache          remote-ext
  credential-cache--daemon  remote-fd
  credential-store          remote-ftp
  cvsexportcommit           remote-ftps
  cvsimport                 remote-http
  cvsserver                 remote-https
  daemon                    remote-testsvn
  describe                  repack
  diff                      replace
  diff-files                request-pull
  diff-index                rerere
  diff-tree                 reset
  difftool                  rev-list
  difftool--helper          rev-parse
  fast-export               revert
  fast-import               rm
  fetch                     send-email
  fetch-pack                send-pack
  filter-branch             sh-i18n--envsubst
  fmt-merge-msg             shell
  for-each-ref              shortlog
  format-patch              show
  fsck                      show-branch
  fsck-objects              show-index
  gc                        show-ref
  get-tar-commit-id         stage
  grep                      stash
  gui                       status
  gui--askpass              stripspace
  hash-object               submodule
  help                      svn
  http-backend              symbolic-ref
  http-fetch                tag
  http-push                 unpack-file
  index-pack                unpack-objects
  init                      update-index
  init-db                   update-ref
  instaweb                  update-server-info
  interpret-trailers        upload-archive
  log                       upload-pack
  ls-files                  var
  ls-remote                 verify-commit
  ls-tree                   verify-pack
  mailinfo                  verify-tag
  mailsplit                 web--browse
  merge                     whatchanged
  merge-base                worktree
  merge-file                write-tree

git commands available from elsewhere on your $PATH

  branch-by-author        lfs
  credential-osxkeychain  subtree

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
```

`-a`をつけると、見たこともないコマンドがたくさん出てきますね。でも、臆することはありません。`--help`の解説にあるように、`git <command> --help` とすることで、懇切丁寧なドキュメントを瞬時に参照することができるからです。


いかがでしたでしょうか？
皆さんも気が向いた時にはぜひgitのmanページとかhelpを開いてみてください。