gitで特定のcommitバージョン/リビジョンを指すコレをなんと呼ぶか問題

# 問題

```
                         これ
       ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
commit 3a8461e04c04ed94a64df5d2cd7adbe764a2b8d8
Author: bigwheel <hogehoge@gmail.com>
Date:   Tue May 2 02:50:19 2017 +0900

    Fix Process output method
```

同僚に「ちょっとそのコミットの**これ**、slack DMで送ってー」なんて言うとき、あると思います。
**これ**をなんと呼ぶか。
自分はコミットハッシュないしコミットIDと呼んできましたがどうやら正しい呼称ではなさそう。

# 先に結論

[Git manual](https://git-scm.com/docs/gitglossary)的には `コミットのSHA-1` ないし `コミット(オブジェクト)?の(オブジェクト名|SHA-1)`が正しい。
もしくは[Pro Git \- Book](https://git-scm.com/book/en/v2)には以下の表現もある。

* コミットのSHA-1チェックサム
* コミットのSHA-1ハッシュ

ただし、**これ**そのものだけを他と区別して指す固有の用語はない。Git概念上コミットはオブジェクトの1種であり、Git上のオブジェクトはそれを一意に識別するSHA-1のハッシュ値を必ず持つため、**これ**は必然的に `コミットオブジェクトのSHA-1のハッシュ値` であるというだけである。

**これ**はGit利用上の重要度が他のSHA-1のハッシュ値と比べて段違いに高いため、固有の名詞があったほうが良いと思われる。

とりあえず僕はコミットハッシュとしばらく呼ぶことにします。

# 詳細

## 公式用語集を当たる

[Git \- gitglossary Documentation](https://git-scm.com/docs/gitglossary)

gitのmanualの用語集の中で関連しそうな項目は以下。

> コミット
>> 名詞として: Git履歴上の1点のこと。あるプロジェクトの履歴全体は相互に参照を持った(意訳)コミットの集合として表現されます。この"コミット"という単語はGitではしばしば他のバージョン管理システムでの"リビジョン"や"バージョン"と同じ場所で用いられます。またコミットオブジェクトの省略としても使われます。
>>
>> 動詞として: Git履歴にプロジェクトの状態を新しいスナップショットとして保存するアクションのこと。それは現在のインデックス状態を表す新しいコミットを作り、HEADを新しいコミットのポイントへ進めることで行われます。
>
> コミットオブジェクト
>> 特定のリビジョンについての次のような情報を含むオブジェクトです:
>> * 親
>> * コミッター
>> * オーサー(著者)
>> * 日付
>> * 保存されたリビジョンのトップディレクトリに対応した(≒相対パスの、という意味か)ツリーオブジェクト
>
> リビジョン
>> コミット(名詞)の同義語
>
> オブジェクト
>> Gitでの保存の単位。これはその中身のSHA-1で一意に識別されます。それ故に、オブジェクトは変更することができません。
>
> オブジェクト名
>> オブジェクトの一意な識別子。このオブジェクト名はよく40桁の16進文字列で表現されます。また口語ではSHA-1と呼ばれます。
>
> SHA-1
>> "セキュアハッシュアルゴリズム1"; 暗号化ハッシュ関数です。Gitの文脈ではオブジェクト名の同義語として使われます。

これに従うなら次が正式名称になる。

```
コミットオブジェクトのオブジェクト名
```

コミットオブジェクトはコミットという省略、オブジェクト名はSHA-1という同義語があると書いているので正規表現で表記するなら次になる。

```
コミット(オブジェクト)?の(オブジェクト名|SHA-1)
```

でも正直なところあれのことをオブジェクト名なんて呼んでいる人・記事を見たことがないし同義語のSHA-1だって「それハッシュアルゴリズムのことじゃないですかwww」って煽られそうである。


## Git公式ガイド[Pro Git \- Book](https://git-scm.com/book/en/v2)ではなんと書かれているか

最初に**これ**に関する言及があるページは[Git \- Viewing the Commit History](https://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-History)

> By default, (中略) this command lists each **commit with its SHA-1 checksum**, the author’s name and email, the date written, and the commit message.

その他**これ**に関する言及があるページをいくつか拾ってみた。

[Git \- Revision Selection](https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection)

> Single Revisions
>> You can obviously refer to any single commit by its **full, 40-character SHA-1 hash**, but there are more human-friendly ways to refer to commits as well.

[Git \- Branches in a Nutshell](https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell)

> Because a branch in Git is actually a simple file that contains **the 40 character SHA-1 checksum of the commit** it points to, branches are cheap to create and destroy.

[Git \- Maintaining a Project](https://git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project)

> If you want to pull **commit `e43a6`** into your master branch, you can run

というわけで、Git公式であるPro Gitですら**これ**の表現は文脈により毎回異なり、表現のため非常に苦慮していることがわかった。

## GitHubはどう扱っているか

[GitHub 用語集 \- GitHub Docs](https://docs.github.com/ja/get-started/quickstart/github-glossary#commit-id)

> コミットID
> 別名 SHA。コミットを特定する 40 文字のチェックサムハッシュ。

ただし、これはGitの公式の用語集にはない呼称で、GitHub独自の呼び方である。コミットID = CommitのIdentifierというのは間違っていないが・・・。

## まとめ

公式の呼称の定義は一応あるものの**これ**のみを限定して指す固有の用語はない。
またその固有の用語がないことでPro Gitなどでも苦慮している様子が伺える。
僕も含め全世界のエンジニアが同様に困ってそうなので、固有の用語があったほうが良さそう[^1]。

[^1]: 邪推すると**これ**に今まで固有の用語がなかったのはいわゆるPlumbing層が優先されてPorcelain層が軽視されてきたためだと思う