Git入門

##はじめに
改めてGITを勉強したので、備忘録として残しておきます。


##Git
Gitとは分散型バージョン管理システムのことで、Linuxのソースコードを効果的に管理するために作られた。

Gitを使うメリット
・編集前のファイルの状態に戻すことができる。
・チームで開発する場合、他人の編集内容を知らず識らずのうちに上書きしてしまうとった問題を回避できる。

###リポジトリ
ファイルやディレクトリの状態を管理する場所。
リポジトリ下に置くことで変更履歴を管理できる。

リモートリポジトリは専用のサーバに配置して複数人で共有するためのもの。
ローカルリポジトリは自分のマシン上にある、一人一人が管理するもの。

###コミット
コミットとは、ファイルやディレクトリの追加・変更をリポジトリに記録する操作のこと。

コミットにより、前回コミット時の状態と現在の状態の差分の記録がコミット（リビジョン）として記録される。

このコミット時にはメッセージが必要となり内容は変更内容の要約＋変更した理由になる。

###ワークツリーとインデックス（ステージングエリア）
Gitの管理下に置かれた、みなさんが実際に作業をしているディレクトリのことをワークツリーという。

Gitにはインデックスというものがあり、コミットを実行した時にワークツリーから直接リポジトリ内に状態を記録するのでなく、その間に設けられているインデックスの設定された状態を記録するようになっている。

基本的に以下の三つの状態になる。
1:作業ディレクトリ
↓git add 
2:ステージングエリア（インデックス）
↓git commit
3:リポジトリ



###初期設定

``` 
#名前、メールアドレス設定、設定確認
$ git config --global user.name "Kazuma Horikawa"
$ git config --global user.email "horikazu1397@gmail.com"
$ git config --global color.ui true
$ git config -l
```

###git init
リポジトリを新規作成または再初期化する

```
$ git init
Initialized empty Git repository in /Users/×××/Desktop/test/.git/
```
###git log
コミットのログを確認する

```
$ git log
commit da4××××××××××× (HEAD -> master)
Author: ×××××× <×××××@gmail.com>
Date:   Sat Jun 22 10:42:34 2019 +0900

    new commit

$ git log --oneline (一行でログを確認)
da45938 (HEAD -> master) new commit

$ git log -p (ログに加えてどこが変更されたかを表示)
commit da4××××××××××× (HEAD -> master)
Author: ×××××× <×××××@gmail.com>
Date:   Sat Jun 22 10:42:34 2019 +0900

    new commit
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..1ffa548
--- /dev/null
+++ b/index.html
@@ -0,0 +1 @@
+hi from test

$ git log --stat (ログに加えてどのファイルが変更されたか)
commit da4××××××××××× (HEAD -> master)
Author: ×××××× <×××××@gmail.com>
Date:   Sat Jun 22 10:42:34 2019 +0900

    new commit
index.html | 1 +
1 file changed, 1 insertion(+)
```

###git status

作業ディレクトリ(add、ステージングエリアの前)で状態を確認できる。
checkout/addで編集できる。

```
$ git status
On branch master
nothing to commit, working tree clean
```
この表示はステージングエリアに何もないということ

```
$ vim status.html
$ git status
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	status.html
```
この表示はコミットするためには```git add```をしてくださいと言っている

###git diff
作業ディレクトリ(add、ステージングエリアの前)で変更を確認できる。

```
$ git diff
diff --git a/index.html b/index.html
index 1ffa548..d288de7 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
 hi from test
+confirm diff
```
addしてステージングエリアのファイルを確認する場合は、オプションで```--cached```をつける
```git diff --cashed```

ファイルを削除・移動する場合は、
```git rm/mv```
とする。

###.gitignore
指定したファイルをコミットしないようにする。
vimでワイルドカードを用いて編集し、
```*.log```
のようにすると、.log系のファイルはaddされない。
.gitignoreが適用される範囲はどうディレクトリと下位ディレクトリで、主な用途としてはセキュリティ上見られたくないものやファイルが大きくて上げる必要がないものに使われる。

```
$ vim test.log
$ vim .gitignore
  *.log
```
↑により、test.logはコミットされない。

