【Git】Commitとは?役割とオプションの種類!ハッシュ/DAG/HEAD

この記事からわかること
- Gitのコミットとは?
- 役割とオプションの種類
- ハッシュ/DAG/HEADとは?
- コミットメッセージの残し方
index
[open]
\ アプリをリリースしました /
GitのCommit(コミット)とは?
Commit(コミット)とはリポジトリにファイルの変更や追加の履歴を保存することやその保存単位を指します。Gitの管理下にあったファイルなどの追加や変更を1つのコミットとしてまとめて履歴に保存することでプログラムのバージョン管理が可能になります。
現在のステージングされているファイルやディレクトリの状態をそのままスナップショットとして切り出すといった方がわかりやすいかもしれません。
そして蓄積されていくコミットたちは有向非巡回グラフ(DAG)と呼ばれるデータ構造で保存され、変更内容だけでなく、コミットを識別するためのハッシュ値やコミットメッセージ、タイムスタンプ、親コミットを指すポインタなどの情報も一緒に記録されます。

有向非巡回グラフ(DAG:Directed Acyclic Graph)
有向非巡回グラフ(DAG:Directed Acyclic Graph)とは一方向に伸びていく(有向)直線的な(非巡回)グラフのことです。名称の「有向」とは「向きが定まっている」、「非巡回」とは「巡回することない(環にならない)」という意味だと思います。
GitのコミットもDAG形式で管理されており、最初のコミット(initial)から2回目のコミット(First)がされた場合に両者は親と子の関係になります。子側は親コミットを指すポインタを持っています。これにより任意のコミットから履歴を遡ることができるようになっています。
一意のハッシュ値
コミットを識別するための識別子としてハッシュが振られます。この値はSHA-1(シャーワン)というハッシュ関数を使用して生成され、Git上では生成されたハッシュ値の先頭7桁が表示されます。SHA-1を使用したハッシュ値は実際には160ビット(16進数では40桁)です。
このハッシュ値はコミットの内容などをもとに生成されているため、重複する可能性は極めて少ないですが、確率上は重複することもあるようです。
コミットのハッシュ値はコミット履歴を確認するgit log
を実行することで確認できます。
--pretty=format:"%h"
をつけてフォーマットを指定すれば短縮されたコミットIDのみを取得することができます。
HEADとは
コミットを指すポインタとしてHEAD
と呼ばれるものがあります。これは現在のブランチの最新のコミットを指すポインタになっています。コミットが新しく追加されるとHEAD
は新しく追加したコミットを指すようになります。
Gitからブランチを指す方法はこのHEAD
もしくは一意のハッシュ値(省略可)を使用してコミットを指定します。
HEADの1つ前を指定する
HEADの2つ前を指定する
まとめ
- リポジトリにファイルの変更や追加の履歴を保存すること
- 有向非巡回グラフ(DAG)と呼ばれるデータ構造で管理
- 親子関係
- ハッシュ値で識別
- 先頭を指すHEADというポインタあり
コミットコマンド(git commit)
実際にGitを操作してコミットを実行するにはgit commit
コマンドを使用します。コミットの前にはファイルの変更をステージングしている必要があるので忘れずに実行してください。
- ディレクトリをGitの管理下に置く(git init)
- ファイルを編集
- ステージング(git add)
- コミット(git commit)
コミットは以下のコマンドを叩きます。するとGitに設定しているエディタが起動しコミットメッセージを入力できるようになります。コミットメッセージはコミットの概要を記述します。「〇〇機能の追加」や「UIの修正」などファイルに対して行った操作(作成や変更、削除など)と箇所など分かりやすいメッセージを残します。
私の場合は以下のようにVi(Vim)
が起動しました。#
から始まる部分はコメント部分なので無視して上部にコミットメッセージを入力し:wq
と叩いて保存すればコミットは完了です。
いちいちエディタを起動させるのは面倒なので-m
を使用することで1つのコマンドでコミットメッセージごとコミットすることが可能です。
コマンドオプションの種類
オプション | 説明 |
---|---|
-m "メッセージ" |
コミットメッセージを指定 |
-a または--all |
変更されたすべてのファイルを自動的にステージングし、コミット |
-am "メッセージ" |
変更されたすべてのファイルを自動的にステージングし、指定されたメッセージでコミット |
-c "コミット" |
直前のコミットの内容を編集するためのエディタを開く |
--amend |
直前のコミットを修正 |
--allow-empty |
変更がない場合でも空のコミットを作成 |
--signoff |
コミットメッセージの末尾に署名を追加 |
コミットの履歴を見る方法
コミットの履歴を確認するにはgit log
コマンドを使用します。これは現在のブランチのコミット履歴を全て表示することができます。表示されるのはコミットハッシュ、ユーザー情報、タイムスタンプ、コミットメッセージです。
1行で表示する
ファイルを指定して表示する
コミットで変更されたファイルの情報(変更されたファイルの数、追加・削除された行数)を開示
コミット詳細な情報を見る
コミットの詳細な情報を見るのはgit show
コマンドを実行します。このコマンドはコミットで変更したファイルの差分を表示することができます。
コミット同士の差分を表示する
コミット同士の差分を確認するにはgit diff
コマンドを実行します。引数には差分を確認したいコミットを2つ指定します。
コミットコメントルール
コミットコメントは基本的に自由ですが、チームで開発していく上ではある程度ルールを設けておくと統一化できてわかりやすくなります。angular.js/DEVELOPERS.mdに記載されている以下のようなルールが個人的にはわかりやすくて採用しています。
このルールは接頭辞にfeat:
などを付与するといったものです。これによりコミットの内容のカテゴリを瞬時に識別できるようになります。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
参考文献