Ponieważ jest to oznaczone tagiem git, mam nadzieję, że mój brak wiedzy na temat SVN jest pomijalny.
Obecnie klonuję repozytorium i klonuję konkretną gałąź za pomocą gitk.
Klonujesz całe zdalne repozytorium nie tylko określoną gałąź.
Repozytorium najlepiej wyobrażać sobie jako bazę danych, więc tworzysz klon bieżącego stanu zdalnej bazy danych. Ale potem pracujesz nad własną kopią tej bazy danych; jeśli się zgodzisz, zmienisz lokalną bazę danych.
fetch
Polecenie służy do utrzymania lokalnej bazy danych w synchronizacji ze zdalnym jeden.
Zwykle z tej lokalnej bazy danych pobierasz oddział do pracy. To nic innego jak wewnętrzny znacznik git, od którego zaczęła się twoja obecna praca.
Załóżmy, że pracujesz nad prostym repozytorium, w którym nie ma żadnej gałęzi master
, możesz zajrzeć do .git
folderu, aby odsłonić „magię”:
Załóżmy, że twoje ostatnie zatwierdzenie (wł. master
) Było 182e8220b404437b9e43eb78149d31af79040c66
, znajdziesz dokładnie to pod cat .git/refs/heads/master
.
Od tego, że rozgałęziasz nową gałąź git checkout -b mybranch
, znajdziesz dokładnie ten sam wskaźnik w pliku cat .git/refs/heads/mybranch
.
Oddziały są niczym więcej jak „wskaźnikami”. Znacznik „pracujący” nazywa się a HEAD
.
Jeśli chcesz wiedzieć, gdzie jesteś HEAD
:
cat .git/HEAD
która mówi np. ref: refs/heads/mybranch
, która z kolei wskazuje ( cat .git/refs/heads/mybranch
) na wartość skrótu zatwierdzenia78a8a6eb6f82eae21b156b68d553dd143c6d3e6f
Rzeczywiste zatwierdzenia są przechowywane w objects
folderze (sposób, w jaki sam jest tematem).
Folder projektu zawiera tylko treść dla tej gałęzi i nie widzę wszystkich gałęzi jak w SVN, co jest dla mnie trochę mylące.
Nie myl tego working directory
z „bazą danych git” jako całością. Jak powiedziałem powyżej, twój katalog roboczy jest jedynie migawką (być może) podzbioru.
Załóżmy, że masz różne gałęzie, twój katalog roboczy jest przeznaczony do pracy tylko w tej gałęzi (chociaż możesz umieścić pracę stamtąd gdzie indziej).
Zwykle, jeśli chcesz zobaczyć, jakie gałęzie są zdefiniowane dla projektu, masz taką możliwość
git branch
dla lokalnych oddziałów
git branch --remote
dla zdalnych oddziałów
git branch -a
dla obu
(lub git branch -v
)
Ponieważ git jest rozproszonym systemem kontroli wersji, nie tylko możliwe, ale i zachęcane jest tworzenie różnych gałęzi lokalnie / zdalnie.
Mój typowy przepływ pracy to:
- rozgałęzić gałąź funkcji
- rozgałęziaj z tego gałąź WIP (praca w toku)
- działaj tak, jak chcesz - nawet jeśli popełniasz po jednej linii; to nie ma znaczenia
Po zakończeniu funkcji:
- squash /
WIP
przerób gałąź (z interaktywnym rebasingiem) = wykonaj z tego pojedynczy zatwierdzenie
- połącz
WIP
gałąź z gałęzią funkcji i zaoferuj, że (jeśli pracujesz z github, ta oferta będzie nazywana „żądaniem ściągania”) w celu zintegrowania z gałęzią stabilną (główną).
Chciałbym również wiedzieć, jak obsługiwać proces, w którym muszę wprl na dwóch gałęziach jednocześnie, na przykład, jeśli muszę na przykład wykonać poprawkę na masterie, ale zachować zawartość innej gałęzi.
To zależy od struktury twojego projektu:
Powiedz, że masz stabilnego mistrza. A funkcje są rozwijane tylko z tej stabilnej gałęzi - więc zwykle znajduje się za gałęzią funkcji. Wtedy miałbyś ostatnie zatwierdzenie na masterie, które byłoby rdzeniem gałęzi funkcji.
Następnie dokonałeś zatwierdzenia w gałęzi master i możesz zdecydować, czy połączyć obie gałęzie razem, czy też dokonać zmiany bazy (co jest rodzajem scalenia dla użytkowników z zaawansowanymi potrzebami, że tak powiem).
Lub zawsze możesz wprowadzać zmiany w oddziałach (np. master
) I wybierać je w innych oddziałach.
Jakie są zalecane konwencje nazw, aby foldery zawierające gałąź były klonowane z repozytorium w GIT, na przykład myproject-branchname
To zależy od Ciebie.
Zazwyczaj kończy się na nazwie repozytoriów.
Ale zdarzają się sytuacje, gdy nie jest to pożądane:
np. sklonujesz oh-my-zsh z git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
Here .oh-my-zsh
jest wyraźnie nazwany jako cel.