[GitHub]初回コミットの流れを整理

GitHubを使い始めて1週間ほど経ちましたがイマイチ流れを把握出来ていない(コマンド打っていても自分が今何をしているのかすぐにわからなくなる)ので、記事を書いて頭を整理しようと思いました。
メインは初回コミットのざっくりとした流れですが、ChatGPTが説明してくれた各コマンドの細かい説明も補足＆メモ用に貼り付けてあります(後々別記事に分けたりしたいと思っています)。
あと関係無いけど、ChatGPTの回答をそのまま貼り付けたらちゃんとマークダウンもそのままで見やすくてすごい…！めっちゃ参考になるしマジでChatGPT様様すぎる。
## リポジトリを初回コミットするときのざっくり流れ
### 1. GitHubでリモートリポジトリを作成
- GitHubのWebサイトで新しいリポジトリを作成
- リポジトリ名や公開・非公開設定を選ぶ
- 必要ならREADMEや.gitignoreを最初に作る（後から追加してもOK）
### 2. ローカルでGitを初期化する
- ターミナルでローカルリポジトリ(プロジェクトディレクトリ)に移動し、`git init`実行
- ローカルリポジトリに「.git」フォルダが作成され、Gitが使えるようになる
### 3. ファイルやフォルダをGitに追加する
- `git add .`で現在のディレクトリ内にあるすべてのファイルやフォルダを「ステージングエリア」に追加する('.'はカレントディレクトリにあるすべてのファイルやフォルダを指す)
- 具体的に言うと.git/indexに変更情報が追加される。indexはバイナリファイルで、`git ls-files --stage`で中身を確認することができる
```.git/index
100644 1b2e1d384b8c3c63f8c8ef847c3e2b1c202345c7 0       example.txt
```
・100644: ファイルのパーミッション（例: 100644は普通のファイル）。
・1b2e...: ファイルのハッシュ値。
・0: ステージング状態（0は通常の状態）。
・example.txt: ファイル名。 
### 4. 変更内容を保存する
- `git commit -m "Initial commit"`で初回コミット
- 変更内容をスナップショット（完全な記録）として、 .git/objects フォルダに保存する
- .git/objects/はバイナリファイルだが、`git cat-file`で中身を確認できる(`git cat-file`の使い方は後述。単に`git cat-file`を実行すると内部オブジェクト（コミット、ブロブ、ツリーなど）が全部表示されて大変なことになる)
- 保存された変更は`git log`で確認できる
```git log の実行結果
commit f331b1c27868559c6527d9fb16d6e61c7fbea439 (HEAD -> main, origin/main)
Author: zumomo_zzZ <kuragekyatto@gmail.com>
Date:   Wed Jan 15 14:27:56 2025 +0900
```
### 5. リモートリポジトリにプッシュする
- `git remote add origin リモートリポジトリのURL`
- 「origin」はリモートリポジトリのデフォルト名みたいなもの
- `git push -u origin main`。「-u」は「今後、このブランチ（main）とリモートのoriginをセットで扱う」って意味

---
### 以下補足っていうかChatGPTの説明貼り付け！
---
## git cat-fileの使い方
### まず、`git cat-file` コマンドの基本
このコマンドは、Gitの **内部オブジェクト**（コミット、ブロブ、ツリーなど）の内容や情報を確認するためのもの。使い方はいくつかあるけど、ここでは実際に中身を見るために重要なオプションを確認していく。
### 主なオプション
1. **`git cat-file -t <オブジェクトハッシュ>`**  
   - **用途**: オブジェクトの「種類」を確認（commit, blob, tree, tagのどれか）。  
   - **例**: `git cat-file -t 067352b83e6425ba96cfff1e950f3c80b8c01868`  
     → 出力: `blob` など

2. **`git cat-file -p <オブジェクトハッシュ>`**  
   - **用途**: オブジェクトの中身を「きれいに表示」する。  
   - **例**: `git cat-file -p 067352b83e6425ba96cfff1e950f3c80b8c01868`  
     → コミットの場合はメッセージや親コミットが見えるし、ブロブ（ファイルデータ）の場合はソースコードが見える

