【Git】Commitとは?役割とオプションの種類!ハッシュ/DAG/HEAD
この記事からわかること
- Gitのコミットとは?
- 役割とオプションの種類
- ハッシュ/DAG/HEADとは?
- コミットメッセージの残し方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
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
を実行することで確認できます。
$ git log
commit ec7d62b081c28a82768ed36ad26a75cc714c7fda
Author: USERNAME <USER EMAIL>
Date: Thu Jun 29 22:54:06 2023 +0900
READMEファイルの追加
--pretty=format:"%h"
をつけてフォーマットを指定すれば短縮されたコミットIDのみを取得することができます。
$ git log --pretty=format:"%h"
HEADとは
コミットを指すポインタとしてHEAD
と呼ばれるものがあります。これは現在のブランチの最新のコミットを指すポインタになっています。コミットが新しく追加されるとHEAD
は新しく追加したコミットを指すようになります。
Gitからブランチを指す方法はこのHEAD
もしくは一意のハッシュ値(省略可)を使用してコミットを指定します。
$ git show HEAD
$ git show ec7d62b081c28a82768ed36ad26a75cc714c7fda
$ git show ec7d62b
HEADの1つ前を指定する
$ git show HEAD^
$ git show HEAD~1
HEADの2つ前を指定する
$ git show HEAD^^
$ git show HEAD~2
まとめ
- リポジトリにファイルの変更や追加の履歴を保存すること
- 有向非巡回グラフ(DAG)と呼ばれるデータ構造で管理
- 親子関係
- ハッシュ値で識別
- 先頭を指すHEADというポインタあり
コミットコマンド(git commit)
実際にGitを操作してコミットを実行するにはgit commit
コマンドを使用します。コミットの前にはファイルの変更をステージングしている必要があるので忘れずに実行してください。
- ディレクトリをGitの管理下に置く(git init)
- ファイルを編集
- ステージング(git add)
- コミット(git commit)
コミットは以下のコマンドを叩きます。するとGitに設定しているエディタが起動しコミットメッセージを入力できるようになります。コミットメッセージはコミットの概要を記述します。「〇〇機能の追加」や「UIの修正」などファイルに対して行った操作(作成や変更、削除など)と箇所など分かりやすいメッセージを残します。
$ git commit
私の場合は以下のようにVi(Vim)
が起動しました。#
から始まる部分はコメント部分なので無視して上部にコミットメッセージを入力し:wq
と叩いて保存すればコミットは完了です。
ここにコミットメッセージを記述する
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch main
#
# Initial commit
#
# Changes to be committed:
# new file: README.md
#
# Changes not staged for commit:
# modified: README.md
#
# Untracked files:
# README2.md
#
~
いちいちエディタを起動させるのは面倒なので-m
を使用することで1つのコマンドでコミットメッセージごとコミットすることが可能です。
$ git commit -m “コミットメッセージ”
コマンドオプションの種類
オプション | 説明 |
---|---|
-m "メッセージ" |
コミットメッセージを指定 |
-a または--all |
変更されたすべてのファイルを自動的にステージングし、コミット |
-am "メッセージ" |
変更されたすべてのファイルを自動的にステージングし、指定されたメッセージでコミット |
-c "コミット" |
直前のコミットの内容を編集するためのエディタを開く |
--amend |
直前のコミットを修正 |
--allow-empty |
変更がない場合でも空のコミットを作成 |
--signoff |
コミットメッセージの末尾に署名を追加 |
コミットの履歴を見る方法
コミットの履歴を確認するにはgit log
コマンドを使用します。これは現在のブランチのコミット履歴を全て表示することができます。表示されるのはコミットハッシュ、ユーザー情報、タイムスタンプ、コミットメッセージです。
$ git log
commit 19911ef886c93dcd5ba01b0030a5e82c0cc2705c (HEAD -> main)
Author: USERNAME <USER EMAIL>
Date: Sat Jul 1 10:12:21 2023 +0900
READMEファイルに追記
commit ec7d62b081c28a82768ed36ad26a75cc714c7fda
Author: USERNAME <USER EMAIL>
Date: Thu Jun 29 22:54:06 2023 +0900
READMEファイルの追加
1行で表示する
$ git log --oneline
19911ef (HEAD -> main) READMEファイルに追記
ec7d62b READMEファイルの追加
ファイルを指定して表示する
$ git log -- README.md
コミットで変更されたファイルの情報(変更されたファイルの数、追加・削除された行数)を開示
$ git log --stat
commit ec7d62b081c28a82768ed36ad26a75cc714c7fda (HEAD -> main)
Author: USERNAME <USER EMAIL>
Date: Thu Jun 29 22:54:06 2023 +0900
READMEファイルの追加
README.md | 0
1 file changed, 0 insertions(+), 0 deletions(-)
コミット詳細な情報を見る
コミットの詳細な情報を見るのはgit show
コマンドを実行します。このコマンドはコミットで変更したファイルの差分を表示することができます。
$ git show HEAD
commit 19911ef886c93dcd5ba01b0030a5e82c0cc2705c (HEAD -> main)
Author: USERNAME <USER EMAIL>
Date: Sat Jul 1 10:12:21 2023 +0900
READMEファイルに追記
diff --git a/README.md b/README.md
index e69de29..1fa4a19 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+# TestGitProject
コミット同士の差分を表示する
コミット同士の差分を確認するにはgit diff
コマンドを実行します。引数には差分を確認したいコミットを2つ指定します。
$ git diff HEAD HEAD^
diff --git a/README.md b/README.md
index 1fa4a19..e69de29 100644
--- a/README.md
+++ b/README.md
@@ -1 +0,0 @@
-# TestGitProject
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
参考文献