「こんなことしたい」って時にどんなgitコマンド使えば良いのか？

# 目的
ここ一年位になって（ようやく）gitを使う頻度が増えたのですが、非常に使いやすいと感じたので、備忘録として
覚えたことが増えたらちょこちょこ更新していこうかなと考えています。

とはいえ、まだ勉強中なので、表現が間違っていたり
「このコマンドは正確にはそういう意味じゃない」とか
「こっちのコマンドの方が良い」などあればご指摘いただければと思います。

# なんとなく理解している構造
![コマンドと構造にかんするなんとなくの理解](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224361/9fcf9452-5354-1b66-101f-03da385a914d.png)

# よく使うコマンド（オプションなし）の一覧
|コマンド|概要|備考|
|---|---|---|
|`git remote`|リモートリポジトリの確認||
|`git fetch`|リモートリポジトリの内容をリモート追跡ブランチに反映する||
|`git checkout`|ローカルブランチの切り替えやワーキングツリーの編集内容をローカルブランチの内容に戻す|指定したブランチ名がない場合は`git branch`のブランチ切り出しと同じ意味|
|`git branch`|ブランチ一覧取得したり、ローカルでブランチを切り出したりする||
|`git add`|ワークツリーからインデックスに追加する||
|`git status`|ワーキングツリーの状態を確認する||
|`git diff`|作業の差分を確認|コミット間やワーキングツリーとインデックス間の差分|
|`git stash`|作業内容を一時退避する||
|`git commit`|インデックスからローカルリポジトリに反映する||
|`git reset`|`add`や`commit`を取り消す||
|`git push`|ローカルリポジトリの内容をリモートリポジトリに反映する||

# やりたいこと別コマンド一覧
## ローカル作業前
|やりたいこと|コマンド|
|---|---|
|リモート追跡ブランチを最新化したい|`git fetch`|
|リモートブランチと、ローカルブランチの状態を確認したい|`git remote show <リモート名>`|
|リモート側で既に消えているブランチがあったので、リモート追跡ブランチからも消したい|`git remote prune origin`|
|リモートブランチの内容をローカルブランチに反映したい|`git pull --no-rebase <リモート名> <ブランチ名>`|
|ローカルのブランチ一覧を確認したい|`git branch`|
|リモート追跡ブランチを含めてローカルのブランチ一覧を確認したい|`git branch -a`|
|ブランチを切り替えたい|`git checkout <ブランチ名>`|
|今のブランチから新しいブランチを切り出したい|`git branch <ブランチ名>`|
- pullはよくわからないので後でちゃんと調べたい・・・

## ローカル作業中
|やりたいこと|コマンド|
|---|---|
|ワーキングツリー・インデックスの編集状態を一覧で確認したい|`git status`|
|ワーキングツリーの編集内容を取り消してブランチのコミット済み状態で上書きしたい|`git checkout <ファイル名>`|
|インデックス登録済ファイルの編集差分を確認したい|`git diff`|
|特定のインデックス登録済ファイルの編集差分を確認したい|`git diff <ファイル名>`|
|特定のファイルをインデックスに登録したい|`git add <ファイル名>`|
|カレントディレクトリ配下の全未登録作業内容をインデックスに登録したい|`git add .`|
|ワーキングツリー内の全未登録作業内容をインデックスに登録したい|`git add -A`|
|ワーキングツリー内でインデックス未登録（新規ファイル）を覗いた作業内容をインデックスに登録したい|`git add -u`|
|変更内容を対話式で確認しながらインデックス登録する|`git add -p`|
|`add`コマンド実行時にどのファイルがインデックス登録されるかの確認だけしたい|`git add -n`|
|間違えてaddしたのを取り消したい（※）|`git reset HEAD <対象のファイル>`|
- ※`--soft`か`--hard`かでワーキングツリーの状態が変わる

## ローカル作業中だけどブランチを切り替えて別作業をしたい（インデックスの内容を退避させて置きたい）
- `stash@{n}`を指定しない場合は`stash@{0}`（最新stash）が対象

|やりたいこと|コマンド|
|---|---|
|作業内容を一旦退避させたい|`git stash`|
|stashの一覧を確認したい|`git stash list`|
|`stash@{n}`だけだとわからないのでコメントをつけてstashしたい|`git stash save <コメント>`|
|stash内容をファイル一覧で確認したい|`git stash show stash@{n}`|
|stash内容を差分で確認したい|`git stash -p show stash@{n}`|
|stash内容を元に戻したい|`git stash apply stash@{n}`|
|stash内容を元に戻した上でstashを消したい|`git stash pop stash@{n}`|
|stash内容を消したい|`git stash drop stash@{n}`|
|全stash内容を消したい|`git stash clear`|

## 作業完了
|やりたいこと|コマンド|
|---|---|
|ローカルブランチにコミットしたい|`git commit -m <コミットメッセージ>`|
|複数行のコミットメッセージを入れてコミットしたい|`git commit`<br>→vimでコミットメッセージを編集|※これ修正・確認が必要※
|コミットを取り消したい|`git reset --hard HEAD^`|
|リモートブランチにプッシュしたい|`git push <リモート名> <ブランチ名>`|

## 作業後
|やりたいこと|コマンド|
|---|---
|リモート追跡ブランチを最新化したい|`git fetch`|
|リモートブランチとか、ローカルとリモートの比較状態確認したい|`git remote show <リモート名>`|
|リモートで消えてるブランチあったら、リモート追跡ブランチから消したい|`git remote prune <リモート名>`|
|ローカルからブランチを消したい|`git branch -d <ブランチ名>`|
|ローカルから強制的にブランチを消したい|`git branch -D <ブランチ名>`|

## その他
|やりたいこと|コマンド|
|---|---|
|今のワーキングツリーにマージしたらコンフリクトが起きるか確認したい|`git merge --no-commit <ブランチ名>`|
|コンフリクトの確認だけしてマージをやめたい|`git merge --abort`|
|コンフリクトの解消をしたのでインデックスに追加したい|`git add <ファイル名>`|

# 課題
- もっとちゃんと調べたほうがいいコマンド
 - `git pull`
 - `git add`
 - `git reset`
- gitの基本的な概念をもっと理解したほうが扱いやすそう