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

この記事からわかること

  • Gitコミットとは?
  • 役割オプション種類
  • ハッシュ/DAG/HEADとは?
  • コミットメッセージ残し方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

GitのCommit(コミット)とは?

Commit(コミット)とはリポジトリにファイルの変更や追加の履歴を保存することやその保存単位を指します。Gitの管理下にあったファイルなどの追加や変更を1つのコミットとしてまとめて履歴に保存することでプログラムのバージョン管理が可能になります。

現在のステージングされているファイルやディレクトリの状態をそのままスナップショットとして切り出すといった方がわかりやすいかもしれません。

そして蓄積されていくコミットたちは有向非巡回グラフ(DAG)と呼ばれるデータ構造で保存され、変更内容だけでなく、コミットを識別するためのハッシュ値やコミットメッセージ、タイムスタンプ、親コミットを指すポインタなどの情報も一緒に記録されます。

【Git】Commitとは?使い方とオプションの違いと役割

有向非巡回グラフ(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

まとめ

コミットコマンド(git commit)

実際にGitを操作してコミットを実行するにはgit commitコマンドを使用します。コミットの前にはファイルの変更をステージングしている必要があるので忘れずに実行してください。

  1. ディレクトリをGitの管理下に置く(git init)
  2. ファイルを編集
  3. ステージング(git add)
  4. コミット(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

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

参考文献

有向非巡回グラフ

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index