はじめに
こんにちは!25年新卒エンジニアの鈴木です。
今回は、新卒研修で実施された「Git講座」での学んだことを紹介します。普段から当たり前のように使っているGitですが、その裏側にある概念を元に、なぜそうするべきなのか?といった部分を改めて学ぶことができ、今後のチーム開発に役立つヒントがたくさん詰まった研修でした。
この記事を通して、皆さんのGitとの付き合い方がより良いものになれば嬉しいです!
Gitの概念
Gitは分散管理型のバージョン管理システムです。チーム開発において、Gitの活用は必須となります。
バージョン管理システムとは
あるファイルに対して「誰が」「いつ」「どのような変更をしたか」という変更履歴を記録するシステムです。これにより、ファイルの変更履歴を追跡し、管理することが可能となります。
Gitのメリット
Gitを利用するメリットは以下の通りです。
- 他のメンバーの変更を手元に取り込むことができる。
- ファイルに対する変更内容の差分を確認できる。
- 過去の任意の時点にファイルを復元できる。
バージョン管理システムの種類
バージョン管理システムには主に2種類が存在します。
- 中央集中型: 全てのファイルと変更履歴を1つの中央リポジトリで管理します。ファイルの最新のコピーをダウンロードし、変更内容をリポジトリへアップロード(コミット)します。SVNなどが該当します。
-
分散管理型: 各ユーザーがリポジトリの完全なコピーをローカルに持ちます。これにより、オフラインでの作業や、後からのリモートへのアップロード(push)が可能となります。Gitはこちらのタイプです
Gitプラットフォーム
Gitのリポジトリをホスティングし、共同作業を支援するサービスが複数存在します。
- GitHub: Microsoft社が提供するサービスです。
- GitLab: GitLab社のオープンソースソフトウェア(OSS)です。
- BitBucket: Atlassian社の製品であり、同社製品(Confluence、JIRAなど)との連携が強力です。
これらのプラットフォームは、基本的な機能において大きな違いはありません。
Gitの構造
Gitを効果的に利用するためには、その内部構造を理解することが重要です。
- ワーキングツリー: ファイルの編集を行う作業場所です。編集を終えたファイルはステージングエリアに移動させます。
-
ステージングエリア(ステージ、インデックス): 次のコミットに含まれることを示す場所です。
add
コマンドを実行することで、ファイルがここに追加され、コミットの対象となります。 - ローカルリポジトリ: コミット履歴(変更差分)が保存されている場所です。リモートリポジトリの完全な複製であり、自身のPC上に存在します。
- リモートリポジトリ: チームで共有しながら使用する場所です。GitHubなどのプラットフォーム上に存在し、コミット履歴を保存します。
コミット
コミット(commit)は、ファイルの変更内容を保存し、その履歴をリポジトリに記録することです。これにより、過去の状態に戻したり、変更履歴を確認したりすることが可能となります。コミットは、その内容から計算される一意な「ハッシュ値」によって識別されます。
- HEAD: ブランチ内の最新のコミットを指します。
- HEAD~n: 最新のコミットからn個前のコミットを指します。
- ハッシュ値~n: 指定したハッシュ値のコミットからn個前のコミットを指します。
ブランチ管理
ブランチ(branch)管理は、開発の本流から分岐し、その本流に影響を与えることなく複数の作業を同時に進行させるための手法です。独立した作業領域をブランチと呼びます。
ブランチ管理のメリットは以下の通りです。
- 複数の作業を同時並行で進めることができる。
- 開発全体への影響を考慮した安全性が確保される。
- コードレビューのプロセスが容易になる。
Gitの基本操作
実際にGitを操作する際の基本的なコマンドと手順を解説します。
基本コマンド
-
git clone <リモートリポジトリのURL>
: 既存のリモートリポジトリをローカル環境に複製するコマンドです。 -
git branch
: ローカルリポジトリにあるブランチの一覧を表示します。 -
git branch -a
: ローカルとリモートリポジトリの両方にあるブランチの一覧を表示します。 -
git branch <ブランチ名>
: 新規ブランチを作成します。 -
git branch -d <ブランチ名>
: 指定したブランチを削除します。 -
git checkout <ブランチ名>
: 既存のブランチに移動します。 -
git checkout -b <ブランチ名>
: 新規ブランチを作成し、そのブランチに移動します。 -
git add <ファイル名>
: 指定したファイルをステージングエリアに追加します。 -
git add .
: カレントディレクトリ以下の全ての変更をステージングエリアに追加します。 -
git commit -m "コミットメッセージ"
: ステージングエリアの変更内容をローカルリポジトリに保存します。 -
git status
: ファイルの変更状況やコミットの履歴などを表示します。 -
git push --set-upstream <リモートリポジトリ名> <ブランチ名>
: コミットをリモートリポジトリにアップロードし、そのリモートブランチを現在のブランチの上流ブランチとして設定します(初回のみ)。 -
git push <リモートリポジトリ名> <ブランチ名>
: 上流ブランチが設定されている場合に、コミットをリモートリポジトリにアップロードします。 -
git pull <リモートリポジトリ名> <ブランチ名>
: リモートリポジトリの変更をローカルリポジトリにダウンロードします。これはgit fetch
とgit merge
を組み合わせたコマンドです。 -
git fetch <リモートリポジトリ名>
: リモートリポジトリの最新情報をローカルリポジトリに取得します(リモート追跡ブランチを更新)。 -
git merge <リモートリポジトリ名>/<ブランチ名>
: リモート追跡ブランチの変更を現在のブランチに統合します。
基本的な作業の流れ
一般的なGitの作業手順は以下の通りです。
-
main
ブランチに移動:git checkout main
- 新規ブランチの作成と移動:
git checkout -b <新ブランチ名>
- ファイルの編集
- コミット対象のファイルをステージング:
git add <ファイル名>
- コミット:
git commit -m “コミットメッセージ”
- リモートリポジトリへの反映:
git push -u origin <ブランチ名>
(初回) またはgit push
(以降)
lazygitで快適なGit操作
Gitのコマンド操作は非常に強力ですが、多くのコマンドを覚えるのは大変です。そこで、ターミナルベースのGUIクライアント「lazygit」の利用をおすすめします。lazygitは、コミット、ブランチの切り替え、マージ、リベースといった基本的なGit操作を直感的かつ視覚的に行えるツールです。複雑なコマンドを打ち込む手間を省き、Gitの操作をよりスムーズにしてくれます。
以下のgifはファイルの差分をadd, commit, pushするまでの操作の流れです。vimライクな操作で特定の行のみstagingできる点も魅力の1つです。
プルリクエスト(Pull Request: PR)
プルリクエストは、開発者のローカルリポジトリにおける変更を他の開発者に通知するためのGitHubの機能です。
プルリクエストの機能
- 作業内容をレビュー担当者や関係者に通知する。
- コードの変更箇所を分かりやすく表示する。
- コードに関するコミュニケーションの場を提供する。
コンフリクトの解消
コンフリクトは、同じファイルの同じ部分を異なるブランチで変更した際に発生し、Gitがどちらの変更を採用すべきか判断できない状態です。
コンフリクトの発生条件
同じファイルの同じ行に対し、複数人が異なる変更を加えた場合に発生します。
コンフリクトの解消方法
コンフリクトの解消には主に2つの方法があります。
-
ローカルリポジトリで解消: 他の人の変更が含まれた最新の状態を
pull
で取得し、ローカル環境で競合箇所を修正します。統合開発環境(IDE)の強力なサポート(例: VS Codeの自動解消機能)を活用することが推奨されます。手動で解消する場合は、Gitが挿入する特殊なマーカー(<<<<<<< HEAD
、=======
、>>>>>>> branch-name
)を参考に、適切な内容に編集します。解消後はgit add
で変更をステージングし、git merge --continue
でマージコミットを作成します。 - GitHub上で解消: GitHubのWebインターフェース上でコンフリクトを解消することも可能ですが、動作確認ができない点や、開発環境のサポートが受けられない点がデメリットとなります。
コンフリクト解消時の注意点
- 全てのコンフリクトを解消する必要がある(未解消ではコミットできない)。
- 変更内容を正確に理解し、不明な点があれば変更者と確認する。
- コンフリクト解消後は、アプリケーションが正常に動作することをテストで確認する。
- マージコミットのメッセージを明確にし、状況を後から理解できるようにする。
コンフリクトを発生させないための取り組み
-
変更前に頻繁に
pull
(取り込み)を行う: これにより、自分の作業が他の変更と競合する可能性を低減できます。
チーム開発を意識したブランチ管理
ブランチ管理は、チームでの開発効率と安定性を高めるために不可欠です。もしmain
ブランチのみで運用した場合、バグの発見が遅れ、安定したリリースが困難になるリスクがあります。
ブランチ管理手法
開発プロジェクトのブランチ(作業の枝分かれ)を効率的に管理するための手法がいくつか存在します。
ブランチ管理の必要性
-
main
ブランチのみの運用における問題点:- プルリクエスト(PR)が作成されずに直接
push
されるため、バグの発見が遅れる。 - 開発中にバグが混入すると、安定的なリリースが困難になる。
- プルリクエスト(PR)が作成されずに直接
-
main
ブランチ +develop
ブランチでの運用: -
main
ブランチ +develop
ブランチ +feature
ブランチでの運用:
ブランチ運用の最適化
develop
、main
、feature
ブランチを運用するスタイルは、基本的な推奨形です。しかし、数人のチームか、数十人のチームかなど、プロジェクトの規模によって最適な運用ルールは異なります。チームにとって何が最適かを考慮し、ブランチ管理方法を決定することが重要です。
まとめ
今回のGit研修を通して、バージョン管理システムの重要性と、チーム開発におけるGitの役割を深く理解することができました。Gitの基本概念から、コミット、ブランチ、プルリクエスト、コンフリクト解消、そして様々なブランチ管理手法までを丸一日かけて学ぶことができたため、今後Gitの知識を深めていく上での強固な基盤となりました。
研修で得た学びを活かし、チームでの開発をよりスムーズに進め、高品質なプロダクトの実現に貢献できるよう、日々精進していきます。
▼採用情報
レアゾン・ホールディングスは、「世界一の企業へ」というビジョンを掲げ、「新しい"当たり前"を作り続ける」というミッションを推進しています。
現在、エンジニア採用を積極的に行っておりますので、ご興味をお持ちいただけましたら、ぜひ下記リンクからご応募ください。