GIt基本操作チュートリアル

「GitHub実践入門」の書籍から第4章のgitの使い方のチュートリアルを実施とメモ。

内容詳細はとても丁寧に書籍には記載されているので、Gitの通常の利用（GitHubを使わない）でもとてもお勧めな書籍。

# 基本的な操作

## git初期化

```
$ git init
Initialized empty Git repository in /home/vagrant/test/.git/
```


## リポジトリの状態確認

### ステータスの確認

```
$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
```

### ファイルを作ってステータスの確認
```
$ touch README.md

$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	README.md
nothing added to commit but untracked files present (use "git add" to track)
```
## 追加・編集

### ステージ領域へのファイルを追加（git add）

```
$ git add README.md

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#	new file:   README.md
#
```

### リポジトリの歴史を記録

```
$ git commit -m "First commit"
[master (root-commit) f83324e] First commit
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md

$ git status
# On branch master
nothing to commit (working directory clean)
```

### コミットログを確認

```
$ git log
commit f83324e2d5c95a3ef022a887a5d740f6153eccba
Author: vagrant <vagrant@hogehoge.(none)>
Date:   Wed Jan 21 12:22:05 2015 +0000

    First commit
```

### 変更差分を確認
README.mdに変更をかけての状態の確認。


```
$ vi README.md
以下の行を追加
----------------
# GITチュートリアル
----------------
```
        
状態の確認

```
$ git diff
diff --git a/README.md b/README.md
index e69de29..002e313 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+# GITチュートリアル

$ git add README.md
```

### ワークツリーと最新のコミットの差分を確認する

```
$ git diff HEAD
diff --git a/README.md b/README.md
index e69de29..002e313 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+# GITチュートリアル

 git commit -m "Add Index"
[master d7bacc6] Add Index
 1 files changed, 1 insertions(+), 0 deletions(-)
```

ログの確認

```
$  git log
commit d7bacc6d3b08bfc1207910066909bb1d64ec5a23
Author: vagrant <vagrant@hogehoge.(none)>
Date:   Wed Jan 21 12:26:15 2015 +0000

    Add Index

commit f83324e2d5c95a3ef022a887a5d740f6153eccba
Author: vagrant <vagrant@hogehoge.(none)>
Date:   Wed Jan 21 12:22:05 2015 +0000

    First commit
```

# ブランチの操作

### ブランチ一覧を表示

```
$ git branch
* master
```

## ブランチを作成し切り替える

### feature-Aブランチに切り替えてコミットする

```
$ git checkout -b feature-A
Switched to a new branch 'feature-A'
```

これは以下の操作と同じ。

```
$ git branch feature-A
$ git checkout feature-A
```

ブランチの確認

```
$ git branch
* feature-A
  master
```

ファイルを更新する。

```
$ vi README.md
以下の行を追加
----------------
    - feature-A
----------------
```

ファイルの追加

```
$ git add README.md
```

feature-Aのブランチでのコミット

```
$ git commit -m "Add feature-A"
[feature-A ae9f50e] Add feature-A
 commit --amend --author='Your Name <you@example.com>'
 1 files changed, 2 insertions(+), 0 deletions(-)
```

### masterブランチへ切り替える

```
$ git checkout master
Switched to branch 'master'
```

ブランチをmasterに戻したところでファイル内容を確認してみる。

```
$ cat README.md
# GITチュートリアル
```

feature-Aで変更した内容が戻っている。


一つ前のブランチに切り替える（feature-A）

```
$ git checkout -
Switched to branch 'feature-A'
```

## ブランチをマージ

マスタにブランチを戻す。

```
$ git checkout master
Switched to branch 'master'
```

マージコマンドの実行

```
$ git merge --no-ff feature-A
Merge made by recursive.
 README.md |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)
```

### ブランチを視覚的に確認する

```
$ git log --graph
*   commit 1eaad66acbb5809b1a916b30f99d680c6acaa923
|\  Merge: d7bacc6 ae9f50e
| | Author: hogehoge <hogehoge@test.com>
| | Date:   Wed Jan 21 12:36:09 2015 +0000
| |
| |     Merge branch 'feature-A'
| |
| * commit ae9f50e127e271f798bc552aa1cd92098a650cae
|/  Author: vagrant <vagrant@hogehoge.(none)>
|   Date:   Wed Jan 21 12:32:09 2015 +0000
|
|       Add feature-A
|
* commit d7bacc6d3b08bfc1207910066909bb1d64ec5a23
| Author: vagrant <vagrant@hogehoge.(none)>
| Date:   Wed Jan 21 12:26:15 2015 +0000
|
|     Add Index
|
* commit f83324e2d5c95a3ef022a887a5d740f6153eccba
  Author: vagrant <vagrant@hogehoge.(none)>
  Date:   Wed Jan 21 12:22:05 2015 +0000

      First commit
```

# コンフリクトの解消

### 歴史を戻る

feature-Aブランチを分岐する前に戻る

```
$ git reset --hard d7bacc6d3b08bfc1207910066909bb1d64ec5a23
HEAD is now at d7bacc6 Add Index
```

fix-Bブランチを作成する

```
$ git checkout -b fix-B
Switched to a new branch 'fix-B'
```

過去のmasterの状態から別ブランチを作成した状態でファイルの編集。
（feature-Aで編集したものと同じファイル。）

```
$ vi README.md
以下の行を追加
----------------
 - fix-B
----------------
```

ファイルをコミット。

```
$ git add README.md

$ git commit -m "Fix B"
[fix-B cdea270] Fix B
 1 files changed, 2 insertions(+), 0 deletions(-)
```

### feature-Aブランチをマージした後の状態に進む

まずは状態の確認。

```
$ git reflog
cdea270 HEAD@{0}: commit: Fix B
d7bacc6 HEAD@{1}: checkout: moving from master to fix-B
d7bacc6 HEAD@{2}: d7bacc6d3b08bfc1207910066909bb1d64ec5a23: updating HEAD
1eaad66 HEAD@{3}: merge feature-A: Merge made by recursive.
d7bacc6 HEAD@{4}: checkout: moving from feature-A to master
ae9f50e HEAD@{5}: checkout: moving from master to feature-A
d7bacc6 HEAD@{6}: checkout: moving from feature-A to master
ae9f50e HEAD@{7}: commit: Add feature-A
d7bacc6 HEAD@{8}: checkout: moving from master to feature-A
d7bacc6 HEAD@{9}: commit: Add Index
f83324e HEAD@{10}: commit (initial): First commit
```

上から4番目のがfeature-Aブランチをマージした後の状態。

```
$ git checkout master
Switched to branch 'master'

 git reset --hard 1eaad66
HEAD is now at 1eaad66 Merge branch 'feature-A'
```

### コンフリクトを解消

マージしてみる。

```
$ git merge --no-ff fix-B
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
```

「README.md」ファイルで、「Merge conflict」が出ていると表示される。

この状態で「README.md」を確認。

```
$ cat README.md
# GITチュートリアル

<<<<<<< HEAD
  - feature-A
=======
 - fix-B
>>>>>>> fix-B
```

このファイルを以下のように編集

```
$ vi README.md
以下に編集
----------------
# GITチュートリアル

  - feature-A
 - fix-B
----------------
```

### 解消した結果をコミットする

```
$ git add README.md
$ git commit -m "Fix conflict"
[master 334d70b] Fix conflict
```

コンフリクトが解消されてコミットされる。