-
1. Pierwsze kroki
- 1.1 Wprowadzenie do kontroli wersji
- 1.2 Krótka historia Git
- 1.3 Podstawy Git
- 1.4 Linia poleceÅ
- 1.5 Instalacja Git
- 1.6 WstÄpna konfiguracja Git
- 1.7 Uzyskiwanie pomocy
- 1.8 Podsumowanie
-
2. Podstawy Gita
- 2.1 Pierwsze repozytorium Gita
- 2.2 Rejestrowanie zmian w repozytorium
- 2.3 PodglÄ d historii rewizji
- 2.4 Cofanie zmian
- 2.5 Praca ze zdalnym repozytorium
- 2.6 Tagowanie
- 2.7 Aliasy
- 2.8 Podsumowanie
-
3. GaÅÄzie Gita
-
4. Git na serwerze
- 4.1 ProtokoÅy
- 4.2 Uruchomienie Git na serwerze
- 4.3 Generowanie Twojego publicznego klucza SSH
- 4.4 Konfigurowanie serwera
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Inne opcje hostowania przez podmioty zewnÄtrzne
- 4.10 Podsumowanie
-
5. Rozproszony Git
-
6. GitHub
-
7. NarzÄdzia Gita
- 7.1 Wskazywanie rewizji
- 7.2 Interaktywne używanie przechowali
- 7.3 Schowek i czyszczenie
- 7.4 Signing Your Work
- 7.5 Searching
- 7.6 Przepisywanie historii
- 7.7 Reset Demystified
- 7.8 Advanced Merging
- 7.9 Rerere
- 7.10 Debugowanie z Gitem
- 7.11 ModuÅy zależne
- 7.12 Bundling
- 7.13 Replace
- 7.14 Credential Storage
- 7.15 Podsumowanie
-
8. Dostosowywanie Gita
- 8.1 Konfiguracja Gita
- 8.2 Git Attributes
- 8.3 Git Hooks
- 8.4 An Example Git-Enforced Policy
- 8.5 Summary
-
9. Git i inne systemy
- 9.1 Git jako klient
- 9.2 Migracja do Gita
- 9.3 Podsumowanie
-
10. Mechanizmy wewnÄtrzne w Git
- 10.1 Komendy typu plumbing i porcelain
- 10.2 Obiekty Gita
- 10.3 Referencje w Git
- 10.4 Spakowane pliki (packfiles)
- 10.5 Refspec
- 10.6 ProtokoÅy transferu
- 10.7 Konserwacja i odzyskiwanie danych
- 10.8 Environment Variables
- 10.9 Podsumowanie
-
A1. Appendix A: Git in Other Environments
- A1.1 Graphical Interfaces
- A1.2 Git in Visual Studio
- A1.3 Git in Eclipse
- A1.4 Git in Bash
- A1.5 Git in Zsh
- A1.6 Git in Powershell
- A1.7 Summary
-
A2. Appendix B: Embedding Git in your Applications
- A2.1 Command-line Git
- A2.2 Libgit2
- A2.3 JGit
-
A3. Appendix C: Git Commands
- A3.1 Setup and Config
- A3.2 Getting and Creating Projects
- A3.3 Basic Snapshotting
- A3.4 Branching and Merging
- A3.5 Sharing and Updating Projects
- A3.6 Inspection and Comparison
- A3.7 Debugging
- A3.8 Patching
- A3.9 Email
- A3.10 External Systems
- A3.11 Administration
- A3.12 Plumbing Commands
10.3 Mechanizmy wewnÄtrzne w Git - Referencje w Git
Referencje w Git
Za pomocÄ
komendy git log 1a410e
możesz również przejrzeÄ caÅÄ
historiÄ swojego projektu, ale musisz wiedzieÄ, że 1a410e
jest ostatniÄ
zmianÄ
(commitem) aby zobaczyÄ wszystkie modyfikacje.
Potrzebujesz pliku w którym bÄdziesz mógÅ zapisywaÄ wartoÅÄ SHA-1 pod ÅatwiejszÄ
nazwÄ
, tak abyÅ mógÅ jej używaÄ zamiast sumy SHA-1.
W Gitcie nazywane sÄ
one "referencjami" lub krócej "refs"; możesz znaleÅŗÄ pliki zawierajÄ
ce wartoÅÄ SHA-1 w katalogu .git/refs
.
W obecnym projekcie ten katalog nie zawiera żadnych plików, a jego struktura wyglÄ
da tak:
$ find .git/refs
.git/refs
.git/refs/heads
.git/refs/tags
$ find .git/refs -type f
Aby stworzyÄ nowÄ referencjÄ, która pomocna bÄdzie przy zapamiÄtywaniu który commit jest ostatni, możesz wykonaÄ tÄ prostÄ komendÄ:
$ echo "1a410efbd13591db07496601ebc7a059dd55cfe9" > .git/refs/heads/master
Teraz, możesz używaÄ referencji którÄ wÅaÅnie stworzyÅeÅ zamiast sumy SHA-1 w komendach Gita:
$ git log --pretty=oneline master
1a410efbd13591db07496601ebc7a059dd55cfe9 third commit
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit
Nie musisz bezpoÅrednio zmieniaÄ plików referencji.
Git udostÄpnia bezpieczniejsze narzÄdzie do tego, gdy chcesz zaktualizowaÄ referencje wywoÅaj update-ref
:
$ git update-ref refs/heads/master 1a410efbd13591db07496601ebc7a059dd55cfe9
Praktycznie tym samym sÄ gaÅÄzie w Git: proste wskazanie lub referencja na najnowszÄ wprowadzonÄ zmianÄ. Aby stworzyÄ gaÅÄ Åŗ z poprzedniego commita, wykonaj to:
$ git update-ref refs/heads/test cac0ca
Twoja gaÅÄ Åŗ bÄdzie zawieraÅa tylko zmiany starsze niż podany commit:
$ git log --pretty=oneline test
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit
W tej chwili, Twoja baza w Git wyglÄ da podobnie do poniższej:

