Gitの基礎をまとめてみた

# はじめに
初学者の私が備忘録としてGitの基礎コマンドについてまとめる。

GitHubが絡むものと、ローカルのGitのみでの動作のモノの差が
明示されていないサイトが多く、初学者としてはむずかしいなあと感じた。

# ローカル操作編
GitHubのことは一旦置いといて、ローカル環境での操作のコマンドを記録していく。

## ファイルを保存する関係のコマンド

### git add
ファイルの中身をインデックスに追加する
ローカルのワークツリーからローカルのステージに記録
<font color=red>git commitの前段のようなイメージ</font>

```git:よく使うやつ
git add .

全ファイルを対象に記録する場合「.」忘れずに！！！！！！
```

https://git-scm.com/docs/git-add/ja

### git commit
追加・変更したファイルをGitに登録するためのコマンド
ローカルのステージからローカルのリポジトリに記録
<font color=red>git commitをする前にはgit addが必要</font>

```git:よく使うやつ
git commit -m "自由にメッセージ"

コミットする際に変更点をメモしておける。（例：会員機能を作ったよとか）
```

https://www.sejuku.net/blog/71279

## 現状の確認に関するコマンド

### まず初めに
* ワークツリー
現在作業中でaddもcommit行われていないモノ
* ステージ
addされて、commitがまだのモノ
* リポジトリ
addとcommitが済んでいる状態のモノ

### git diff
リポジトリとワークツリーの差分をチェック
つまり、現在作業中のモノ(ワークツリー)とcommit済みのもの(リポジトリ)の差分を確認できる。

```git:こんなこともできる
git diff --staged

リポジトリ(commit済み)とステージ(add済みcommit未だ)の差分をチェック
git diffと比較対象を「--staged」で変更されたコマンド。
```

### git status
ワークツリーとステージの差分をチェック

```git:なんか便利そう
git status -s

git statusは長いメッセージが出てくるが、それを省略して見やすくしてくれる。
```

https://qiita.com/tommy_aka_jps/items/af536a7c20747f99aa42

https://codelikes.com/git-status/

### git log
commitの履歴を確認することができる。


## 元に戻す系のコマンド
### git restore ファイル名
addやcommitしたものに戻すコマンド
```git:使い方①
git restore file.txt

ステージ(add済commit未)からワークツリーへ「file.txt」をコピーする(元に戻す)
```

```git:使い方②
git restore --staged file.txt

リポジトリ(add済commit済)からステージ(add済commit未)へ「file.txt」をコピーする(元に戻す)
```

# チーム開発編
ここからGitHubが出てくる

### 作業手順
1. ローカルのメインブランチをGitHubのメインブランチと揃える
2. 作業用ブランチを切って作業を行う
3. ファイル修正・ローカル内でコミット
4. GitHubへpush
5. プルリクエストをする <font color=red>※GitHub上での操作</font>
6. コードレビューをしてもらう <font color=red>※GitHub上での操作</font>
7. マージをしてもらい、GitHubの内容を更新する <font color=red>※GitHub上での操作</font>

つまり、githubへpushしただけではGitHubは更新されていない！！


### git branch ブランチ名
ブランチを作成するコマンド
<font color=red>ワークしているブランチはこれだけでは切り替わらないので注意！！！！
作業しているブランチを変えたい場合は`git switch ブランチ名`が必要</font>

### git branch
ブランチ一覧を表示

```git:豆知識
git branch -a

GitHub含めたすべてのブランチが確認できるみたい
```

### git switch
ブランチを切り替える際に使用する。

```git:使用例
git switch ブランチ名

ブランチ名のブランチへ移動する
```
```git:こんなこともできる！便利！
git switch -c branch

ブランチを作成して移動する
ほな「git branch ブランチ名」はいらんわけや・・・。
```

### git checkout ブランチ名
ブランチを切り替える際に使用する。

### git switchとgit checkoutと何が違うん！？
* git switchは移動するのみ
* git checkoutは変更の取り消しも含まれる

つまり、git checkoutはgit switch＋git restoreになるわけやな。

<font color=red>switchのほうが後から出てきた便利コマンドらしく、
これから学習する人はswitchで覚えたほうがわかりやすいっぽい。</font>
確かにcheckoutって直感的にわかりにくい。

https://snowsystem.net/git/git-command/git-switch/

https://www.delftstack.com/ja/howto/git/git-switch-vs-checkout/

https://www-creators.com/archives/1388

### git merge 取り込みたいブランチ
現在のブランチに、他のブランチの更新を取り込む処理
ローカル内での話

```git:使い方
git merge 取り込みたいブランチ

取り込みたいブランチを記述することがポイント
現在AブランチにいてBブランチの内容をコピーしたい場合は
git merge Bブランチとなる
```

