Skip to content

Gitについて

Toshiki Wata edited this page Dec 13, 2023 · 19 revisions

Gitの基礎知識

Gitはバージョン管理システム(VCS:Version Control System)と呼ばれるものです。

1. バージョン管理とは?

例えばtest/フォルダにindex.htmlというファイルがあったとして
何もせずに修正を加えてしまうと元の状態に戻したいときに困ります

そのため、フォルダをコピーしてtest1210/のように
バックアップを取ってから変更を加えることがあります。

これがバージョン管理です!

2. Gitを使う理由

変更履歴を残すだけであれば、日付フォルダでもなんとかなりそうです。

ではなぜGitが必要なのでしょうか?

それは他にも便利な機能がいっぱいあるからです!
一部ご紹介します。

3. 便利な機能

3.1. commit(コミット)

  • 修正をひと固まりにして保存する機能
  • 修正内容の他に、修正日時、修正した人、コミットのタイトルが含まれる
  • コミットを意味のある単位でまとめることで、コミット単位の差分を見たり、修正の取り消しが簡単にできる

3.2. diff(ディフ)

  • 修正された差分を見る機能
  • 追加された文字や削除された文字、古いファイル名や新しいファイル名をわかりやすく表示できる

3.3. merge(マージ)

  • 複数のコミットをまとめる機能
  • 同じファイルを違う人が同時に修正したときに、両者の作業内容を自動的に取り込んで反映する

4. 3段階のファイル状態

gitはローカルにあるファイルを

  • 作業ディレクトリ
    • 変更を加えた作業中のファイル群
  • ステージングエリア
    • 次のコミットに含めるファイル群
  • Gitディレクトリ
    • 変更が確定したファイル群
    • コミット完了した状態

という3つの状態に分けて管理します。

例えば、index.htmlstyle.cssを修正して同時にロゴの画像(logo.png)を変更した場合を考えます。

変更を終えた瞬間、3つのファイルは作業ディレクトリにあります。

でも、同時にコミットしてしまうと1つのコミットに2つの変更内容が混ざってしまうし、1つ1つコミットすると作業が大変でコミットログも見づらくなってしまいます。

そんな時に、まとめてコミットしたい内容をステージングエリアに一時的に保存しておけば、ファイルの入れ忘れを防げ、同じ変更内容の単位でそろえておくことができます。

コミットの手順

5. リポジトリ

5.1. そもそもリポジトリとは?

  • リポジトリ=データの保管場所という認識でひとまず問題ないです!

5.2. リポジトリの種類

リポジトリには大きく2種類あります。

  • リモートリポジトリ
    • インターネット上にあるリポジトリのこと
    • もっと言うとGitHub上にあるリポジトリのこと
  • ローカルリポジトリ
    • 自分のパソコン内にあるリポジトリのこと

この2つは重要な概念になるので覚えておいてください!

ちなみに上に書いた3段階のファイル状態ローカルリポジトリの話です。

5.3. リポジトリのイメージ

リポジトリの運用方法はいろいろあると思いますが、今回のプロジェクトでは

  1. GitHub上でリモートリポジトリを作る
  2. それぞれのパソコンにリモートリポジトリをダウンロードする(このときにローカルリポジトリになる)
  3. それぞれがローカルリポジトリに修正を加えてリモートリポジトリに反映させる
  4. 3を繰り返して完成に近づけていく

という運用になります。

できるだけ簡単な言い回しにしたかったので表現が適切じゃないかもしれないですが、こんなイメージになります!

5.4. リポジトリの操作を表すGit用語

ここで紹介する用語はGitを扱う上で必須級のものなのでぜひ覚えてください!

5.4.1. clone(クローン)

「パソコンにリモートリポジトリをダウンロードすること」を clone(クローン) といいます。

クローンの手順

5.4.2. push(プッシュ)

ローカルリポジトリに修正を加えてリモートリポジトリに反映させること」を push(プッシュ) といいます。

プッシュの手順

5.4.3. pull(プル)

プルの必要性をイメージしやすくするために次のストーリーを読んでください。

  1. あなたは数人のチームでWeb製作をすることにしました。
  2. 代表1人がGitHub上にリモートリポジトリを作成しました。
  3. メンバーそれぞれがクローンしてローカルリポジトリを作りました。
  4. あるメンバーが修正をコミットプッシュしてリモートリポジトリが更新されました。
  5. しかしその修正はあなたのローカルリポジトリに反映されません。

ここで、「リモートリポジトリローカルリポジトリに反映させる」必要があります。

これをプルといいます。

プルの手順

6. conflict(コンフリクト)

ここもイメージしやすくするために次のストーリーで考えましょう。

A君はGitHub上にリポジトリを作成して、ファイルを追加しました。

A君とB君はこれをクローンして、それぞれが別の更新作業を行います。

リモートリポジトリのファイル

<p>おはよう</p>

先にA君が更新作業を終えてコミット・プッシュしました。

A君の更新内容

- <p>おはよう</p>
+ <p>こんにちは</p>

つづいてB君が更新を終えてコミット・プッシュをしました。

B君の更新内容

- <p>おはよう</p>
+ <h2>おはよう</h2>

ここでコンフリクトが発生しました!

一般的にコンフリクトが発生した時は、後からコミットした人が解消作業します。

このプロジェクトでもそのように進めようと思いますので、コンフリクトが発生した時はここを見ながら落ち着いて解消作業を進めてください!

7. branch(ブランチ)

例えば、ヘッダーとサイドメニューを作りたいときに

  • A君がヘッダー
  • B君がサイドメニュー

のような割り振りであればブランチを意識せず開発を進めることもできそうです。

一方で

  • A君とB君がヘッダー
  • C君とD君がサイドメニュー

のような割り振りであれば A君とB君用の作業場所、C君とD君用の作業場所を分けて開発したいですよね!

それを一つのリポジトリ内で実現できる機能ブランチです!

7.1. 余談

1つ目の割り振り方でもブランチをわけることがあります。

例えば常にmainブランチをリリースしているコードの状態にして置きたい場合です。

そうすることでソースコードの管理がしやすくなるので、
アップデート機能は新規ブランチで作業して実際にリリースする時にmainに反映させます。

7.2. Pull Request(プルリクエスト)

その名の通り「プルしてください」という要求をすることです!

分岐させたブランチは最終的にmainブランチに統合しないといけないので、
マージしたいときはorigin/mainにプルリクエストを送ります。