こんにちは。テクマトリックスの長久保です。

昨今の開発現場でのデファクトスタンダードになっている「Git」。
今回はこのGitについて、どういった点でほかのバージョン管理より良いのか、どういった形で利用していくのかなど、Gitについて紹介するシリーズになります。

本シリーズについて

目的

  • Gitがどういったものか理解できる
  • 他のツールと比較してのメリット・デメリットを整理する
  • 実際にGitの簡単な操作ができるようになる

想定するユーザー

このシリーズは以下のユーザーを想定して記載します。

  • Gitに興味はあるけれど、まだ使ったことがない方
  • ソフトウェア開発においてバージョン管理の重要性は理解しているが、どのツールを使うべきか迷っているソフトウェア開発者の方
  • 共有フォルダやSubversionなどのバージョン管理システムを使用しているが、Gitへの移行を検討している方
  • チームでのコラボレーションをより効率的に行いたいと考えている方

構成

本シリーズは全4回で構成されています。

シリーズの第2回目にあたる今回は、共有フォルダを利用している開発者に向けて、共有フォルダと比較した際のGitの優れた点を紹介します。これにより、皆さんがGitを導入するための第一歩を踏み出す手助けとなれば幸いです。

共有フォルダの問題点

共有フォルダを使った開発では、次の問題が生じる可能性があります。

競合の発生

共有フォルダでは、複数の開発者が同時に同じファイルを編集することで、ファイルの競合が発生しやすくなります。例えば、二人の開発者が同じソースコードファイルを編集し、それぞれの変更を保存した場合、後から保存した変更が先に保存した変更を上書きしてしまう可能性があります。このような競合は、バグの混入や機能の消失などの問題を引き起こし、開発効率を大きく低下させます。

データの紛失

共有フォルダでは、ファイルの上書きや削除によるデータの紛失リスクが高まります。特に、重要なファイルが誤って削除された場合や、意図しない変更が加えられた場合、元の状態に戻すことが非常に困難になります。
もしバックアップを取得していないフォルダを削除してしまった場合、取り返しのつかない損失を招く可能性があります。

履歴管理の困難さ

共有フォルダでは、ファイルの変更履歴を手動で管理する必要があります。Excelファイル等で管理されている開発現場もあるようです。
変更内容や変更を行った人物、変更日時などを手動で記録する手間が伴います。また、記入漏れや記入間違いといったヒューマンエラーのリスク、意図しない変更が混入してしまうリスク、重要な変更が見落とされるリスクも高まります。

共同作業の非効率性

共有フォルダを利用する場合、開発者間でのファイル共有や変更の統合が非効率的になりがちです。特に、大規模なプロジェクトや多くの開発者が関わるプロジェクトでは、誰がどのファイルを変更したのかを把握するのが難しく、結果として作業の重複やミスが増える可能性があります。
また、最新のファイルを追跡することにさえコストが発生し、効率的な開発環境とは言い難いです。

開発規模が小さい場合、共有フォルダでも問題ない?

共有フォルダを利用しているユーザーからは、「我々の開発チームは小規模なので、Gitの必要性を感じない」という意見を聞くことがあります。しかし、実際にはチームの規模やコードの量に関係なく、Gitを導入することで得られる多くのメリットがあります。
以下に一例を紹介します。

  • 誤解1: 小規模チームではバージョン管理システムは不要
    小規模チームであっても、何らかの方法でコードの履歴を管理しているかと思います。
    バージョン管理システムを利用すると、これらの履歴が自動で管理され、手動での管理をする手間が省けます。
  • 誤解2: コードの量が少ないためバージョン管理自体の必要がない
    現時点でのコードの量が少なくても、バージョン管理の重要性は変わりません。プロジェクトが進行するにつれて、コードは次第に複雑になります。初期の段階からバージョン管理を行うことで、後々の管理が容易になります。
  • 誤解3: フォルダごとに開発者が異なるためファイルの競合は発生しない
    たとえ現在の作業分担で競合が発生していないとしても、プロジェクトの進行やメンバーの追加により、状況は変わる可能性があります。Gitを導入することで、柔軟に対応できる開発環境を整えることができます。

共有フォルダからGitへの移行

共有フォルダをGitの管理対象にすることは難しくありません。以下に、共有フォルダからGitに移行する具体的な手順と、これまでの作業がどのように変わるかを説明します。
また、実行に必要なコマンドも記述しますが、各コマンドの具体的な動作内容については、ここでは省略します。

Gitの環境を作成する

Gitの基礎知識は、「第1回:本シリーズの概要、Gitの基本概念と入門」で紹介しています。そちらを先にご覧いただくと、本内容の理解がよりスムーズになります。

今回はWindows環境で説明をします。
Windows環境でGitコマンドを実行できるようにするため、Git for Windowsをインストールし、GitサーバーとしてGitLabを利用して説明します。


リポジトリの作成とファイルの登録

まず、共有フォルダ内のプロジェクトをGitリポジトリに変換します。この手順を行うことで、現在のプロジェクトの全ファイルとその変更履歴を管理することができます。

  • 手順:
  1. 管理対象フォルダに移動します。
  2. Gitを初期化するために以下のコマンドを実行します。
    git init
    git initを実行すると.gitという管理用のフォルダが作成されます。
  3. 全ファイルを追加し、初期コミットを行います。
    git add .
    git commit -m "Initial commit"

    このコマンドを実行することにより、現在のフォルダ内に含まれているファイルが履歴として記録されます。この際にコミットコメントを追加し、コードの修正意図も記録することが可能です。

