git 個人学習

git忘れたので


初期設定
--
ユーザー名登録 
```bash
$ git config --global user.name "ゆーざーねーむ"
$ git config --global user.name
$ 設定したユーザー名が出力される
```

メールアドレス登録
```bash
$ git config --global user.email "めーるあどれす"
$ git config --global user.email
$ 設定したメールアドレスが出力される
```

リポジトリの作成
---
```bash
$ git init
$ la
.git
```

```bash
$ git clone <リポジトリ名>
# リモートリポジトリのファイル
# .git
```

ステージング
--
```bash
$ git add <ファイル>
$ git add <ディレクトリ名>
$ git add .
```
基本は、記録したいファイルのみ選択する

ローカルリポジトリへ記録
--
```bash
$ git commit
$ git commit -m "メッセージ"
# 変更内容を確認する場合、使用する
$ git commit -v
```

変更状況の確認
--
```bash
# workdirとステージングされたファイルが確認できる
$ git status
```
```bash
# workdirの変更内容
$ git diff
$ git diff <ファイル名>

# ステージングした後の変更内容の確認
$ git diff --staged
```

変更履歴の確認
--
```bash
$ git log

# 変更内容を一行で表示する
$ git log --oneline

# 変更内容を一行で表示する
$ git log -p ファイルの変更差分を表示する

# ファイルの変更差分を表示する
$ git log --oneline

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

ファイルの削除を記録する
--
```bash
# ローカルリポジトリとファイルシステムから削除
$ git rm <ファイル名>
$ git rm -r <ディレクトリ名>

# indexから削除
$ git rm --cached <ファイル名>
```
てっきり、ステージングされた段階で、blobオブジェクトを作成しているので、git rm --cachedを実行したタイミングで、消えると思ってたけど、違うらしい
git gc実行で消えるっぽい

ファイルの移動
--
```bash
$ git mv <oldファイル> <newファイル>
```
mvコマンドなどで代替は可能ですが、仮にステージングされたファイルを変更した場合、追跡機能は無い
他にも色々リスクがあるみたいなので、

リモートリポジトリ
--
```bash
# ローカルリポジトリにoriginとしてurlのリモートリポジトリを登録する
$ git remote add origin https://xxx
```

リモートリポジトリへ送る
--
```bash
$ git push <リモート名> <ブランチ名>
$ git push origin master
```

リモートリポジトリの作成方法は以下参照
[GitHub リモートリポジトリの作成](https://qiita.com/Futo_Horio/items/4d669f695680bc13d5fa#4-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E5%8F%8D%E6%98%A0)



バージョン管理から除外する
---bash
.gitigoreへ記録したくないファイルを記載することで、バージョン管理から除外ができる
[.gitigoreについて](https://zenn.dev/purigen/articles/67bb8de047e1bb)


ファイルへの変更を取り消す
--
```bash
$ git checkout -- <ファイル名>
$ git checkout -- <ディレクトリ名>

# カレントディレクトリへ以下の変更を全て取り消す
$ git checkout -- .
```
ステージングの状態と同じ状態にするため、ステージング後の変更を取り消すとは、別の動作

ステージングの取り消し
--
```bash
$ git reset HEAD <ファイル名>
$ git reset HEAD <ディレクトリ名>
#カレントディレクトリへ以下の全て取り消し
$ git reset HEAD .
```
コミットの記録からステージングの内容を上書きする

直前のコミットをやり直す
--
```bash
$ git commit --amend
```
リモートリポジトリにpushしたコミットはやり直したらいけない

リモートを表示する
--
```bash
$ git remote
#対応するURLを表示
$ git remote -v
```

リモートから情報を取得する
```bash
$ git fetch <リモート名>
$ git fetch origin
# fetchした内容をブランチにmergeさせる場合は、
$ git merge origin
```

ローカルリポジトリのリモートブランチに保存される
この時点で、workdirには追加されていない
ローカルブランチへmergeする際は、git merge実施する

```bash
$ git pull <リモート名> <ブランチ名>
$ git 
```
git fetch + git mergeを現在のブランチに実施する


リモートリポジトリの詳細情報を表示する
---
```bash
$ git remote show <リモートリポジトリ名>
$ git remote show origin
```

ブランチ
```bash
#ブランチの作成
$ git branch <ブランチ名>
# 全てのブランチを表示する
$ git branch -a
```

ブランチを切り替える
---
```bash
$ git checkout <既存ブランチ名>

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

変更履歴をマージする
---
```bash
$ git merge <ブランチ>
$ git merge <リモート/ブランチ名>
```

ブランチを変更・削除する
---
```bash
$ git branch -m <ブランチ名>
# 強制的な削除
$ git branch -D <ブランチ名>
```





<details><summary>メモ</summary>
gitは、変更箇所をすべてをひとまとめにスナップショットで保存している
スナップショットの方が、差分の計算をしなくても良いから処理が速くなり都合がいい

データをスナップショットで、保存している
commitが、直前のcommitを記録しているため、commitを辿ることが出来る

リポジトリ
--
変更履歴の保管場所を指す
* ローカルリポジトリ
* リモートリポジトリ


ローカルリポジトリの詳細
--
* ワークディレクトリ
更新箇所
* ステージング
記録したいファイルをステージングさせる
* リポジトリ
記録する

自分なりの解釈ですが、ポケ◯ンでレポートを刻むことはできません
ジムバッジを１～３個取得し、３個目取得の段階で、レポートすると全体を記録します
しかし、仮に一部分のみ記録できる場合、1個目でレポート、2個目...でレポートができる場合、2個取得段階で、レポートし、ステージングし、commit記録することで、2個目の取得段階でレポートができるみたいな感じ

なので、2個目の段階で、ステージング(add)し、記録(commit)することで、2個目取得段階のみ記録することができる

ローカルリポジトリの処理
--
gitは、変更を記録する。
どのように変更を記録するのか

1.git add
ステージングさせたファイルをローカルリポジトリにblobオブジェクトとして保存する
ステージングされたファイルにblobオブジェクトの情報を追記する。これらをindexと呼ぶ
※blobオブジェクト
ステージングしたファイルを圧縮したファイル

※index
ステージングしたファイル

2.git commit
commit時、indexはリポジトリにtreeオブジェクトとして保存される。
treeファイルは、indexの構成を記録する
commitオブジェクトには、ツリーファイルと直前のcommitの情報がスナップショットとして保存される

これらは、git init時に作成される

mergeの種類
Fast Foward: 早く送りになるmerge
Auto Merge: 基本的なmerge


git使う頻度少ないから、忘れる。。。
個人開発とかで使っていくようにしよ。。