Git でよく使う主要コマンド一覧

# 記事内容
よく使用する git コマンドを備忘録も兼ねてまとめてみました。

# `git status`
**変更内容の確認するためのコマンド**

```shell
git status
```

# `git diff`
**変更したファイルの差分を確認するためのコマンド**

```shell
# add 前の変更を確認する場合
git diff

# add　後の変更を確認する場合
git diff --staged

# ローカルの developブランチと元となるリモートブランチの差分を確認する場合
git diff origin/develop

# ローカルの developブランチとリモートの masterブランチの差分を確認する場合
git diff develop origin/master

# リモートの developブランチとリモートの masterブランチの差分を確認する場合
git diff origin/develop origin/master
```

- `git status`との違い
   - コマンドによって比較対象が異なる。
   - 具体的にどのような変更がされたのか確認できる。

# `git branch`

**ブランチ一覧を確認するためのコマンド**

```shell
git branch

# リモートブランチを含んだブランチ一覧を確認する場合
git branch -a
```

**ブランチ名の変更**

```shell
git branch -m （旧ブランチ名） （新ブランチ名）

# 現在作業しているブランチ名を変更する場合
git branch -m （新ブランチ名）
```

**ローカルブランチの削除**

```shell
git branch -d （ブランチ名）

# 強制削除する場合
$ git branch -D （ブランチ名）
```

**リモートブランチの削除**

```shell
git push --delete origin （ブランチ名）
```

:::note alert
共同開発等で他のメンバーと共有している場合は注意が必要です。
:::

# `git switch`
**ブランチを切り替えるためのコマンド**

```shell
git switch （ブランチ名）
```
**ブランチを新規作成し、作成したブランチに切り替える場合**

```shell
git switch -c （ブランチ名） (ローカルに反映したいリモートブランチ名)

# 例） git switch -c dev origin/dev
```

**リモートブランチをローカルブランチに反映する場合**

```shell
git switch -c （ローカルブランチ名）
```

# `git stash`

**変更内容を一時退避させるためのコマンド**

```shell
git stash push -m （メッセージ）

# 実行例
git stash push -m stashで変更内容を退避!
```

:::note alert
git commit とは違い、メッセージは クォーテーション「 "" 」で囲うとエラーになります。
:::

**退避させたスタッシュ一覧を確認する場合**

```shell
git stash list

# 出力結果
stash@{0}: ...
stash@{1}: ...
```

**現在作業しているブランチに退避させたスタッシュの内容を統合する場合**

```shell
# 統合後もスタッシュを削除したくない場合
git stash apply stash@{スタッシュ番号}

# 統合後、スタッシュを削除する場合
git stash pop stash@{スタッシュ番号}
```

**退避させたスタッシュを削除する場合**

```shell
git stash drop stash@{スタッシュ番号}
```

# `git add`
**変更した内容を登録するためのコマンド**

```shell
git add （ファイル名）

# 全てのファイルを追加する場合
git add .
```

# `git commit`
**`git add`で登録した変更内容をローカルリポジトリに登録（コミット）するためのコマンド**

:::note
メッセージには、変更内容が分かる文言を記述します。
:::

```shell
git commit -m "メッセージ"
```

**add と commit を一括で行う場合**

```shell
git commit -am "メッセージ"
```

:::note alert
異なるロジックの変更内容が存在する場合は、オススメできない方法です。
:::

**直前のコミットを変更する場合（コミットメッセージのみ変更可）**

```shell
git commit --amend -m "メッセージ"
```

# `git push`

**リモートリポジトリの履歴を更新するためのコマンド**

```shell
git push origin HEAD

# 下記とやっていることは一緒
git push origin （現在作業しているブランチ名）
```

`HEAD`は、今現在作業しているブランチを指しています。



# `git fetch`

**リモートリポジトリの履歴を取得するためのコマンド**

共同開発など他のメンバーの変更内容をローカルで参照したい時に使用します。

```shell
# 全ての履歴を取得したい場合
git fetch

# 特定ブランチのみ取得したい場合
git fetch （リモートリポジトリ名） （リモートブランチ名）

# 例） リモートリポジトリにある remoteブランチの履歴のみ取得したい場合
git fetch origin remote
```

# `git merge`

**他ブランチの履歴を現在作業しているブランチに統合するためのコマンド**

```shell
git merge （ブランチ名）
```

##### マージする前の状態に戻す場合（※コンフリクトの編集をしていないときに限る）

```shell
git merge --abort
```

# `git pull`

**リモートリポジトリの更新内容を取得し、現在作業しているブランチに統合するためのコマンド**

先ほど紹介した`git fetch`と`git merge`を同時に実行するコマンドという認識でOKです。

```shell
git pull （リモートリポジトリ名） （リモートブランチ名）

# 例） リモートリポジトリの remoteブランチを現在作業しているブランチに統合する場合
git pull origin remote

# 上記を fetchコマンドと mergeコマンドで実行した場合
git fetch origin remote
git merge origin/remote
```

