【備忘録】Git（Lab）をCUIで一週間で使えるようになるまで（単語編）

# はじめに
　本投稿はGitどころかプログラミングも初心者であった私がGitをCUIで使えるようになった経験をもとに作成しております。そのため言葉の解釈や定義が若干違うところはあるかと思います。しかし、今回はあくまで初心者の方が読んだ時に各用語を理解するための説明となっておりますのでその点ご了承下さい。（要はイメージを分かりやすくするためにかみ砕いて作ってます）

# そもそもGitとは？
　バージョン管理システムの一つです。Git以外の代表的なバージョン管理システムとしてはsub version SVMなどがあげられます。

　じゃあGitは何が特徴的なのかというと「branch（ブランチ）」という機能を使用することです。他のバージョン管理システムとの違いとか、この辺については今のところはあまり気にしなくてもいいかと思いますので、そもそもGitとはなんぞやって気になる方はご自分で調べてみてください！

# ブランチ
　文字通り **枝** です。下の画像のようにある一本の大きな枝（マスターブランチ、GitLab上ではmainブランチ表記が多い）から枝分かれして出来ていくイメージ。枝の付け根の部分（生やした時点）では生やした元（今回の場合main）と同じ構成（ファイルなどが）になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698908/a8b5727a-f9c7-4abb-bd89-93515828a3cb.png)

# コミット
　ちょーーーーーーーーーーーーーーーーーーーーーー簡単に言うとセーブのこと。厳密にいうと「変更の確定」になる。

　Gitを知り尽くしている偉い先生方の言う「まずはコミット！！！」っていうのはこれのことです。乙女ゲーとかギャルゲーで言うと分岐発生のたびにコミット（セーブ）しておけばその地点にいつでも戻れるので条件全踏み攻略が容易になります。（もっといい例えはなかったのか...）

　これ大事なのは大体のゲームは保持できるセーブデータ（コミットログ）の数に限りがあったりするのですがGitではございません（確か）。なので手戻り発生時にできるだけ戻った後の作業減らすためにいっぱいしといて損はない！ってことだと思います。

# プッシュ
　リポジトリ間を跨いで行うコミットみたいなもの。厳密には違うけど最初はこれぐらいの認識でもいいかと…（じゃないと私はパニックになりました）。イメージで分かりやすいのは変更した点を「挿げ替える」。

　以下の画像の場合、元々リモート上では青い円柱だったものをローカルで一部をオレンジに変更。その変更点をローカルからリモートに押し出して（push）してリモート上の青い円柱を一部オレンジに「挿げ替えて」保存しておく。（ってイメージで私は解決しました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698908/688ff35b-56d9-4cf0-3cfb-fb6e65905903.png)

# プル
　リポジトリ間を跨いで行う情報の更新みたいなもの。これも厳密には違うけど最初はこれぐらいの認識でもいいかと…（じゃないと私はパニック（2回目）になりました）。

　以下の画像で言うと最初にローカルブランチを作った時点では青い円柱でした。それをリモートで誰かが更新を入れたので一部オレンジの円柱になりました。この時、関係ない場所ならまだいいのですが、関係ありまくりな場所が更新されている可能性だってあります。この時ローカルでリモートではオレンジになった変更無視して色々作った結果、オレンジの部分との整合性が合わない！なんてことが起こったりします。（そしてそれがコンフリクトに繋がったり、コーディングやファイル構成の考え直しになったり...）

　それを防ぐために自分の使っているブランチが変更されたらリモートから新しい情報を引っ張ってきて（pull）、変更箇所を「挿げ替える」ことでローカルブランチの状態をリモートブランチに合わせることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698908/41fbb932-b108-9cf3-3e01-92de2b7ab2f7.png)

# コミットとプッシュとプル
　この3つが何が何だかってなる人は以下にすんごいものすごく簡略化した違いをまとめておいたので参考程度にご覧ください。
　正確な違いはもっとたくさんありますのであくまでも参考でお願いします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698908/510dfc2e-f40b-f89a-1440-dc8ff1cb923d.png)

