ソフトウェア

バージョン管理ツール「Git」は一体どういうものなのか?


「バージョン管理ツールのGitとは一体どういうものであるのか?」について簡単にまとめてみました。今回はGitの概念や考え方についてを中心にまとめており、「Gitが何なのかよく分からない」「実際のコードに触れてみたもののよく分からず使うのをやめてしまった……」といった人向けに記事を作成しています。

Git
https://git-scm.com/

バージョン管理とは、要するに「ある時点でファイルを別に保存しておく」ということです。別のファイルに保存しておけば、またそこからやり直すことができます。これを直感的に行うと下図のような「手動ファイル名バージョニング」になりがちです。ただし、この「手動ファイル名バージョニング」は命名する時の思いつきで決めることが多く、後で見た時に「どれが本当の最新ファイルなのか分からない」となりがちなのが問題です。


これに対する一つの解決策が「プロジェクトフォルダに『作業中』というフォルダを作成し、この中身を更新していく」というもの。


この方針では「ここでいったん保存しておきたい」となった時に「作業中」フォルダをコピーし、そのフォルダ名を日時などの決まった形式に変更するというバージョン管理方法が思いつきます。


そして上記の作業を簡単に、そしてより賢く行ってくれるのが「Git」です。「ある時点でのフォルダの中身を保存したもの」のことを「スナップショット」と呼びます。また、「スナップショットを保存する」ことを「Commit(コミット)する」といいます。


「先週コミットしておいたもの」を昨日編集してまたコミットし、その昨日コミットしたものを編集して今日再びコミットを行う……と、このようにコミットを積み重ねておけば、いつでも以前コミットした時の状態に戻すことが可能となります。「同じファイルが何度も保存されて容量が増えてしまうのでは」というもっともな疑問が思い浮かびますが、Gitはうまく必要なファイルだけを新たに保存してくれるようになっています。


コミットはある一定の規則にしたがったランダムな名前になっており、自分で命名することはできません。コミット名には日時の情報すら含まれていないため、「どれが最新のコミットなのか」を特定することすら難しくなっています。そこで、特定のコミットに名前を付けたものが「ブランチ」です。


ブランチは新たなコミットとともに移動していきます。従って、ブランチが指しているコミットを見ればどれが最新のコミットか一発で分かるという訳です。Gitではブランチのことを何も意識しなくても標準設定で「master」ブランチが設定されており、何も設定を変えていなければこのmasterブランチ上で作業を行うことになります。


ブランチと似た機能に「タグ」があります。ブランチと同じように特定のコミットに名前を付けるために存在しますが、ブランチと違って新たなコミットがあっても移動せず、常に設定した時のコミットを指しています。


「どのブランチで作業しているのか」を示したものを「HEAD」と呼びます。下図は本の執筆において、すでに出版した部分であるコミット「1」に新たに「新章執筆」ブランチを設定し、コミット「2」「3」と進めていったという様子。「新章執筆」ブランチで作業しているため「HEAD」が「新章執筆」ブランチを示しています。


ここで、改訂版を出す前に重版をかけたいと言われたため先に誤字脱字を修正することになったとします。HEADを「出版」ブランチに切り替えると、Gitが自動でフォルダの中身を「出版」ブランチが指しているコミットのものに置き換えます。コミットしていないファイルは消えるので、ブランチを切り替える前にきちんとコミットしておく必要があります。


誤字脱字を修正し、新たなコミット「4」を作成しました。このコミット「4」の状態で重版を出します。


ここで、改訂版を出版するために以前執筆していた新章を取り込みます。このように、2つのブランチを合併させることを「merge(マージ)」と呼びます。2つのブランチで同じ場所が編集されていない場合は簡単にマージを行うことができ、また同じ場所が編集されていた場合でもGitが競合部分を教えてくれるため、その部分を修正するだけでマージできます。このように、Gitを使用すると誤字脱字を「重版用ファイル」と「改訂版用ファイル」の2カ所で変更するというような二度手間を避けることができます。


Gitのおさらいをすると以下の通りです。

・フォルダの中身をある時点でまとめて保存するのが「commit(コミット)」

・最新のコミットを管理するのが「ブランチ」
今回の記事で、ブランチが新たなコミットに自動で移動すると記載しましたが、実際には「ブランチ上で作業していた場合(=HEADがブランチを指していた場合)」のみ新たなコミットに移動します。例えば同じコミット「1」に「出版」「新章」の2つのブランチが付いていた上で「新章」ブランチで作業していた場合、新たなコミットを作成しても移動するのは「新章」ブランチのみであり、「出版」ブランチが自動で移動することはありません。

・コミットに名前を付けるために使うのが「タグ」

・どのブランチで作業しているのかを示すのがHEAD
HEADが指しているブランチは「master*」のようにアスタリスクを付けて表示されることがあります。

・複数のコミットを合併するのが「merge(マージ)」

以上のことを学んだら、次はチュートリアルサイトなどで実際にコマンドを入力して動作を確かめてみるのがオススメです。

この記事のタイトルとURLをコピーする

・関連記事
並行開発に襲われたサブバー村をGitで救うRPG「ギットクエスト」をプレイ - GIGAZINE

Git誕生10周年を記念した開発者のリーナス・トーバルズ氏のインタビュー - GIGAZINE

GitHub生誕10周年、これまでの功績を振り返るとこんな感じ - GIGAZINE

日付を元にバージョンを定める「カレンダー・バージョニング」という考え方 - GIGAZINE

私たちが何気なく使っているソフトウェアはどのように開発されているのか? - GIGAZINE

in ソフトウェア, Posted by log1d_ts

You can read the machine translated English article here.