Git/GitHub 基本コマンドまとめ【①超基本編】

## 概要

Git/GitHubで利用する基本的なコマンドを、備忘録としてまとめました。

▼参考文献
学習にあたり、下記の書籍を参考にしました。
初学者にも分かりやすくおすすめです。
<a href="https://www.amazon.co.jp/GitHub%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-Pull-Request%E3%81%AB%E3%82%88%E3%82%8B%E9%96%8B%E7%99%BA%E3%81%AE%E5%A4%89%E9%9D%A9-PRESS-plus/dp/477416366X/ref=sr_1_1?adgrpid=53626124112&gclid=Cj0KCQiA4aacBhCUARIsAI55maGNRd3M2sy3FGpZzRYd_yrGuuF2_Ll5ZtYbCGlYKp2HAR2TEhPzTfYaAgSgEALw_wcB&hvadid=618622326886&hvdev=c&hvlocphy=9053326&hvnetw=g&hvqmt=e&hvrand=6536586612737748313&hvtargid=kwd-334941713223&hydadcr=27264_14598071&jp-ad-ap=0&keywords=github+%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80&qid=1670022279&sr=8-1">GitHub実践入門 ~Pull Requestによる開発の変革</a>

▼そもそも用語が分からない…という方におすすめのサイト
<a href="https://zukulog098r.com/git/">【イラストで覚える】初心者のためのGitとGitHub用語集</a>


# リポジトリの作成・登録

### 手順
- アプリケーションのディレクトリを作成
- アプリケーションのディレクトリ上で、ローカルリポジトリを作成（`git init`）
- GitHub上で、リモートリポジトリを作成
- リモートリポジトリを登録（`git remote add`）

## git init

ローカルリポジトリを作成するコマンド。
すでに存在するリポジトリの初期化にも使用される。
　※アプリケーションのルートディレクトリで実行

```:Terminal
$ git init    : ローカルリポジトリを作成／初期化
```

## git remote add

リモートリポジトリを登録するコマンド。

```:Terminal
$ git remote add origin リポジトリURL   : URLのリモートリポジトリを'origin'という名前で登録
```
ここで、`origin` はリモートリポジトリの識別子（名前）として登録されます。
上記コマンドを実行すると、以降 `origin` という名前で
URLのリモートリポジトリが指定できるようになります。 

なお、リポジトリURL ＝ `git@github.com:ユーザ名/リポジトリ名` です。


# ファイルの変更 ～ コミット

### 手順
- ワークツリーでファイルを変更
- 変更ファイルをステージ（＝インデックス）に追加（`git add`）
- ステージ上のファイルをローカルリポジトリにコミット（`git commit`）

## git add

ステージにファイルを追加するコマンド。

```:Terminal
$ git add .           :  全ての変更ファイルをステージに追加
$ git add -A          :             〃
$ git add ファイル名   :  指定ファイルのみ ステージに追加
```

## git addを取り消す

git addを取り消したいときは、下記コマンドを実行。

```:Terminal
$ git reset             :  git addを取り消し（全ファイル）
$ git reset ファイル名   :  git addを取り消し（指定ファイル）
```

## git commit

ステージ上のファイルを、ローカルリポジトリにコミットするコマンド。

```:Terminal
$ git commit -m "コミットメッセージ"   : ローカルリポジトリにコミット

$ git commit    : エディタが起動し、詳細なコミットメッセージを作成できる
　　　　　　　　　 メッセージを入力し、エディタを終了 →　コミットを完了
　　　　　　　　　 メッセージを入力せず、エディタを終了 →　コミットを中止
```

## git commitを取り消す

コミットメッセージを修正したいときは、下記コマンドを実行。
　※ 直前のcommitのみ有効

```:Terminal
$ git commit --amend -m "コミットメッセージ"   : 直前のコミットのコミットメッセージを修正

$ git commit --amend　　: エディタが起動し、詳細なコミットメッセージを作成できる
    　　　　　　　　　     メッセージを入力し、エディタを終了 →　修正を完了
　　　　　　　　　         メッセージを入力せず、エディタを終了 →　修正を中止
```

git commitを取り消したいときは、下記コマンドを実行。
- コミットIDは `git log` を使って調べられます。
- 直前のコミットの場合は、`HEAD` で指定すればOK

