STERFIELD

2023/03/03

Gitとは何か?

Gitとは何か?

最近のシステム開発ではGitを使うことが一般的になってきました。
実際、スターフィールドでもほぼすべての案件でGitを活用しています。

しかし、Gitは覚えることが多く仕組みも複雑なため、これからGitを使い始める人にとっては高いハードルになっているでしょう。
私も初めてGitを使った時は何がなんだかさっぱりわかりませんでした。

この記事では

  • これからGitを使い始めるけど、用語とか仕組みが全然わからない!
  • 名前はなんとなく聞いたことあるけど、どんなものなのかわからない!

という人向けに、基本的な用語や仕組みを重点的に説明します。

そもそもGitとはどういうものなのか?

Gitは、ざっくり言うとファイルを「いつ・誰が・どこを・どのように」編集したかを管理するツールです。

ファイルの変更履歴を管理するツールは昔から多数存在しますが、Gitはそのツールの中でも分散型バージョン管理システムという分類にあたります。
分散型バージョン管理システムの特徴は、各自のPCにファイルを持ち、自分の好きなタイミングで編集内容を同期(プッシュやプル)できることです。
同期さえしなければ、どんなにファイルを編集したり削除しても別の作業者に影響しないというメリットがあります。
そのため、Gitは複数人で開発をする際に多く利用されています。

また、集中型バージョン管理システムというものも存在し、CVS・Subversionなどがこれに該当します。
これらは編集が完了したらすぐに作業者全員に共有されるので、誤った変更内容を登録すると作業者全員に影響を与えてしまいます。

GitとGitHubの違い

Gitを使う際に、GitHubもセットで登場してくることが多いので混同する方もいると思いますが、GitとGitHubは同じものではありません!
上記で述べたように、Gitは分散型バージョン管理システムというツールです。
一方でGitHubはGitの仕組みを利用した、開発支援をしてくれるwebサービスです。
Gitは「システム」でGitHubは「サービス」のような関係にあたります。
「メール」というシステムにおける「Gmail」というサービス、「動画」というシステムにおける「YouTube」というサービス、といったような関係と同じものです。

Gitの仕組み

Gitは以下のような構造でファイルの変更履歴を管理しています。

用語と仕組みを説明していきます。

リポジトリ(repository)

ファイルやディレクトリを保存している場所のことです。
変更履歴もリポジトリに保存しています。
リポジトリには以下の2種類があります。

リモートリポジトリ(remote repository)

主にサーバー上にあるリポジトリで、作業者全員の編集内容を共有するためのリポジトリです。
各PCで行った編集内容を取りまとめしているリポジトリです。
GitHubなどのサービスを利用することで、誰でも簡単にリモートリポジトリを作成できます。

ローカルリポジトリ(local repository)

自分のPC上にあるリポジトリです。
作業者はこのリポジトリに対して編集します。

クローン(clone)

一言で言うと「ダウンロード」に近い機能です。
リモートリポジトリから、自分のPCにローカルリポジトリを作成します。
ほとんどの場合、Gitで最初に行う作業となります。

プル(pull)

リモートリポジトリにある最新の変更内容をローカルリポジトリに反映する機能です。
クローンと少し似ている機能ですが、クローンはリモートリポジトリの内容をすべてダウンロードするのに対し、プルはローカルリポジトリに反映されていない最新の変更内容のみをダウンロードします。

フェッチ(fetch)

リモートリポジトリにある最新の変更履歴をローカルリポジトリに反映する機能です。
プルと少し似ている機能ですが、プルは変更内容も反映するのに対し、フェッチは変更履歴のみを反映します。

プッシュ(push)

一言で言うと「アップロード」に近い機能です。
ローカルリポジトリの変更内容をリモートリポジトリに反映します。
プッシュを行うことで、自分の変更内容をリモートリポジトリに反映し、別の作業者がプルすることで自分の変更を別の作業者に反映できます。

コミット(commit)

