gitコマンド集

# add
指定したファイルをインデックスに登録しコミット対象にする。

```zsh:基本
git add <ファイル名>
```

`git add -u` or `git add --update`：バージョン管理下のファイルのみ`add`される。
`git add -A` or `git add --all`：すべての変更ファイルが`add`される。
`git add .`：カレントディレクトリ以下の変更ファイルが`add`される。

|            | New File | Modified File | Deleted File |
|:----------:|:--------:|:-------------:|:------------:|
| git add -u |  ×       |    ○          |     ○        |
| git add -A |  ○       |    ○          |     ○        |
| git add .  |  ○       |    ○          |     ○        |


# commit
リポジトリへ変更を記録する。

```zsh:基本
git commit -m <コミットメッセージ>
```
### 直前にコミットしたメッセージの変更
```zsh
git commit --amend -m <新しいコミットメッセージ>
```
※2つ以上前のコミットメッセージを変更する場合は、`rebase`を参照。


# push
ローカルリポジトリの内容をリモートリポジトリへ反映する。

```zsh:基本
git push origin <ブランチ名>
```
※`origin`はリモートリポジトリの場所の別名(デフォルト)を表す。

`git push origin HEAD`：カレントブランチを`push`する。
`git push -f origin <ブランチ名>`：リモートブランチをローカルブランチの内容で上書きする。
`git push -d origin <ブランチ名>`：リモートブランチを削除する。


# fetch
リモートリポジトリから最新情報をローカルリポジトリにダウンロードする。

```
git fetch origin <ブランチ名>
```

# merge
指定したブランチの内容を統合する。

```
git merge <ブランチ名>
```


# pull
リモートのブランチの内容をローカルのブランチに反映する。（`git fetch`+`git merge FETCH_HEAD`）

```zsh:基本
git pull origin <ブランチ名>
```




# branch
ブランチの一覧表示、作成、削除を行う。

### ローカルブランチの一覧表示
```zsh
git branch
git branch -l
```
### リモート追跡ブランチの一覧表示
```zsh
git branch -r
```
### リモート追跡ブランチとローカルブランチの両方を一覧表示
```zsh
git branch -a
```

### ローカルブランチを作成
```zsh
git branch <ブランチ名>
```

### ローカルブランチを削除
```zsh:マージ済みの場合
git branch -d <ブランチ名>
```
```zsh:汎用
git branch -D <ブランチ名>
```
※`-D`は`--delete --force`のショートカット

# checkout
ワークツリーの内容を指定したブランチに切り替える。

### ブランチの切り替え
```zsh:基本
git checkout <ブランチ名>
```

`git checkout -b <ブランチ名>`：ブランチを作成し、切り替える。（`git branch` + `git checkout`）

# clone
リポジトリのクローンを作成する。

```zsh:カレントディレクトリにリポジトリを複製
git clone <リポジトリのURL>
```

```zsh:指定したディレクトリにリポジトリを複製
git clone <リポジトリのURL> <ディレクトリ> 
```


# init

リポジトリを新規作成する、または既存リポジトリを初期化する

```zsh:カレントディレクトリの場合
git init
```

```zsh:ディレクトリを指定する場合
git init <ディレクトリ名>
```


# rm
ファイルを削除する、またはGitの管理対象から外す

```zsh:指定したファイルをGitの管理対象から外し、ワークツリーからも削除する
git rm <ファイル名>
```

`git rm -f <ファイル名>`：指定したファイルが最後のコミット後に変更されていても削除する。
`git rm -r <ディレクトリ名>`：指定したディレクトリをGitの管理対象から外し、ワークツリーからも削除する。
`git rm --cached <ファイル名>`：ファイルをワークツリーに残したまま、Gitの管理対象から外す。


# config
Gitの設定を確認・変更する。

### 設定一覧を表示
```
git config -l
git config --list
```
※local,system,globalの設定を個別に確認するには、オプション`--local` or `--system` or `--global`をつける。

### 設定の確認
```
git config <設定項目名>
```

### 設定の変更
```zsh:コマンドラインから編集する場合
git config <設定項目名> <設定値>
```

```zsh:エディタで直接編集する場合
git config -e
```
### Gitの設定Tips

#### ユーザー名とメールアドレスを設定する。
※GitHubのユーザー名とメールアドレスと揃えるとよい。

```
git config --global user.name "<ユーザー名>"
git config --global user.email "<メールアドレス>"
```

#### シンボリックリンクを有効にする。
```
git config --global core.symlinks true
```

#### 日本語のファイル名が文字化けしないようにする。
```
git config --global core.quotepath false
```

#### ファイルの大文字・小文字を区別して認識する。
```
git config --blobal core.ignorecase false
```

#### 改行コードが混在している場合は変換しないようにする。
```
git config --global core.safecrlf true
```

#### `commit` または `checkout`時に改行コードを変換しない。
```
git config --global core.autocrlf false
```

