開発者向け git command を自分用にまとめ

# はじめに
新しいプロジェクトを開始した時 git のコマンドを思い出せないそこのあなた(自分)のために、散在しているコマンドの手順をここにまとめてあげよう。

## 開発初手順
>#### 1. ローカルでブランチを作成
>```sh
>git switch develop
>git pull origin develop
>
>git switch -c feature/@@@@@/@@@@
>git branch
>```
>
>#### 2. リモートにプッシュする
>```sh
># コードに変更を加えずにコミット可能
>git commit --allow-empty -m "空コミット"
>git push origin HEAD
>```
>
>#### 3. 開発
>以下手順を繰り返す
>```sh
>〜開発〜
>
># 動作テスト
>npm run build
>npm run dev
>
># コミット
>git add [ファイル名]
>git commit -m "こみっとメッセージ"
>git push origin HEAD
>```
>
>#### 4. マージする
>コンフリクトがあればローカルで解消する
>リモートの develop からマージ
>```sh
>git fetch
>git merge origin/develop
>```
>または
>`git pull origin develop`<br>
>または
>`git pull --rebase origin develop`<br>
>[＞違いを理解する](https://kray.jp/blog/git-pull-rebase/)
>[＞さらに理解する](https://qiita.com/dys/items/c062b1be0d0287352e37)
>fetch & merge がおすすめです。
>```sh
>git add .
>git commit -m "コンフリクト解消"
>git push origin HEAD
>```
>
>＞プルリクエスト承認申請につづく

## first step
```sh
git -v
git clone h@@@@@

# ローカルでブランチを作成
git switch -c feature/@@@@@/@@@@
# 新しいローカルブランチをリモートから直接作成する
git switch -c feature-branch origin/feature-branch
# git switch -t remotes/origin/feature-branch
# git switch コマンドと -t オプションは、Git 2.23 以降で利用可能????
```

## commit
```sh
git status -sb
git add .
git commit -m "COMMIT MESSAGE"
git push origin HEAD
```

## ステージングの調整
作業ディレクトリや実際のファイルには変更がありません。

### 全ての `add` を完全に削除
```sh
# 全てのファイルを取り消し
git rm --cached -r .
# 特定のファイルのみ取り消し
git rm --cached -r file_name
```

### 一つ前の `add` を取り消す
```sh
# 全てのファイルを取り消し
git reset HEAD
# 特定のファイルのみ取り消し
git reset HEAD file_name
```

## コミットの調整
```sh
# commitの履歴確認
git log
# 1コミット1行表示される
git log --oneline
# 表示するコミットの数を指定
git log -n 10
# パスやファイルを限定する
git log -p

# commitのメッセージ修正
git commit --amend -m "新しいメッセージ"
# 直近のコミットメッセージを変更
git commit --amend
# コミット ID も変更される。実質的には、古いコミットに代わる新しいコミットを作成。
```

### git reset
```sh
# commitの打ち消し
git reset [コミットID] # ローカルリポジトリ内のコミット自体を削除する
git revert <コミットのハッシュ値> # コミットと逆のコミットを作成する
git reset --hard HEAD~1
# HEAD~1は直前のコミットを指し、--hardフラグは、コミット後の変更内容を完全に削除し、指定したコミットまでの履歴を変更することを意味します

# 特定のコミットに移動する
git reset --soft [コミットID] # HEAD のみを移動  変更点はステージされたまま（indexに残る）
git reset --mixed [コミットID] # （※デフォルト）HEADとindexを移動  変更点はワークツリーに残る（ステージから外れる）
git reset --hard [コミットID] # HEAD、index、ワークツリーすべて移動  変更点は完全に破棄される
```

### git show
```sh
git show [コミットID] # コミット内容の詳細を表示
# コミットIDを省略またはheadにすることで最新のコミットを示す

git show [コミットID] --stat # ファイルごとの変更数（差分の概要）だけ表示
git show [コミットID] --name-only # 変更されたファイル名のみ表示
git show [コミットID] --name-status # ファイル名と変更タイプ（A:追加, M:変更, D:削除）
```

## ブランチの調整
```sh
# ブランチを確認
git branch
# 全てのブランチを確認
git branch -a
# リモートブランチのみを表示
git branch -r
# 現在のコミットの所属するブランチを確認
git branch --con

# ブランチ名の変更
git branch -m <古いブランチ名> <新しいブランチ名>

# ブランチの削除
git branch -D <ブランチ名>

# リモートのブランチをローカルに反映
git branch local_branch origin/remote_branch

# ブランチの比較
git diff <ブランチ名> <ブランチ名>

# ブランチをマージする(指定ブランチがHEADに取り込まれる)
git merge <ブランチ名>

# 現在のローカルブランチが紐づいているリモートブランチを確認する方法
git branch -vv
git status
```

[git diff コマンドの使い方](https://qiita.com/shibukk/items/8c9362a5bd399b9c56be)
[git log コマンドの使い方](https://www.kagoya.jp/howto/rentalserver/webtrend/gitlog/)

## stash
変更の一時撤退
```sh
# 変更を退避する
git stash
# 追跡されていないファイルも stash する
git stash -u
# ステージングしてない変更だけを stash する
git stash --keep-index

# stash一覧の確認
git stash list

# 退避した作業を元に戻すと同時に、stashのリストから消す
git stash pop stash@{0}
# 番号を指定しない場合0番目(最新)がpopされる
git stash pop

# 最新のスタッシュを削除
git stash drop
# N番目のスタッシュを削除
git stash drop stash@{N}
```
[git stash 参考リンク](https://qiita.com/chihiro/items/f373873d5c2dfbd03250)
[git stash コマンド一覧](https://qiita.com/akasakas/items/768c0b563b96f8a9be9d)


## Gitの情報を見る
```sh
  # ユーザー名とメールアドレスを確認
  git config --global user.email
  git config --global user.name
  # ユーザー名とメールアドレスを登録
  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

  # remote urlを確認
  git remote -v
```


## リモートにpushしたコミットメッセージを変更したい
```sh
git rebase -i HEASD~n # n: 整数（何個前のコミットまで遡るか）
# vi で修正したいコミットの pick を edit に変更
git commit --amend
# vi でコミットメッセージを修正
git rebase --continue
git push --force-with-lease origin <ブランチ名>
```

## 最新の状態にする
```sh
# リベース基を最新の状態にする
git switch develop
git pull origin develop

# リベースを実行
git switch feature
git rebase develop
# コンフリクトを解決
git add <conflicted-file>
git rebase --continue


# 履歴が書き換えられているため強制プッシュ
git push origin HEAD --force-with-lease
```

## git rebase
`git rebase` についてはこちらの記事にまとめ直しました

https://qiita.com/takekota/items/95e4b08c247fea8190de

***

## references
* [【Git】最低限これだけ押さえる！現場で使えるgit rebaseの流れ](https://qiita.com/C_HERO/items/06669621a1eb12d8799e)
* [git rebase についてまとめてみた](https://qiita.com/KTakata/items/d33185fc0457c08654a5)

* [Gitのコミットメッセージの書き方](https://qiita.com/itosho/items/9565c6ad2ffc24c09364)
* [【GitHub】開発中ブランチを安全に退避させてプルリクを作成するまでに使うGitコマンド紹介【Pull Request】](https://qiita.com/zawawahoge/items/c9acc8a05a9745d230f1)

* [はじめてチーム開発する時用のGitチート](https://qiita.com/zunbero_zunbero/items/eb5305a4e9801bc18f3a)

* [【Git】コミットメッセージの先頭につけた方が良い単語リスト- prefix集](https://qiita.com/muranakar/items/20a7927ffa63a5ca226a)
* [GitHubの実務tips](https://qiita.com/yamadagenki/items/5e4ee79a7a680b1675e8)
* [git add を取り消す](https://qiita.com/yukure/items/89562e5eb1d03995dc5b)