git の使い方

# git とは
-  [公式サイト](https://git-scm.com/)

バージョン管理システムのことでファイルの変更の履歴を管理してくれる。
複数人で共同開発をするときに git を使うことで開発をスムーズに進められる。

# git の使い方
## git の初期設定
### git のバージョンを確認

```zsh
$ git --version
```

### git の設定
上 2 つはユーザ情報の設定で必ず行う必要がある。
3 つ目は出力メッセージを色分けできるようにする設定。

```zsh
$ git config --global user.name "ユーザ名"
$ git config --global user.email "メールアドレス"
$ git config --global color.ui true
```

### git の設定情報の確認とヘルプの見かた

```zsh
$ git config -l
$ git config --help
```

## ファイルのバージョンの管理
### git の初期化
git を使うためにはバージョンを管理したいソースコードがあるディレクトリで以下のコマンドを実行する。

```zsh
$ git init
```

コマンドを実行すると、.git というディレクトリが作成される。
.git ディレクトリをリポジトリといい、ここにファイルの変更履歴が記録される。

### 履歴に追加したいファイルの指定
ステージングエリア（インデックス）に履歴を管理したいファイルを add すると、そのファイルがバージョン管理の対象になる。
フィアル名に`.`を指定すると、カレントディレクトリ下にあるすべてのファイルが add される。
.gitignore にファイル名を記述しておくと、そのそのファイルは add されない。
.gitignore はカレントディレクトリ下のファイルにのみ適用される。

```zsh
$ git add ファイル名
$ git add .
```

### リポジトリに変更履歴を追加
ステージングエリアからリポジトリに変更履歴を追加することをコミットするという。
コミットするときにはコミットメッセージも入れる。
`-m`オプションを使うと、コマンド入力時にメッセージも入れられる。
`--amend`オプションを使うと、ログを増やさずに直前のコミットを変更できる。

```zsh
$ git commit
$ git commit -m "commit_message"
$ git commit --amend
```

### コミット履歴の確認
コミットにはオブジェクト名というコミットを一意に表す ID 的なものが付けられる。

```zsh
$ git log
```

`--oneline`：履歴がコンパクトに表示される。
- `-p`：ファイルの変更箇所が表示される
- `--stat`：どのファイルを何箇所変更したかが表示される。

### 作業ディレクトリの状態を表示
以下のコマンドで自分がどのファイルに変更を加えたかや、どのファイルを add したかがわかる。

```zsh
$ git status
```

### 変更履歴を確認
add する前には 1 つ目の、 add したが commit していないときには 2 つ目のコマンドを使えばファイルの変更箇所（差分）を見れる。

```zsh
$ git diff
$ git diff --cached
```

### ファイルの変更を元に戻す
add する前にファイルの変更を取り消したい場合は以下のコマンドを実行する。

```zsh
$ git checkout -- ファイル名
```

過去のコミット内容に戻したい場合は以下のコマンドを実行する。
コミット ID に HEAD を指定すると直前のコミット内容に戻れる。
`--soft`はコミットが取り消されるだけであるが、`--hard`はコミット及びステージングエリアにある内容も取り消される。

```zsh
$ git reset --hard コミットID
$ git reset --soft コミットID
```

コミットの reset を取り消すこともできる。

```zsh
$ git reset --hard ORIG_HEAD
```

### その他
ステージングエリアに上げたファイルを操作する際にはコマンドの先頭に git を必ず付ける。

## ブランチ
複数のバージョンを並行して作りたい場合にはブランチを使うと便利。
ブランチとは枝分かれした履歴の道筋のことをいう。

### ブランチの一覧を確認
今いるブランチには「*」が先頭についている。
master ブランチがメインのブランチでこれは自動的に生成される。

```zsh
$ git branch
* master
  branch2
```

### ブランチの作り方

```zsh
$ git branch ブランチ名
```

### ブランチの切り替え
ブランチを作っただけだと、master ブランチにいる状態。
以下のコマンドで作成したブランチへ自由に移動できる。

```zsh
$ git checkout ブランチ名
```

ブランチを作成すると同時にそのブランチに切り替えることも可能。

```zsh
$ git checkout -b ブランチ名
```

### マージ
ブランチで変更・修正した内容を master ブランチに反映させることをマージするという。
マージ先のブランチで以下のコマンドを実行するとマージできる。

```zsh
git merge マージしたいブランチ名
```
マージ後に必要なくなったブランチは以下のコマンドで削除する。

```zsh
$ git branch -d ブランチ名
```

### コンフリクトの解消
違うブランチで同じ部分に変更を加えてマージしようとした時にコンフリクトが発生する。
その場合、コンフリクトを解消しコミットする必要がある。

### タグ
コミット ID は長いのでタグという別名を付けられる。
直前のコミットにタグを付けたい場合はコミットIDは不要。
`git tag`とのみだとタグの一覧が表示される。

```zsh
$ git tag タグ名 コミットID
```

コミットの内容を見たい場合にはタグ名を使って以下のコマンドを実行する。

```zsh
$ git show タグ名
```

設定したタグを削除したい場合は以下のコマンドで削除できる。

```zsh
git tag -d タグ名
```

### エイリアス
コマンドに別名を付けることをエイリアスを設定するという。
長いコマンドにはエイリアスを設定しておくと作業がスムーズになる。
例えば、以下のように設定すると`git checkout`の代わりに`git co`が使えるようになる。

```zsh
$ git config --global alias.co checkout
```

## 共同作業するときの git
### リモートリポジトリの登録
リモートリポジトリをローカルリモートリポジトリに登録することでファイルを共有できるようになる。
リモートリポジトリにの名前は origin とするのが一般的。
`git config -l`や`git remote -v`で 登録したリモートの情報も確認できる。

```zsh
$ git remote add リモート名 リモートのURL
```

### リモートリポジトリの削除

```zsh
$ git remote rm origin
```

### プッシュ
リモートリポジトリにローカルリポジトリ内のファイルをアップロードすることをプッシュという。
これによって他の開発メンバーとファイルを共有できるようになる。

```zsh
$ git push origin master
```

### プル
他の人がプッシュしたファイル内容をローカルリポジトリに反映させる（マージする）ことをプルという。

```zsh
$ git pull origin master
```

以下のようにすれば、共有リポジトリの内容のクローンをローカルリモートリポジトリに作成できる。

```zsh
$ git clone
```

# 参考資料
- [ドットインストール git入門](https://dotinstall.com/lessons/basic_git)
- [try git](http://try.github.com/)
- [サルでもわかるGit入門](http://www.backlog.jp/git-guide/)
- [Pro Git](http://git-scm.com/book/ja)