シンプルでやさしいチートシート 【Git編】

## はじめに
右側の目次からお探しの用語やコマンドをクリックしてお使いください！:slight_smile:





## 対象となる読者
* Gitを触り始めたばかりの初心者の方
* 復習も兼ねて基本操作を中心におさらいしたい経験者の方
* オプションや引数など細かいところを思い出したい方

### ローカルリポジトリを作成　git init
```
  git init
```
プロジェクトのディレクトリに移動し実行
.git という名前の新しいサブディレクトリが作成されます。

### 既存のリポジトリをクローン　git clone 
```
　 git clone [URL or SSH]
```
https:// プロトコルに加え、SSH プロトコルを使用し、git:// や user@server:/path/to/repo.git といった形式を使うこともできます。

### インデックスに追加する　git add
```
  git add [ファイル名]
  git add -u 
  git add -A
  git add .
```
`-u` はバージョン管理されていて、変更があったすべてのファイルがaddされます。（新しく作られたファイルはaddされません）
`-A` は変更があったすべてのファイルがaddされます。
`.` はカレントディレクトリ以下の、変更があったすべてのファイルがaddされます。
インデックスに追加したくないファイルは`.gitignore`に記述する事で、追跡対象から外すことができます。

### ファイルの状態を確認　git status
```
  git status
  git status -s
```

今いるブランチの場所と、コミットに関する情報、該当するファイルの状態が表示されます。

##### コミットに関する情報
* nothing to commit　→　ワーキングツリーとインデックスに対して変更がない
* Untracked files　→　ワーキングツリーに存在するがステージされていない
* Changes to be committed　→　ファイルがステージされている
* Changed but not staged for commit　→　追跡対象のファイルがワーキングツリーで変更されたが、まだステージされていない


##### 該当するファイルの状態
* new file　→　インデックスに新しく追加されたファイル
* modified　→　修正があったファイル
* deleted　→　削除したファイル

##### ショートオプション
`-s`オプションで、簡略化して表示することができます。
ファイル名の左側に、ファイルの状態や変更されたかどうかを示す文字列が表示されます。

* ??　→　 まだステージされていない新しいファイル
* A　→　ステージングエリアに追加されたファイル
* M　→　修正されたファイル


### 変更されたファイルの差分を確認　git diff

```
  git diff　→　変更したけれどもまだステージされてない内容を確認
  git diff --stagedまたは--cached　→　コミットに含めるべくインデックスに追加した内容を確認
  git diff HEAD^　→　最後のコミットからの差分を確認
  git diff --name-only　→　差分があるファイル名を確認
```

### ファイルを削除　git rm

```
  git rm [ファイル名]
  git rm -f [ファイル名]
  git rm --cached [ファイル名]
```
変更したファイルをすでにインデックスに追加している場合は、`-f` オプションで強制的に削除しなければなりません。
ファイルを残したまま管理対象から外したい場合は、`--cached`オプションをつけます。
### コミットする　git commit

```
  git commit
  git commit -m "メッセージ"
```
インデックスに追加した内容をリポジトリにコミット(登録)することができます。
`-m`オプションでコミットにメッセージをつけることができます。

### コミット履歴を閲覧　git log
```
  git log
  git log -p 
  git log --stat
  git log --pretty=format:"%h - %an, %ar : %s"
  git log --oneline --decorate
  git log --oneline --decorate --graph --all
```
`git log`でコミットの履歴を閲覧できます。
コミットのハッシュ値、誰が、いつ、コミットメッセージがあるならコミットメッセージも表示します。
##### 詳しく見る git log -p
git logと同じ情報を表示するとともに各エントリの直後にその diff を表示します。`git log -p -2`など引数を指定すると直近の2エントリだけを出力します。
##### 統計情報を見る git log --stat
各コミットエントリに続けて変更されたファイルの一覧と変更されたファイルの数、追加・削除された行数が表示されます。 また、それらの情報のまとめを最後に出力します。

##### 見やすく表示 git log --pretty=format:"%h - %an, %ar : %s"
```
$ git log --pretty=format:"%h - %an, %ar : %s"
c12e17c - コミット太郎, 13 hours ago : 競合を解決
a2f2c53 - コミ子, 3 days ago : Merge pull request #2 from komiko/branch-1
```

 `--pretty`オプションでログをデフォルトの書式以外で出力、`format`オプションで独自のログ出力フォーマットを指定することができます。`%h`はコミットのハッシュ (短縮版)、`%an`はAuthor の名前、`%ar`はAuthor の相対日付、`%s`は件名(コミットメッセージ)を表しています。