###git commit --amend
直前のコミットを変更したいがlogはそのままでいい場合に使う。
コミットメッセージが開き、変更するか問われる。

###git reset
addまでして前のコミットの状態にしたい時、logを指定して戻ることができる。
```git reset --hard HEAD```
HEADまたは直接logの値を指定できる

```git reset --hard ORIG_HEAD```
とすることでコミットデータが戻る

```
$ git reset --hard HEAD
HEAD is now at 5a6fd32 new

$ cat index.html 
hi from test
confirm diff

$ git reset --hard HEAD^(HEADのもう一つ前)
HEAD is now at da45938 new commit

$ cat index.html 
hi from test

$ git reset --hard ORIG_HEAD
HEAD is now at 5a6fd32 new
```
###git branch
```git branch```
で現在の状況を確認できる。標準はmaster
```git branch hoge```
でブランチ作成
```git checkout hoge```
でブランチ移動
または作成・移動は
```git checkout -b hoge```
とする

```
$ git branch
* master

$ git branch hoge

$ git branch
  hoge
* master
* 
$ git checkout hoge
Switched to branch 'hoge'

$ git branch
* hoge
  master

$ git checkout -b hogehoge
Switched to a new branch 'hogehoge'

$ git branch
  hoge
* hogehoge
  master
```

###git merge
masterにブランチを同期させる。
```git merge hoge```
上記でいえば、hogeでの編集内容をmasterに同期することができる。
```git branch -d hoge```
で削除できる

```
$ git branch
  hoge
* master

$ git checkout hoge
Switched to branch 'hoge'

$ vim hoge.html

$ git add .

$ git commit -m"commit from hoge"
[hoge a3d9e3e] from hoge
 1 file changed, 1 insertion(+)
 create mode 100644 hoge.html

$ git log
commit a3d××××××××（HEAD -> hoge)
Author: ×××× <×××@gmail.com>
Date:   Sat Jun 22 11:04:05 2019 +0900

    from hoge

commit 5a6××××××××(master)
Author: ××× <×××@gmail.com>
Date:   Sat Jun 22 10:52:59 2019 +0900

　　cmmit from master

$ git checkout master
Switched to branch 'master'

$ git merge hoge
Updating 5a..a3e
Fast-forward
 hoge.html | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 hoge.html

$ git log
commit a3d×××× (HEAD -> master, hoge)
Author: ××× <×××@gmail.com>
Date:   Sat Jun 22 11:04:05 2019 +0900

    from hoge
```
###CONFLICT
同じファイルを違うブランチで編集してマージするとコンフリクト（衝突）が起きる
```git status```で確認できる
この場合はvimでコンフリクトが起きている箇所を直接編集する。

###git tag
logの値の羅列に対して名前をつけることができる。
```git tag v1.0```
↑直近のコミットをv1.0という名前にした。
```git show v1.0```
でコミット内容確認できる。
```git tag -d v1.0```
でタグを削除できる。

```
$ git tag v1.0

$ git show v1.0
commit a3d××× (HEAD -> master, tag: v1.0, hoge)
Author: ××× <×××@gmail.com>
Date:   Sat Jun 22 11:04:05 2019 +0900

    from hoge

diff --git a/hoge.html b/hoge.html
new file mode 100644
index 0000000..45b983b
--- /dev/null
+++ b/hoge.html
@@ -0,0 +1 @@
+hi

$ git tag -d v1.0
Deleted tag 'v1.0' (was a3d9e3e)
```

###alias
aliasを使うことでコマンドに短縮名をつけることができる
checkoutにcoという略称をつけたい
```git config --global alias.co checkout```
branchにbrという略称をつけたい
```git config --global alias.br branch```

```
$ git config --global alias.st status

$ git st
On branch master
nothing to commit, working tree clean

$ git config -l(aliasの確認)
...
alias.st=status
...
```

###共有リポジトリ
共有リポジトリをinitする場合は--bare/sharedというオプションが必要になる
```git init --bare --shared```
```git remote add origin リモートリポジトリのパス```
でリポートリポジトリを指定する。
```git push origin master```
で内容をプッシュすることができ、
```git pull origin master```
で内容をプルできる

```git congig -l```
でリモートリポジトリの場所やaliasを確認することができる。