Gitのチートシート

## Gitのチートシートまとめ
gitでよく使用するコマンドやメモをまとめます。
自分のアウトプットを兼ねて、gitのチートシートを作成いたします。
【必要があれば更新していきます。】

## まずは超基本

### 設定関係

```
# グローバルの設定編集
$ git config --global --edit


# 設定確認
$ git config --list

# もしくはこれ
$ cat ~/.gitconfig
```


### リポジトリの作成
```
# リポジトリの新規作成(.gitが作成される)
$ git init
```

```
# gitリポジトリのクローンを作成
$ git clone <リポジトリのURL>
```
### ステージに追加
git add は変更をステージに追加する。
コミットする変更を準備するため。
圧縮ファイルの生成と
インデックスファイルにマッピングされた情報を追加する。

```
# 変更をステージに追加する
$ git add <ファイル名>
$ git add <ディレクトリ名>
$ git add .
 ```

### コミット
変更をリポジトリに記録する＝コミット。
インデックスファイルを元にツリーファイルを生成と
コミットファイルの作成。

```
# コミットする
$ git commit
$ git commit -m "メッセージ"

#　変更内容も確認できる
$ git commit -v
```

### コミットメッセージの書き方
原理原則として変更内容の要点と変更理由を書く
簡単に書くときは、１行に収める。
正式に書くときは

```
1行目:変更内容の要約
2行目:空行
3行目:変更した理由
```

### コミットやステージする前にどんな変更をしたか確認する
変更差分を確認する
differenceの略。

```
# git addする前の変更分(ワークツリーとステージの間の変更差分)
$ git diff
$ git diff <ファイル名>

# git addした後の変更分(ステージとリポジトリの変更差分)
$ git diff --staged
```

### 変更履歴の確認

```
# 履歴の確認
$ git log

# １行で見やすく表示
$ git log --oneline

# 特定のファイルの変更差分を表示する
$ git log -p <ファイル名>

# 表示するコミットの数を制限する
$ git log -n <表示する数>
```


### ファイルの削除を記録する
git addは使わない。
removeの略

```
# gitの記録から(すでにリポジトリにあるファイル)も消えるし、ワークツリーからも消す方法
# ファイルごと削除
$ git rm <ファイル名>
# ディレクトリごと削除
$ git rm -r <ディレクトリ名>

# ワークツリーにはファイルを残したい時
$ git rm --cached <ファイル名>
```

### ファイルの移動を記録する

```
# ファイルの移動を記録する
$ git mv <旧ファイル><新ファイル>

# 以下のコマンドと同じ
$ mv <旧ファイル><新ファイル>
$ git rm <旧ファイル>
$ git add <新ファイル>
```

### リモートリポジトリを新規追加する

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

# originというショートカットで、リモートリポジトリを登録する
# 今後は、originという名前でpushやpullが行える
$ git remote add origin https://github.com/user/〇〇
```

### リモートの表示
```
$ git remote

# 対応するURLも表示させるのであれば
$ git remote -v
```

### リモートの変更・削除
別のリモート名にしたい時とか、リモートを使わなくなった時とか

```
# リモート名の変更
$ git remote rename <旧リモート名><新リモート名>

# リモートの削除
$ git remote rm <リモート名>
```

### リモートリポジトリにプッシュ

```
$ git push <リモートリポジトリ名><ブランチ名>

# 例えば
# ローカルのmasterブランチを、登録したリモートリポジトリ名のoriginにpushする
$ git push origin master
```

```
# git push -uコマンドについて
# 次回以降 git pushだけで勝手にorigin masterでpushしてくれる
```

### バージョン管理したくない.gitignore
・パスワードとかの機密情報を記載したファイル(AWSのパスとか気をつける)
・チーム開発で必要ないもの(自動生成されるものとかキャッシュとか)

.gitignoreファイル自体は、普通に作成する
.gitignoreの書き方

```
# #はコメント

# 指定したファイルを除外
index.html

# ルートディレクトリを指定
/root.html

# ディレクトリ以下を除外
dir/