```git:githubからも持ってこれるらしい
git merge リモート名/取り込みたいブランチ
```

https://www.sejuku.net/blog/71003

### コンフリクト
同じ個所が変更されているものをmergeした場合に発生するエラー
正しい状態に書き直して再度mergeするとOK

# GitHub周り

### git push　※事前にGitHubとの連携が必要
ローカルでcommitしたものをGitHubに反映させる
※事前にGitHubとの連携が必要

```git:使い方
git push リモート名 ブランチ名
```

### git pull　※事前にGitHubとの連携が必要
githubのブランチをローカルのワークツリーへコピー
※事前にGitHubとの連携が必要

```git:使い方
git pull リモート名 ブランチ名
```

### git fetch　※事前にGitHubとの連携が必要
githubのブランチをローカルのリポジトリにコピー
※事前にGitHubとの連携が必要

git pullとは反映される場所が違うため注意！！！！
`git fetch`と`git merge`を一発でできるようにしたのが`git pull`

### git fetchとgit pullは使い分けが便利らしい
git pullはコンフリクトが発生していたら修正が困難(らしい)
mainブランチ(自身が直接変更処理を加えないブランチ)へはgit pull
作業ブランチへはgit fetch→git mergeをした方がコンフリクトの解消がしやすい。 

https://www.youtube.com/watch?v=WHwuNP4kalU

https://qiita.com/Hashimoto-Noriaki/items/3e04bf96e3b0aaf86b6e

### git clone　※事前にGitHubとの連携が必要
Github上からファイルを取り込む方法
なんか`git pull`と似てんな・・・・。

https://tech.amefure.com/web-git-clone-push

### git cloneとgit pullって何が違うん！？
多分見た目上は結構同じな気がする。しかし、やってることは結構違う。
* git clone
ファイルをすべてコピーする
* git pull
ローカルとリモートの差分をリモートからコピーする

https://www.youtube.com/watch?v=yagGQ1eHE1g

https://tech.amefure.com/web-git-clone-push

# おまけ編

### git log
コミット履歴が見れる
コミットのIDとかも見れる。

### git rebase
ブランチの状態を変更することができるコマンド
カレントブランチを他のブランチと直列回路につなぎ直せる。
並列回路⇒直列回路に切り替えるイメージ
チーム開発では混乱のもとになったりするので、そういうのがあるんだ程度でOK

https://www.sejuku.net/blog/71919


### git reset
コミットしたものに戻したい場合に使う
<font color=red>履歴を消してしまうので必要時は要検討すること</font>

* --soft
コミットだけリセット。(Headの移動だけ)

* --mixed
コミットとアドもリセット(Headの移動に加えて、addした状態も取り消す)

* --hard <font color=red>最終手段なので全然使わない、リスクが大きい</font>
コミットとアドとワークツリーもリセット(最終手段！ってかんじ)
--mixedに加えて、ワーキングツリーもすべて削除される


```git:こんな使い方
git reset --soft [巻き戻したい時点のコミットを指定]
git reset --mixed [巻き戻したい時点のコミットを指定]
git reset --hard [巻き戻したい時点のコミットを指定]
```

https://www.r-staffing.co.jp/engineer/entry/20191129_1

https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe

https://www.youtube.com/watch?v=vXoYb71ZXV8

### git stash
ブランチの内容をcommitしたくないが、ブランチの移動をしたい際に使用したりする
一時別置きができる機能

https://www.youtube.com/watch?v=sBCJ7-JmMs0

https://www.youtube.com/watch?v=L5B624Phxu0

### git revert
git resetとは違い、消した履歴が残る。
というより、消すというわけではなくコミットを「Revert状態」にするというイメージ。
あれ？このコミットどうしたっけ・・・？というのがgit logから確認できる。
そして、再revertすることで元に戻せる！

https://www.youtube.com/watch?v=4DeTLuozMLE

### git cherry-pick
他のブランチから内容をコピーしてくる手法。特定のファイルだけでもいけるっぽい。
あまり使わなそう・・・。存在だけここでは知っておく。

https://www.r-staffing.co.jp/engineer/entry/20200327_1


# Git勉強するうえでよくわからなかった言葉
### ハッシュ
commitに割り振られているIDのようなもの
`git log`で確認できるやつ

```git:ハッシュ
$ git log 
commit 757cd618f38d574238bae4768ff1a1aedfafdb7a　☜
Author: DQNEO <dqneo@example.com>
Date:   Thu Feb 4 21:18:28 2016 +0900
second commit
```
上記例の<font color=red>`757cd618f38d574238bae4768ff1a1aedfafdb7a`</font>がハッシュとかハッシュ値と呼ばれるやつ。



# 随時更新！