この記事は最終更新日から1年以上が経過しています。
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に傾倒する人です
最近書いた記事
- 2019.10.17ES2019で追加されたあれこれを使ってみる
- 2019.09.20JavaScript で安全に扱える最大整数
- 2019.07.24Gitでハッシュ値指定が重複したらどうなるのか
- 2019.07.09ハッシュは何に使えるのか