個人的によく使ってるGitコマンド集

# はじめに
会社ではGitをGUIツールに頼らずに直接コマンドを叩いて操作しています。
ただコマンドを忘れて検索することも多いので、よく使うコマンドを基本的なものを含めて自分用にメモすることにしました。

私が日頃よく使うものを適宜、追加・更新していきます。

# 個人的よく使うGitコマンド

## git checkout
checkoutは機能が多いです。それもあって最近はGit公式側がgit switch, restoreとして機能を準備しています。

### ブランチ切り替え
|コマンド|機能| 
|--|--|
|git checkout ${branch}|ブランチの切り替え|
|git checkout -b ${branch}|ブランチの作成と切り替え|

### ファイル操作（変更取り消し・取得）

|コマンド|機能| 
|--|--|
|git checkout ${path}|ファイルの変更の取り消し|
|git checkout ${branch} -- {file_path}|指定ブランチからファイルを取得|


## git status

|コマンド|機能| 
|--|--|
|git status|ステージング状態などを表示|
|git status --name-only|ステージング状態などを名前だけ表示|
|git status --short|ステージング状態などを簡易的に表示|

## git diff

|コマンド|機能| 
|--|--|
|git diff ${path}|指定ファイルの差分を表示|
|git diff --cached|ステージング済みファイルの差分を表示|
|git diff --name-status|差分が追加/削除かのマークを表示|
|git diff --diff-filter=A/D/M/a/d/m|差分をフィルタリングして表示|
|git diff origin/${branch}|指定ブランチとの差分を表示|
|git diff origin/${branch} -- {file_path}|指定ブランチの指定ファイルとの差分を表示|

## git add

|コマンド|機能| 
|--|--|
|git add ${path}|指定ファイルをステージング|
|git add -A|すべての変更差分をステージング|
|git add -p|対話的にファイルの一部をステージング|

## git commit

|コマンド|機能| 
|--|--|
|git commit --message ${commit_message}|コミットメッセージ入力|
|git commit --amend|直前commitの修正|
|git commit -n|commit hookを無視してcommit|

## git push

|コマンド|機能| 
|--|--|
|git push --set-upstream origin ${branch}|上流ブランチの設定|
|git push --force|強制push。自分しか利用していないことが保証できるブランチ以外では絶対に使わない。運用ルールで利用禁止されている禁忌のコマンド|

## git branch

|コマンド|機能| 
|--|--|
|git branch|ローカルリポジトリのブランチを表示|
|git branch -D ${branch}|指定したブランチをローカルリポジトリから削除|
|git branch --contains|現在のブランチを表示|

- `git branch | grep ${hoge} | xargs git branch -D`で「grepで抽出したブランチをローカルリポジトリから削除」をよく使う。
- git branch --containsは `git rev-parse --abbrev-ref HEAD` みたいにカレントブランチを抽出する際に使ったりする。

## git fetch
基本的に `-p` オプションしか使っていないです。

|コマンド|機能| 
|--|--|
|git fetch|リモートリポジトリの情報をローカルリポジトリに反映|
|git fetch --prune|リモートリポジトリの情報をローカルリポジトリに反映し、かつリモートリポジトリで削除ブランチがあればローカルリポジトリでも削除|


## git merge

|コマンド|機能| 
|--|--|
|git merge ${branch}|${branch}を現在のブランチにマージ|
|git merge --theirs(or --ours)|コンフリクト時にマージ元（マージ先）を取り込む|
|git merge --no-fast-forward|マージコミットを作成して取り込む|
|git merge --abort|コンフリクトした場合に、一旦マージ前に戻す|

## git show
基本的にgit log → commit_hashを確認 → git show の流れで利用しています。

|コマンド|機能| 
|--|--|
|git show ${commithash}|該当hashの変更差分を確認する|

## git log

