開発において「GitHub(ギットハブ)」は必須スキルとなっています。こちらの記事でGitHubの基礎知識と基本操作、そして実際の開発時の使い方について解説します。
GitとGitHubについて
GitHubとは「Git」の仕組みを使用したウェブサービスのことです。まずGitとGitHub違いについて説明します。
「Git」とは分散型バージョン管理システムのことです。バージョン管理とは分かりやすく言と、ソフトウェア・アプリケーション開発で作成したソースコードの状態を記録することでバージョンを管理します。機能追加やバグ修正を行う度に変更されるソースコードをその都度記録しておくと変更履歴を管理できることはもちろん、前の状態に戻すことも可能になります。バージョン管理システムには様々な種類がありますが、その中でもGitは「分散型」です。分散型ではないものは「集中型」で、こちらはサーバー上で管理する一つのリポジトリを複数人が接続して使います。リポジトリとは「貯蔵庫」という意味があり、ディレクトリの構造・状態やソースコード、変更履歴を格納しておく場所のことです。「分散型」はサーバー上にあるリポジトリを開発者が各自の環境に複製して作業を行います。
「GitHub」とは、Gitの仕組みを使用して開発のソースコードを保存・共有・公開ができるウェブービスです。開発者が自分の作品のソースコード等を公開したり、チーム開発ではメンバー内でコードを確認(レビュー)したりすることができます。各自の環境で開発を行い、コードを共有・履歴を管理できるため、チーム開発に最適で必須のツールです。
ここからは、GitHubの使い方について以下の順序で説明していきます。
- 使用前の基礎知識
- 基本的な操作方法
- 開発での使用の流れ
GitHubの基礎知識
GitHubを使うために必要な前提知識となるいくつかの用語について説明します。
-
リポジトリ
前項で説明したリポジトリですが、GitHubには「リモートリポジトリ」と「ローカルリポジトリ」があります。
- リモートリポジトリ リモートリポジトリとは、GitHub上で保存・管理しているリポジトリのことです。インターネット上にあるため世界中に公開されていると言えます。複数人の開発者がリモートリポジトリを元として自分の環境に複製(clone)して作業を行います。
- ローカルリポジトリ ローカルリポジトリとは、自分の環境(ローカル環境)にあるリポジトリのことです。
-
ワークツリー
ローカル環境でGitの管理下におかれた、実際に作業を行っているディレクトリのことです。
-
インデックス(ステージングエリア)
Gitではワークツリーでの作業内容をローカルリポジトリに記録(コミット)していきますが、直接記録するわけではなく中間にインデックスと呼ばれる準備領域が存在します。インデックスはステージングエリアとも呼ばれ、この領域を間に挟むことでワークツリー内で変更を行ったファイルだけをリポジトリに記録することができます。
-
コミット
ローカル環境内(ワークツリー)で行った作業内容をローカルリポジトリに記録することをコミットと呼びます。任意のタイミングでディレクトリの状態を記録することができるためバージョン管理には欠かせない仕組みです。コミットを行うと、コミットを一意に識別するため40桁のID=コミットIDが付与されます。コミットIDがあることで履歴を管理することができます。
-
プッシュ
プッシュとはローカルリポジトリの内容をリモートリポジトリに反映させることです。プッシュを行うことで、変更履歴を含む自身のローカルリポジトリの内容がリモートリポジトリにアップロードされます。
-
ブランチ
ブランチとは、一つのプロジェクト(リポジトリ)の中で本筋から分岐させて変更履歴を記録していくためのものです。分岐したブランチの内容は他のブランチに影響しないため、並行して行われる複数の機能追加やバグ修正等の作業を可能にします。
- マージ 枝分かれになったあるブランチを他のブランチと合流させることをマージと言います。
-
クローン
既存のリポジトリをローカル環境に複製することをクローンと言います。自分の環境にクローンすることでオフライン状態でもファイルの編集を行うことがでGit管理下で変更を追跡することができます。またクローン元のリモートリポジトリとの接続も切れないため、オンライン状態でローカルの変更をプッシュすることができます。
-
フォーク
フォークとはGitHub上で既存のリポジトリを自分のアカウント領域に複製することができるGitHubの機能です。フォークしたリポジトリでは自分の作業内容を更新・反映させることができます。また元の既存リポジトリに対して管理者に更新内容を通知して共同で開発することも可能です。同じ「複製」の機能であるクローンとフォークの違いは下記図のようになります。
-
プルリクエスト
プルリクエストとは、ソースコードの変更をリポジトリの管理者・レビュアーに対して通知して反映(マージ)を依頼する、GitHubが提供する機能のことです。プルリクエストが送られると変更内容や反映先のコードとの差分が通知されます。プルリクエストにより開発メンバー内でコードレビューを行い、一人では気づかなかった記述ミスやバグ等を見つけたりとコードの品質を向上させることができます。
必須の基本操作
ここからは実際にgit操作を行ってみましょう。ここではコマンドを用いてgit操作する方法について説明します。
事前準備
- GitHubのアカウント作成
- ローカル環境にGitで管理する作業ディレクトリを作成
基本操作
GitHubの主な機能はローカルで作業した内容をGitHub上=リモートリポジトリに反映させることです。ここではその手順・方法について説明します。
-
git clone
GitHub上のリポジトリをローカル環境に複製するには
git clone
を実行します。$ cd [ディレクトリパス] #作業ディレクトリに移動 $ git clone [URL]
インターネット上にあるリポジトリをローカル環境にコピーするための接続方法にはhttps接続とssh接続の二種類があります。接続の際には、httpsではアクセストークンの生成、sshではsshキーの設定を行っておく必要があります。
上記コマンドのgit cloneの後ろに記述する[URL]は以下のように取得します。
- httpsによる接続
- sshによる接続
-
git init
git init
はローカルリポジトリを初期化するコマンドで、対象の作業ディレクトリをGitの管理下に置くことができます。ローカルの作業ディレクトリでgit init
を実行することで「.git」というローカルリポジトリが作成されます。 -
git add
git add
は指定したファイルをワークツリーからインデックスに登録するコマンドです。ファイル名はスペースで区切ることで複数指定することができます。
$ git add [ファイル名]
またgit add .
と.
(ピリオド)を指定するとワークツリーの全てのファイルがインデックスに登録されます。
-
git commit
編集したファイルをインデックスに登録したら、git commitを実行してインデックスに登録されたファイルをローカルリポジトリに記録=コミットを行います。
git commit
を実行する際にはオプション-m
で必ずコメントを記述する必要があります。コメントは開発チーム内で共有するためレビュアーやメンバーに分かりやすい内容を心がけると良いでしょう。
$ git commit -m "[コメント]"
-
git push
続いてコミットしたファイルを
git push
を実行してリモートリポジトリに反映=プッシュします。初回は「.git」ファイルをリモートリポジトリに紐づけるためにgit remote add [リポジトリ名] [リモートリポジトリのURL]
を実行します。この操作によって対象のリモートリポジトリのURLが指定したリポジトリ名で登録されます。リポジトリ名はoriginとすることが多いです。
$ git remote add origin https://...
二回目以降はgit push [リポジトリ名] [プッシュ先のブランチ名]
でリモートリポジトリにファイルをアップロードすることができます。
$ git push origin [ブランチ名]
add
、commit
、push
の一連の流れを繰り返すことで自分の作業内容を一定のまとまりごとにGitHub上のリモートリポジトリに反映させることができます。
-
git status
git status
を実行するとGitの現在の状況を確認できます。例えばファイルの登録をどこまで行ったか(addは行ったがcommitはまだ、など)の確認をする際に便利なコマンドです。ディレクトリやオプションの指定もできるので、実際に試して確認してみると良いでしょう。 -
git log
git log
はコミットの状況・ログを確認できるコマンドです。コミットIDやユーザー情報、日付等のデータが表示されます。こちらも様々なオプションがあります。確認したいことに合わせてオプションを指定しましょう。 -
git pull
リモートリポジトリの内容をローカル環境に反映させることをプルと言います。プルを実行するコマンドは
git pull
です。git pull [リポジトリ名] [ブランチ名]
とリモートリポジトリの名前とリモートリポジトリ上のブランチ名を指定して実行します。
# 例
$ git pull origin main
-
git fetch
とgit merge
前項で説明した
git pull
はgit fetch
とgit merge
を一度に行うコマンドです。git fetch
はリモートリポジトリの内容をローカルリポジトリに取り込むのみで更新(マージ)は行いません。そのためgit fetch
を実行しただけではローカルリポジトリ内のブランチの内容に変更は起きていません。git merge
を実行することでgit fetch
で取り込んだ内容をローカルリポジトリ内のブランチに結合させることができます。 -
git branch
とgit checkout
ブランチを操作するコマンドには
git branch
とgit checkout
があります。git branch
はブランチの一覧を表示したりブランチの作成・削除を行ったりすることができ、様々なオプションがあります。git branch
のみ実行するとブランチの一覧が表示されます。現在使用しているブランチには*(アスタリスク)がつきます。git branch [新規ブランチ名]
で新しくブランチを切ることができます。ブランチを切ると、使用中のブランチの内容がそのまま引き継がれます。ただし作成したブランチには移動していない状態です。git checkout [ブランチ名]
でブランチを移動することができます。git checkout -b [新規ブランチ名]
というように-b
オプションを指定すると、新しいブランチの作成と移動を同時に行うことができます。
チーム開発でのGitHub使用の流れ
基本的には以下の手順でGitHubを使用して開発を進めていきます。
- リポジトリ作成・ローカル環境への反映 まずはチームで使用するリモートリポジトリを作成または用意されているリポジトリを自分の環境にクローンします。
- 作業用ブランチを切る 作業用ブランチを切ります。続いてローカル環境で作業を行いますが、ここで作業用ブランチを切ります。作業用ブランチを切ることでクローンしてきた内容に影響を与えずに開発を行うことができます。
- 開発・リモートリポジトリへの反映
ディレクトリ・ファイルの追加や編集を行いながらこまめに
git add
、git commit
、git push
を実行します。コミットは作業単位で行い、いくつかのコミットをまとめてGitHubにアップロード=プッシュすることが多いです。プッシュ先はリモートリポジトリ上のメインで使用するブランチではなく、作業用のブランチを指定することが一般的です。 - プルリクエスト リモートリポジトリの作業用ブランチにプッシュした作業内容をメインのブランチに反映させるためにプルリクエストを送ります。チーム内でコードレビューを行い、マージ担当者がGitHub上でマージを実行するとリモートリポジトリのメインのブランチが更新されます。
- 次の作業に移る時は新しくブランチを切ります。 その前に、最新のリモートリポジトリをローカル環境に取り込む必要があります。ローカル環境内のメインのブランチは常にリモートリポジトリの内容を反映させて、そこから作業用ブランチを切ることでスムーズに開発を進められます。
- 2〜5を繰り返します。
コンフリクト
複数のブランチを結合=マージする際に、複数人が同じ箇所を編集したことにより起こる競合・衝突をコンフリクトと言います。コンフリクトが発生したら双方のブランチの編集内容を確認して修正した後に再度マージを実行します。
こちらで紹介した手順はチーム開発でGitHubを使用する際の大まかな流れです。実際の開発ではチーム内でGitHubの使用手順について認識を揃えておくことが大切です。
まとめ
GitHubにはバージョン管理・チーム開発のため多くの機能があります。当記事で解説したのは基礎的な部分で、GitHubを使用するために必ず押さえておくべき内容です。様々なコマンドやオプションを利用することでより高度な処理を実行できます。GitHubの知識や使用経験は採用時にもアピールになります。GitHubはほとんどの機能が無料で個人利用もできるため、まずは実際に手を動かしてみましょう。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2023.09.25
インフラ基盤を支える運用保守エンジニアとは
私たちの生活に欠かせないサーバーやネットワークは、日々稼働しています。そんなサーバーやネットワークといったシステム面を運用保守するのが「運用保守エンジニア」です。
- インフラエンジニア
2023.07.17
DevOpsエンジニアってどんな仕事?必要なスキルや資格など
DevOpsとは、「Development(開発」と「Operations(運用)」を組み合わせた造語です。従来は分断されていた開発と運用を連携し、同一のプロセスとして扱おうという考え方から生まれました。
- インフラエンジニア
2023.09.12
【BIND入門実践】BINDでDNSサーバーを構築してみよう
こちらの記事では、AWSのEC2(ubuntu)にBINDをインストールし、実際にDNSサーバーを構築する方法を解説します。
- ネットワーク
- インフラエンジニア