Subversionしか使っていないSIerおじさんがgitに挑戦する

# 自己紹介
SIerに勤務する会社員(38)です。
常駐している現場ではSubversionしか使っておらず、gitはほぼ使ったことがありません。
先日githubにわけもわからず1個だけのっけただけです。

現場ではプレイングマネージャー的なポジションです。
腕前はなかなか残念なものですが、ようやく学ぶのが面白くなってきた感じがあります（遅）。

# この記事の主旨
そんなおっさんがgitを、短時間（子どもが昼寝から目覚めるまで）でできる範囲で学ぶものです。

# 学び方
優れた入門記事・サイトが多数あるのでしょうけれど、あえてマニュアル（man）、ヘルプ（--help）だけでやってみます。
なんでかというと、忘れてもすぐ参照できるから…
（ネットが自由に使えない現場もあるので）

# 環境構築
ググるといっぱい出てくるので割愛します！

# マニュアルを読む
`$ man git`

```bash:
GIT(1)                                                         Git Manual                                                        GIT(1)

NAME
       git - the stupid content tracker

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>]
           [--super-prefix=<path>]
           <command> [<args>]

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.
…以下略…
```

下手な翻訳は余計に混乱するので、英語を頑張って読むことにします。
macを使っているので、指3本タップで単語の意味を調べつつ…。
…にしても時間がかかりすぎると悟ったので、オプションじゃなくてコマンドが書いてありそうなところまで移動します。
（fとかbで移動できる程度にはvimを覚えた）

```bash:
HIGH-LEVEL COMMANDS (PORCELAIN)
       We separate the porcelain commands into the main commands and some ancillary user utilities.

   Main porcelain commands
       git-add(1)
           Add file contents to the index.

       git-am(1)
           Apply a series of patches from a mailbox.

       git-archive(1)
           Create an archive of files from a named tree.

       git-bisect(1)
           Use binary search to find the commit that introduced a bug.

       git-branch(1)
           List, create, or delete branches.

       git-bundle(1)
           Move objects and refs by archive.

       git-checkout(1)
           Switch branches or restore working tree files.
```

なんか見たことある「add」とか「checkout」とかが出てきましたが、コマンドだけでも相当な数があることがわかりました。
これを全部ちゃんと覚えてから使おうっていう発想をすると、一生使えないままなんだろうなと悟ったので、マニュアルはそっと**q**で閉じておきます。
あとで必要になったら読めばいいっす。

# ヘルプを読む
`$ git --help`

```bash:
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     Reapply commits on top of another base tip
   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.
```

おっ、まだ読める範囲のVolumeだし、使用場面ごとに主なコマンドが書いてあって親切！
ヘルプを中心に見ていこう。

```bash:
start a working area (see also: git help tutorial)
```

ん！？どうやらチュートリアルがあるらしい。親切！
早速やってみます。ワクワク。

`$ git help tutorial`

```bash
GITTUTORIAL(7)                                                 Git Manual                                                GITTUTORIAL(7)

NAME
       gittutorial - A tutorial introduction to Git

SYNOPSIS
       git *

DESCRIPTION
       This tutorial explains how to import a new project into Git, make changes to it, and share changes with other developers.

       If you are instead primarily interested in using Git to fetch a project, for example, to test the latest version, you may prefer
       to start with the first two chapters of The Git User's Manual[1].

       First, note that you can get documentation for a command such as git log --graph with:

           $ man git-log
…以下略…
```

ん〜！…なかなかハードル高そうです。
でもとにかくやっていくのみ。

```bash
IMPORTING A NEW PROJECT
       Assume you have a tarball project.tar.gz with your initial work. You can place it under Git revision control as follows.

           $ tar xzf project.tar.gz
           $ cd project
           $ git init

       Git will reply

           Initialized empty Git repository in .git/
```

このあたりからは、具体的なコマンドが書いてあるおかげで、なんとなく意味がわかりました。
最初に`git init`するか`git clone`するものらしい、というのはヘルプで見たので理解。
ではあとはとにかく実践していきます！

# チュートリアルを実践
### init
適当な場所にディレクトリを作って、そこに移動し、コマンド投入。

```bash
$ git init
Initialized empty Git repository in (作ったディレクトリのパス)/.git/
```

### add
このへんはSubversionと同じっぽいので戸惑いなし。適当なファイルを作ってaddする。

```bash:
$ vim tekitou
(…編集…)
$ cat tekitou 
aaaaaaaa
bbbbbbbb
cccccccc

$ git add .
```

### commit
`$ git commit`
commitしようとしたら、なんか入力画面が出てきました。
コミットメッセージを入れるやつですね。

```bash:
適当にコミットします。
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Committer: (おっさんの名前)
#
# On branch master
#
# Initial commit
#
# Changes to be committed:
#       new file:   tekitou
#
~                                                                                                                                                     
```

```bash:
$ git commit
[master (root-commit) 3762d4e] 適当にコミットします。
 Committer: (きもいおっさんのなまえ)
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly. Run the
following command and follow the instructions in your editor to edit
your configuration file:

    git config --global --edit

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

 1 file changed, 4 insertions(+)
 create mode 100644 tekitou
```
なんか色々怒られた気がしますが、とにかくcommitできました。

### diff
名前からして、差分を取るものでしょう。
先程commitしたファイルを少し修正しつつ、新しいファイルを１つ追加したうえでdiffしてみます。

```bash:
$ git diff
diff --git a/tekitou b/tekitou
index 43fbc54..f6e3dee 100644
--- a/tekitou
+++ b/tekitou
@@ -1,4 +1,4 @@
 aaaaaaaa
-bbbbbbbb
+bbbzzzbbbbb
 cccccccc
```
差分が出てきました。想定の範囲内。
ただ、新しく作ったファイルは出てきませんでしたので、addしてからdiffしてみます。

```bash: 
$ git add .
$ git diff
```
あれ、なんも出てこない。
チュートリアルを見ると`--caches`オプションをつけるように書いてありました。

```bash:
$ git diff --cached
diff --git a/newfile b/newfile
new file mode 100644
index 0000000..dece85d
--- /dev/null
+++ b/newfile
@@ -0,0 +1,4 @@
+111111111
+2222222222
+33333333333
+
diff --git a/tekitou b/tekitou
index 43fbc54..f6e3dee 100644
--- a/tekitou
+++ b/tekitou
@@ -1,4 +1,4 @@
 aaaaaaaa
-bbbbbbbb
+bbbzzzbbbbb
 cccccccc
```

### status
修正したとか新規ファイルだとか、現在の管理状態がわかるっぽいですね。

```bash:
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   newfile
	modified:   tekitou
```

# まとめ
ここで子どもが起きたので時間切れっす！
branchesの考え方とか、push、pull等、全然gitならではのところにたどり着いていませんが、マニュアル、ヘルプ、チュートリアルが丁寧に用意されているので、こんな調子でやっていけばなんとかなるだろうという気がしました。