**コミット履歴を枝分かれさせたくない場合**

```shell
git pull --rebase （リモートリポジトリ名） （リモートブランチ名）
```
参考記事 ↓

https://qiita.com/makua/items/7aa1f4fa02ef9ab1f9d9

**`git pull`を取り消したい場合**

```shell
# git pull したブランチが、現在作業しているブランチにマージされた場合（かつ直前の状態に戻す場合）
git reset --hard HEAD@{1}

# マージが失敗（コンフリクト）した場合の取り消し方法
git merge --abort
```
# `git reset`

**`push`したコミットを取り消すためのコマンド**

```shell
# 直前のコミットだけ取り消す場合
git reset --soft HEAD^

# 直前のコミットと変更内容も一緒に取り消す場合
git reset --hard HEAD^

# 2つ前のコミットと変更内容も一緒に取り消す場合
git reset --hard HEAD~2
```

**`git reset`で取り消したコミットを復元する方法**

```shell
# HEADが指しているコミット履歴を確認
git reflog

# 出力内容
71f4da2 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~1
53f1se1 HEAD@{1}: xxxxx... # ← このコミットを復元したい

# 取り消したコミットの直前に戻す
git reset --hard HEAD@{1}
# もしくは　⬇️
git reset --hard ORIG_HEAD

# 再度、HEADが指しているコミット履歴を確認
git reflog

# 出力内容（ reset で取り消したコミットを取り消して復元）
53f1se1 HEAD@{0}: xxxxx...
```

# `git revert`
**特定のコミットを元に戻すコマンド**
- 指定したコミット以降に行なわれた処理を全て戻すわけではない

#### マージコミットを取り消す場合
マージした二つのコミット（親）の内、どちらに戻すかを指定する必要がある。

```shell
# マージコミットの有無を確認
git cat-file -p { commit_id }

# 下記のようにparentが2つあればマージコミット
tree f1cabb208445a0cd15cb29f15b805100851f8dcb
parent b9466577c0c19af5605be40a4af90cfa37bdaf10
parent 84a1988999654e186f1ac42942befcaa2ce730ae
author xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
committer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

https://udomomo.hatenablog.com/entry/2019/07/14/235323

```shell
# 特定のコミットを取り消す
git revert { commit_id }

# マージコミットを取り消す場合
git revert -m 1 { commit_id }
```

https://qiita.com/chihiro/items/2fa827d0eac98109e7ee

# `git rebase`
指定したコミットを作り直して、ログを掃除するためのコマンド

### 3つ前のコミットを修正する場合

１. コミット履歴を確認 

```shell
$ git log --oneline --graph
* e52c85bcb8 (HEAD -> branch_name) テスト
* 1af223d5f6 フロント側の実装
* 05c9b42463 バック側の実装
* ...
```

２. 修正したいコミットを選択

```shell
git rebase -i HEAD~3 # 3つ前のコミット
```

３. テキストエディタが開き、1行目の`pick`の文字を`edit`に変更して保存・終了
- 終了すると、修正するコミットがチェックアウトされた状態になる

```shell
edit 05c9b42463 バック側の実装 # pick => editに修正
pick 1af223d5f6 フロント側の実装
pick e52c85bcb8 テスト
```

４. ファイルを修正し、ステージングに上げてから修正内容を保存

`commit --amend`：直前のコミットを修正するためのコマンド
- **使用用途**
    - コミット後に追加で修正を行いたい
    - `git add`し忘れたファイルがある

:::note alert
プッシュ済みのコミットを修正してしまうと、`git push -f`を実行する必要があるので共有リポジトリの場合は注意が必要！
:::

```shell
git add .
git commit --amend
```

５. コミットでの作業を終了
`commit`しただけだと、まだ修正内容が反映されないので、このコミットでの修正が完了したことを知らせている。

```shell
git rebase --continue
```

上記実行後、他のコミットで競合が発生した場合、競合箇所を修正後に下記コマンドを実行する。

:::note warn
この時、`commit`は必要ないので実行不要！
:::

```shell
git add .
git rebase --continue
```

#### 今までの作業を中止する場合
これまでの`rebase`での作業を無かった事にしてくれる。

```shell
git rebase --abort
```

#### `rebase`後で元に戻したい場合
rebase前のコミットはORIG_HEADという名前で残っているため、下記コマンドで`rebase`前の状態に戻すことができる。

```shell
git reset --hard ORIG_HEAD
```

https://qiita.com/zaneli@github/items/8d519a229653a2ed9ec6

https://backlog.com/ja/git-tutorial/stepup/33/

# `git cherry-pick`
特定のコミットを取り込みコマンド

```shell
git cherry-pick commit_id
```

#### 複数取り込む場合
二つのコミットの間を「..」で繋げる。

```shell
git cherry-pick commit_id..commit_id
```

#### コミットしたくない場合
`-n`オプションを付ける。

```shell
git cherry-pick -n commit_id
```

####