|コマンド|機能| 
|--|--|
|git log --oneline|ログを表示する際に、commitメッセージを1行で表示|
|git log --short|ログを要約して表示|
|git log -p|ログを表示する際に、変更差分も表示|
|git log --grep=${hoge}|ログをhogeで検索する|

## git stash

|コマンド|機能| 
|--|--|
|git stash save ${stash_message}|ステージ済みのファイルを名前をつけて退避する|
|git stash list|退避したものを一覧を確認する|
|git stash pop|退避したstashの一番上を適用する|
|git stash apply ${stash_no} |指定したstashを適用する|

## git reset

|コマンド|機能| 
|--|--|
|git reset {$path}|ステージング済みのファイルをunstageする|
|git reset --hard (or --soft) ${commit_hash}|指定したcommit_hashの状態に戻る|

## git cherry-pick

|コマンド|機能| 
|--|--|
|git cherry-pick ${commithash}|他ブランチなどから指定したcommitを取り込む|

## git revert

|コマンド|機能| 
|--|--|
|git revert ${commithash}`|指定したcommit_hashの内容を打ち消すcommitを作成する。|

## git tag

|コマンド|機能| 
|--|--|
|git tag list|タグのリストを表示|
|git tag -a ${tag} -m "tag message"|任意のタグをタグコメントを追記しながら登録|
|git push --tags|タグをpushする|
|git tag --delete ${tag}|tagを削除する|
|git push --delete origin　${tag}|GitHub上にあるタグを削除する|

# .gitconfigでのalias設定
よく使うコマンドは `~/.gitconfig` にaliasでまとめておくと、コマンドを打つ際に `git chekcout -b ${hoge}` でなく `git cob ${hoge}` のように省エネできるので、適宜登録しておくと良いでしょう。

以下、私が登録しているものの抜粋です。
ほとんど使わないものも登録していますが、辞書のように「こんなオプションあったなぁ」と思い出すのにも使えたりします。
（最近、整理していないのでコマンドミスあったらすみません。）

``` ~/.gitconfig
[alias]
	ad = add
	ada = add -A
	br = branch
	bra = branch -av
	cl = clean -df
	cm = commit --verbose
	co = checkout
	cob = checkout -b
    # !"hoge(); hoge" とすることでhogeメソッドを登録しつつ、hogeを叩くことができ、より柔軟性高く利用することができる
    cor = !"f() { git fetch -p && git checkout -b $1 origin/$1 }; f"
	cp = cherry-pick
	df = diff
	dfc = diff --cahed
	dfh = diff HEAD
	dft = difftool
	dfr = !git diff origin `git rev-parse --abbrev-ref HEAD`
	fp  = fetch -p
	lg  = log --stat
	lgg = !git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
    ps = !git push origin `git rev-parse --abbrev-ref HEAD`
	pl = !git pull origin `git rev-parse --abbrev-ref HEAD`
	plr = pull --rebase
    pr  = !"f() { git log --merges --oneline --reverse --ancestry-path $1...master | grep 'Merge pull request' | head -n 1; }; f"
	rf  = reflog --format='%C(auto)%h %<|(20)%gd %C(blue)%ci%C(reset) %gs (%s)'
    rfs = !git reflog --format='%C(auto)%h %<|(20)%gd %C(blue)%ci%C(reset) %gs (%s)' | awk -F' ' '{print $2}' | xargs git reset --hard
	st = status
	sc = stash clear
    sk  = update-index --skip-worktree
    su  = ls-files --others --exclude-standard
    usk = update-index --no-skip-worktree
	vi  = !nvim ~/.gitconfig
```

# まとめ
GUIツールを使っている場合にはあまりgitコマンドにはお世話にならないかもしれません。ただ、コマンドをある程度使えるようになっておくとGUIが叩いてるコマンドの詳細を知れたり、shellスクリプトでGitコマンドをどう利用すればよいかをスムーズに考えられたりするかもしれないので、知っておくのに損はないかと思います。私はタイピングが好きなので、単にコマンドを叩きたいという理由で叩覚えることが多いですが......。