🤷‍♂️

VCSとは?GITはなんで使わないといけないか

2023/07/16に公開

はじめに

バージョン管理システム(VCS)は、アプリケーションのソースコードを管理するための基本的なツールです。特にGitはWEBアプリケーション開発の分野で広く使用されてるVCSとして使われてます。
しかし、VCSがソースコード管理するための唯一な方法でしょうか?単純にZIPファイルやファイルの名前にバージョン名を書いて共有すれば、良いんじゃないでしょうか?
それであれば、Gitみたいな特定なソフトウェアをインストールしなくても良いし、コマンドを覚えれ時間を減らして、学習曲線減らすこともできると思います。
なんでVCSを使わないといけないでしょうか?

Version Control Systemとは

まずは、バージョン管理システムは何なのでしょうか?バージョン管理システムについてのWikipedaの説明です。
https://ja.wikipedia.org/wiki/バージョン管理システム

バージョン管理システム(英: version control system、VCS)はコンピュータ上でファイルの変更履歴を管理するシステムである。

一般的に、バージョン管理システム(Version Control System、VCS)はソフトウェアを開発者が時間の経過とともにソースコードの変更を管理するのに役立つソフトウェアツールです。つまり、ファイルの変更事項について全て修正事項を記録するため、開発者は必要に応じてプロジェクトの過去履歴を閲覧することができます。

バージョン管理システムがない場合発生する問題

バージョン管理システムがない場合発生する問題としては以下の問題が発生します。

  1. 作業の上書き
  2. 変更の追従の難しさ
  3. 非効率的な協業
  4. 問題があるロールバック
  5. コードの紛失

作業の上書き

バージョン管理システムがない場合作業の上書きが発生する可能性が高いです。
例えば、開発者Aと開発者Bがindex.htmlというファイルを修正する時です。
Aはindex.htmlから発生してるバグを午前中修正してチームに共有しました。
しかし、Bは作業に集中してしまいAが変更したことを認識できませんでした。その後、頑張ったBは機能追加してチームに共有しました。
この場合Aが午前中に修正した分が上書きしてしまうので、Aはまた作業をしないといけないです。なので、無駄な時間と努力がかかります。

変更の追従の難しさ

アプリケーションを開発する際には機能を追加、バグ修正、リファクタリングが頻繁に発生します。バージョン管理システムがない場合特定な機能が追加された実機、コードの改修理由などがわかりにくいです。
例えば、AとBはアプリケーションを保持してます。時間が経ってAは転職してしまし、新しいCが合流しました。
Cはコードを読んで理解できましたが、Aが作成した非効率的なコードを見つけました。Cは最適化したかったが、有能な開発者Aがなんで非効率的なコードを残したか記録がないし、不用意に壊したくなかったので、非効率的なコードをそのまま放置しました。この決定は結局、アプリケーションのパフォーマンスを低下させました。

非効率的な協業

バージョン管理システムがない場合非効率的な協業が発生します。
例えば、機能追加とバグ修正がそれぞれ開発した場合です。開発が終わったら、誰かが一つに纏めないといけないです。この作業をするために、メールでファイルを転送してダウンロードして一行ずつ比較しながら、纏める作業をします。このような作業は時間が掛かるし、ミスが発生しやすいです。それと面白くないです!!

問題があるロールバック

アプリケーションを開発してロールバックすることは珍しくありません。このような場合開発者はアプリケーションの以前のバージョンにロールバックする必要があります。しかし、バージョン管理システムがなければ、このロールバックは本当に悪夢になリます。
例えば、アプリケーションを同日に3バージョンをリリースした際に、v.0.0.0にバグを見つけました。このバージョンを元のバージョンに変更しないといけないです。だけど、V.0.0.1とV.0.0.2がリリースされてるので、なかなか戻せにくいです。

コードの紛失

バージョン管理システムがないとコードの紛失は良く発生します。コードを作成した後、メール転送して削除した際を考えてみましょう。
その後、マージする方もダウンロードをしたコードを削除してしまうとそのコードは世の中で存在しません。なので、改めて作成しないといけないです。