Gdy uruchamiasz komendÄ takÄ
jak git branch (nazwagaÅÄzi)
, Git po prostu uruchamia komendÄ update-ref
, w celu dodania sumy SHA-1 ostatniego commita w gaÅÄzi na której siÄ obecnie znajdujesz, do referencji którÄ
chcesz stworzyÄ.
HEAD
Powstaje pytanie, po uruchomieniu git branch (nazwagaÅÄzi)
, skÄ
d Git wie jaka jest suma SHA-1 ostatniego commita?
OdpowiedÅŗ to plik HEAD.
W pliku HEAD znajduje siÄ symboliczne dowiÄ zanie do gaÅÄzi w której siÄ obecnie znajdujesz. Poprzez symboliczne dowiÄ zanie, mam na myÅli to, że inaczej niż w przypadku normalnego dowiÄ zania, nie zawiera ono sumy SHA-1, ale wskaÅŗnik na innÄ referencjÄ. Jak zobaczysz na zawartoÅÄ tego pliku, zazwyczaj zobaczysz coÅ w stylu:
$ cat .git/HEAD
ref: refs/heads/master
Po uruchomieniu git checkout test
, Git zaktualizuje ten plik, aby zawieraÅ:
$ cat .git/HEAD
ref: refs/heads/test
Gdy uruchomisz git commit
, zostanie stworzony obiekt commit, okreÅlajÄ
c rodzica tego obiektu na podstawie wartoÅÄ SHA-1 na którÄ
wskazuje HEAD.
Możesz również rÄcznie zmodyfikowaÄ ten plik, ale bezpieczniej bÄdzie użyÄ komendy symbilic-ref
.
Możesz odczytaÄ wartoÅÄ która jest w HEAD przy jej pomocy:
$ git symbolic-ref HEAD
refs/heads/master
Możesz również ustawiÄ nowÄ wartoÅÄ HEAD:
$ git symbolic-ref HEAD refs/heads/test
$ cat .git/HEAD
ref: refs/heads/test
Nie możesz jednak wstawiÄ symbolicznego dowiÄ zania które jest poza katalogiem refs:
$ git symbolic-ref HEAD test
fatal: Refusing to point HEAD outside of refs/
Etykiety
PoznaÅeÅ już trzy gÅówne obiekty Gita, ale istnieje jeszcze czwarty. Obiekt tag, jest bardzo podobny do obiektu commit ā zawiera informacje o osobie, dacie, treÅci komentarza i wskaÅŗnik. GÅównÄ różnicÄ jest to, że obiekt tag wskazuje na commit, a nie na obiekt tree. Jest podobny do referencji gaÅÄzi, ale nigdy siÄ nie zmienia ā zawsze wskazuje na ten sam commit, ale z ÅatwiejszÄ nazwÄ .
Tak jak opisaliÅmy w rozdziale Podstawy Gita, istniejÄ dwa typy etykiet: anotowane i lekkie. Możesz stworzyÄ lekkÄ etykietÄ poprzez uruchomienie:
$ git update-ref refs/tags/v1.0 cac0cab538b970a37ea1e769cbbde608743bc96d
WÅaÅnie tym jest lekka etykieta ā gaÅÄziÄ
która nigdy siÄ nie zmienia.
Opisana etykieta jest jednak bardziej skomplikowana.
Gdy tworzysz opisanÄ
etykietÄ, Git stworzy obiekt tag, a nastÄpnie zapisze referencjÄ wskazujÄ
ca na niego, zamiast na obiekt commit.
Możesz to zauważyÄ, po stworzeniu opisanej etykiety (-a
wskazuje że bÄdzie to opisana etykieta):
$ git tag -a v1.1 1a410efbd13591db07496601ebc7a059dd55cfe9 -m 'test tag'
Stworzona zostaÅa nastÄpujÄ ca wartoÅÄ SHA-1:
$ cat .git/refs/tags/v1.1
9585191f37f7b0fb9444f35a9bf50de191beadc2
Teraz, uruchom komendÄ cat-file
na tej wartoÅÄ SHA-1:
$ git cat-file -p 9585191f37f7b0fb9444f35a9bf50de191beadc2
object 1a410efbd13591db07496601ebc7a059dd55cfe9
type commit
tag v1.1
tagger Scott Chacon <schacon@gmail.com> Sat May 23 16:48:58 2009 -0700
test tag
Zauważ, że wpis rozpoczynajÄ cy siÄ od "object" wskazuje na sumÄ SHA-1 commitu który zatagowaÅeÅ. Zauważ również, że nie musi on wskazywaÄ na commit; możesz stworzyÄ etykietÄ dla każdego obiektu w Git. Na przykÅad, w kodzie ÅŗródÅowym Gita, opiekun projektu zamieÅciÅ publiczny klucz GPG, jako obiekt blob i nastÄpnie go otagowaÅ. Możesz zobaczyÄ klucz publiczny uruchamiajÄ c poniższe polecenie w sklonowanym repozytorium Git:
$ git cat-file blob junio-gpg-pub
Repozytorium ze ÅŗródÅami projektu Linux ma również taki tag ā pierwszy tag stworzony z poczÄ tkowego stanu kodu ÅŗródÅowego.
Zdalne repozytoria
Trzecim typem referencji który poznasz, sÄ
referencje zdalne.
Jeżeli dodasz zdalne repozytorium i wypchniesz do niego kod, Git przechowa wartoÅÄ którÄ
ostatnio wypchnÄ
ÅeÅ do niego, dla każdej gaÅÄzi w katalogu refs/remotes
.
Na przykÅad, możesz dodaÄ zdalne repozytorium o nazwie origin
i wypchnÄ
Ä gaÅÄ
Åŗ master
do niego:
$ git remote add origin git@github.com:schacon/simplegit-progit.git
$ git push origin master
Counting objects: 11, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 716 bytes, done.
Total 7 (delta 2), reused 4 (delta 1)
To git@github.com:schacon/simplegit-progit.git
a11bef0..ca82a6d master -> master
NastÄpnie możesz zobaczyÄ w którym miejscu byÅa gaÅÄ
Åŗ master
na zdalnym repozytorium origin
w czasie gdy wysyÅaÅeÅ zmiany, przez sprawdzenie pliku refs/remotes/origin/master
:
$ cat .git/refs/remotes/origin/master
ca82a6dff817ec66f44342007202690a93763949
Referencje zdalne różniÄ
siÄ od gaÅÄzi (referencje refs/heads
) gÅównie tym, że sÄ
tylko do odczytu.
Możesz wykonaÄ git checkout
do jednej z nich, ale Git nie wskaże HEAD-a, wiÄc nigdy nie zaktualizujesz go komendÄ
commit
.
Git zarzÄ
dza nimi jak zakÅadkami do ostatniego znanego stanu, w którym te gaÅÄzie byÅy na tych serwerach.