GitHubとは、プログラムのコードを書いたり、それを共有したり、改良したりするためのオンラインのプラットフォーム。具体的に説明すると、GitHubとはGitというバージョン管理システムを基にしたオンラインのバージョン管理サービスです。
参考 構成管理とは?
バージョン管理システムを一言で言うとあなたが作成したファイルの変更履歴を記録・管理するシステムのこと。Gitはその1つで、特にプログラムコードの管理に優れたツールです。
GitHubはこのGitをインターネット上で利用できる形にしたもので、多くの開発者がGitHubを通じて、コードを保存し、他の人と共有し、一緒に改良していくためのオンラインサービスです。
GitHubがなぜ世界中で利用されているか?その重要性を簡単に整理しておきます。
以上のような理由から、GitHubは世界中の開発者や企業に利用され、ソフトウェア開発の中心的なツールとなっています。
この記事では、GitHubの基本的な概念とその使い方について、初心者の方でも理解できるように説明していきます。
プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。
「Githubとは何か」をわかりやすく
GitHubとは、ソフトウェア開発者が「①自分のコードを他の開発者と共有」し、共同でプロジェクトを進行するためのプラットフォームであり、「②そのコードのバージョン管理も可能」なオンラインサービスです。
基本的には無料で利用できます。(後述するプライベートリポジトリを作る場合や企業向け機能を使用する場合には有料プランで利用する必要があります。)
GitHubは全世界の開発者に利用されており、その数は5000万人を超えると言われています(2023年6月現在)。また、多数のオープンソースプロジェクトがGitHub上で管理・開発されており、この結果誰でも簡単にコードを共有したり、他人のコードを改善したり、新しいプロジェクトに参加したりすることが可能な状況になっています。
GitHubを使うこで、自分が開発したソフトウェアやライブラリを公開し他の人々に利用してもらうこともできるという点で、プログラマーを目指す方であれば当たり前に利用できないと恥ずかしいツールの1つです。
バージョン管理システム(VCS)とは何か
そもそもバージョン管理システムって何?という点をご説明しておきます。
バージョン管理システムとは、ファイルの変更履歴を記録し、過去のある時点の状態を再現したり、変更内容を比較したりすることができるシステムのことを指します。
特にソフトウェア開発では、何百、何千ものコードファイルが存在し、それらが頻繁に更新されるため、どのバージョンが最新で、どのバージョンにどのような変更が加えられたかを把握することが重要となります。
GitとGithubの違い
「Git」と「GitHub」の違いについて説明します。
簡単に言うと、「Git」はバージョン管理システムそのものであり、「GitHub」はそのGitを利用して、コードの共有やバージョン管理を行うためのプラットフォームです。
Gitは、開発者がローカル環境でコードの変更履歴を管理するためのツール。これにより複数の開発者が同時に異なる部分のコードを編集することが可能になります。
その一方で、GitHubはこのGitのシステムをWeb上で利用できるようにしたもので、開発者同士が容易にコードを共有し、協力して作業を進めることを可能にするという役割を担います。
GitHubの基本
GitHubを理解するために必要な基本的な概念を説明します。
4つの重要な要素、レポジトリ、ブランチ、コミット、そしてプルリクエストについて説明します。
用語 | 説明 |
---|---|
レポジトリ | プロジェクトに関連するすべてのファイルとその履歴が格納される場所。 プロジェクト全体の情報を一元管理するためのもの。 |
ブランチ | レポジトリの特定のバージョンを示し、独立した作業空間として機能するもの。 基となるブランチの状態からコピーされ、そこから新たな作業が開始される。 |
コミット | ブランチに対する一連の変更を記録する行為。 作業の進捗を保存し、特定の時点に戻るためのマーカーとなります。 |
プルリクエスト | 1つのブランチから別のブランチへの変更を統合するためのリクエスト。 コードレビューと変更の討議を行うためのツールでもあります。 |
まずは、GitHubを理解するための根幹となるリポジトリとは何か?について解説をします。
GitHub:リポジトリ(リモート/ローカル)
まずはじめに結論からお伝えします。
Gitにおける「リポジトリ」とは、プロジェクトのファイルやその変更履歴を管理する場所のことを指します。これらのリポジトリは、主に「リモートリポジトリ」と「ローカルリポジトリ」の2つの形で存在します。
Gitにおける「リポジトリ」は、単に言うと、あなたのプロジェクトのすべてが保存されている場所です(プロジェクトの全てのファイルと、それらのバージョン履歴を保持)。この文脈で説明すると、リポジトリはプロジェクトのソースコード、ドキュメント、その他関連ファイルの変更履歴を追跡し、管理するためのデータベースのようなものと考えることができます。
リポジトリにはコードファイルだけでなく、画像、PDF、データベース、あらゆるものを保管することができます。同時にリポジトリ内では、ファイルやディレクトリの追加、変更、削除などの操作履歴が全て記録されています。
リモートリポジトリとは(Remote Repository)
リモートリポジトリはインターネット上に存在し、複数の人がアクセスできる共有のリポジトリです。ある意味、ここがプロジェクト全体のすべての情報が詰まっている場所で、今のソースコードの情報や履歴が一元管理されてるということ。
すべてはこのリモートリポジトリで管理されている!と頭に入れておきましょう。
詳しくはこの後で解説していきますが、GitHubはこのリモートリポジトリをホストするサービスの1つで、開発者たちはGitHub上にリモートリポジトリを作成し、ローカルリポジトリのコードをプッシュ(アップロード)することで、他の開発者と共有する仕組みという流れになります。
ローカルリポジトリとは(Local Repository)
一方、ローカルリポジトリとは、リモートリポジトリのコピーを開発者の自身のマシン上に作成したものです。
このリポジトリは各開発者の個別の作業スペースとなり、他の開発者から独立して作業を進めることができます。
開発者はこのローカルリポジトリでコードの編集やデバッグなどの作業を行い、その作業結果をコミットという形で保存します。
リポジトリのクローン(git clone)
「クローン」とは、リモートリポジトリの内容をまるごとコピーして、ローカルマシン上に新しくローカルリポジトリを作成することを指します。この操作により、リモートリポジトリに含まれるすべてのファイル、ディレクトリ、ブランチ、タグ、コミット履歴などがローカルリポジトリに複製されます。
ポイント クローンの主な利点
- 完全なバックアップ
- リモートリポジトリの完全なコピーを取得するため、オフラインで作業を続けることができます。
- 独立した作業環境
- クローンによって作成されたローカルリポジトリであれば、リモートリポジトリに影響を与えることなく、自由にコードの編集や実験を行うことができます。
- 協力作業の容易化
- クローンを使用することで、他の開発者が作成したコードを簡単に取得し、プロジェクトに貢献することができます。
クローンを行うには、Gitがインストールされたコマンドラインインターフェイス(CLI)で以下のコマンドを使用します。
ポイント クローンの方法
git clone [リモートリポジトリのURL]
[リモートリポジトリのURL]
にはクローンしたいリポジトリのアドレスを指定します。例えば、GitHub上のリポジトリをクローンする場合、そのリポジトリのページに表示されているHTTPSまたはSSH形式のURLを使用します。
git clone https://github.com/ユーザー名/リポジトリ名.git
このコマンドを実行すると、指定されたリポジトリの内容が現在のディレクトリに「リポジトリ名」のフォルダとしてダウンロードされ、ローカルリポジトリが作成されます。
リポジトリのクローンは、Gitにおける基本的な操作の1つで、プロジェクトのローカルコピーを作成して作業を開始するための最初のステップになります。ただし、クローン操作はリポジトリの初回取得時にのみ必要で、その後の更新をローカルリポジトリに取り込むには、git pull
コマンドを使用します。
リモートリポジトリの最新化(git pull)
git pull
コマンドは、リモートリポジトリから最新の変更を取得して、それを自分のローカルリポジトリ(自分のコンピュータ上にクローンしたリポジトリ)に統合するために使用されます。このコマンドは、リモートリポジトリの最新の状態をローカルリポジトリに同期させる際に非常に便利です。
ポイント git pull
コマンドの実行例
git pull origin master
origin
はリモートリポジトリの名前(通常はクローン作成時にデフォルトで設定される名前)で、master
は取得したいブランチの名前(master
ブランチは多くのプロジェクトで使用される主要なブランチですが、main
という名前の場合もあります)。
このgit pull
コマンドを実行すると、Gitはまずリモートリポジトリから指定されたブランチの最新の変更(コミット)をローカルリポジトリにダウンロードします(これを「フェッチ」と言います)。次に、ダウンロードした最新の変更を現在ローカルで作業しているブランチに自動的に「マージ」(統合)します。
ローカルリポジトリ上でのコミット
ここで、ローカルリポジトリ上でソースコードを編集した場合に、その編集結果がどのようにローカルリポジトリ上に反映されていくのか?を説明しておきます。
- ステップ1ソースコードの編集
ローカルリポジトリ内の編集したいファイルを開き、編集が完了したらファイルを保存する。
- ステップ2変更のステージング
コマンドライン(ターミナルやGit Bash)を使用して以下の操作を行います。
- 1.変更の確認
- コマンドラインで、編集されたリポジトリのディレクトリに移動。
git status
コマンドを実行して、どのファイルが変更されたかを確認。変更されたファイルは「変更されたファイル」としてリストアップされる。
- 2.変更のステージング
- 変更をステージングするには、
git add ファイル名
コマンドを使用。すべての変更をステージングしたい場合は、git add .
を実行します。
- 変更をステージングするには、
- 1.変更の確認
- ステップ3コミットの作成
ステージングされた変更に対して、
git commit -m "コミットメッセージ"
コマンドを実行。「コミットメッセージ」は、行った変更の説明などを記述する。
ステージングエリア(インデックス)は、次にコミットする変更を一時的に格納する場所です。git add
コマンドによって変更をステージングすることで、これらの変更が次のコミットに含まれるようになります。
コミットは、ある時点でのプロジェクトの状態を記録したもので、ステージングされた変更がローカルリポジトリの履歴に追加されます。コミットには一意のID(ハッシュ値)が割り当てられ、誰がいつ変更を行ったかの情報も記録されます。
このプロセスを通じてローカルリポジトリの変更を管理し、プロジェクトの履歴を正確に追跡することができます。そして、最終的にはgit push
コマンドを使用して、これらのローカルの変更をリモートリポジトリに反映させるような流れで進んでいきます。
ローカルリポジトリとリモートリポジトリの連携(push)
開発者がローカルリポジトリで一通りの作業を終えて結果を保存(=コミット)しただけでは、まだリモートリポジトリにはその変更が反映されていません。変更結果をリモートリポジトリに反映させるためには、ローカルリポジトリからリモートリポジトリへ変更を"プッシュ"という作業を行います。
- ステップ1コマンドラインを開くイトル
コマンドラインインターフェイス(CLI)を開く。Windowsの場合はCmdやPowerShell、macOSやLinuxの場合はTerminalを使用。
- ステップ2ローカルリポジトリのディレクトリに移動
コマンドラインで、変更をコミットしたローカルリポジトリがあるディレクトリに移動。
cd /path/to/your/repository
- ステップ3リモートリポジトリにpush
以下のコマンドを実行し、ローカルリポジトリの変更をリモートリポジトリにpushする。
git push origin ブランチ名
ここで、「origin」はリモートリポジトリの名前(デフォルトでの呼び名)。「ブランチ名」は変更をpushしたいブランチの名前です。たとえば、
master
やmain
ブランチにpushする場合は、以下のようになります。git push origin master
これらのステップを踏むことで、ローカルリポジトリの変更をリモートリポジトリに反映させることができます。これにより、プロジェクトの最新の状態がリモートリポジトリに保持され、チーム内での共有が可能になります。
このローカルリポジトリとリモートリポジトリとの間で変更をやり取りすることにより、多くの開発者が一つのプロジェクトに協力して作業を進めることが可能になるという仕組みです。
GitHub:ブランチとマージ
レポジトリの説明の中で出てきたブランチとマージについてご説明します。
まず始めに結論から。①「ブランチ」は作業の流れを分岐させ、新たな開発を行うための枠組みであり、②「マージ」はそれらの分岐した作業を再度統合するための操作です。これらは、多人数での開発や複数の作業を並行して進めるための重要な機能です。
ブランチとは(Branch)
ブランチは、プロジェクトを進行させながら新たな開発を行うための道筋を示すものと考えることができます。
プロジェクト進行中に新しい機能を追加したい、またはバグを修正したいといった場合、そのままメインのコードに手を加えると他の部分に影響を及ぼす可能性があります。ここで役立つのがブランチです。
ブランチを作成すると、現在の開発の状態を元にした新たな作業スペースが作られます。これにより、メインのコード(通常はmaster
またはmain
ブランチと呼ばれます)を触らずに新しい機能の開発やバグの修正を行うことができます。
マージとは(Merge)
ブランチで分岐した作業を元の開発の流れに戻す(統合する)ための操作がマージです。開発者がブランチ上で行った作業の結果をmain
ブランチにマージすることで、新たな機能や改善がプロジェクト全体に反映されます。
もし、変更した個所が他のブランチと重複するような場合は、自動的にマージは行われず監理者の手によってどの変更をマージするか?を選択する必要があります。このような仕組みで、元の資源を保持しながら安全に変更をマージしていくことが可能になるのです。
ブランチとマージは、開発作業を効率よく、安全に進めるための重要なツールです。
ブランチを利用することで、異なる作業を並行して進めることができマージによってそれらの作業結果をスムーズに統合することができます。特にチームでの開発ではこのブランチとマージの概念が重要となり、1人ひとりの開発者が自由に作業を進めつつ、その結果を円滑に統合し、1つの製品を作り上げるために利用されます。
ブランチの概念をもう少し分かりやすく丁寧に理解したい!という方は以下の記事を確認してみてください。
Github:コミットとプッシュ
コミットとプッシュという基本的な用語について解説します。
①コミットとは開発者が行った変更をローカルリポジトリに保存する操作で、②プッシュはそれらの変更をリモートリポジトリに反映させる操作です。これらの機能を理解することで、個人やチームでの開発作業がスムーズに進むようになります。
コミットとは(Commit)
コミットとは、Gitにおいて行った変更を保存する操作です。ファイルの追加や修正、削除など、あなたが行った全ての変更を「スナップショット」として保存します。コミットはそれぞれ固有のIDを持ち、このIDによって特定の変更を指定したり、過去の状態に戻したりすることができます。
図8:コミットとは
コミットを行う際には、その変更に関するメッセージを記述します。これにより、あとからそのコミットが何を含んでいるのかを理解するのが容易になります。
プッシュとは(Push)
コミットはあくまでローカルリポジトリ(つまりあなたのマシン上)に対して行われる操作で、これにより行った変更は他の開発者からは見ることができません。
開発者が行った変更を他の人と共有するためには、それらの変更をリモートリポジトリに反映させる必要があります。
これを行う操作がプッシュです。プッシュを行うと、ローカルリポジトリに行われたコミットがリモートリポジトリに反映され、これにより他の開発者もその変更を見ることができるようになります。
コミットとプッシュは、開発作業の効率と共有性を保つための重要なツールです。コミットを利用すれば、作業の進捗を定期的に保存し、必要に応じて過去の状態に戻すことができます。また、プッシュによってこれらの変更を他の開発者と共有し、一緒に作業を進めることができます。
これらの操作は、一人での開発はもちろん、チームでの開発においても非常に重要で、開発者がそれぞれの作業を進めつつ、その結果を共有し、一つの製品を作り上げるために利用されます。
GitHub:プルリクエストとは(Pull Request, PR)
最後にプルリクエストという用語について解説します。
結論から言うと、プルリクエストとは自身が行った変更を他の開発者にレビューしてもらい、問題がなければメインのブランチに統合(マージ)するためのリクエストのこと。
このリクエストが承認されれば、あなたが行った変更はメインのブランチに統合され、プロジェクト全体で反映されるわけです。
一般的な開発フローでは、新たな機能の開発やバグの修正は個別のブランチで行われます。そのブランチでの作業が終了したら、その変更をメインのブランチに取り込む必要があります。しかし、直接統合するのではなく、他の開発者にレビューしてもらうことで、問題がないか確認するのが一般的。
ここで行うのがプルリクエストです。プルリクエストを行うことで、不要な変更がマージされることを防ぐことが可能になります。
まとめ:GitとGitHubの基本概念
概念 | 説明 |
---|---|
リポジトリ (リモート/ローカル) | プロジェクトのすべてのファイルと変更履歴を保管する場所。 リモートリポジトリはオンライン上で共有されるため、チーム全体での共有に使用される。 ローカルリポジトリは個々の開発者のマシン上に存在し、個々の開発作業が行われます。 |
ブランチとマージ | ブランチはプロジェクトの異なるバージョンを作成するためのツール。 1つのブランチ上での変更は他のブランチに影響を与えない。 マージは、一つのブランチで行われた変更を他のブランチに統合する操作。 |
コミットとプッシュ | コミットはローカルリポジトリに対して行われる操作で、行った変更を保存すること。 プッシュはローカルリポジトリに行われたコミットをリモートリポジトリに反映させる操作。 |
プルリクエスト | 自身が行った変更を他の開癠者にレビューしてもらい、問題がなければメインのブランチに統合(マージ)するためのリクエスト。 |