#### コミットメッセージを編集する際に使用するエディタを指定する。
```
git config --global core.editor "'C:/Program Files (x86)/Hidemaru/Hidemaru.exe' //fu8 "
```

#### カレントブランチと同名のリモートブランチが存在する場合のみ、カレントブランチの`push`が行われる。
```
git config --global push.default simple
```

#### GitHubと通信する際に使用するユーザー名とパスワードをキャッシュする。
```
git config --global credentia.helper wincred
```



# remote
リモートリポジトリとの関連付けを管理する。

### リモートリポジトリの名前を表示する
```
git remote
```

### リモートリポジトリの名前と場所（URL）を表示する
```
git remote -v
```

### 指定したリモートリポジトリの詳細情報を表示する
```
git remote show <リモートリポジトリの名前>
```

### リモートリポジトリを追加する
```
git remote add origin <リモートリポジトリの場所（URL）>
```

### リモートリポジトリの場所（URL）を編集する
```
git remote set-url <リモートリポジトリの名前> <リモートリポジトリの場所（URL）>
```

### リモートリポジトリの削除
```
git remote rm <リモートリポジトリの名前>
```



# stash
変更をコミットせずに一時的に退避する。

### 変更差分を退避する。（未追跡ファイルを除く）
```
git stash
```

### 未追跡ファイルも含めて変更差分を退避する。
```
git stash -u
```

### 変更差分にメッセージを付けて退避する。
```
git stash save <メッセージ>
```

### 退避させた変更を一覧表示する。
```
git stash list
```

### 退避させた変更を戻す。
```zsh:退避を削除しない
git stash apply stash@{<番号>}
```
```zsh:退避を削除
git stash pop stash@{<番号>}
```
※`<番号>`は`git stash list`で確認できる。

### 退避リストから削除する。
```zsh:指定した退避を削除
git stash drop stash@{<番号>}
```
```zsh:全削除
git stash clear
```

### 退避した内容を確認する。

```zsh:変更されたファイル一覧を表示
git stash show stash@{<番号>}
```

```zsh:ファイルごとの変更内容を表示
git stash show -p stash@{<番号>}
```




# status
ファイルの状態を表示する。

```
git status
```
| 項目 | 意味 |
|:----|:----|
| Changes to be committed | インデックスに反映されているファイル |
| Changes not staged for commit | インデックスに反映されていない変更ファイル |
| Untracked files | 未追跡ファイル |




# log
コミットログを表示する。

```zsh:基本
git log
```

`git log <ファイル名 or ブランチ名>`：指定ファイル（ブランチ）のコミットログを表示する。(複数ファイル指定可能)
`git log --stat`：コミット毎に各ファイルの変更概要を表示する。
`git log --oneline`：各コミットを一行ずつ表示する。



# reset
現在のHEADを指定した状態にリセットする。

```zsh:HEADを一つ前のコミットに戻す。（ワークツリー、インデックスは対象外）
git reset HEAD^
git reset --mixed HEAD^
```

`git reset --soft HEAD^`：HEADとインデックスを一つ前のコミットに戻す。
`git reset --hard HEAD^`：HEADとインデックス、ワークツリーを一つ前のコミットに戻す。

| | HEAD | インデックス | ワークツリー |
|:---|:--:|:--:|:--:|
| --soft | ○ | | |
| オプションなし(--mixed) | ○ | ○ | |
| --hard | ○ | ○ | ○ |

### git resetを取り消す。
```
# 1.戻したいところを調べる。
git reflog

# 2.戻す
git reset --soft HEAD@{<1.で調べた番号>}
```




# revert
既存のコミットを取り消す。
※取り消したいコミットを打ち消すコミットを作成する。

```
git revert <コミットID>
```

### マージコミットを取り消す場合
マージした二つのコミットのうち、どちらに戻すのか指定する必要がある。

```zsh
# マージした側のブランチに戻す場合
git revert -m 1 <コミットID>

# マージされた側のブランチに戻す場合
git revert -m 2 <コミットID>
```




# cherrypick
既存コミットの変更を反映させる。
※他ブランチの特定コミットのみを反映するできるコマンド

```
git cherry-pick <コミットID>
```




# rebase

### 2つ以上前のコミットのメッセージ変更
```zsh
# 1.rebaseのTODOリストに対象コミットを追加
git rebase -i HEAD~[対象コミットの順番]

# 2.対象コミットを「pick」からeditに変更

# 3.コミットメッセージを変更
git commit --amend -m "変更後のコミットメッセージ"

# 4.rebaseを継続する
git rebase --continue
```

### コミットをまとめる
```zsh
# 1.rebaseのTODOリストに対象コミットを追加
git rebase -i HEAD~[対象コミットの中で最古ものの順番]
# or
git rebase -i [対象コミットの一つ前のコミットID]

# 2. 対象コミットの中で最新のものを「pick」にそれ意外を「s(squash)」また「f(fixup)」に変更

# 3.まとめたコミットのメッセージを変更

```