Referencje (refs)
Posługiwanie się SHA1 commitu jest wygodne do pewnego momentu. Kiedy w naszym projekcie pojawiają się branche (poza domyślnym, masterem), podłączamy lokalne repozytorium do zdalnych i zaczynami tagować nasze commity samo SHA1 staje się nieporęczne. Z pomocą przychodzi nam wtedy refs.
Refs jest niebezpośrednim sposobem odniesienia się do commitu, za pomocą aliasu. Wewnętrznie Git wykorzystuje refs do reprezentowania branchy oraz tagów.
Refs są przechowywane w katalogu .git/refs. Przykładowa zawartość (zależąca od stanu naszego repozytorium) może wyglądać następująco:
ll .git/refs
Standardowo możemy zobaczyć 3 katalogi:
- heads - zawiera wszystkie lokalne branche
- remotes - zawiera wszystkie branche pobrane ze wszystkich zdalnych repozytoriów (każde repozytorium odwzorowane jest w postaci podkatalogu)
- tags - analogicznie do heads lecz zawiera tagi zamiast branchy
Każdy z plików znajdujący się w katalogu .git/refs zawiera SHA1 commitu, na który wskazuje branch/tag. Aby się o tym przekonać wykonać w terminalu następujące polecenia:
cat .git/refs/heads/master
git log --format=format:%H -1 master
Wynik obu poleceń powinien być jednakowy.
Posługiwanie się refs
Refs może być wykorzystywane podobnie jak samo SHA1 commitu w poleceniach git. Przykładowo aby zobaczyć zawartość ostatniego commitu na branchu master możemy wykonać następujące polecenie:
git show master
Wewnętrznie git przetłumaczy to polecenie na:
git show refs/heads/master
Jest to szczególnie istotne kiedy posiadamy wiele branchy o tej samej nazwie na przestrzeni wielu repozytoriów (localny + zdalne). Aby sprawdzić zawartość ostatniego commitu na zdalnym branchu master wystarczy wykonać polecenie:
git show refs/remotes/origin/master