【初心者向け】魚のブリーダーでもわかるGitコマンド

##修正履歴
・9/20 ③ステージング調整のファイルの編集情報初期化に間違えがあったので修正しました。
git checkout develop .gitignore
↓
git checkout HEAD .gitignore

・10/18 コミットの差分の表示方法を追加する。
git diff 5c57qaq ac34z6d

・10/23 ステージングとHEADの差分表示を追加する。
git diff --staged

・10/25 ④スタッシュを追記する。

・11/1 現在との差分を1ファイル比較する方法を追記する。

##環境構築ステップ
1. <b>Gitクライアントツールのインストール</b>
（Xcodeのインストールでコマンドラインツールが入る）
2. <b>[Githubアカウントを作成する。](https://github.com/)</b>
3. <b>[Githubリポジトリを作成する。](https://qiita.com/rkamiya/items/ece357e4190418ddd811)</b>

##魚のブリーダーとしての心得
Git操作を魚のブリーダーとして例えた場合の比喩です。

<b>①クローン</b>
ため池（リモート）から水槽（ワークツリー）に、水をはる（クローン）ことができます。

```bash:git&nbsp;clone
# プロジェクトを作成するフォルダに移動する。
cd ~
mkdir project
cd project
# 魚（ブランチ）はデフォルト（masterブランチ）で水をはる（クローン）。
git clone git@github.com:rwakizaka7/tameike.git
ls -al
```

<b>②ブランチ操作</b>
水に入っている魚（ブランチ＝修正情報）を切り替えたり、複製したりできます。

```bash:git&nbsp;xxx
# プロジェクト直下に移動する。
cd ~/project/tameike
# ため池（リモート）の最新情報を取得する。
git fetch
# 手に持っている魚（ブランチ＝修正情報）を確認する。
git branch -a
# 手に持っている魚（ブランチ）をmasterにする。
git checkout -q master
# 指定した魚（ブランチ）をもとに、新しい魚を作成し手に持つ。
git checkout -b develop

# 削除検証のブランチを作成する。
# 削除する魚（ブランチ）を作成する。
git checkout -q develop
git checkout -b feature/tuna
# 水槽（ワークツリー）の魚（ブランチ）をため池（リモート）に作成する。
git push -u origin feature/tuna

# 削除する魚（feature/tunaブランチ）から手を離す。
git checkout -q develop
# 水槽（ワークツリー）の魚（ブランチ）を削除する。
git branch -D feature/tuna
# ため池（リモート）の魚（ブランチ）を削除する。
git push --delete origin feature/tuna
```

<b>③ステージング調整</b>
魚（ブランチ＝修正情報）を育てるための、育成プラン（ステージング）を調整する必要があります。
育成プラン（ステージング）に追加したファイルのみ成長（コミット）できます。

```bash:git&nbsp;xxx
# プロジェクト直下に移動する。
cd ~/project/tameike
# 手に持っている魚（ブランチ＝修正情報）をdevelopにする。
git checkout -q develop

# ファイルの修正（新規作成、削除）を作成する。
ls -al
mkdir folder
touch folder/index.html
touch index.html
rm .gitignore
ls -al
# 指定ファイルの編集情報（削除）リセットする。
git checkout HEAD .gitignore
ls -al
# フォルダや全ファイル単位でも水槽（ワークツリー）の編集情報をリセットできる。
# フォルダの例（developブランチにはまだfolderがないためできない）
# git checkout HEAD folder
# 全プロジェクトの例
# git checkout HEAD .

# 育成プラン（ステージング）の確認
# `??`：管理外
# `緑の1文字目`：ステージング追加済み
# `赤の2文字目`：ステージング未追加
# `M`：変更
# `A`：追加
# `D`：削除
# `R`：ファイル名の変更
git status -uall -s

# 育成プラン（ステージング）のリセット方法
# 特定ファイルの育成プラン（ステージング）をリセットする。
# git reset ./index.html
# 特定フォルダの育成プラン（ステージング）をリセットする。
# git reset ./folder
# 全ての育成プラン（ステージング）をリセットする。
# git reset . 

# 現在の育成プラン（ステージング）の追加方法
# 特定ファイルの育成プラン（ステージング）を追加する。
git add ./index.html
# 特定フォルダの育成プラン（ステージング）を追加する。
git add ./folder
# 全ての育成プラン（ステージング）を追加する。
# git add . 

git status -uall -s

# 育成プラン（ステージング）と現在を1ファイル比較する。
git diff HEAD ./index.html

# 育成プラン（ステージング）と現在を全て比較する。
git diff --staged
```

<b>④スタッシュ</b>
育成プラン（ステージング）を一時的に保管することができます。成長（コミット）が適用されていない、編集ファイル、があると他の魚（ブランチ）に持ち替えることができないので、一時的に育成プラン（ステージング）に加えて、スタッシュに保管すると良いでしょう。

```bash:git&nbsp;stash
# 育成プラン（ステージング）にファイルを追加する。
vi ./index2.html
# [i]test2[ESC][:wq]
git add ./index2.html
git status -uall -s
# 名前なしでスタッシュに保管する。
git stash
# スタッシュすると成長プラン（ステージング）から成長が消える。
git status -uall -s
# 保管中のスタッシュ一覧を確認する。
git stash list
# スタッシュのファイル一覧を表示する。
git stash show stash@{0}
# スタッシュとの成長（変更）差分を表示する。
git stash show -p stash@{0}
# スタッシュを成長プラン（ステージング）に適用する。
git stash apply stash@{0}
git status -uall -s
# 一度、成長プラン（ステージング）を消す。
git reset --hard HEAD
git status -uall -s
# ログからスタッシュのコミット番号を確認する。
git log --oneline --graph --all
# コミット番号からスタッシュを成長プラン（ステージング）に適用する。
git stash apply 4a10378
git status -uall -s
# 名前ありでスタッシュに保管する。
git stash save "一時保管"
# スタッシュを削除する。
git stash drop 4a10378
```


<b>⑤コミット＋プッシュ</b>
水槽（ワークツリー）の魚（ブランチ）に成長（コミット）を適用し、ため池（リモート）の同じ魚にアップロード（プッシュ）できます。

```bash:git&nbsp;push
# 【③ステージング調整の後】
# 水槽（ワークツリー）の魚（ブランチ）に成長（コミット）を適用する。
git commit -m 'ファイルを新規追加する。'
# ため池（リモート）に魚（ブランチ）を確認する。
git branch -a
# ため池（リモート）に魚（ブランチ）がない場合、
# 水槽（ワークツリー）の魚（ブランチ）をため池（リモート）に作成する。
git push -u origin develop
# ため池（リモート）に魚（ブランチ）がある場合、
# 水槽（ワークツリー）の魚（ブランチ）の成長（コミット）をため池（リモート）に適用する。
git push
```

<b>⑥プル</b>
他のブリーダーがため池（リモート）にアップロード（プッシュ）した、魚の成長（コミット）を、ため池を覗いて（フェッチ）、存在を認知し、ダウンロード（プル）して、水槽（ワークツリー）に魚の成長（コミット）を適用することができます。

```bash:git&nbsp;pull
# プロジェクト直下に移動する。
cd ~/project/tameike
# 手に持っている魚（ブランチ＝修正情報）をdevelopにする。
git checkout -q develop
# ため池（リモート）の最新情報を取得する。
git fetch
# ため池（リモート）の魚（ブランチ）の成長（コミット）を水槽（ワークツリー）に適用する。
git pull origin develop
```

<b>⑦マージ</b>
魚（ブランチ）に他の魚（ブランチ）の成長（コミット）をマージすることができます。

```bash:git&nbsp;merge
# プロジェクト直下に移動する。
cd ~/project/tameike

# Git Flow 開発手法に沿って魚（ブランチ＝修正情報）を作成する。
# develop -> feature/tuna
git checkout -q develop
git checkout -b feature/tuna
echo 'マグロ' >> name.txt
git add ./name.txt
git status -uall -s
git commit -m 'name.textを追加する。'
git push -u origin feature/tuna

# 魚（feature/tunaブランチ）の成長（コミット）を親魚（developブランチ）にマージする。
git checkout -q develop
git merge feature/tuna
# 水槽（ワークツリー）の魚（ブランチ）の成長（コミット）をため池（リモート）に適用する。
git push
```

<b>⑧競合解決</b>
アップロード（プッシュ）または、ダウンロード（プル）、マージをして、魚の成長（コミット）を適用した時、魚の成長（コミット）が競合することがあります。その場合、魚の方向性（競合）を解決して、水槽（ワークツリー）に競合解決済みの魚の成長（コミット）を適用し、ため池（リモート）にアップロード（プッシュ）する必要があります。

```bash:git&nbsp;xxx
# 【⑦マージの後】

# 競合状態を発生させるために魚（ブランチ＝修正情報）を作成する。
# マージ前の魚（developブランチ）の成長（コミット）番号を取得する。
git log --oneline --graph --all
# 成長（コミット）番号の魚（ブランチ＝修正情報）から、新しい魚（ブランチ）を作成し手に持つ。
git checkout -q 914cbbf
git checkout -b feature/salmon
echo 'サーモン' >> name.txt
git add ./name.txt
git status -uall -s
git commit -m 'name.textを追加する。'
git push -u origin feature/salmon

# 魚（feature/salmonブランチ）の成長（コミット）を親魚（developブランチ）にマージする。
git checkout -q develop
# 別の魚（feature/tunaブランチ）の成長（コミット）と競合する。
git merge feature/salmon
# 競合ステータスを確認する。
git status -uall -s
# 競合場所を編集する。
vi ./name.txt
# 競合解決したファイルの育成プラン（ステージング）を追加する。
git add ./name.txt
git status -uall -s
git commit -m 'name.textの競合を解決する。'
git push
```

<b>⑨ブランチのログの確認</b>
他のブリーダーが育成している魚（ブランチ）のコミットログを確認することができます。

```bash:git&nbsp;log&nbsp;--oneline&nbsp;--graph&nbsp;--all
# 魚（ブランチ）の育成情報（コミットログ）を確認する。
git log --oneline --graph --all

# 成長（コミット）の差分を表示する。
git diff 5c57qaq ac34z6d

# 成長（コミット）の差分のファイル名一覧を表示する。
git diff --name-only 5c57qaq ac34z6d
git diff --name-only 5c57qaq ac34z6d ./diff_file_name_list.txt
```

<b>⑩コミットの取り消し</b>
水槽（ワークツリー）の魚（ブランチ）に間違った魚の成長（コミット）を適用した場合、水槽（ワークツリー）の魚（ブランチ）の成長（コミット）をリセットして、1つ前に差し戻すことができます。

```bash:git&nbsp;reset&nbsp;--soft&nbsp;HEAD^
# 魚（ブランチ）の成長（コミット）をリセットして、1つ前に差し戻す。
# リセットで差し戻した魚の成長（コミット）はローカルに残る（コミット前の状態になる）。
git checkout -q feature/salmon
git reset --soft HEAD^
```

<b>（11）上書きプッシュ</b>
間違った魚の成長（コミット）を取り消した時、すでに、ため池（リモート）の同じ魚にアップロード（プッシュ）してしまった場合、ため池（リモート）に上書きアップロード（プッシュ）する必要があります。

```bash:git&nbsp;push&nbsp;-f
# 水槽（ワークツリー）の魚（ブランチ）でため池（リモート）の魚（ブランチ）を上書きする。
# 上書きなので注意する。
git push -f origin feature/salmon
```