gitコマンドチートシート


# Add
```bash:
# 部分的にaddする
git add -p

# add済みのfileをadd(deletedを消すときにも使う)
git add -u
```

# Apply

## diffからworking treeに反映する
```bash:
git diff <FILE> > pending.diff
git apply pending.diff
```

# Archive
```bash:
# zip形式でファイルを出力。
git archive <COMMIT> --format=zip -o <OUTPUT FILE>
```


# Bisect
```bash:
# スクリプトで渡す
git bisect run ./test_script #=> 成功 0, 失敗 1, スキップ 125で返すスクリプト
```

## コミットを二分探索する
```bash:
git bisect good v1.6.0
git bisect bad v1.6.2
git bisect good # 壊れてない
git bisect bad # こわれている
git bisect skip # スキップ
git bisect reset # 終了
```

# Blame
```bash:
# どのcommitでそのファイルが追加されたかみる
git blame <FILE>
```

# Branch
```bash:
# リモートのbranch一覧をみる
git branch -r
# ブランチ名を変更する
git branch -m <NEW_NAME>

# ローカルブランチを削除
git branch -d <BRANCH>
# ローカルブランチを強制削除
git branch -D <BRANCH>

# リモートブランチを削除
git push origin :<BRANCH>

# ローカルブランチをリネーム
git branch -m <OLD_BRANCH_NAME> <NEW_BRANCH_NAME>
```

# Clean
```bash:
# 管理されていない(.gitignoreにもない)ファイルを削除する -n は消去ファイル確認
git clean -n -f
```

# Clone
```bash:
# submodule も一緒に初期化
git clone --recursive <URL>
```


# Checkout
```bash:
# work treeの向き先を現在のcommitにする(detached HEAD)
git checkout HEAD^0 
# fileをコミットからもどす
git checkout <COMMIT> file

# fileをインデックスから戻す
git checkout <FILE>

# remoteのブランチをとってきてcheckout
git checkout -t -b <BRANCH> origin/<BRANCH>

# 一つ前のbrachにcheckoutする
git checkout -

# 強制上書き
git checkout .
git pull
```

# Cherry-pick
```bash:
# 狙ったコミットをマージする
git cherry-pick <COMMIT>
```

# Commit
```bash:commit.sh
# 追加してcommitする
git commit --amend
```

# Diff
```bash:diff.sh
# 最新のコミットと、インデックスの間
git diff --cached

# コミット間の変更ファイル一覧
git diff --stat

# ファイル名と変更を表示
git diff --name-status

# カラーモード
git diff --color-words
```

# Fetch
```bash:
# 全てfetchする
git fetch <REMOTE> <BRANCH>

# fetchしたcommitをmergeする
git merge FETCH_HEAD
```

# Format-patch
```bash:
# 差分をpatch形式としてファイルで出力する
git format-patch <COMMIT..COMMIT>
```

# Log
```bash:log.sh
# 出力するコミット数制限
git log -2

# 各コミットの変更をパッチ形式で出力
git log -p

# ログメッセージの最初の１行を出力
git log --pretty=short

# 内容に変更がある部分を探す
git log --pretty=short -S 'class Abc
  def aa
    p "aa"
  end
end' -- <FILE>

# 全てのログを見る
git log -g

# onelineでみる
git log --oneline

# ある特定のファイルのlogをみる
git log v1.0.0 -- path/to/file.c # v1.0.0タグ以降のfile.cのログを見る

# ある特定のユーザーのコミットをみる
git log --author="<USER NAME>"
```

# Ls-files
```bash:
# マージが必要なfileを出力
git ls-files -u
```

# Merge
```bash:
# マージする。デフォルトはff
git merge <BRANCH>

# ffでも<BRAHCN>の情報があったことを残してMergeする
git merge --no-ff <BRANCH>

# 公開したcommitを取り消す
git merge -s ours <COMMIT>

# 一つ前にいたbranchをmergeする
git merge -
```

# Merge-base
```bash:
# 共通のcommitオブジェクトを出力する
git merge-base <COMMIT> <COMMIT>
```

# Push
```bash:
# 2つ前のコミットでプッシュ先のmasterブランチを更新
git push REMOTE HEAD^^:master

# ローカルmasterでremoteのmaster更新
git push REMOTE master

# ブランチ削除
git push :temporary

# 強制的にpushする。(過去のcommitを変えちゃうかもしれない)
git push -f
```

# Reset
```bash:
# indexから全て削除
git reset

#indexからFILEを削除
git reset <FILE>

# commitを削除
git reset HEAD^

# commitを削除しファイルももとに戻す
git reset --hard HEAD

# resetを取り消す
git reflog
git reset --hard <リセットの前のCOMMIT>

# 直前の操作(commit, merge, rebase, reset等)を取り消す
git reset --hard ORIG_HEAD
```

# Remote
```bash:
# 現在Remoteとして設定されている一覧を取得
git remote -v

# Remoteを登録する
git remote add <REMOTE>

# Remoteとして登録しているのを削除する　
git remote rm <REMOTE>

# Remote の url を変更する
git remote set-url <REMOTE> <URL>
```

# Rev-list
```bash:
# 指定したディレクトリのコミットidを一覧表示
git rev-list HEAD^..HEAD -- DIR/
```

# Revert
```bash:
# 過去のcommitを打ち消すcommitをする
git revert <COMMIT>

# コミットを行わない
git revert -n <COMMIT> 
```

# Rm
```bash:
# Add取り消し
git rm --cached <FILE>
```

# Rebase
```bash:
# インタラクティブリベースを取り消す
git rebase --abort
```

## 過去のcommitを修正する
```bash:
git rebase -i HEAD~<戻したいコミットの位置>
  # editorが起動するので直すコミットの横にあるコマンドを edit に変更
  # 実際に変更して git add で indexに追加
git commit --amend でcommit
git rebase --continue
```

## リベースそのものを無かったことにする
```bash:
git log -g # rebase -i 前のコミットを探す
git reset <COMMIT>
```

## topicブランチ育て中にmasterブランチの変更を取り込む
```bash:
git checkout feature
git fetch origin
git rebase origin/master
```

## 以下でも一緒
```bash:
git checkout feature
git pull --rebase origin master
git checkout master
git pull --rebase
```

# Shortlog
```bash:
# コミットの（ユーザー毎の？）要約
git shortlog HEAD^..HEAD -- <DIR>

# ユーザー毎のコミット数を集計
git shortlog <COMMIT>..<COMMIT> --summary
```

# Status
```bash:
# 次のcommitに含まれるのを確認する 
git status
```

# Stash
## 現在の変更を一時的によける
```bash:
git stash 
git checkout <Other BRANCH> # edit files … 
git add 
git commit 
git checkout <Working BRANCH> 
git stash pop
```

# Tag
## remoteのタグを消す
```bash:
# localのタグを消す
git tag -d <TAG_NAME>
# それをremoteに反映する
git push origin :refs/tags/<TAG_NAME>
```