ちゃんとわかってる？~gitを復習しよう2~

## この記事について
- どんな記事？：gitの復習として、基本用語、コマンドなどについてまとめた記事の第2回です！
- 対象者はどんな方？：gitをしっかり理解できていない方、　gitをなんとなく使えるけど説明はできない方
[前回の記事はこちら](https://qiita.com/morizoe/items/4e9a2d61c8c6b4d38918#:~:text=14%20views-,%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6,-%E3%81%A9%E3%82%93%E3%81%AA%E8%A8%98%E4%BA%8B%EF%BC%9F%EF%BC%9Agit)

## 基本コマンドの復習
### cloneについて
- cloneコマンドとは
  既存のリモートリポジトリをローカルリポジトリとして自身のマシンに複製するコマンドのこと。
- 実際の使い方
    ~~~bash
      $ git clone [クローンしたいリポジトリ] [クローン先のディレクトリ(省略可)]
      # 例えば以下のように！
      $ git clone https://github.com/Ryo-Sasaki-xxx/example 
    ~~~
    
  通信方式としてhttps、sshなどがある。クローン先のディレクトリを省略するとカレントディレクトリにクローンされる。
- オプションについて
    ~~~bash
      $ git clone -b [クローンしたいブランチ名] [クローンしたいリポジトリ] [クローン先のディレクトリ(省略可)]
    ~~~
  のようにbオプションを加えることで、タグやブランチを指定した複製ができる。

### branchについて
- branchコマンドとは
  リポジトリ内のブランチを管理するコマンドのこと。具体的には一覧表示、作成、削除などができる。
- 実際の使い方
    ~~~bash
      #新しくブランチを作成する場合
      $ git branch [ブランチ名]
      #既にあるブランチを表示する場合
      $ git branch
    ~~~
  
- オプションについて
    ~~~bash
    $ git branch -a
    ~~~
  のようにaオプションを加えることでローカルとリモート両方のブランチを表示できる。
    ~~~bash
    $ git branch -d [ブランチ名]
    ~~~
  のようにdオプションを加えることでそのブランチを削除できる。ただしdオプションの場合は現在のブランチにマージされたブランチのみ削除でき、Dオプションであれば強制的に削除できる。

### checkoutについて
- checkoutコマンドとは
  ブランチの切り替えや変更履歴からある状態の復元をするコマンドのこと。より具体的に言うと、指定したコミット、ブランチで[HEADを更新する](https://qiita.com/ymzkjpx/items/00ff664da60c37458aaa#:~:text=%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82-,HEAD%E3%81%A8%E3%81%AF,-Git%E3%81%8C%E3%81%A9%E3%81%86)コマンドである。
- 実際の使い方
    ~~~bash
    #ブランチを切り替える場合
    $ git checkout [ブランチ名]
    ~~~
    ~~~bash
    #変更履歴から状態を復元する場合
    $ git checkout [コミットハッシュ値] [パス]
    ~~~
  
- オプションについて
    ~~~bash
    $ git checkout -b [ブランチ名]
    ~~~
  のようにbオプションを加えるとブランチの新規作成と切り替えが同時にできる。

### logについて
- logコマンドとは
  指定されたコミットから順に親のコミットを辿ることによって到達可能なコミットをリスト化し、表示するコマンドのこと。
- 実際の使い方
    ~~~bash
    #全てのコミットの履歴を表示する場合
    $ git log
    #特定のコミット以前の履歴を表示する場合
    $ git log [コミットハッシュ値]
    ~~~

  また^をコミットハッシュ値の前につけるとそのコミットから到達可能なコミットは出力から取り除かれる。
  さらに ^ [コミットハッシュ値1] [コミットハッシュ値2] の省略形として、特別な表記[コミットハッシュ値1] .. [コミットハッシュ値2] がある。
- オプションについて
    ~~~bash
    $ git log --author=[コミッター名]
    ~~~
  のようにauthorオプションを加えるとコミッターで履歴を絞り込める。

### statusについて
- statusコマンドとは
  インデックスとHEADに違いがあるパス、ワークツリーとインデックスに違いがあるパス、追跡されないワークツリー内のパスを表示するコマンド。1番目はコミットする必要があるものであり、2番目と3番目はコミットする前にステージングする必要があるもの
  である。
- 実際の使い方
    ~~~bash
    $ git status
    ~~~

- オプションについて
    ~~~bash
    $ git status -s
    ~~~
  のようにsオプションを加えるとショートフォーマットで出力される。

### addについて
- addコマンドとは
  ワークツリーの内容に基づいてインデックスを更新するコマンド。
- 実際の使い方
    ~~~bash
    $ git add [ファイル名 or ディレクトリ名]
    ~~~
  ファイル名で指定した場合は指定されたファイルのみステージングする。ディレクトリ名で指定した場合はそのディレクトリ配下のファイルをステージングする。
- オプションについて
    ~~~bash
    $ git add -A
    ~~~  
  のようにAオプションを加えるとワークツリーの全てのファイルがステージングされる。

### commitについて
- commitコマンドとは
  インデックスの現在の内容と変更を説明するメッセージを含む新しいコミットを作成するコマンドのこと。
- 実際の使い方
    ~~~bash
    $ git commit
    ~~~  
- オプション
    ~~~bash
    $ git commit -m "[メッセージ]"
    ~~~  
  のようにmオプションを加えるとメッセージを追加できる。
    ~~~bash
    $ git commit -a
    ~~~  
  のようにaオプションを加えると変更、削除されたファイルを自動的にステージングした上でコミットできる。

### diffについて
- diffコマンドとは
  ワークツリーとインデックス、最新のコミット、指定したコミット間等の差分を表示するコマンドのこと。
- 実際の使い方
    ~~~bash
    #ワークツリーとインデックスの差分を表示する場合
    $ git diff
    #ワークツリーと最新のコミットとの差分を表示する場合
    $ git diff HEAD
    #ワークツリーと指定したコミットとの差分を表示する場合
    $ git diff [コミットハッシュ値]
    ~~~  

- オプションについて
    ~~~bash
    $ git diff --cached
    ~~~
  のようにcachedオプションを加えるとインデックスと最新のコミットの差分を表示できる。addコマンドでステージングした後に
  確認のためよく用いられる。

### pushについて
- pushコマンドとは
  ローカルの変更履歴をリモートリポジトリに反映させるコマンド。
- 実際の使い方
    ~~~bash
    $ git push [リモートリポジトリ名] [ブランチ名]
    ~~~
  リモートリポジトリ名は通常originとして登録しているはず。
- オプションについて
    ~~~bash
    $ git push [リモートリポジトリ名] --delete [ブランチ名]
    ~~~
  のようにdelateオプションを加えるとリモートリポジトリの指定したブランチを削除できる。
  
### fetchについて
- fetchコマンドとは
  リモートブランチの現在の状態をリモート追跡ブランチに反映させるコマンドのこと。[リモート追跡ブランチ](https://qiita.com/djkazunoko/items/373363648d2e0b620bf8#:~:text=%E6%9C%8830%E6%97%A5-,%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E8%BF%BD%E8%B7%A1%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%80%81%E4%B8%8A%E6%B5%81%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81,-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E8%BF%BD%E8%B7%A1%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81)とはローカルリポジトリに存在するリモートブランチの状態を把握するブランチのこと。
- 実際の使い方
    ~~~bash
    $ git fetch [リモートリポジトリ名(省略可)] [ブランチ名(省略可)]
    ~~~
  リモートリポジトリ名やブランチ名で特定のリポジトリやブランチからの更新のみを取得できる。
- オプションについて
    ~~~bash
    $ git fetch --all
    ~~~
  のようにallオプションを加えると全てのリモートリポジトリから更新を取得できる。
  
### mergeについて
- mergeコマンドとは
  あるブランチから別のブランチに変更を反映させるコマンドのこと。
- 実際の使い方
    ~~~bash
    $ git merge [マージ元ブランチ名]
    ~~~
  指定したブランチの変更履歴を現在いるブランチに反映させている。
- オプションについて
  特筆すべきオプションはない!

### pullについて
- pullコマンドとは
  リモートリポジトリからの変更を現在のローカルブランチに反映させるコマンドのこと。より具体的にはリモートリポジトリからリモート追跡リポジトリにフェッチし、リモート追跡リポジトリをローカルブランチにマージするコマンドのこと。
- 実際の使い方
    ~~~bash
    $ git pull [リモートリポジトリ名]
    ~~~
- オプションについて
  特筆すべきオプションはない!

### その他参考文献
- [git公式リファレンス](https://git-scm.com/)
- [git公式リファレンスの翻訳版](https://tracpath.com/docs/)