```:Terminal
$ git reset --soft コミットID     : commitのみ取り消し
$ git reset --mixed コミットID    : commit、addを取り消し
$ git reset コミットID            : commit、addを取り消し（mixedと同じ）
$ git reset --hard コミットID     : commit、addを取り消し、ワークツリーも修正
```

# リモートリポジトリにプッシュ／リモートリポジトリからコードを取得

- コミットしたファイルを、ローカルリポジトリから リモートリポジトリにプッシュ（`git push`）
- リモートリポジトリから最新のコードを取得（`git pull`）

## git push
コミットしたファイルを、ローカルリポジトリからリモートリポジトリにプッシュするコマンド。
```:Terminal
$ git push -u origin master    　　 : originリポジトリのmasterブランチにpush
$ git push -u origin ブランチ名     : originリポジトリの指定ブランチにpush
```
ここで、`-u`オプションを加えることで、
作業中のブランチの上流（= upstream）を `origin の指定ブランチ` に設定できます。
つまり、`git pull` コマンドを実行するとき、特に指定しなくても`origin の指定ブランチ`から取得できます。

## git pull
リモートリポジトリから最新のコードを取得し、ワークツリーに反映するコマンド。
```:Terminal
$ git pull origin master    　　 : originリポジトリのmasterブランチのコードを取得
$ git pull origin ブランチ名     : originリポジトリの指定ブランチのコードを取得
```


# 合わせて知っておきたいコマンド
- リポジトリの状態を表示（`git status`）
- 変更の差分を表示（`git diff`）
- コミットログを表示（`git log`）
- 作業ログを表示（`git reflog`）

## git status
リポジトリの状態を表示するコマンド。
```:Terminal
$ git status    　　: リポジトリの状態を確認
```
①今いるブランチ名
②コミットが１度もされていないかどうか
③ファイルの変更・add・commitの状態　　　が確認できます。
　※ 出力結果の見方は別記事で投稿します。

## git diff
変更の差分を表示するコマンド。
```:Terminal
$ git diff    　　　　　　: ワークツリーとステージ間の差分を表示
$ git diff HEAD          : ワークツリーと最新コミット間の差分を表示
$ git diff コミットID     : ワークツリーとコミット間の差分を表示
```

## git log
現在のリポジトリにコミットされたログを表示するコマンド。
```:Terminal
$ git log    　　　　　　　　　: 全てのコミットログを表示
$ git log --pretty=short      : 全てのコミットログを表示 ／コミットメッセージを要約（1行目のみ）
$ git log -p   　　　　　　　　: 全てのコミットログを表示 ／ファイルの差分も表示
$ git log --graph   　　　　　 : 全てのコミットログを表示 ／図で視覚的に分かりやすい

$ git log ディレクトリ名   　　: 指定ディレクトリ下のファイルのみ、コミットログを表示
$ git log ファイル名   　　　　: 指定ファイルのみ、コミットログを表示
```
## git reflog
現在のリポジトリで行われた作業ログを表示するコマンド。
```:Terminal
$ git reflog    　　: 作業ログを表示
```

- `git log` と `git reflog` の違い
`git log` はその状態からの過去のログしか確認できませんが、`git reflog` は全てのログを確認できます。
また、`git log` はコミットログしか確認できませんが、`git reflog` はコミット以外のマージ、チェックアウトなど、全ての作業のログを確認できます。
そのため、`git reset` を実行して歴史を戻った後、戻った分の歴史を復元する時などに使うことができます。
（`git log`では`git reset`後の状態が最新となるため、戻った分の歴史は表示されません）

# まとめ

- リポジトリの作成・登録（`git init`／`git remote add`）
- ファイルの変更 ～ コミット（`git add`／`git commit`）
取り消し・修正（`git reset`／`git commit --amend`）
- リモートリポジトリにプッシュ（`git push`）
- リモートリポジトリからコードを取得（`git pull`）
- 合わせて知っておきたいコマンド（`git status`／`git diff`／`git log`／`git reflog`）

以上、個人の開発で必須レベルのコマンドをまとめてみました。
同じく初心者の方の助けになれば幸いです。