GitHubの使い方その1

## 仕組み
![スクリーンショット 2024-01-19 11.22.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/8a8ddfff-ab35-ccf7-3c49-7cdc00788b52.png)
<dl>
  <dt>ローカルは3つのエリアに分かれている</dt>
  <dd>ワークツリー</dd>
  <dd>ステージ</dd>
  <dd>リポジトリ</dd>
</dl>

1. まず、プログラムのファイルの変更等はワークツリーで行う。
2. `git add`でそのファイルをステージに追加。
3. `git commit`でステージから(ローカル)リポジトリに追加。

## 1. Gitプロジェクトを作成する
##### 1-1. 試しに`git_tutorial`という名前でディレクトリを作成してGit管理を初期化。
```sh
 # 今いるディレクトリにgit_tutorialディレクトリを作成する
mkdir git_tutorial

# 作成したディレクトリに移動する
cd git_tutorial

# git管理をはじめる
git init
# Initialized empty Git repository in /hogehoge/git_tutorial/.git/

```
![スクリーンショット 2024-01-19 12.30.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/73bdb40a-9f9e-82c9-78fa-e9d63e9affe2.png)
試しにデスクトップを確認↓ちゃんと作成できています。
![スクリーンショット 2024-01-19 12.28.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/3dd78aa9-fd65-e924-976e-ef4216eb769f.png)

##### 1-2. 変更をステージに追加する
先ほど作成した`git_tutorial`ディレクトリにに`test.md`という名前のファイルを作成して、ステージに追加`add`します。 
* まずはファイルの作成。
```sh
# echoコマンドで出力した文字列をtest.mdファイルに追記する
echo "# ABCD" >> test.md

# 作成されたファイルを確認する
cat test.md
# git_tutorial

```
ちゃんと出来ています！
![スクリーンショット 2024-01-19 12.43.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/3504e06b-5409-81e6-2be9-256871023dff.png)

* 次にこのファイルをステージに追加。変更をステージに知らせる作業になります。
各用途ごとのコマンドは以下
```sh
# ファイルごとにステージに追加する
git add <ファイル名>

# ディレクトリごとステージに追加する
git add <ディレクトリ>

# ワークツリーの変更をすべてステージに追加する
git add .
```
### ここで変更状況の確認を一旦してみます。
現在は、ワークツリーで`test.md`という名前のファイルを作成して、ステージに追加されている状況で、まだローカルリポジトリには反映されていないはず。
そんな時は、
```sh
# 変更状況を確認する
git status
```
![スクリーンショット 2024-01-19 12.53.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/079dc2d3-794f-a9c9-3ff1-bcba312e405d.png)
まだ、下記のファイルがコミットされていないよとお知らせしてくれる。
ちなみに表示されている`git rm --cached <file>`はそのファイルを削除するコマンドになる。



##### 1-3. ローカルリポジトリにコミットする
`git commit`で、ステージに追加されているファイルをローカルリポジトリに反映させます。この作業をして初めて、プログラムの変更のスナップショットがローカルリポジトリに記録される。
```sh
git commit -m ‘最初のコミット’
# [main e21164e] ‘最初のコミット’
# 1 file changed, 1 insertion(+)
# create mode 100644 README.md
```
`-m`で、メッセージをつけてコミットできる。

### ここで先ほどと同様に、`git status`で変更状況の確認をしてみます。
![スクリーンショット 2024-01-19 13.03.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/589e35d2-5574-155a-adae-a6480262a924.png)
`nothing to commit, working tree clean` これは、変更が全てコミットされてるよとのことなのでこれでOK。

##### 1-4. ファイルの内容を修正して変更履歴を確認する
1. 先ほど作成してコミットしたファイル`test.md`に文字を追加。
1. ステージに登録する前後でワークツリー内での変更を`git diff`コマンドで確認。
1. 変更をステージに追加`git add .`
1. ステージの変更を確認する

```sh
# README.mdに変更を追加する
echo "あいうえお" >> test.md

# ワークツリーの変更を確認する
git diff

# 変更をステージに追加する
git add .

# ワークツリーの変更を確認する
git diff

# ステージの変更を確認する
git diff --staged
```
![スクリーンショット 2024-01-19 13.25.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/8b8f6241-ced1-f1ab-d5cd-d62f4b52742e.png)

+ 記号は追加された行を示していて、
@@ -1 +1,2 @@ は変更が行われた部分のコンテキストを示している。この場合、元のバージョン（-1）と新しいバージョン（+1,2）の行が変更された意味。

* ステージに追加して、もう一度`git diff`をしてみると何も表示さえれない。このことからも`git diff`はワークツリーで変更してまだステージに登録していない変更内容を表示してくれるコマンドだとわかる。
![スクリーンショット 2024-01-19 13.31.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/b108640a-6772-fe82-b741-ad14865c5838.png)
* 次に`git diff --staged`で、ステージの変更内容が表示される。先ほど登録したにようが表示される。
![スクリーンショット 2024-01-19 13.35.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/56fe99bc-26a4-bcb9-7d35-3f56a7f7fbf4.png)

##### 1-5. 変更履歴を確認する
ここまでのコミットの内容を確認したい場合は`git log`コマンドでログを確認できる。
![スクリーンショット 2024-01-19 13.45.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/267609e6-3e9a-b7f8-e787-0d99b11cdb92.png)
各用途ごとのコマンドは下記
```sh
# コミットログを確認する
git log

# コミットログを一行で表示する
git log --oneline

# ファイル単位でコミットログを確認する
git log -p index.html

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

```
##### 1-6. 削除や移動のコマンド
```sh
# ワークツリーとローカルリポジトリからファイルを削除する
git rm <ファイル名>

# ワークツリーとローカルリポジトリからディレクトリを削除する
git rm -r <ディレクトリ名>

# ローカルリポジトリからは削除するが、ワークツリーにはファイルを残したいとき
git rm --cached <ファイル名>


# ファイルの移動をおこなう。`git add`と同じようにこのコマンドでファイルの移動もできる。
git mv <旧ファイル> <新ファイル>

# ファイルを移動する
mv <旧ファイル> <新ファイル>

# 古いファイルの削除
git rm <旧ファイル>

# 新しいファイルを追加
git add <新ファイル>


```






《感想》
変更のログを記録できるのはとても便利。もしチームで開発するときは、ステージに登録の時点でチーム内で確認するのかな？