バージョン管理システムが必要な理由

なので、バージョン管理システムが必要です。

作業の上書き

バージョン管理システムを使用すると作業を上書きする心配はありません。
変更事項をマージする際に同一な部分を修正した場合はコンフリクトを発生させて開発者が手動で解決しないといけないです。なので競合を解決しないとそのコードはマージすることができません。
それと、このような問題を事前に防止するため、コードを検討するPull Requestというプロセスをしようするどころもあります。

簡単な変更履歴追従

バージョン管理システムを使用すると、コードの変更を簡単い追従することができます。
各修正はタイムスタンプと作業者の詳細とともに記載されます。開発者は変更履歴を確認することで、特定の変更がおこわれた時期と理由を理解することができます。
問題があるコードを、開発者はそのコードのソースを追従し、作業内容を理解することができます。これにより、コードベースをより管理しやすい作業で保持することができます。

効率的な協業

バージョン管理システムはチームメンバー間の効率的な協業を促進します。
開発者ほ、お互いに簡単に共有しながら新しい機能やバグについて同時に作業することができます。変更事項をマージすることはバージョン管理システムにより簡単になって、異なるソースコードを自動的にマージしてくれます。

簡単なロールバック

ミスが発生してコードのロールバックが必要な場合簡単なコマンドを利用して対応できます。なので、以前のバージョンに戻しやすいです。

コードの紛失防止

バージョン管理システムを使用するとコードがリモートサーバに保存されるので、コードの紛失が発生しません。システムの問題や事故によるローカルコードを紛失しても、リモート環境で管理されるので、紛失を防止してくれます。

バージョン管理システムの種類

バージョン管理システムには主に集中型バージョン管理システム(CVCS)と分散型バージョン管理システム(DVCS)の2種類があります。

集中型バージョン管理システム

集中型バージョン管理システムには、すべてのプロジェクトファイルの集中型単一リポジトリがあります。開発者はコードのファイルやセクションをチェックアウトすることができますが、すべての変更は中央リポジトリに保存され、追跡されます。
代表的に集中型バージョン管理システムはSubversion(SVN)です。

分散型バージョン管理システム

分散型バージョン管理システムでは、すべての開発者がプロジェクト履歴の完全なコピーをローカルコンピュータに持っています。 つまり、オフラインで作業し、ローカルで変更をコミットし、オンラインになったときに中央リポジトリと同期することができます。
代表的に分散型バージョン管理システムはGitです。

GITについて

https://git-scm.com/
Gitは分散型バージョン管理システムであり、世界で最も人気のあるVCSの一つです。
Gitでは変更事項はスナップショットに保存されてプロジェクトの状態をコミットや変更する際にすべてのファイルに対して写真を撮ります。効率性をため、変更されなかったファイルは写真を撮りません。
もうちょっと分かりやすく説明すると、作業を区切りにGitが覚えるように指示することができます。
Gitではこれを「コミット」と言います。各コミットは特定視点の写真です。
Gitがこのような写真とその記録を維持するため、以前の写真と比較して何が変更されたかを比較することができます。
それと分岐を作ってソースコードベースから様々のバージョンを複数作成することもできます。なので、それぞれコードを作成して入れても分岐は独立的に運用されるので、他のブランチに影響がありません。

ブランチに対する作用が終わったら元のブランチにマージすることができます。Gitは賢くて変更事項を一緒に結合してくれます。
なので、Gitを利用してコードを管理して、変更事項を維持して、他の方と協業する際にミスが発生することを防止してくれます。

良く使われるGitコマンド

よく使われるGitコマンドとしてはinit、checkout、add、commit、pushなどがあります。

  • init : Gitのリポジトリを初期化します。新しいプロジェクトを始まる時に実行するコマンドです。
  • checkout : チェックアウトはブランチ間に移動する時に使います。
  • add : 変更事項をステージに追加する時に使います。
  • commit : 変更事項をブランチに保存する時に使います。
  • push : リモートブランチに保存する時に使います。

