Jestem użytkownikiem SVN, a teraz uczę się Git.
W SVN zazwyczaj kasuję na moim komputerze lokalnym repozytorium, które obejmuje wszystkie gałęzie w moim projekcie i wybrałem folder dla mojej gałęzi, którą jestem zainteresowany i tam pracuję.
Widzę różnicę przy użyciu Git.
Obecnie klonuję repozytorium i klonuję konkretną gałąź za pomocą gitk.
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 mogę znaleźć łatwego sposobu, aby zobaczyć wszystkie gałęzie w moim lokalnym repozytorium za pomocą Git.
Chciałbym wiedzieć, czy proces Git, który opisałem, jest „standardowy”, a niektórzy, jak poprawny lub coś mi brakuje.
Chciałbym również wiedzieć, jak obsługiwać proces, w którym muszę pracować jednocześnie na dwóch gałęziach, na przykład, jeśli muszę na przykład wykonać poprawkę w systemie głównym, ale zachować zawartość innej gałęzi.
Jakie są zalecane konwencje nazw, aby na przykład foldery zawierające gałąź były klonowane z repozytorium w Git
myproject-branchname
?
git clone
jest bardziej podobnysvnadmin hotcopy
lubsvnrdump
+svnadmin load
niż to jestsvn checkout
. Dziękigit
, nie żądać kawałki z tym repozytorium; kopiujesz całe repozytorium i pracujesz z nim lokalnie, wypychając zmiany z powrotem do repozytorium „źródłowego”, kiedy tylko masz na to ochotę. Git i Subversion używają dwóch całkowicie różnych modeli do kontroli źródła.git-flow
Odpowiedzi:
Witaj w gangu!
Reedukacja SVN
Poczekaj chwilę. Podczas gdy CVS i SVN oraz inny tradycyjny (tj. Scentralizowany) system kontroli wersji spełniają (głównie) ten sam cel, co nowoczesne (tj. Rozproszone) systemy kontroli wersji, takie jak mercurial i Git, znacznie lepiej będzie uczyć się Git od podstaw zamiast próba przeniesienia przepływu pracy SVN do Git.
http://hginit.com ( widok na archive.org ) autorstwa Joela Spolsky'ego (jednego z założycieli Stack Exchange) to tutorial dla mercurial, nie Git, ale jest to zerowy rozdział, „Ponowna edukacja Subversion” to przydatne dla osób zmieniających się od SVN do dowolnego rozproszonego systemu kontroli wersji, jak to mówi, co SVN koncepcje trzeba (tymczasowo) un -learn (lub
stash
z dala , jak użytkownicy Git może powiedzieć), aby być w stanie owinąć wokół głowy rozproszonych koncepcje systemu kontroli wersji i idiomatyczne przepływy pracy ustanowione do pracy z nimi.Możesz więc przeczytać ten zerowy rozdział i przeważnie po prostu zastąpić słowo „merkurial” słowem „Git”, a tym samym odpowiednio przygotować siebie i swój umysł na Git.
Drobnym drukiem
(Można pominąć ten na razie). Podczas Mercurial i Git są znacznie bardziej podobne do siebie niż do SVN, nie są pewne różnice koncepcyjne między nimi, więc niektóre z wypowiedzi i rady w „Subversion reedukacji” staną się technicznie źle przy zamianie „merkurial” na „Git”:
W SVN wszystko jest katalogiem (ale niekoniecznie należy traktować go jako taki)
Ale przeszkadzałem ci. Mówiłeś?
Jeśli przez to masz na myśli, że sprawdziłeś folder główny repozytorium SVN (lub jakikolwiek inny folder odpowiadający więcej niż
trunk
jednemu oddziałowi, np. W tradycyjnym układzie repozytorium SVNbranches
folder zawierający wszystkie gałęzie inne niż trunk) Śmiem twierdzić, że prawdopodobnie użyłeś SVN źle (ish), a przynajmniej trochę nadużyłeś faktu, że pień, gałęzie i znaczniki są złożone w jedną (choć hierarchiczną) przestrzeń nazw wraz z katalogami w ramach wersji / bazy kodu.Chociaż może być kuszące, aby zmienić kilka gałęzi SVN równolegle, to AFAIK, a nie sposób, w jaki SVN ma być używany. (Nie jestem jednak pewien, jakie mogą mieć wady tego rodzaju.)
W Git tylko katalogi są katalogami
Każdy klon repozytorium Git jest repozytorium Git: domyślnie pobiera pełną kopię historii repozytorium źródłowego, w tym wszystkie wersje, gałęzie i znaczniki. Ale to wszystko po naszej stronie: Git przechowuje go w pewnego rodzaju bazie danych opartej na plikach, znajdującej się w ukrytym
.git/
podfolderze folderu głównego repozytorium .Ale jakie są nie ukryte pliki widoczne w folderze repozytorium?
Kiedy jesteś
git clone
repozytorium, Git robi kilka rzeczy. W przybliżeniu:.git/
podfolder z „bazą danych”master
).Ten ostatni krok oznacza, że Git sprawdza poprawkę wskazaną przez tę gałąź i rozpakowuje zapisane tam drzewo plików (baza danych używa pewnych metod kompresji i usuwania duplikatów) do folderu głównego repozytorium. Ten folder główny i wszystkie jego podfoldery (z wyjątkiem specjalnego
.git
podfolderu) są znane jako „kopia robocza” repozytorium. Tam wchodzisz w interakcję z zawartością aktualnie sprawdzonej wersji / oddziału. To tylko zwykłe foldery i pliki. Jednak do interakcji z repozytorium per se („bazą danych” wersji i referencji) używaszgit
poleceń.Wyświetlanie gałęzi Git i interakcja z gałęziami Git
Wersja,
gitk
którą otrzymałem, nie może klonować repozytoriów. Może tylko przeglądać historię repo i tworzyć oddziały oraz sprawdzać oddziały. Ponadto nie ma „klonowania” gałęzi. Możesz klonować tylko repozytoria.Czy chodziło Ci o klonowanie repozytorium za pomocą,
git clone ...
a następnie za pomocągitk
, sprawdzenie oddziału?Tak, to dość standardowe:
git clone ...
git checkout ...
lub używając narzędzia graficznego, takiego jakgikt
Może:
git branch
git branch -r
lub wszystkie gałęzie zgit branch -a
możesz użyć,
gitk
aby wyświetlić pełną historię (wszystkie tagi oddziałów itp., o których wie Twoje lokalne repozytorium), wywołując jąJak pracować z wieloma gałęziami równolegle
Istnieją różne scenariusze:
Nowa (jeszcze nie utworzona) zmiana musi zostać zastosowana do wielu gałęzi
Użyj tego przepływu pracy:
c
z wersji, która już jest w przodkach wszystkich tych gałęzi (np. Wersja, która wprowadziła błąd, gdy zmiana będzie poprawką) lub z wersji, która (w tym wszyscy jego przodkowie) jest dopuszczalna do wprowadzenia w wszystkie te gałęzie.c
.Dla każdej gałęzi,
b
która wymaga zmiany:Sprawdź
b
:Scal
c
wb
:Usuń oddział
c
:Konieczna jest istniejąca zmiana w innym oddziale
(... ale bez innych zmian dokonanych w miejscu, w którym ta zmiana się znajduje)
W jednej gałęzi
a
chcesz zmienić jeden lub kilka plików do dokładnego stanu, jaki mają w innej gałęzib
a
Pobierz zawartość pliku z oddziału
b
:(Inaczej niż
git checkout
bez podania ścieżek, to nie przełączy się na gałąźb
, tylko stamtąd pobierze żądaną zawartość pliku. Te pliki mogą lub nie mogą już istnieća
. Jeśli tak, to zostaną zastąpione zawartościąb
.)Pracując nad jedną gałęzią, chcesz sprawdzić, jak się sprawy mają w innej gałęzi
Sprawdź oddział, nad którym chcesz pracować.
Następnie, patrząc na drugą gałąź,
gitk
spróbuj zmienić przyciski opcji z „łatki” na „drzewo”)git worktree
aby utworzyć oddzielny katalog roboczy tego samego repozytorium (tj. również korzystając z bazy danych w.git/
katalogu bieżącego lokalnego repozytorium), w którym możesz sprawdzić tę inną gałąźźródło
stash
jest idealny.git stash
dobrze jest odsunąć niedokończone prace, np. zmienić gałęzie, a później wrócić.O ile nie przejrzysz katalogu powyżej pnia, w Subversion na ogół nie masz wszystkich gałęzi dostępnych lokalnie. W Git wszystkie treści (zatwierdzenia, wiadomości, gałęzie itp.) Są zawsze klonowane do każdej kopii.
Niemożliwe, patrz wyżej. Możesz
git checkout branch-name
, ale nie możeszgit clone something branch-name
. W Subversion gałęzie są folderami. W Git gałęzie są wskaźnikami do zatwierdzenia.Uruchom
git branch
. Domyślnie pokazuje tylko oddziały lokalne. Służygit branch --remote
do wyświetlania zdalnych oddziałów.źródło
--single-branch
(nawet tylko końcówkę z--depth 1
). Różnica między lokalnymi i odległymi gałęziami znanymi z git jest jedynie rodzajem etykiety. Zdalne gałęzie są poprzedzone nazwą zdalnego źródła (częstoorigin
). Lokalne oddziały nie mają tego prefiksu. Ale w końcu dane są dostępne lokalnie (chyba że zrobiłeś to--single-branch
lub coś podobnego). Kiedy biegnieszgit checkout $branchname
z gałęzią, dla której nie istnieje gałąź lokalna, ale gałąź zdalna, git automatycznie konfiguruje gałąź lokalną „śledzącą” zdalną.Ponieważ jest to oznaczone tagiem git, mam nadzieję, że mój brak wiedzy na temat SVN jest pomijalny.
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ło182e8220b404437b9e43eb78149d31af79040c66
, znajdziesz dokładnie to podcat .git/refs/heads/master
.Od tego, że rozgałęziasz nową gałąź
git checkout -b mybranch
, znajdziesz dokładnie ten sam wskaźnik w plikucat .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).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łówgit branch --remote
dla zdalnych oddziałówgit 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:
Po zakończeniu funkcji:
WIP
przerób gałąź (z interaktywnym rebasingiem) = wykonaj z tego pojedynczy zatwierdzenieWIP
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ą).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.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.źródło
Git clone
faktycznie klonuje całe repozytorium, ale ustawia katalog roboczy na domyślny (zazwyczaj główny).Możesz zobaczyć inne gałęzie,
git branch
aby zobaczyć gałęzie lokalne lubgit branch -r
zdalne, a następniegit checkout
przełączyć się na istniejącą gałąź lub utworzyć nową na podstawie bieżącej gałęzi.Powinieneś przeczytać dokumentację git, aby uzyskać więcej informacji, a Atlassian ma również kilka dobrych artykułów na jej temat.
źródło
Gałęzie w git i svn to zasadniczo różne rzeczy.
W svn gałąź (lub tag) to katalog repo.
W git gałąź (lub znacznik) jest wskaźnikiem do zatwierdzenia.
Z svn możesz, jeśli chcesz wykupić katalog główny repo. Oznacza to, że wszystkie gałęzie i znaczniki są sprawdzane jednocześnie. Uważaj, że to nie jest normalny sposób korzystania z SVN.
Git nie jest katalogiem, więc nie ma odpowiednika „sprawdzania katalogu głównego repo”. Istnieje wsparcie dla wielu działających drzew, więc wydaje mi się, że możesz połączyć skrypt, aby sprawdzić każdą gałąź w tym samym czasie, jeśli naprawdę tego chciałeś, ale byłoby to raczej niezwykłe.
Ponadto z SVN istnieje dokładnie jedno repo. Z git każdy programista ma swoje własne repo. Oznacza to, że programiści mogą pracować offline, ale oznacza to również, że różni programiści mogą mieć inne wyobrażenie o tym, co znajduje się w każdej gałęzi.
Ze względu na to, że są katalogami i na podstawie prostego modelu historii liniowej svn, gałęzie svn mają solidne historie. Jeśli chcesz wiedzieć, co było na oddziale x w dniu y, możesz łatwo zadać to pytanie.
Z drugiej strony gałęzie Git tak naprawdę nie mają historii. Istnieje „reflog”, ale ma on na celu raczej mechanizm odzyskiwania po awarii niż długą historię. W szczególności reflog nie może być odczytany zdalnie i jest domyślnie wyłączony dla zwykłych repozytoriów.
Zatwierdzenia mają oczywiście historie, ale te historie nie są wystarczające, aby odpowiedzieć na pytanie „co było na gałęzi x repozytorium w dniu z”.
Możesz wyświetlić listę wszystkich lokalnych oddziałów, wpisując „git branch”.
Możesz wyświetlić listę wszystkich gałęzi, zarówno lokalnych, jak i zdalnych, używając „git branch -a”
Kilka opcji.
Możesz zatwierdzić zmiany w „innej gałęzi”, przełączyć się na master, aby wykonać tam swoją pracę, a następnie wrócić.
Możesz także utworzyć dodatkowe działające drzewo. Google „git-worktree”, aby uzyskać szczegółowe informacje na temat składni.
Nie sądzę, że istnieje ustalona konwencja. Wyewidencjonowanie wielu pracujących drzew jednocześnie nie jest regułą.
źródło