目次

目次

Gitでハッシュ値指定が重複したらどうなるのか

鈴木
鈴木
最終更新日2019/07/24 投稿日2019/07/24

Gitではコミットすると

[master 9687931] firstcommit

みたいな感じでハッシュ値がつきます。 reflogなどでみると、7文字しか表示されないんですが裏側では

96879317b70a9ce7b206828f17e91626d084a630

こんな感じで40文字で保存されてます。 ブランチを移動する際にこのハッシュ値を指定して移動することができるのですが全文字入れなくても移動できます。

>git show 96879317b70a9ce7b206828f17e91626d084a630
commit 96879317b70a9ce7b206828f17e91626d084a630 (HEAD -> master)
>git show 9687931
commit 96879317b70a9ce7b206828f17e91626d084a630 (HEAD -> master)
>git show 9687
commit 96879317b70a9ce7b206828f17e91626d084a630 (HEAD -> master)
>git show 968
fatal: ambiguous argument '968': unknown revision or path not in the working tree.

こんな感じで4文字まで省略できるっぽいです。 で、これが重複したらどうなるか気になったので調べました。


まずいっぱいコミットしたGitリポジトリを用意します。 統計でいうとハッシュ値は8文字前後では2000件付近で重複し始めるので2000回くらいコミットしました。 で、git reflog > hash.txt みたいにしてハッシュ値の一覧をとります。

~~~
d23f482
2e9670c
3098a81
bbf7937
7433423
ffbcee3
e57b3c5
~~~

で、こんな感じで検索。

require("fs").readFile "hash.txt", (e,d)->
  chk = d.toString().split("\n").map (i)-> i.substr(0,4)
  chk.forEach (i,ind)->
    console.log "overlappp!", i if chk.indexOf(i) != ind and chk.indexOf(i) != ind

すると何件かでました。

overlappp! e218
overlappp! 7433
overlappp! a79f
overlappp! 1f0c
overlappp! a067
overlappp! 082b
overlappp! 51d8

重複してるハッシュ値で指定すると

>git show 7433
error: short SHA1 7433 is ambiguous
hint: The candidates are:
hint:   7433423 commit 2018-11-20 - commit
hint:   74338b7 commit 2018-11-20 - commit

曖昧であるとでて、可能性のあるハッシュ値を提示してくれます。 なるほど。

鈴木

和服とvapeとСистемаと醗酵とたまごふわふわとカッティングシェイプスとジャージークラブとjuke/fwkに傾倒する人です

目次