3. **`git cat-file -s <オブジェクトハッシュ>`**  
   - **用途**: オブジェクトのサイズ（バイト単位）を確認する。  
   - **例**: `git cat-file -s 067352b83e6425ba96cfff1e950f3c80b8c01868`  
     → 出力: `12345`（バイト数）

---

### 実践例
1. **コミットの中身を見てみる**：
   ```bash
   git log --oneline
   ```
   → コミットハッシュの短縮版が出てくる（例: `abc123`）。  
   そのハッシュをフルにして使うか、`git rev-parse abc123` でフルハッシュを取ってから：
   ```bash
   git cat-file -p <フルハッシュ>
   ```
   → コミットメッセージや親コミット、ツリー情報が見える！

2. **ファイル（ブロブ）の中身を見てみる**：
   - `git ls-files --stage` でファイルのハッシュを確認
   - `git cat-file -p <ファイルのハッシュ>` を実行
   → 実際のソースコードや内容が表示される。

---

### ちょっとした「何が起きてるかわかる」ポイント
- **`-t`**: オブジェクトが何なのか（commit/tree/blob）
- **`-p`**: 実際の中身を見る
- **`-s`**: サイズを見る
- Gitはすべて「ハッシュ」で管理している！


---
オブジェクトハッシュの探し方
---
**オブジェクトハッシュ**がわからないと `git cat-file` を実行できない。  
だから、まずは「どのハッシュを使うべきか」を探る手順を知る必要がある。
Gitのオブジェクトハッシュはリポジトリ内にいっぱいあるけど、以下のコマンドで手がかりを見つけられる。

---

#### 1. **コミットのハッシュを取得する**
```bash
git log --oneline
```
これで、最近のコミットの短縮版ハッシュが一覧表示される。例：
```
abc123 初回コミット
def456 更新しました！
```
これをフルハッシュにしたければ、以下のコマンドを使う：
```bash
git rev-parse abc123
```
→ 結果：`abc123def4567890abcdef1234567890abcdef12`

これが **コミットオブジェクト** のハッシュ。  
**使い方例**：`git cat-file -t abc123def4567890abcdef1234567890abcdef12`

---

#### 2. **ツリーオブジェクトのハッシュを取得する**
コミットは「ツリーオブジェクト」とリンクしている。コミットの中身を確認すればツリーのハッシュが見える：
```bash
git cat-file -p <コミットのハッシュ>
```
例：
```
tree 1234567890abcdef1234567890abcdef12345678
author ズモモ <zuzumomo@example.com> 1674102200 +0900
committer ズモモ <zuzumomo@example.com> 1674102200 +0900

初回コミット
```
ここで `tree` に続いてるハッシュがツリーオブジェクトのハッシュ。

---

#### 3. **ファイル（ブロブオブジェクト）のハッシュを取得する**
ツリーオブジェクトの中にはファイルが入ってる。以下のコマンドで確認：
```bash
git ls-files --stage
```
例：
```
100644 067352b83e6425ba96cfff1e950f3c80b8c01868 0 chat-history-2025-01-15.zip
```
この `067352b83e6425ba96cfff1e950f3c80b8c01868` が、**ファイル（ブロブオブジェクト）のハッシュ** 。

---

### ハッシュを見つけるフローまとめ
1. `git log --oneline` → コミットのハッシュを探す
2. `git cat-file -p <コミットハッシュ>` → ツリーのハッシュを探す
3. `git ls-files --stage` または `git cat-file -p <ツリーハッシュ>` → ファイルのハッシュを探す

---

### コツ
Gitオブジェクトはすべて**リンクでつながってる**から、コミットから始めて順々にたどることで、ツリーやブロブのハッシュにアクセスできる！  
だから、「まずコミットのハッシュを見つける」ってのがスタート地点！