Gitコマンドと開発フロー【未完成】

# 記事のタイトル

## 目次
■[個人開発時のフロー](#個人開発時のフロー)
- [git init](#git-init)
- [git add](#git-add)
- [git diff](#git-diff)
- [git commit](#git-commit)
- [git log](#git-log)
- [git status](#git-status)
- [git rimote](#git-rimote)
- [git push](#git-push)

■[移動・削除・変更・短縮](#移動削除変更短縮)
- [git mv](#git-mv)
- [git rm](#git-rm)
- [git reset (addステージングを取り消し)](#git-reset-addステージングを取り消し)
- [git commit -amend (直前のコミットを取り消し)](#git-commit-amend-直前のコミットを取り消し)
- [Gitコマンドエイリアス(短縮)](#gitコマンドエイリアス短縮)
- [Gitのデフォルトエディタをvimに変更](#gitのデフォルトエディタをvimに変更)

■[チーム開発時のフロー](#チーム開発時のフロー)
- [git clone](#git-clone)
- [git pull](#git-pull)
- [git fetch](#git-fetch)
- [git merge](#git-merge)
- [git branch](#git-branch)
- [git checkout](#git-checkout)
- [emojiテンプレ作成](#emojiテンプレ作成)


■[ブランチの最初に戻りやり直す](#ブランチの最初に戻りやり直す)



# ■個人開発時のフロー
<br>

## git init
効果：リポジトリを初期化し追跡下に置かれ、バージョン管理が可能になる。
メモ：開発の時は最初にこのコマンドを入力する
```bash:コマンド
git init
```
<br>


## git add
効果：ファイル変更をステージングエリアに上げる。
```bash:コマンド
# 特定のファイル
git add <ファイル名>

# 全ファイル
git add .
```
<br>


## git diff
効果：現在の作業ディレクトリとステージングエリアとの間の差分を表示。
メモ：既存のファイルに対する変更点（追加、削除、修正）のみを表示。新規ファイルは含まない。
```bash:コマンド
# 作業ディレクトリ　～　git addの差分
git diff

# git add　～　git commit後の差分
git diff HEAD

# git add　～　git commit前の差分
git diff --staged
```
<br>


## git commit
効果：選択したファイルを記録
```bash:コマンド
# 別エディタで記録
git commit

# 直接入力 ※使用頻度多い
git commit -m "Initial commit"

# コミットする際に変更内容を表示
git commit -v
```

## git log
コミット履歴表示
```bash:コマンド
# コミット履歴を表示※他メンバー含む
git log

# 1行表示
git log --oneline

# グラフィカルに表示
git log --graph

# 変更内容も表示
git log -p

# 入力した数だけ表示
git log -n <数>

# 1行表示 + 入力した数だけ表示　⇨　シェルコマンドでエイリアス登録用
git l <数>
# 上記コマンドのエイリアス設定
git config --global alias.l '!bash -c "git log --oneline -n $1"'

# 
```

`!`の意味
コマンドの先頭に付けると外部コマンドとして実行できる

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9

`-c`の意味
連続コマンド入力

`$1`の意味
https://atmarkit.itmedia.co.jp/ait/articles/1810/07/news001.html
<br>


## git status
現在の変更内容確認
```bash:コマンド
git status
```
<br>


## git rimote
リモートリポジトリの設定を管理
```bash:コマンド
# リモートの一覧表示
git remote

# リモートの詳細URL表示
git remote -v

# リモートリポジトリ登録・追加
git remote add <リモートリポジトリ名> <リモートリポジトリのURL> 
```
<br>


## git push
リモートリポジトリにファイルをアップロード
メモ：GitHubで自動生成され、以後は「`git p`」でプッシュ可能になる
```bash:コマンド
git push <リポジトリ名> main
```
<br><br>


# ■移動・削除・変更・短縮
<br>

## git mv
留意点：名称変更した場合はgit commitする必要がある
git rmとgit addを同時に行うことになるため
```bash:コマンド
# ファイル名orディレクトリ名変更
git mv ＜変更前＞ ＜変更後＞

# ファイル移動
git mv ＜移動したいファイル＞ ＜移動先ディレクトリ＞
```
<br>


## git rm
```bash
# ファイル削除
git rm ＜ファイル名＞

# ディレクリ削除
git rm ＜ディレクリ名＞

# ディレクリと中の全てのファイルを削除
git rm -r ＜ディレクトリ名＞

#ファイルをgitの追跡から解除をしてローカルに残したい場合
git rm --cached ＜ファイル名＞

#ディレクトリと中の全てのファイルをgitの追跡から解除をしてローカルに残したい場合
git rm --cached -r ＜ディレクトリ名＞
```
<br>



## git reset (addステージングを取り消し)
コミットが `1以上` ➡ ステージに追加した変更を元に戻す (`git add`をキャンセル)
```bash:コマンド
# ファイル
git reset HEAD ＜ファイル名＞

# ディレクトリ
git reset HEAD ＜ディレクトリ名＞

# 全て
git reset HEAD .
```
<br>


## git commit -amend (直前のコミットを取り消し)
注意点：既にリモートでプッシュしたコミットは取り消ししない
他の開発者の履歴に影響を与えるため共有リポジトリでは特に注意が必要。
基本プッシュしたら使用しない事。
```bash:コマンド
# ファイル
git commit --amend
```
<br>


## Gitコマンドエイリアス(短縮)
```bash:コマンド
# コマンドエイリアス登録
git config --global alias.短縮コマンド 元コマンド

# クオテーションで囲む方法
# 例)ログを1行で表示
git config --global alias.lg "log --oneline"
# 例)コミットを直接入力
git config --global alias.cm "commit -m"

# 登録された全てのコマンドエイリアスを表示
git config --global --get-regexp alias

# エイリアスを削除する
git config --global --unset alias.削除したいコマンド
```
※ `--global`は Git のグローバル設定に適用されます。
※エイリアスを設定する際には `git` を含める必要はありません。
たとえば、`git status` の操作を短縮して `s` としたい場合の入力例⇩
`git config --global alias.s status`



https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases




## Gitのデフォルトエディタをvimに変更
```bash:bash
# Vimに変更
git config --global core.editor "vim"

# エディタの設定反映の確認
git config --global --get core.editor
```

<br>

# ■チーム開発時のフロー

<br>


## git clone
リモートリポジトリからローカルリポジトリにプロジェクトを複製。
他の人がすでに作成しているプロジェクトから始める場合に使用。							
							
```bash:コマンド
git clone <リポジトリのURL>
```
<br>

## git fetch	
リモートリポジトリからローカルリポジトリのブランチに情報を落とす
ローカルリポジトリに情報を落とすだけでワークツリーには反映しない
```bash:コマンド
git fetch <リモート名>
```

## git merge	
```bash:コマンド
# 変更を取り込む側のブランチに切り替える
git checkout master  # masterブランチに切り替え

# 他のブランチから統合
git merge feature-branch  # feature-branchの内容をmasterブランチにマージする

```
両方のブランチを統合して、新しく「マージコミット」を作成する
<br>


## git pull
リモートリポジトリからファイルをダウンロードする。
`git fetch`と `git merge`を同時に行っている
```bash:コマンド
git pull origin master
```
【手順①】`git pull` で他メンバーが作成したファイルをダウンロード
【手順②】ファイルの中身変更
【手順③】`git add` でステージング
【手順④】`git push` でプッシュ
<br>


## git branch	


アスタリスク `（*）` が付いているブランチは、現在チェックアウトして作業しているブランチ。コミットや変更がそのブランチに適用されます。
```bash:コマンド
# 新しいブランチ作成
git branch <ブランチ名>

# 現在のリポジトリ内のブランチを一覧表示
git branch

# ブランチの全情報を表示(ローカルおよびリモート)
git branch -a

# ブランチの全情報を表示(リモートのみ)
git branch -r
```
<br>


## git checkout
***主に二つの目的で使用されます***
1. ブランチの切り替え
2. 変更の取り消し



```bash:コマンド
# ブランチの切り替え
git checkout <切り替えたいブランチ名>

# 変更が取り消され、最後にコミットされた状態に戻ります
git checkout -- ＜ファイル名＞

# ディレクトリごと
git checkout -- ＜ディレクトリ名＞

# 全取り消し
git checkout -- .
# [--]をつける理由は、ブランチ変更と区別するため


# ブランチの作成とチェックアウトを同時に行う
git checkout -b <ブランチ名>
```


***■変更の取り消し***

①この状態でコミットする
![screenshot_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/6c58191f-2a53-0fe6-e6b9-4deec2c14b8a.png)

②コミット後に再度編集※git checkoutの数を増やす
![screenshot_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/b13482fc-da6a-1381-4b34-64cd2d9dd06d.png)

③`git checkout -- ＜ファイル名＞`を入力し最新のコミット時に戻す

![screenshot_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/b58a2f54-c613-5d13-bd80-bd3a3d06e759.png)




## emojiテンプレ作成
**参考**

https://goodpatch.com/blog/beautiful-commits-with-emojis

<br>

**【手順1】テンプレートファイル作成**

```bash
vim ~/.commit_template
```

**【手順2】以下からテンプレ内容を記述**

https://gist.github.com/nownabe/85d8595fd142adc426fbfaf2bab015e0

**【手順3】テンプレートをGitに設定**

```bash
# Gitに設定
git config --global commit.template ~/.commit_template

# 設定確認
git config --get commit.template
```

<br>


## ブランチの最初に戻りやり直す


```bash:コマンド
# 全取り消し
git checkout .
# 未追跡ファイルを一括削除
git clean -fd

# 「01_feature」という1つ前のブランチに戻る
git checkout 01_feature

# 「02_feature」という現在作業していたブランチを削除する
git branch -D 02_feature

# やり直したい「02_feature」ブランチを作り直しチェックアウト
git checkout -b 02_feature
```

<br>
コミットを指定し作業環境を完全に戻す

```bash:コマンド
# 1つ前のコミットにリセット
git reset --hard HEAD~
####### or ######
# 2つ前のコミットにリセット
git reset --hard HEAD~2

# 未追跡ファイルを一括削除
git clean -fd
```







# 　注意）使用は控える
未追跡ファイルの削除
`-f` は強制的にファイルを削除するオプションです。
`-d` はディレクトリも含めて削除します。
`-x` は.gitignoreで無視されているファイルも含めてすべて削除します。
```bash:コマンド
git clean -fdx
```
開発やり直しのために未追跡ファイルを削除鶴つもりが
元から格納されていたアセットファイルまで削除されたので
使わないようにする。
先に記述した`git clean -fd` はいいが `-x`は使わないようにする。
**gitignoreファイル**まで削除される

<br>

未追跡ファイルの削除の確認
```bash:コマンド
git clean -nxd
```


リファレンスログから古いコミットへの参照を即時に期限切れにして削除します。
```bash:コマンド
git reflog expire --expire=now --all

```
ガベージコレクションを強制的に実行して、削除されたコミットを含む不要なオブジェクトをクリーンアップ
```bash:コマンド
git gc --prune=now --aggressive
```