他にも様々なオプションがあるようなので、用途に合わせて使ってみてください。
[Git-book --pretty=format用の便利なオプション](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%B1%A5%E6%AD%B4%E3%81%AE%E9%96%B2%E8%A6%A7#rpretty_format)

コマンドが長いので~/.gitconfigにエイリアスを登録しておくと良さそうです。
[git logを見やすくしたい！ @forest1](https://qiita.com/forest1/items/82ac22596fbe65187a8b)
##### コミット履歴をブランチとグラフを表示して確認 git log --oneline --decorate --graph --all

```
$ git log --oneline --decorate --graph --all
* d1c8d (HEAD, master) made other changes
| * 96ab3 (branch1) made a change
|/
* d45cd add feature #32 - ability to add new formats to the
```
コミットの歴史を表示するだけではなく、 ブランチポインタがどのコミットを指しているのかや、歴史がどこで分裂したのかも表示します。

### コミットの詳細を確認　git show
```
  git show
  git show [SHA-1]
  git show [タグ名]
```
最新のコミット内容を表示します。SHA-1(コミットごとのハッシュ値)や設定したタグを指定して見ることもできます。

### リモートリポジトリへプッシュする　git push
```
  $ git push [リモートリポジトリ] [ブランチ]
```
ローカルリポジトリのコミットがリモートリポジトリに反映されます
ここでの[リモートリポジトリ]は`git remote add `で登録した時の名前です。
デフォルトのoriginで登録し、masterにpushしたい場合は、`$ git push origin master`となります。
### ブランチの一覧を表示する　git branch
```
  git branch　→　ローカルリポジトリのブランチ一覧を表示 + HEAD(今作業している場所)を表示
  git branch [ブランチ]　→　新しいブランチを作成
  git branch -a　→　ローカル、リモートのブランチ一覧を表示 + HEAD(今作業している場所)を表示
  git branch -r　→　リモートのブランチを表示
  git branch -d [ブランチ]　→　ブランチを削除する
```

### ブランチを切り替える　git checkout
```
  git checkout [ブランチ]
  git checkout -b [ブランチ]
```
`-b`オプションをつけると新しいブランチが作成され、そのブランチにHEADを切り替えます。

##### HEADとは
HEADは現在のブランチを指すブランチポインタです。
checkoutによってHEADを移動させると、２つの作業が行われます。1つはHEADポインタを移動させる。もう１つは作業ディレクトリ内のファイルを移動先のスナップショットの状態に戻します。 つまり変更があった場合ブランチを切り替えると、作業ディレクトリのファイルが変更されるということです。


### ブランチを統合する(分岐した作業履歴を残す)　git merge 
```
  git merge [ブランチ]
```
##### mergeの手順

```
 git checkout [branch1]　→　branch1ブランチに移動
 git commit -a -m "修正OK"　→　変更をコミット
 git checkout master　→　masterブランチに移動
 git merge [branch1]　→　差分をマージ
```


### ブランチを統合する(分岐した作業履歴をひとつに統合する)　git rebase

```
  git rebase
```

##### rebase、fast-forward mergeの手順
```
  $ git checkout branch1　→　branch1ブランチに移動
  $ git commit -a -m "修正OK"　→　変更をコミット 
  $ git rebase master　→　分岐した作業履歴をひとつに統合
  $ git checkout master　→　masterブランチに移動
  $ git merge branch1　→　masterにも統合。(fast-forwardマージ)
```
リベースした結果の最後のコミットであっても、マージ後の最終のコミットであっても同じスナップショットになります。
違う点は、マージは分岐した作業履歴を残すのに対し、リベースは分岐した作業履歴をひとつに統合します。

##### fast-forward
>あるコミットに対してコミット履歴上で直接到達できる別のコミットをマージしようとした場合、Git は単にポインタを前に進めるだけで済ませます。マージ対象が分岐しているわけではないからです。 この処理のことを “fast-forward” と言います。
[Git-book ブランチとマージの基本](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%AE%E5%9F%BA%E6%9C%AC)

### 特定のコミットのみを指定し、統合する。　git cherry-pick
```
  git cherry-pick [SHA-1]　→　指定したコミットを統合する。
```
git logで正しいSHA-1(コミットごとのハッシュ値)を確認してから行いましょう。

### リモートリポジトリからローカルリポジトリを更新する　git pull
```
  git pull [リモートリポジトリ] [ブランチ]
```
git pullは、git fetchとgit mergeを組み合わせたものです。
### リモートリポジトリなど、他のリポジトリデータを取得　git fetch
```
  git fetch [リモートリポジトリ] [ブランチ]
```
### コミットはせずに変更を退避する　git stash
```
  git stash　→　作業を退避させる(saveを省略していますが、保存できます)
  git stash save "メッセージ"　→　メッセージをつけて退避させる
  git stash list　→　退避させたい作業の一覧を表示
  git stash apply stash@{0}　→　退避させた作業を戻す
  git stash drop stash@{0}　→　退避させた作業を消す
```
あるブランチで作業中だが、別ブランチで作業が必要になった。でもコミットできる状態じゃない場合、`git stash`で退避させることができます。
作業を戻したり消したい場合は、`git stash list`確認してから実行します。

```
  $ git stash list
  stash@{0}: On master: stash-test-2
  stash@{1}: On master: stash-test
  $ git stash apply stash@{0}
    stash@{0}の作業を戻す
  $ git stash list
  stash@{0}: On master: stash-test-2
  stash@{1}: On master: stash-test
  git stash drop stash@{1}
    stash@{1}を削除
  $ git stash list
  stash@{0}: On master: stash-test-2
```  

### コミットを取り消す(取り消した事を記録する)　git revert 
```
  git revert [SHA-1]
```
取り消したことを記録するので、(新しくコミットを追加しているだけ)リモートにpushされたコミットに対しても安全に使うことができます。

### コミットを取り消す(取消したことを記録しない)　git reset
```
  git reset --soft HEAD^
  git reset --hard HEAD^
```
* `--soft`オプションはインデックスやワークツリーには触れずにコミットを削除します。
* `--hard`オプションはインデックスとワークツリーもリセットし、コミットを削除します。 
* `HEAD^`は直前のコミットを指します
* `HEAD~{n}`  ：n個前のコミットを指します。

※　git resetは取り消したことを記録しないので、リモートにpushされたコミットなどには使わないようにしましょう。


### 直近のコミットの変更、コミットメッセージの変更　git commit --amend 
```
  git commit --amend
```

実行するとテキストエディタが開き、直近のコミットメッセージ変更できます。
これは新しいコミットを作成して直近のコミットをそれで置き換えています。
さらにファイルなどを修正追加しステージグエリアに変更を加えてgit commit --amendを実行すると、これも新しいコミットを作成して直近のコミットをそれで置き換えています。コミットのSHA-1(コミットごとのハッシュ値)も変わるので、使う際には注意が必要です。
※ すでにプッシュしているコミットは書き換えないようにしましょう。


### リモートリポジトリを追加　git remote add 
```
  git remote add [任意の名前] [リモートリポジトリパス]　→　 リモートリポジトリを追加
  git remote -v　→　設定されているリモートリポジトリを参照します。
  git remote rm [任意の名前]　→　リモートリポジトリの登録を削除します。
```

### 過去にコミットした履歴を見る　git reflog 
```
  git reflog
```
実行すると、最近のコミットから順に、SHA-1(コミットごとのハッシュ値)、処理、コミットメッセージが表示されます。

```
  $ git reflog
  09b872e (HEAD -> master) HEAD@{0}: commit: test3
  ce0887b HEAD@{1}: commit: test2
  a6c62f3 HEAD@{2}: commit: test
  8e57c80 HEAD@{3}: reset: moving to HEAD
```

### コミットに対してタグをつける　git tag [タグ名] [SHA-1]
```
  git tag　→　タグ一覧を表示
  git tag [タグ名] [SHA-1]　→　タグを付ける
  git push [リモートリポジトリ] [タグ名]　→　リモートに反映
  git tag -d [タグ名]　→　タグの削除
```
 タグをつける際にSHA-1(コミットごとのハッシュ値)を省略すると直前のコミットに適用されます。


### Gitで使用する名前とメールアドレスの設定 　git config
```  
  $ git config --global user.name "gittaro"
  $ git config --global user.email taro@example.com
```

## おわりに
もしこの記事が為になった！という方はフォローやいいねボタンのクリックをしていただけたらとても嬉しいです！:smiley:


## 参考

[Git-book](https://git-scm.com/book/en/v2)
[Git基本コマンド@konweb](https://qiita.com/konweb/items/621722f67fdd8f86a017)