【Git】コマンド辞典　~ローカルリポジトリ・リモートリポジトリの基本操作~

##ローカルリポジトリでの操作

###init　（リポジトリを新規作成する）
.gitディレクトリが作成される。

```
// カレントディレクトリにローカルリポジトリを作成
$ git init

//指定したディレクトリにローカルリポジトリを作成
$ git init ~/sample

Initialized empty Git repository in /Users/******/.git/
```

###clone　（リモートリポジトリのコピーを作成する）
事前準備として、GitHubの「Clone or download」より、コピーしたいリポジトリのURLをコピーしておく。
またコピーを保存したいディレクトリに移動しておく。

```
$ git clone コピーしたURL

//ブランチを指定してクローンする
$ git clone コピーしたURL　-b ブランチ名
```

###status　（ワークツリーやステージの状態を確認する）

```
//現在の状態を確認
$ git status

On branch master
nothing to commit, working tree clean
```

###add　（変更をステージに追加する）

ステージがある理由はコミットする変更を準備する為。記録したい変更のみをステージに追加し、一部の変更のみコミットすることが出来る。

git addコマンドの裏側で起こっていることは以下の通り。
①addしたファイル内容を圧縮したファイルが、リポジトリに作成される。
②インデックスに、ファイル名と圧縮ファイルの内容をマッピングした情報が記載される。

```
//指定したファイルの変更をステージに追加する
$ git add ファイル名

//すべてのファイルの変更をステージに追加する
$ git add .
```

###commit　（変更を記録する）

```
//gitのテキストエディタにてコミットメッセージを入力し、変更を記録
$ git commit

//エディタを立ち上げることなく、メッセージ付きで変更を記録
$ git commit -m "メッセージ"

//エディタが立ち上がり、変更内容をエディタ上で確認することができる
$ git commit -v
```

###diff　（変更差分を確認する）
git diff : ワークツリーとステージの変更差分（addされていない変更）が表示される
git diff --staged : ステージとローカルリポジトリの変更差分（addされているが、commitされていない変更）が表示される

```
//ワークツリーとステージの変更差分
$ git diff
$　　git diff ファイル名

//ステージとローカルリポジトリの変更差分
$ git diff --staged
```

###log　（ログ）
リポジトリにあるリビジョンを確認する。（最新の変更から順に表示される）

```
$ git log
```
表示される内容は、以下の通り。
・リビジョン番号（英数字のハッシュ値）
・コミットしたユーザー名＜メールアドレス＞
・コミットした日時
・コミットメッセージ

```
//一行で表示する
$ git log --oneline

//特定ファイルの変更差分のみ表示する
$ git log -p index.html

//表示するコミット数を制限する
$ git log -n コミット数
```

###rm　（ファイルを削除する）

```
//ローカル（ワークツリー）からも削除する
//そもそもファイルが要らなくなった場合
$ git rm ファイル名

//gitの記録からのみファイルを削除し、ローカルにはファイルを残す
//例：パスワードの載っているファイルを、誤ってgitにあげてしまった
$ git rm --cached　ファイル名
```

###　（バージョン管理しないファイルをGitの管理から外す）
.gitignoreファイルに記録する。
例：パスワードを記録した機密ファイル/チーム開発には必要ないファイル/自動生成されるファイル

```
//.gitignoreファイルへの書き方

・指定したファイルを除外
index.html

・ルートディレクトリを指定
/root.html

・ディレクトリ以下を除外
ディレクトリ名/
```

##GitHubとやり取りする
###remote add　（ローカルリポジトリとリモートリポジトリを紐づける）
GitHubのリモートリポジトリの「Code」をクリックし、表示されるURLをコピーしておく。
ターミナルにて、git initを実行したディレクトリに移動する。
下記コマンドを実行してリモートリポジトリと紐付けしておくことで、今後URLを指定せずともショートカット名前で指定することができる。（ショートカット名にはoriginをよく使う）

```
//紐づける（複数登録することも可能）
$ git remote add リモートのショートカット名 コピーしたリポジトリアドレス　
```

###remote　（紐づいているリモートリポジトリを確認する）
```
//登録したリモートのショートカット名を表示（複数登録している場合は複数表示される）
$ git remote

//対応するURLも表示(fetchとpushの2つ表示される)
$ git remote -v

リモート名  コピーしたリポジトリアドレス (fetch)
リモート名  コピーしたリポジトリアドレス (push)
```

###パーソナルアクセストークンの発行
pushする際、GitHubのユーザー名とパーソナルアクセストークンでの認証が必要となる。
GitHub → Settings → Developper settings → Personal access tokens　→ Generate new token
より、パーソナルアクセストークンを発行しておく。
・Note：任意の名前を設定する
・Expiration：有効期間を任意で設定する
・Select scopes：このアクセストークンの所有者に許可する操作にチェックを入れる（全てチェック）
**※GitHubにpushする度にこのアクセストークンが必要となるので、必ずコピーしておく。**
失くした場合は再発行する。

###push　（ローカルの内容をリモートに反映させる）

```
$ git push リモート名 ブランチ名

例)
$ git push origin master
//ローカルブランチ「master」を、リモートレポジトリ「origin」上の同名のブランチに反映する

// -u をつけると、次回以降「git push」のみでorigin masterにpushできる
$ git push -u origin master
```

