Git初心者ガイド：ステージングエリア、ワークツリー、ローカルリポジトリ、リモートリポジトリの全て

# 1.はじめに
ジョブカン事業部のアドベントカレンダー12日目になりました！

https://qiita.com/advent-calendar/2024/jobcan

どうも、ジュニアエンジニアのあいすぱと申します。

共同開発をするうえでGitなどのバージョン管理ツールはとても便利ですよね！
私も入社してからGitを使うことになったのですが、気を付けていても**事故ってしまったり**、**予期せぬミスやうまく動作しないこと**が多々ありました。。

そこで、今回は同じGit初心者の方に向けて
**大まかな仕組み**と、**リポジトリ作成・参加～pushするまで**にどんなことをしているのかについて自分なりに調べたことをまとめてみました！

Gitを使い始めたひと、どのコマンドが何をしているのかピンと来ていない人の参考になれば幸いです。

# 2.Gitの大まかな仕組み
この章では、Gitがどのようにバージョン管理を行っているのかを記載していきます。

2.1.リモートとローカル
2.2.ローカルリポジトリを利用するとどうなる
2.3.ローカル環境の3つのエリア
2.4.具体的なコマンドでは何をしているのか

もし読んでいってピンと来なくても気にせず読み進めて大丈夫です！
「2.4.具体的なコマンドでは何をしているのか」を読むときの補助や必要に応じて都度読み返してみてください。

## 2.1.リモートとローカル
まずGitでは、複数人で同じソースコードを編集できるようにするため、**リモートリポジトリ(共有のソースコード置き場)**　から **ローカルリポジトリ(自分のPC)** にコードを複製しています。

ローカルリポジトリとリモートリポジトリは、例えば、オフラインで遊べる（スマホにデータがあるタイプ）スマホゲームと通信環境下ならいろんな端末で遊べる（アプリの提供元がデータを管理してる）スマホゲームみたいな感じですね！

そして、それを編集し再びリモートリポジトリに変更を反映することで開発を進めています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942143/64be4d96-3ae8-1881-01c7-41204790e4d0.png)


## 2.2.ローカルリポジトリを利用すると
この節では、**ローカルリポジトリ**（以下、リポジトリ）**が作成されるときをより分解して説明**していきます！

プロジェクトや個人で開発をするとき、プロジェクトのソースコードをコピーしてきたり、自分でリポジトリを作成したりすると思います。

この「リポジトリが作成される」とは、もう少し厳密にいうと、**リポジトリが作成されるのに加えて「指定されたフォルダをGitの管理下に置くための初期設定をしている」** と言えます。

この初期設定では、
1.指定フォルダをGitの管理下にすること
2.ファイルの編集用エリアの作成（ワークツリー）
3.変更したファイルを一時保存するためのエリアの作成（ステージングエリア）
4.バージョン管理を行うためのリポジトリの作成（ローカルリポジトリ）
が行われています。

:::note info
例えば、git initコマンドを利用した場合、この初期設定が行われます。その時指定したディレクトリに「.git」の隠しフォルダが作成されます。このフォルダに「1.指定フォルダをGitの管理下にすること」の指定したフォルダを監視する機能が格納されています。
:::

各エリアについては次節で詳しく記載していくので、今は　ふーん・。・　くらいで大丈夫です。

## 2.3.ローカル環境の3つのエリア
前節でもお伝えした通り、リポジトリを作成すると3つのエリアが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942143/fa61cd6d-cbd9-0010-e813-3cd67480887c.png)
それでは、各エリアについて詳しく見ていきましょう！

#### ワークツリー
ワークツリーとはファイルの編集を行うスペースとして準備されます。つまり、**VSCodeなどで編集しているのはこのワークツリーの部分**なんですね。

:::note warn
注意：ファイルの新規作成時はGitの管理から外れています。Gitの管理下にあるフォルダ内のファイルではありますが、新規作成されたファイルをGitの管理下にするためには「ステージングエリアに加える」必要があります。
:::