# リポジトリ
　はい、ここで来ました初心者殺しの用語、リポジトリ。私はこいつのせいでGitの理解にとんでもなく苦しめられました...

　リポジトリとはざっくり言うとプロジェクトファイルの全ての情報（ブランチやその中のファイル構成、コミットの記録など全ての記録の塊）のこと。要は下図のような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698908/9f90ef9d-d363-c4ac-702c-40aec8d655a5.png)

　つまりGitに関わるものは全てリポジトリの下にあることになる（ってことらしいです）。

　で、ここで皆さん疑問がわくと思います。「GitLab上ではリモートブランチのHTTPSリンクから（つまりブランチから）ローカルリポジトリをクローンで作成しないっけ...?でもブランチはリポジトリの下...?　え？」

　これについてはクローンの解説と一緒に説明します。（皆様の脳内パニックお察しします。私もこいつの、本当にこいつのせいでGitの理解が最初全く進まなかったといっても過言ではありません...）

# クローン
　はい、と言うことで皆様のパニックを解消するためにまずはクローンの説明をします。

　クローンとは文字通りオンライン上にあるリポジトリをローカルへクローン（複製する）すること。本当にこれだけです。オンライン上のjavaファイルとかWebContentの中身とかそういったものを全く同じファイル構成、内容物でローカルに持ってくるだけです。

　**ただし**ここからがややこしポイントです。オンラインリポジトリ（GitLab）上にあるブランチはローカルで複製されることはない（ローカルブランチと紐づけることはできるけどクローンでは複製はされない）。どういうことかというと、ローカルにクローンを作成してもリモートにあるブランチがローカルに複製されることはないんです（厳密にいうとされていない訳ではないが見た目上はされていないように見える。この辺は今回すっ飛ばします）。

　GitLabを使用して初心者がGitを学習する際に、リポジトリとブランチがごちゃごちゃになる原因は恐らく（というかほぼ確定で）こいつなのではと思ってます。じゃあ「ここはどういう理解で筆者解決してん？」と思いますよね。私は以下の画像のように「オンラインリポジトリはブランチの下にあるもの（ローカルは逆）。でプッシュとかプルは運命の赤い糸（やかましい）で結びついているブランチを目印にして**ブランチ以外の**リポジトリを対象に行う。」と勝手に思い込んで整合性取ってました。はい、完全にパワープレーです（最後に雑ですみません）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698908/191a833e-b5a2-7f2b-ad39-43da473454c9.png)

　だってこんなんGitLab上で作業したいブランチ選択してそこからHTTPSリンク取得してクローンでローカルリポジトリ作成させるようにしてるGitLabの仕様が分かりづらいんじゃないですか！！こんなの初心者何も知らずにやったら「リモートブランチからクローン（ローカルリポジトリ作成）するんだ、へ～」ってなるじゃないですか！！そしたらローカルでリポジトリの下にブランチ作成させられるんですからもう初心者からしたらあんたそりゃもう...(以下省略)

# 最後に
　今回はGit（Lab）をCUIで一週間で使えるようになるまで（単語編）ということで、必死にかみ砕いて理解するまでの過程を備忘録として書き出しました。そのため正確には違う部分もあると思います（というか数多くある）ので気になった方は正確な理解のためにご自分で調べてみてください。

　次回はGit（Lab）をCUIで一週間で使えるようになるまで（単語編）のタイトルからお察しかもしれませんが、使えそうなコマンドラインをチートシート形式で作成する予定です。お楽しみに！
　
　それからこんな感じでプログラミング完全初心者が色々とかみ砕いて理解するまでの過程を備忘録としてこれからも定期的に投稿していきますのでよければアカウントのフォローとLGMTボタンの押下お願いします！

　それからこんな感じの記事初心者なりに必死にかみ砕いて記事にして欲しいとあれば何かしらの方法でご連絡ください！（メアドはQiita用のもの作成予定ですのでそちらが公開次第メールでも大丈夫です！）