###fetch　（リモートから情報を取得する①）
リモートリポジトリから、ローカルリポジトリの中のリモート専用の場所（remotes/リモート/ブランチ）へ情報を取得する。
※fetchのみではワークツリーへは反映しない。

```
//リモートリポジトリから、ローカルリポジトリへ情報を取得する
$ git fetch リモート名

//取得してきたリモートリポジトリの内容を、ワークツリーへ取り込む
$ git merge リモート名/ブランチ名

```
###pull　（リモートから情報を取得する②）
リモートリポジトリから、ローカルリポジトリの中のリモート専用の場所（remotes/リモート/ブランチ）へ情報を取得し、ワークツリーへ取り込むまでを一つのコマンドで行う。
※fetchとmergeを一度に行う。

```
$ git pull リモート名　ブランチ名
```
**pullの注意点**
自分が今いるブランチに、pullしてきたブランチの内容が統合される。

例：$ git pull origin hogeを実行する場合
→自分が現在作業しているのがhogeブランチであれば問題ないが、自分がmasterブランチに居るとすると、masterブランチにhogeブランチが統合されてしまう。

###remote show　（リモートの詳細情報を確認する）

```
$ git remote show リモート名
```

###remote rename/remote rm（リモートの変更・削除を行う）

```
//リモート名の変更
$ git remote rename　旧リモート名　新リモート名

//リモートの削除
$ git remote rm リモート名
```

##変更を元に戻す
###checkout （ワークツリーでの変更を元に戻す）
ステージの状態を取得し、その情報でワークツリーの内容を上書きする。

```
//特定のファイルを元に戻す
$ git checkout -- ファイル名(スペースが必要)

//ディレクトリごと元に戻す
$ git checkout -- ディレクトリ名

//全変更を取り消す
$ git checkout -- .
```

###reset HEAD （ステージした変更を元に戻す）
リポジトリから最新のコミットを取得し、その情報でステージの内容を上書きする。
※直前のgit addを取り消す。
※ステージから取り消すだけなので、ワークツリーのファイルには影響を与えない。
※ワークツリーのファイルからも変更を取消したい場合は、git reset HEADをした後にgit checkoutを行う。

```
//特定のファイルを元に戻す
$ git reset HEAD ファイル名

//ディレクトリごと元に戻す
$ git reset HEAD ディレクトリ名

//全変更を取り消す
$ git reset HEAD .
```

###reset --soft （commitのみを取り消す）

```
//コミットコードを指定
$ git reset --soft 取り消しするコミットコード
 
//直前のコミットを取り消しする場合
$ git reset --soft HEAD^
```
###reset --hard （コミットの内容ごと取り消す）
commitを取り消すだけだなく、ステージへの移動・ワークツリーでの変更も取り消す。

```
# コミットコードを指定
git reset --hard 取り消しするコミットコード
 
# 直前のコミットを取り消しする場合
git reset --hard HEAD^
```

###amend　（直前のコミットをやり直す）
今のステージの状態で、コミットを上書きする。
**※リモートリポジトリへpushしたものは、やり直してはいけない。新しくコミットを作って間違えた内容を修正する。**
例：コミットしたけど、一つ修正するのを忘れていた

```
//コミットしたい内容で、git addを済ませておく
$ git commit --amend
//commitした時のコミットメッセージが立ち上がり、書き直すことができる
```

##ブランチの操作
###branch　（ブランチを確認・新規追加・変更・削除する）

```
//今あるブランチの一覧を表示する
$ git branch

//リモートリポジトリも含め、今あるブランチの一覧を表示する
$ git branch -a

//ブランチを新規追加する（ブランチの切り替えは行わない）
$ git branch ブランチ名

//今いるブランチを変更する
$ git branch -m ブランチ名

//ブランチを削除する（masterにマージされていない変更が残っている場合は削除しない）
$ git branch -d ブランチ名

//ブランチを強制削除する
$ git branch -D　ブランチ名
```


###checkout　（ブランチを切り替える）

```
//既存のブランチへ切り替える
$ git checkout 既存のブランチ名

//ブランチを新規作成して切り替える
$ git checkout -b 新ブランチ名
```

###merge　（変更を統合する）
他の人の変更内容を、自分のブランチに取り込む。

```
$ git merge ブランチ名　（ローカルブランチの場合）
$ git merge　　リモート名/ブランチ名　（リモートブランチを参照する場合）

例
$ git merge origin/master
//リモートリポジトリ「origin」のmasuterブランチの内容を、自分の作業中のブランチに統合する
```

###stash （作業を一時避難する）
ワークツリーとステージの状態を保存し、別の場所に一時避難させる。
`$ git stash`を実行すると、ワークツリーは作業を行う前の状態に戻っている。

```
//作業を一時避難させる
$ git stash

//避難した作業一覧を確認する
$ git stash list

//最新の避難した作業を復元する（ワークツリーのみ）
$ git stash apply

//ステージの状況も復元する
$ git stash apply --index

//（最新ではなく）特定の作業を復元する
$ git stash apply stash@{復元したい番号}

//最新の避難した作業を削除する
$ git stash drop

//（最新ではなく）特定の作業を削除する
$ git stash drop stash@{復元したい番号}

//全作業を削除する
$ git stash clear
```



<br><br>
##参考教材
https://www.udemy.com/course/unscared_git