#### ステージングエリア
ステージングエリアはワークツリーで編集したファイルを**一時保存する**ためのエリアです。
Gitではワークツリーでの編集は、一回ステージングエリアを通してリポジトリに登録されています。

#### ローカルリポジトリ
ローカルリポジトリは、**プロジェクトのすべてのファイルとその変更履歴を保存**します。これによって過去のバージョンに戻ったり、変更内容を確認したりすることができています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942143/a1a23778-9b92-a762-1b08-e68db9aada7b.png)
つまり、VSCodeなどで編集したファイルは
ワークツリー→ステージングエリア→ローカルリポジトリという流れで記録されているんですね！

ワークツリーとローカルリポジトリの間にステージングエリアがあることで、**複数ファイルに散らばっている複数箇所の変更をまとめてローカルリポジトリに登録**しやすくなっていることがわかると思います。

:::note info
このような仕組みのおかげで、複数の機能を同時開発していても機能ごとにまとめてリポジトリに登録を行うことが可能になります。
:::

## 2.4.具体的なコマンドでは何をしているのか
では具体的にプロジェクトにアサインされた際の
「リモートリポジトリからローカルリポジトリにファイルをコピーしてくるところから、作業をして、それをリモートリポジトリに登録する」までを見ていきましょう。

具体的には
* git clone
* git add
* git commit
* git push
についてみていきましょう！

さっそくですが図で示すと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942143/40eae33a-af40-3bee-51b1-9a0ad406c075.png)

こんな感じになっています。

#### ➀git clone
既に動いているプロジェクトにアサインされた際、ほとんどの場合最初にGitをコピーするところから始まります。
「git clone リポジトリURL 保存先ディレクトリ」でクローンすることができます。リモートリポジトリからローカルリ環境にソースコードがコピーされ、各エリアが作成されます。

#### ➁git add
作業を行い修正が完了するとステージングエリアに変更を保存します。この時に、ある程度の作業単位でファイルを保存しておけ、ファイルの選別を行えるのが、ステージングエリアがあるメリットでした。

#### ➂git commit
git addでステージングエリアに移ったところで、その内容をローカルリポジトリに追加していきます。コミット時、何を変更したのかやなぜしたのかをコメントを付けて残す必要があります。

#### ➃git push
最後に「git push」コマンドでリモートリポジトリへと変更が記録されます。

以上が、リポジトリをしてから変更をリモートリポジトリに反映するまででした。

# 3.おわりに
ここまで読んで下さり、ありがとうございます！

Gitの事故は、思いがけず大変なことになることもあるので**初めに何をしているかの大まかなイメージ**がつかめると、回避策や解決策も考えやすいかと思います。

もし今回出てきたコマンドがよくわからなかったという方は、以下の本を参考にしてみてください。とても分かりやすいことは保証します！（体験談）
- [ わかばちゃんと学ぶ Git使い方入門](https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-%E3%82%8F%E3%81%8B%E3%81%B0%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E5%AD%A6%E3%81%B6-Git%E4%BD%BF%E3%81%84%E6%96%B9%E5%85%A5%E9%96%80%E3%80%88GitHub%E3%80%81SourceTree%E3%80%81%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E6%93%8D%E4%BD%9C%E5%AF%BE%E5%BF%9C%E3%80%89-%E6%B9%8A%E5%B7%9D-%E3%81%82%E3%81%84/dp/4863543433)

皆さんの開発の一助になれば幸いです。

## 参考文献
- [バージョン管理（Part1～Part.11）【Git編（Part.5）】｜ 「Gitが管理するフォルダ」と「3つエリア」の概要 ](https://howahowablog.com/git-part5-alt/)
- [【Git超初心者入門】Gitの基本的な知識をみにつけよう編
](https://www.sidethree.co.jp/blog/memo/202304-2.html)

## 採用情報
DONUTSでは新卒中途問わず積極的に採用活動を行っています。
新卒やインターンの募集もあるので、少しでもいいなと思っていただけたら是非ご覧ください :bow:

https://www.donuts.ne.jp/recruit/

https://recruit.jobcan.jp/donuts/show/B001/1396297