GitについてとGitで使用する基本的なコマンドについて

###バージョン管理システムについて
様々なファイルは修正を繰り返したり、また修正前に戻ったりのが当たり前
→ファイルの履歴を管理する必要がある

**バージョン管理システム**
→ファイルの変更内容を保存して管理しておくためのツール

#Git

###Gitとは
バージョン管理システムの１つ
修正前のバージョンに戻ったり、修正後に行けたり、手軽にバックアップを行うことができ、ソースコードの差分を確認することができる。
チーム開発でよく使用される。

###Gitのインストール方法(CentOSの場合)
1.sudo　yum install git-coreと入力（パスワードを入力する）
2.Is this ok [y/d/N]→yと入力

```
$sudo yum install git-core
--省略--
Is　this ok [y/d/N]:y
```
git --versionと入力しインストールが成功したかを確認する


```
$git --version
```

###Gitの初期設定
まずは使用するユーザーが誰なのか、その情報をGitに伝えるために名前とメールアドレスの登録を行う必要がある。

```
$git config --global user.name '＜名前＞'
$git config --global user.email '＜メールアドレス＞'
```
必須ではないが見やすくするためにカラー出力の設定をする場合は以下のように行う

```
$git config --global color.ui auto
```

これまで設定した内容の確認はcatコマンドを使用する

```
$cat ~/.gitconfig
```

するとこんな形で表示される（例）

```
$cat ~/.gitconfig

[user]
name=hoge
email=fugafuga@hoge.com
[color]
ui=auto
```
##Gitの基本的な使い方

###Gitの基本的なコマンド
git init:初期化のためのコマンド、リポジトリを作成する
**git add**:ファイルをバージョン管理の対象にし、リポジトリに履歴として追加するようにする
**git commit**:リポジトリにファイルの変更履歴を追加する(コミットする)
git status:ワークツリー(リポジトリの内容をファイルとして展開する場所)の状態を表示する
git diff:変更した部分の差分の確認
git log:変更の履歴の確認
####コミットについて
**コミット(リビジョン)**とは
→ある時点でのプロジェクトの状態のこと

**コミットする**
→Gitリポジトリに新しいリビジョンを追加する


###実際の作業について
###①リポジトリの作成
リポジトリ→Gitがファイルを保存する場所

####新しいディレクトリの作成を行う
今回はtestdirという名前で作成

```
$mkdir -p ~/git/testdir
```


####ディレクトリの初期化を行う
cdコマンドでtestdirに移動した後、git initコマンドで初期化を行う
→.gitというディレクトリが生成される
→これがGitリポジトリの実体


```
$cd ~/git/testdir
$git init
```

ls -aコマンドで作成されたかを確認する

```
$ls -a
```

この際に

```
.git
```
という表記があればリポジトリが作成されたとわかる

###②バージョン管理するファイルの作成
testdir.shというシェルスクリプト
(シェルのコマンドラインをあらかじめ記述しておくファイルのこと)を作成

```
#ファイルの作成
$touch testdir.sh

#数値モードによるパーミッションの設定
$chmod 755

#vimを使って編集
$vim testdir.sh
--編集作業--
```

###③git addコマンドでリポジトリに履歴として追加
履歴として追加する

```
#testdir.shを追加するための指定
$git add testdir.sh
```

また複数のファイルの追加を一気に行いたい場合は

```
$ git add -A
```
でまとめて追加することができる。

###④git commitでリポジトリにファイルの登録

```
#-m オプションで指定　修正に対するメッセージの入力
$git commit -m ’メッセージの入力①’
```

リポジトリに新しいプロジェクトの状態が保存された
→コミットした

###⑤再編集

```
#vimを使って編集
$vim testdir.sh
--編集作業--
```
###⑥git statusで現在のワークツリーの状態を確認

```
$git status
--中略--
modified: testdir.sh
--中略--
```

⑤で修正を加えたことでtestdir.shにmodified(変更された)と表示

###⑥git diffで変更前後の差分を確認

```
$dit diff
--変更内容が表示--
```

もう一度コミットする前に変更内容に誤りがないか確認

###⑦git addコマンドでリポジトリに履歴として再び追加

```
$git add testdir.sh
```

###⑧git commitで再コミット

```
$git commit
```

-mオプションによるメッセージ入力を行わないと自動的にvimが起動
→vimを使って今回のコミットに対するログメッセージを記入（どのような変更を加えたか)

####コミットに対するログメッセージの書き方
１行目：変更した内容について
２行目：空行
３行目：変更を行った理由について

記入後
→：wq

###⑨git logで変更内容の確認

```
$git log 
commit `40文字の文字列(コミットのオブジェクト名）①`
Author:＜名前＞＜メールアドレス＞が表示
Date：日時

⑧のログメッセージの内容

commit `40文字の文字列(コミットのオブジェクト名）②`
Author:＜名前＞＜メールアドレス＞が表示
Date：日時

④のメッセージの入力①
```
このような内容が表示される

####git logをツリー状にする
※git log に　--oneline --decorate --graphのオプションを付与することで
git logをツリー状に確認することができる

```
$git log --oneline --decorate --graph
--git logがツリー状に表示--
```

####参考
-pオプションでコミットの差分(diff)も表示できる

```
$git log -p
```

オブジェクト名の先頭７文字のコミットを行なった直後の状態→現在のワークツリーまでの差分を表示

```
$git diff 'オブジェクト名の先頭７文字'
```

##git add,git commitの仕組みについて
ワークツリーで作業した内容がリポジトリに保存されるのは
ワークツリー→インデックス(ステージングエリア)→リポジトリという流れになっている

###インデックス(ステージングエリア)について
インデックス(ステージングエリア)とはワークツリーとリポジトリの間に存在する
リポジトリに作業データを保存する(コミットする)前に**一時的に置いておくための場所**である

インデックス(ステージングエリア)については撮影台をイメージするとわかりやすかった
例えると
作った料理(ワークツリーで作ったもの)を

```
hogehoge
fugafuga
```
撮影台の上に乗せて(ワークツリー→インデックスに移動)

```
#ワークツリー→インデックスに移動
$ git add
```

撮影する(コミットする)

```
#インデックスにあるものをコミットする
$ git commit -m '変更内容についてのコメント'
```

そして撮影したもの(コミットしたもの)はデータとして保存される(リポジトリに保存)