# ワイルドカード
# 例：一つ階層を潜った任意のcssファイル
/*/*.css
```

## ファイルの変更を取り消すやり方

### ワークツリーの変更を元に戻す
ステージの情報をワークツリーから持ってくることによって、元に戻す。

```
# ブランチ名とファイル名がかぶった時に、どちらをしているのかGitがわからなくなるから【--】を使う
$ git checkout -- <ファイル名>
$ git checkout -- <ディレクトリ名>

# 全変更を取り消す
$ git checkout -- .
```

### ステージした変更を取り消す
リポジトリの情報を取ってきて、変更分を上書きすることによって、ステージの変更を取り消している。
HEADは最新のコミットを指しているから、最新のコミット情報使ってresetするよってこと。

```
$ git reset HEAD <ファイル名>
$ git reset HEAD <ディレクトリ名>

# 全変更を取り消す(たぶん使う機会はそうそうない)
$ git reset HEAD .
```
注意点
指定した変更をステージから取り消すだけなので、ワークツリーには影響を与えない。
つまり、ワークツリーの変更も同時に変更も戻す場合は
以下をする必要がある。

```
$ git reset HEAD <ファイル名>
$ git reset checkout -- <ファイル名>
```

### 直前のコミットを無かった事にする
編集内容も丸ごと無かった事にする

```
$ git reset --hard HEAD^
```


### 直前のコミットを修正する・上書きする
amendの意味：修正する/改正する

```
$ git commit --amend
```
注意点：リモートリポジトリにプッシュしたコミットは取り消したらだめ！

原理としては、上記のコマンドを打つタイミングで、直前のステージの情報に変更する。
これを使えば、コミットメッセージだけでなくコミット内容を変えることも可能になる。
つまり

```
# コミットする
$ git commmit -m "htmlを変更しました"

# コミット内容を間違えた！となったとする
# ワークツリーにて該当箇所を変更して、git addで、ステージにあげる
# ステージの状態が修正されたら、ここで
$ git commit --amend

# コミットの内容を修正できる

```

### コミットメッセージを変更する
上と一緒

```
$ git commit --amend
```


### コミットを打ち消す
コミットをなかったことにする訳ではなく、逆向きのコミットを履歴の残す。

```
$ git revert <ハッシュ値>
```


## リモートから情報を取得

### fetch(フェッチ)
ローカルに情報を引っ張ってくる。

```
$ git fetch <リモート名>

# 引っ張ってきたブランチは以下で確認
$ git branch -a
```

### merge(マージ)

```
# 現在のローカルのブランチにマージする
# スラッシュ(/)忘れるな
$ git merge <リモート名/引っ張ってきたリモートのブランチ名>
```

### pull(プル)
pullは、fetchしてmergeを一気に行う。
現在のブランチにpullしてきてた情報を取り込むので、注意が必要。

```
$ git pull <リモート名><リモートのブランチ名>

#よく使うのは
$ git pull origin master
```

### じゃあ、fetchとpullはどうやって使い分ける？
個人的にはfetchを使った方が確実。
なぜなら、pullでは現在のブランチにpullしてきた情報を取り込むので、
意識していないと意図しないブランチに取り込む可能性がある。
うっかり別のブランチにいる時なんか注意。

## コンフリクト関連
### コンフリクトが起きたら

```
# まず状況確認
$ git status

# そしたら以下みたいな表示
both modified:   <ファイル名>

# ここに書かれているファイルのコンフリクトを解消する
# 解消方法:最終的な形を作って、必要ないものを削除
# その後ステージに上げて、再コミット
# コミットメッセージの詳細に"コンフリクトの解消"等を書いておく
```

### コンフリクトがなるだけ起きないようにする運用ルール

- 複数人で同じファイルを変更しない
- pullやmerge前に変更中の状態をなくす
  - commitやstashしておく
- pullする際は、pullするブランチに移動してからpull
- (心構え)コンフリクトしても慌てない
  - 状況確認して、コンフリクトを解消して、ステージに上げて、コミット


## ブランチ関連
### ブランチ切る方法
```
# ブランチを切って、チェックアウトも同時に行う
$ git checkout -b <新しく作るブランチ名>
```

### ブランチ名の変更
```
# ブランチ名の変更
# ブランチ名を変更したいブランチに移動してから行う　
$ git branch -m <新しいブランチ名>
```

### ブランチの削除
```
# ブランチの削除
# materにマージされていない変更が残っている場合、削除されない
$ git branch -d <削除したいブランチ名>

# 強制的に消すには
$ git branch -D <削除したいブランチ名>
```

### リモートブランチ
リモートのブランチの状態へのポインタ

```
# リモートブランチの参照は以下
# (/)スラッシュを使う
<リモート>/<ブランチ>
```

## リベース関連
### リベース一連の流れ
```
# 親コミットが同じfeatureとmasterがある場合、
# featureの親コミットをmasterとしてmergeしたい時
$ git checkout feature
$ git rebase master
$ git checkout master
$ git merge feature
```

### プルのリベース型
```
# プルする時にリベースで情報を取得する
$ git pull --rebase <リモート名><ブランチ名>

# 例えば
$ git pull --rebase origin master
```


## スタッシュ関連
### 作業を一時避難する
```
$ git stash
$ git stash save

# 一覧で確認
$ git stash list
```

### スタッシュの復元
```
# 最新の作業を復元する
$ git stash apply

# ステージの状況も復元する
$ git stash apply --index

# 特定の作業を復元する
$ git stash apply [スタッシュ名]
```

### スタッシュの削除
```
# 最新の作業を削除する
$ git stash drop

# 特定の作業を削除する
$ git stash drop [スタッシュ名]

# 全作業の削除
$ git stash clear
```