gitチートシート

# 主な用語 


* 作業ツリー/ワークツリー/ワーキングツリー:ローカルリポジトリ内でgit管理対象としたファイル群。ユーザの作業場所
* インデックス/ステージングエリア:git addすると作業ツリーの内容がインデックスに保存される。インデックスに保存された内容がコミット対象になる。
* ローカルリポジトリ:自分のコンピュータ上のリポジトリ
* リモートリポジトリ:githubなど、リモートのリポジトリ。originっていう名前を付ける事が多いと思う。
* HEAD:直近(最新)のコミット


# gitコマンド

## 準備
グローバルなユーザ名とメアドを設定
```
git config --global user.name "ユーザ名"
git config --global user.email "メアド"
```

エイリアスを設定
```
git config --global alias.ls "log --stat"
git config --global alias.lp "log -p"
git config --global alias.lg "log --graph --pretty=oneline"
git config --global alias.cf 'commit -m "fixup!  c"'
git config --global alias.conflict "diff --name-only --diff-filter=U"
git config --global alias.s "status"
git config --global alias.d "diff"
git config --global alias.aa "add -A"
```

メッセージを編集するエディタをemacsに設定

```
git config --global core.editor emacs
```

autosquash
```
git config --global rebase.autosquash true
```

個別のリポジトリ用のユーザ名とメアドを設定

```
cd 該当のリポジトリ
git config user.name "ユーザ名"
git config user.email "メアド"
```

リポジトリを初期化
```
cd 該当のリポジトリ
git init
```



既存のリモートリポジトリをローカルリポジトリにコピー ※GitHubの場合

```
git clone git@github.com:ユーザ名/リポジトリ名.git

```

リモートリポジトリを追加 ※GitHubのリモートリポジトリをoriginとして追加する場合

```
git remote add origin git@github.com:ユーザ名/リポジトリ名.git
```

## ブランチ操作

ブランチを作成しそのブランチをチェックアウト
```
git checkout -b branch_name
```

ブランチをoriginにpush
```
git push -u origin branch_name
```

ローカルとリモートのブランチ一覧
```
git branch -a
```


マージ済みのブランチ削除
```
git branch -d ブランチ名
```

未マージのブランチ削除
```
git branch -D ブランチ名
```

## diff


作業ツリーとインデックスとの差分を表示
```
git diff
```


インデックスとリポジトリとの差分を表示
```
git diff --cached
```

作業ツリーとHEADとの差分を表示
```
git diff HEAD filename
```

ブランチ間ので同一ファイルを比較
```
git diff ブランチ1 ブランチ2 filename
```


ブランチ間の差分があるファイルを表示
```
git diff --stat -name--status ブランチ1 ブランチ2
```

ブランチ間の差分があるファイルと内容を表示
```
git diff -name--status ブランチ1 ブランチ2
```

変更されたファイル名のみを表示
```
git diff --name-only
```



## タグ操作

タグ一覧

```
git tag
```

タグ作成
```
git tag -a タグ名 -m '説明'
```

コミットを指定してタグ付け
```
git tag -a タグ名 -m '説明' コミットのID
```


タグを指定してチェックアウト
```
git checkout refs/tags/タグ名
```

タグを指定して指定したブランチにチェックアウト
```
git checkout -b ブランチ名 refs/tags/タグ名
```

タグ削除
```
git tag -d タグ名
```

タグの詳細を表示
```
git show タグ名
```

タグをoriginにpush
```
git push origin タグ名
```

## log


直近2つだけのログを表示
```
git log -2
```


直近2つだけのログをパッチと共に表示
```
git log -2 -p
```

直近3つだけのログを変更のあったファイル名と共に表示
```
git log --name-status -3
```

グラフも表示
```
git log --graph --pretty=oneline
```

マージコミットを表示しない
```
git log --no-merges
```

コミットログに"index"を含むコミットを表示
```
git log --grep index
```

"index"という文字列を含む行が追加もしくは削除されたコミットを表示
```
git log -S"index"
```

"index"という文字列を含む行が追加もしくは削除されたコミットの差分を表示
```
git log -S"index" -p
```

特定のファイルのコミット履歴を表示
```
git log -p ファイル
```

自分用
```
git log --name-status  --no-merges
```

```
git --no-pager log --name-status --no-merges
```

## ステージング操作

修正・追加したファイルをステージングに追加
```
git add . -A
```

ステージングの未コミットの指定ファイルの変更を元に戻す
```
git reset ファイル
```

ステージングの未コミットの指定ファイルの変更を元に戻し、ワーキングツリーの状態も修正前に戻す
```
git reset --hard ファイル
```

ステージングの未コミットの全ファイルの変更を元に戻す
```
git reset 
```

直近のコミットを元に戻す(ファイルはそのまま)
```
git reset HEAD^
```


## 未整理


過去の操作の一覧を見る
```
git reflog
```

HEAD@{1}の状態に戻す
```
git reset --hard HEAD@{1}
```


作業ツリーの特定の変更を元に戻す
```
git checkout ファイル
```

作業ツリーの全ファイルの変更を元に戻す
```
git checkout .
```



トラックされてないファイルを削除
```
git clean -fd
```

.gitignoreに入ってるもの含めてトラックされてないファイルを削除
```
git clean -xfd
```

直近のコミットを取り消し、ファイルも元に戻す
```
git reset --hard HEAD^
```

以前のコミットを打ち消すコミットを作る
```
git revert コミットID
```



リモートリポジトリから削除されたブランチをローカルから削除
```
git pull --prune
```

変更が加えられたファイルを表示
```
git status
```



現在のワークツリーを退避する
```
git stash
```


現在退避してる内容を表示
```
git stash list
```


現在退避している内容を取得
```
git stash pop
```




指定したファイルのコミット履歴を表示
```
git blame ファイル名
```

設定一覧
```
git config --list 
```

PR用に空のコミットを作成してpush
```
git commit --allow-empty -m "wip"
git push origin ブランチ
```


ブランチの分岐元を自動的に特定しsquash
※masterからブランチを作った場合
```
git rebase -i --keep-empty --autosquash $(git show-branch --merge-base master HEAD)
```

直前のコミットのコメントを修正
```
git commit --amend
```

squashとかした後にpush
```
git push --force-with-lease 
```

特定のコミット時点のファイルを表示する
```
git cat-file -p ハッシュ:ファイルのパス
```

masterからrebase
```
git rebase master
```

conflictしたファイル一覧
```
git diff --name-only --diff-filter=U
```


一時的に変更しても変更しなかったことにしたい
```
git update-index --assume-unchanged 対象のファイル
```

↑の状態を解除したい
```
git update-index --no-assume-unchanged 対象のファイル
```

コンフリクトしたときにリモートリポジトリの内容を全て適用
```
git checkout --theirs .
```

コンフリクトしたときにローカルリポジトリの内容を全て適用
```
git checkout --ours .
```