やってみる。

上記の内容だけでは分かりにくいと思って、簡単なリポジトリを生成して試してみました。

リポジトリ作成


Githubに簡単なリポジトリを作成しました。

作成した後初期画面を見ると、良く使われるGitコマンドのものが見れます。

ローカルから新しいリポジトリを生成する。

…or create a new repository on the command lineを参考して新しいリポジトリをコマンドを利用して生成してみましょう。コマンドは下記になります。

echo "# git-example" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/Park-Jongseok/git-example.git
git push -u origin main

その前に作業ディレクトリを生成します。下記のコマンドを入力してください。

// このコマンドはフォルダを作成することなので、git-exampleではなくても良いです。
mkdir git-example 
// ディレクトリを移動します。
cd git-example
// VSCodeを開きます。
code .

下記のコマンドを使ってREADME.mdファイルを生成します。

echo "# git-example" >> README.md

上記のコマンドを入力すると# git-example内容を持ってるREADME.mdファイルが生成されます。

git初期化

下記のコマンドを入力してgitを初期化することができます。

git init

このコマンドを入力すると.gitというフォルダが作成作成されます。ls -alコマンドで存在を見れますし下記のコマンドを入力して移動することもできます。

cd .git

ここでは先ほど説明した分散管理するための全てのバージョン情報が入ってます。
HEADではチェックアウトされた分岐の最後のコミット情報、hooksはcommitやPushなどのイベントに前後に発生するスクリプトをがあります。

変更リストに追加する。

この部分が良く使われると思います。とりあえず、書いてるままやってみましょう。
他のIDEを使ってる場合画面はちょっと違うかもしれませんが、やってる作業は同じなので、参考してください。

一旦addコマンドを実行する前です。左のChanges項目に先ほど追加したREADME.mdがあることを確認できます。

git add README.md


addコマンドを入力するとChangesにあるREADME.mdStaged Changesに移動されました。Staged Changesは変更リストに入れたいですよ!ということです。
えば、index.htmlがある場合このindex.htmlはまだ作業中なので、変更リストに入れたくないです。その場合は以下になります。

変更事項を保存する。

ついに、commitを利用して変更事項を単位別に保存したいです。その時には下記のコマンドを入力します。

git commit -m "first commit"


上記のコマンドを入力するとStaged Changes、つまり変更リストにあることが保存されました。
左の変更リストもこれ以上変更事項がないので、なくなりました。
であれば、リモートのリポジトリに保存されるのでしょうか?

リポジトリを確認すると、変更事項が反映されてないみたいです。ローカルでは保存されてますが、リモートでは反映されてないため、これからリモートに反映させたいと思います。

リモートに保存する。

リモートに保存するためには、リモートパスをgitに教えてあげないといけないです。
なので、以下のコマンドを入力します。

git branch -M main
git remote add origin https://github.com/Park-Jongseok/git-example.git

上記のコマンドはメインブランチをmainにして、リモートパスはhttps://github.com/Park-Jongseok/git-example.gitだと教えてあげるコマンドです。
次に以下のコマンドを入力しましょう

git push -u origin main

コマンドを実行した後、リポジトリのページを開くとgit-exampleという文言が見れます。

まとめ

今回はバージョン管理システムがない場合発生する問題とそれを解決するためにバージョン管理システムの必要性について調査しました。それとCVCSとして有名なSVNとDVCSとして有名なGitについても軽く見ました。
その中にWEBアプリケーションを開発する際に良く使われるGitについてリポジトリを利用して直接試してみました。
実はGitはこの機能意外にもrebasemergediffなど強い機能がたくさんあります。それとこのようなGitを使いやすくするツールGit GUIやSourcetreeというツールもあります。
Gitはアプリケーションを開発する時に必須だと思います。なので、みなさん使いましょう!

今までの説明が皆さんにも分かりやすく説明できていればと嬉しいです。

Discussion