【備忘録】Git コマンド📝

# はじめに
この記事では下記の講座で学んだ内容をまとめています。

https://www.udemy.com/course/unscared_git/

この記事は自分用の **備忘録** です。

## git init
**git init** は **.gitフォルダ** を作成します。

## git clone
**git clone \<GitHubのURL>** は 
GitHubから **ファイル群** を **ワークツリー** に・**.git** を **ローカルリポジトリ** にコピーします。

## git add
**git add <ファイル・ディレクトリのパス>** は 
指定した **ファイル** を **圧縮したファイル** を **.git/objects** に保存します。
そして **.git/index** に **圧縮し保存されたファイル** と **元のファイル名** の組を保存します。

:::note info
指定したデータをステージに追加しているというイメージです。
:::

## git commit
**git commit <ファイル・ディレクトリのパス>** は
**.git/index** にディレクトリ構造を追加した **ツリーファイル** を作成し
そして **ツリーファイル** のファイル名を持つ **コミットファイル** を作成します。
最後にどちらも **.git/objects** に保存します。

:::note info
ステージに追加されているデータをリポジトリに追加しているイメージです。
:::

## git status
**git status** は 
**ワークツリーで変更されたがステージに追加されていないファイル** と
**ステージに追加されたがコミットされていないファイル** を表示するコマンドです。

## git diff
**git diff <ファイル名>** は
**ワークツリーで変更したが、ステージには追加していない変更差分** を表示します。
**git diff --staged** は
**ステージに追加したが、コミットしていない変更差分** を表示します。

## git log
**git log** はコミット履歴を最新から最初まで **全て表示** します。
**git log --oneline** はコミット履歴を **1行で表示** します。
**git log -n <コミット数>** はコミット履歴を最新から **与えたコミット数** まで表示します。

## git rm
**git rm <ファイル名>** は **エディタでの削除** と **git add** を同時に行います。
ですが、**エディタで削除** -> **git add** -> **git commit** で良いので余り使わないと思います。

## git mv
**git mv <旧ファイル名> <新ファイル名>** は 
**ファイルパスの変更** と **git rm** と **git add** を同時に行います。
ですが、**エディタで変更** -> **git add** で良いので余り使わないと思います。

## git config 
**git config --global alias.<付けたいエイリアス名> <付けたいコマンド名>** は
**付けたいコマンド名** に **付けたいエイリアス名** を付与しています。
**--global** は **PC全体に適用** するオプションです。

:::note info
**git config --global alias.ci commit** は **commit** に **ci** という**エイリアス**を付与しています。
:::

## git checkout -- .
**git checkout -- .** は 
**現在のステージのファイル内容** で **ワークツリーのファイル内容** を上書きします。

:::note info
**git checkout <ファイル名>** で ファイル単体を上書き
**git checkout <ディレクトリ名>** で ディレクトリ単体を上書き出来ます。

これは **ワークツリーでの変更** を初期化したい時に使います。
:::

## git reset HEAD .
**git reset HEAD .** は
**現在のコミットのツリーファイル** で **ステージのインデックスファイル** を上書きします。

:::note info
**git reset HEAD <ファイル名>** で ファイル単体を上書き
**git reset HEAD <ディレクトリ名>** で ディレクトリ単体を上書き出来ます。

これは **ステージへの追加** を初期化したい時に使います。
:::

## git commit --amend
**git commit --amend** は
**一つ前のコミットファイル** に **上書き** するようにコミットします。

:::note info
**前回のコミット** を修正した時に使います。
:::

## git remote
**git remote** は 登録している **リモートリポジトリの名前** を表示します。
**git remote -v** は 登録している **リモートリポジトリのURL** を表示します。
**git remote show <リモート名>** は 登録している **リモートリポジトリの詳細情報** を表示します。

## git remote add
**git remote add <リモート名> <リモートURL>** は
**リモート名** で **リモートURL** のリモートリポジトリを使えるように登録します。

:::note info
**.git/config** に 登録したリモートリポジトリの情報を保存しています。
:::

## git fetch
**git fetch <リモート名>** は
**リモート名/ブランチ名** の **ブランチ** に 登録した **リモートリポジトリ** から **データ** を取得します。

:::note info
例えば **git fetch origin** は
**origin/main** ブランチに **データ** を取得します。

また、**git merge** を併用することで **mainブランチ** の ワークツリーに反映します。
:::

## git pull
**git pull <リモート名> <リモートブランチ名>** は
**git fetch** と **git merge** を同時に行います。

:::note info
例えば **git pull origin main** は
**git fetch origin main** と **git merge origin/main** を **同時** に実行します。

この時 **git merge** は **自分の今いるブランチとマージする** ことに注意してください。
:::

## git remote rename
**git remote rename <現リモート名> <新リモート名>** は
**現在のリモート名** を **新しいリモート名** に変更します。

## git remote rm
**git remote rm <リモート名>** は **リモート** を削除します。

## git branch
**git branch <ブランチ名>** は
**.git/refs/heads/<ブランチ名>** という **ファイル** を作成します。
**このファイル** の中身は **コミットファイルの名前** です。

なので **ブランチ** は **コミットファイルに対する参照** を持っています。

:::note info
**git branch** は ブランチを作成するだけで、ブランチの切り替えは行いません。
:::

**git branch** は **ローカルリポジトリのブランチ** を全てを表示します。
**git branch -a** は **リモートリポジトリのブランチ** も含んだ **ブランチ全て** を表示します。

## git checkout
**git checkout <ブランチ名>** は
**.git/HEAD** の内容を **ref: refs/heads/main** のように **ブランチファイル** へのパスに書き換えます。

それにより **git checkout** は **HEAD** を **指定したブランチ** に切り替えます。

:::note info
**HEAD** は **自分のいるブランチ** という意味です。
:::

**git checkout -b <ブランチ名>** は
**git branch <ブランチ名>** と **git checkout <ブランチ名>** を **同時に** 行います。

## git merge
**git merge <ブランチ名>** は
**自分のいるブランチのコミットファイル** と **指定したブランチのコミットファイル** を **マージ** します。

## git branch -m -d -D
**git branch -m <ブランチ名>** は 
自分がいるブランチの **名前** を **指定したブランチ名** に変更します。

**git branch -d <ブランチ名>** は **指定したブランチ** を削除します。
**git branch -D <ブランチ名>** は **指定したブランチ** を完全削除します。

:::note info
**-d** と **-D** の違いは**mainブランチにマージ**していなくても削除するかしないかです。
:::

## GitHub Flowについて
**1**. **ローカルリポジトリ** 側で **mainブランチ** から **作業ブランチ** を切る
**2**. **ローカルリポジトリ** 内で **作業ブランチ** を **コミット** する
**3**.**ローカルリポジトリ内の作業ブランチ** を **プッシュ** する
**4**.**GitHub** 側の **作業ブランチ** から **mainブランチ** に **プルリクエスト** を送る
**5**.**プルリクエスト** を **コードレビュー** して **mainブランチ** に **マージ** する

:::note info
この流れに沿ってチーム開発を行うと捗るらしいです。
:::