上記手順に続き、次の手順で開発を進めていったとします。

  • README.mdファイルの内容を修正。修正後、以下コマンドを実行。
    git add .
    git commit -m "README修正"
  • 不具合修正のため、app.javaの修正。修正後、以下コマンドを実行。
    git add .
    git commit -m "不具合○○の修正のため、app.javaの文字列修正"

この状態で、変更履歴を確認するための「git log」のコマンドを実行すると、以下のように変更履歴を確認できます。

GUIツールで確認することも可能です。TortoiseGitを用いて変更履歴を表示した場合、以下のように変更履歴を確認できます。

履歴間を選択し、特定のコミットでどのファイルがどのように変更されたかを確認することも可能です。以下のように変更されたファイルの一覧表示や、WinMergeといった差分比較ツールと連携し、ファイルの差分表示も可能です。

改善が期待される問題点
履歴管理の困難さの解消
Gitの履歴管理の機能により、変更履歴を管理するためのファイルへの記載は不要になります。また、変更の追跡や、特定の履歴への復元もできるようになります。

リモートリポジトリの設定

現在はローカル環境に変更履歴を保持している状態となります。これをGitLabにpush(変更のアップロード)します。従来のローカル環境の変更内容を共有フォルダにアップロードすることに該当します。
GitLabにリモートリポジトリを作成し、ローカルリポジトリと接続します。リモートリポジトリを利用することで、チームメンバーとリポジトリを共有し、共同作業を効率化できます。

  • 手順:
  1. リモートリポジトリを作成します。今回はデモ用に空のリポジトリを作成します。
  2. リモートリポジトリのURLを取得し、ローカルリポジトリに追加します。
    git remote add origin <リモートリポジトリのURL>
    git switch -c main
    git pull origin main
    git push -u origin main

これにより、リモートリポジトリにローカルリポジトリの内容が反映されます。

リポジトリの作成とファイルの登録にて、コマンドラインやTortoiseGitを用いて変更履歴の表示や、WinMergeを用いてコードの差分表示を紹介しましたが、GitLabを用いることでブラウザ上からも変更履歴や、コードの差分表示を確認することができます。

変更履歴の表示
コードの差分表示

改善が期待される問題点

データの紛失
コマンドを使用してファイルを更新することにより、共有フォルダの使用時に起こりがちなアップロード漏れや誤ったファイルのアップロードといったリスクが減少します。さらに、重要なファイルが誤って削除されたり、予期せぬ変更が加えられたりした場合でも、リモートリポジトリの特定の履歴を選択して復元が可能です。

複数人数での共同開発

Gitを導入することで、リモートリポジトリを通じたファイルの共有が可能になります。これにより、常に最新のコードをチーム全体で共有することができ、作業の効率が向上します。

WordやExcelといったバイナリファイルの場合は難しいですが、ソースコードの様なテキストファイルの場合は、差分を自動的にマージしてくれます。また、ほかの開発者との修正内容が競合した場合でも、Gitには標準で強力なマージ機能が付いているため、ほかの開発者の修正内容をスムーズに同期しながら開発することが可能です。

改善が期待される問題点
共同作業の非効率性
Gitを使うことでコマンド一つで変更を共有や他人の修正内容をローカルの開発環境に反映できるようになります。これにより、作業の効率化と変更内容の管理が容易になります
競合の発生
Gitが自動的にマージを試み、競合が発生した場合でも明確にその箇所を示してくれます。各開発者の変更履歴がすべて管理されているため、どの変更が競合を引き起こしたのかを把握しやすく、それによって競合解消の過程もスムーズになります。

まとめ

共有フォルダからGitに移行する場合、「何か複雑なことを行う必要があるのではないか」「どうやって共同作業すればいいかわからない」といった懸念点をお持ちの方もいるかと思います。

Gitは柔軟性に富み、様々な形で運用することが可能なため、今回紹介したような、非常にシンプルな利用でも十分メリットを享受することができます。
今まで履歴管理のために手動でファイルを更新していた作業は、”git commit” コマンドによって自動化できます。また、共有フォルダへのアップロードは “git push” コマンドで置き換えられます。これにより、作業の効率が大幅に向上します。
ブランチ戦略についても、最初はmainブランチのみを使用して、基本的なpull(変更のダウンロード)とpush(変更のアップロード)から始めることができます。慣れてきたら、新機能の開発やバグ修正のために追加のブランチを作成するなど、徐々に複雑なブランチ戦略を採用していくことが可能です。

まずは、ファイルの変更履歴管理のためにGitを導入してみてはいかがでしょうか?

宣伝

Gitの導入支援

Gitはとても強力なバージョン管理ツールですが、Gitの高度な機能を手探りで使うと、コミット履歴が複雑化したり、場合によっては履歴が消失したりする可能性があります。これらの問題を避けるためには、適切な運用方法と開発メンバーへの教育が必要となります。

テクマトリックスでは環境構築からトレーニングまでGitの導入支援が可能です。
お客様のご要望や開発プロセスをヒアリングしたうえで、Gitを用いたソフトウェア構成管理(バージョン管理)の環境構築・移行を行います。また、運用のコンサルティング、トレーニングなども実施しています。
特に、Gitの適切な運用方法や、問題が発生した際の対処法などについての教育は、開発の効率化と安全性向上に大いに寄与します。どのような運用が最適か迷ったり、Gitの使い方についての疑問がある場合は、お気軽にご相談ください。

詳細につきましては、次のボタンより参照下さい。

By nagakubo

主にCI環境構築をメインで担当しています。 Certified CloudBees Jenkins Engineer (CCJE)