ゲームで例えると「セーブ」のような機能です。
コミットを実行することで、ファイルの変更履歴をローカルリポジトリに記録できます。
また、コミットメッセージを記入すれば、このコミットでどのような変更をしたかなどを記録できます。

コミットを行わないと編集した内容がローカルリポジトリに適用されず残り続けてしまうので、編集が完了したら忘れずにコミットしましょう!

 

さらに、コミットする前段階に「ワークツリー」と「インデックス」というものがあります。
コミットするためには、以下のような段階を踏む必要があります。

ワークツリー

現在編集中の内容を仮置きしている場所です。
ワークツリー内にある変更内容はコミットされないので、コミットしたい変更内容をインデックスに登録(add)する必要があります。

インデックス

コミットする変更内容を仮置きしている場所です。

 

なぜこのような機能があるかというと

  • この変更、まだ途中だから今はコミットしたくない
  • この変更は複数のコミットに分けたい

という時に、変更した一部分だけコミットできるようにするためです。
使い慣れるととても便利な機能なので、ワークツリーとインデックスを積極的に活用していきましょう!

ブランチ(branch)

感覚的な例えになってしまいますが、「パラレルワールド」のようなことを実現できます。
以下のように、ファイルの変更内容を分岐させて記録できます。

なぜこのような機能があるかというと、複数人で開発する際にありがちな

  • 別の人が変更した内容のせいで自分の修正した箇所が動かなくなった・・・
  • 同じファイルを複数人で編集したせいで、変更内容が消えた・・・

という問題を防ぐためにあります。

 

ブランチを作成することによって、別のブランチでコミットした内容に影響されず開発を進めることができ、作業の効率化を図ることができます。

また、自分のブランチでコミットした内容は別のブランチでは影響がないため、自分のコミットした内容に不具合があっても別の作業者に迷惑をかける心配もありません。

スターフィールドでは、機能の追加や不具合の修正などの作業単位でブランチを分けることが多いです。

複数人で開発する際は積極的にブランチを利用することをお勧めします!

マージ(merge)

2つのブランチでコミットした変更内容を統合させる機能です。
以下のように、機能追加のため切り分けたブランチで作業が完了し、メインのブランチに変更内容を適用する際にこの機能を利用します。

コンフリクト(conflict)

同じファイルの同じ箇所を変更したブランチをマージする際に起きる現象です。

コンフリクトを解消しないと、マージできません。

コンフリクトが多発すると作業効率が落ちてしまうので、できるだけコンフリクトを起こさないようにしましょう!

できるだけ他の作業者が変更している、または変更しそうなファイルはいじらないようにすればコンフリクトは抑えられます。

その他Gitの便利機能

私がよく使っているGitの機能を紹介します。

リバート(revert)

特定のコミットで変更した内容を打ち消すコミットを作成します。

この機能を使うことによって、特定のコミットの変更を無かったことにできます。

アメンド(amend)

1つ前のコミット内容とコミットメッセージを修正する機能です。

コミットし忘れたファイルがあったり、コミットメッセージに誤字があった時に修正できます。

プッシュ済みのコミットや2つ以降前のコミットには使えないので注意が必要です。

スタッシュ(stash)

コミットしていない変更内容を「一時退避」する機能です。

今の作業を中断して別の作業をする時などに、今の変更内容はとっておきたいけど一旦無かったことにしたい時に便利です。

まとめ

この記事では、Gitを活用するために必要な用語と仕組みを紹介しました。

Gitはプログラム開発などを行うエンジニアにとっては必須のスキルになりつつあるので、ぜひ身につけておきましょう!

参考にさせていただいたサイト

https://tcd-theme.com/2019/12/what-is-Git.html

https://www.i3design.jp/in-pocket/3111#GitHub%E3%81%A8%E3%81%AF%EF%BC%9F

 

Author Profile

著者近影

AIROU

プログラマーです 猫とラーメンが好きです

SHARE

合わせて読みたい