gitコマンドのメモ書き


## gitのバージョン確認

```
git version
```


## 初期設定

```
git config --global user.name "<ユーザ名>"
git config --global user.email <メールアドレス>
```

## 設定の確認

```
git config --global -l
git config --list
cat ~/.gitconfig
```

## ローカルリポジトリ作成

```
mkdir <ディレクトリ名>
git init
ls -al   #.gitがあることを確認する
```

## ファイルの変更をステージングエリアへ追加

```
git add <ファイル名>
```

## ファイルの変更（add）を取り消し

```
git reset .
```

## addする前の変更ファイルの差異を表示
```
git diff --diff-filter=M
```
参考記事：[git diff のとき変更したファイルだけを確認する](https://qiita.com/usamik26/items/bfc2196f510d68b3c2cc)

## ローカルリポジトリへコミット

```
git commit
git commit -v   #どのような変更をしたか確認できる
git commit -m "<メッセージ>"   #エディタ起動せずにコミットメッセージを記録できる 
```

## 直前のコミットの取り消し

```
git reset --soft HEAD^
```

## 現在の状態確認

```
git status
```

## コミット後の変更履歴の確認

```
git log
git log --oneline  #1行で表示する
git log -p <ファイル名>  #ファイルの変更差分を表示する
git log -n <コミット数>  #表示するコミット数を制限する
git show  #git log -1と同意
git log --graph --oneline  #グラフで表示
```

## git addする前の変更分の確認（ワークツリーとステージ間）

```
git diff
```

## git addした後の変更分の確認（ステージとコミット間）

```
git diff --staged
```

## リモートリポジトリの登録（リモートリポジトリのURLをoriginという名前で登録する）

```
git remote add origin https://<ユーザ名>@<リモートリポジトリのURL>
```

## リモートリポジトリ（origin）へローカルリポジトリ（master）の内容を送信
```
git push origin master
もしエラーだったら、以下を実行後、再度push
git pull --rebase origin master

git push -u origin master  #-uと付けると、次回以降のpushで、origin masterを省略できる

git push --set-upstream origin feature  # -uと一緒。次回以降のpushで、origin featureを省略できる

git push origin HEAD  # 上記の--set-upstreamを使用しなくてもこれだけでいける
```

## gitのmanページを表示

```
man git-push
man git-pull
```

## gitクローン

```
git clone <リモートリポジトリのURL>
```

## ファイルの削除

```
git rm <ファイル名>
git rm -r <ディレクトリ名>
git rm --cached <ファイル名>  #gitの記録からのみファイルを消し、ワークツリー上には残す
```

## ファイルを元の状態に戻す（ワークツリー上のファイルの変更を戻す）

```
git checkout -- <ファイル名>
git checkout -- <ディレクトリ名>
git checkout -- .
```

## ステージした変更を取り消す

```
git reset HEAD <ファイル名>  #削除したファイルを元に戻す
git reset HEAD <ディレクトリ名>
git reset HEAD .  #全変更を取り消す

git checkout <ファイル名>
```

## コミットした以前のバージョンに戻す

```
git checkout <コミットID> <ファイル名>
```


## ファイルを移動する（ファイル名の変更）

```
git mv <旧ファイル> <新ファイル>
```

## リモートを表示する

```
git remote -v
git remote show origin
```

## リモートを変更・削除する

```
git remote rename <旧リモート名> <新リモート名>
```

## リモートをURLを変更する

```
git remote set-url origin <新URL>
```

## リモートを削除する

```
git remote rm <リモートリポジトリ名>
ex. git remote rm origin
```

## リモートの向先を変更する

```
git remote set-url <リモート名> <リモートURL> 
ex. git remote set-url origin https://user01@github.org/user01/new.git
```
※クローンしたリポジトリを別のリポジトリとして設定する場合も同様
参考 ： https://qiita.com/SR_midori/items/52730907c1cddeb78b4d


## リモートから情報を取得する（フェッチ）

- リモートから情報を取得する（フェッチ）

```
git fetch <リモート名>
ex) git fetch origin
```

- リモート追跡ブランチ（remotes/origin/xxxxx）の情報を最新版へ更新する

```
git checkout -b remotes/origin/xxxxx origin/xxxxx  # ブランチをリモート追跡ブランチへ切り替え
git fetch
git merge origin/xxxxx
```

- ブランチの情報表示

```
git branch -a   #-aとすることでリモートブランチから取得したブランチ名が表示される
```

- ワークツリー上のブランチをリモートブランチから取得したブランチへ切り替え

```
git checkout <リモートブランチから取得したブランチ名>
ex) git checkout remotes/origin/master

ls -l   #リモートブランチの内容を確認
```

- ワークツリー上のブランチをmasterへ戻す

```
git checkout master
```

- 取得してきた情報をワークツリーのmasterに取り込む（originリポジトリのmasterブランチの情報をワークツリーにマージする）

```
git merge origin/master
```


## リモートから情報を取得し、マージまでを一度にやる（プル）
- リモートから情報を取得してマージする（プル）
    - （使用例）プルリクエストしてリモートリポジトリのmasterがマージされた場合、ローカルリポジトリの内容をmasterと合わせる為にpullしておく

```
git pull <リモート名> <ブランチ名>
git pull origin master

git pull   #origin masterを省略可能
```

## ブランチを新規作成する

```
git branch <ブランチ名>
```

## ブランチの一覧を表示する

```
git branch
git branch -a
```

## ブランチを切り替える

```
git checkout <ブランチ名>

git checkout -b <新ブランチ名>  #ブランチを新規作成して切り替える

git checkout -b <リモートブランチ名> origin/<リモートブランチ名>  #リモートブランチをローカルへチェックアウトして切り替える
```

## ブランチをリモートリポジトリへpush

```
git push origin <ブランチ名>
```

## ブランチをマージする

```
git merge <マージするブランチ名>
git merge <リモート名/ブランチ名>
ex) git merge origin/master  #リモートoriginを自分の作業中のブランチmasterにマージする
```

## 開発用ブランチにMasterブランチの最新コードを取り込む

```
# masterブランチへ移動
git checkout master
# git pullでmasterを最新に
git pull origin master
# 開発用ブランチへ移動
git checkout 開発用ブランチ
# mergeコマンドでmaserの内容を取り込む
git merge origin master
```

参考記事：https://bake0937.hatenablog.com/entry/2017/11/07/081616

## 開発用ブランチに別の作業者が行った修正を取り込む

```
# カレントが開発用ブランチであることを確認
git branch
# git pull で最新の内容を取り込む
git pull origin feature/*****
```

## ブランチ名を変更する

```
git branch -m <ブランチ名>
```

## ブランチを削除する

```
git branch -d <ブランチ名>

git branch -D <ブランチ名>  #強制削除する
```

## コミットせずに変更を退避
```
git stash  #変更を退避

git stash list  #退避した変更一覧を確認

git stash show stash@{0} -p  #変更内容の詳細を確認

git stash apply stash@{0}  #退避した変更を戻す（退避リストに残す）

git stash pop  #退避した変更を戻す（退避リストからは削除）

git stash drop stash@{0}  #退避した変更を削除
```

## リリース対象のコミットに対して、タグを設定
```
git show  # 現在のコミットを確認

git tag -a vX.X.X -m "xxx機能を追加"  # 現在のコミットにタグを付与

git push origin vX.X.X  # 作成したタグをGitHubリポジトリにプッシュ
```

## 特定のコミットを別のブランチに移行する
### 例：間違えてmainブランチにコミットした内容を、featureブランチへ移行
1. mainブランチのコミットログを確認（どこからどこまでを移行したいか）
   ```
   git checkout main
   git log
   ```
2. 特定コミット（コミットID_A から コミットID_B 迄）をfeatureブランチへ移行
   ```
   git checkout feature
   git cherry-pick <コミットID_A>^..<コミットID_B>
   ```
3. featureブランチへの移行をGithubに反映
   ```
   git push origin feature
   ```
4. mainブランチから移行した資材を削除し、それをコミット

## クラウド破産しないように git-secrets を入れることは重要
```
brew install git-secrets
```

## 初期導入手順
1. github上で新規リポジトリ作成
2. ローカルリポジトリの新規作成
    1. cd <任意>
    2. mkdir <リポジトリ用ディレクトリ>
    3. git init
    4. ls -al
3. リモートリポジトリの登録
    1. git remote add origin ＜URL＞
4. READMEのコミット
    1. git add README.md   ←初回コミットは空のREADMEのみ
    2. git commit -m "first commit"
5. リモートリポジトリへpush
    1. git push -u origin master
6. github上で新規ブランチ作成
    1. masterから派生したreleaseブランチを作成
    2. releaseから派生したdevelopブランチを作成
    3. developから派生したfeatureブランチを作成
    4. git fetch --prune でリモートリポジトリのブランチと同期
    5. git checkout -b develop origin/develop でローカルにdevelopブランチを持ってくる
    6. git checkout -b feature で機能追加ブランチを作成する
7. 必要な諸々のファイルやディレクトリを作成

## 障害対応時の流れ
1. masterブランチからhotfixブランチ（hotfix/hogehoge）作成＆マージ
2. 本番適用して問題なければdevelopブランチへマージ

## developブランチ導入の流れ
1. masterブランチからdevelopブランチ作成
1. developブランチからfeatureブランチ作成
1. featureブランチで作業を行い、変更をコミット
1. `git push origin HEAD` で github へ push
1. github へアクセスし、ページ上部にある「Pull request」をクリック
1. 「base:」ドロップダウンメニューで develop ブランチを選択し、「compare:」ドロップダウンメニューで feature ブランチを選択
1. 「Create pull request」ボタンをクリック
1. レビュアーに approve してもらったら「Merge pull request」でマージ
1. ローカルにて `git checkout develop` で develop ブランチへスイッチ
1. `git pull` にて develop ブランチの最新コードを取り込み


参考記事：[Gitのブランチモデルについて](https://qiita.com/y-okudera/items/0b57830d2f56d1d51692)