Jeśli dobrze je rozumiem (i nie jestem ekspertem od każdego z nich), zasadniczo każda z nich ma inną filozofię. Po raz pierwszy użyłem rtęci przez 9 miesięcy. Teraz używam git dla 6.
hg to oprogramowanie do kontroli wersji. Jego głównym celem jest śledzenie wersji oprogramowania.
git to system plików oparty na czasie. Jego celem jest dodanie innego wymiaru do systemu plików. Większość ma pliki i foldery, git dodaje czasu. To, że akurat działa niesamowicie, ponieważ VCS jest produktem ubocznym jego projektu.
W Hg jest historia całego projektu, który zawsze stara się utrzymać. Domyślnie uważam, że hg chce wszystkich zmian we wszystkich obiektach przez wszystkich użytkowników podczas pchania i ciągnięcia.
W git jest tylko pula obiektów i te pliki śledzenia (gałęzie / głowy), które określają, który zestaw tych obiektów reprezentuje drzewo plików w określonym stanie. Podczas pchania lub ciągnięcia git wysyła tylko obiekty potrzebne do poszczególnych gałęzi, które pchasz lub ciągniesz, co jest niewielkim podzbiorem wszystkich obiektów.
Jeśli chodzi o git, nie ma „1 projektu”. Możesz mieć 50 projektów w jednym repozytorium, a git nie będzie się tym przejmował. Każdy z nich może być zarządzany osobno w tym samym repozytorium i na żywo.
Koncepcja oddziałów Hg polega na odgałęzieniu głównego projektu lub odgałęzieniu itp. Git nie ma takiego pojęcia. Gałąź w git jest tylko stanem drzewa, wszystko jest gałęzią w git. Która gałąź jest oficjalna, aktualna lub najnowsza, nie ma znaczenia w git.
Nie wiem czy to miało jakiś sens. Gdybym mógł rysować, hg mógłby wyglądać tak, gdzie każdy zatwierdzenie jesto
o---o---o
/
o---o---o---o---o---o---o---o
\ /
o---o---o
Drzewo z jednym korzeniem i opadającymi z niego gałęziami. Chociaż git może to zrobić i często ludzie używają go w ten sposób, który nie jest egzekwowany. Zdjęcie git, jeśli istnieje coś takiego, może z łatwością wyglądać tak
o---o---o---o---o
o---o---o---o
\
o---o
o---o---o---o
W rzeczywistości pod pewnymi względami nie ma sensu pokazywanie gałęzi w git.
Jedna rzecz, która jest bardzo myląca dla dyskusji, zarówno git, jak i merkurial, mają coś, co nazywa się „gałęzią”, ale nie są to wcale te same rzeczy. Oddział mercurial powstaje, gdy występują konflikty między różnymi transakcjami repo. Oddział w git jest najwyraźniej podobny do klonu w hg. Ale klon, choć może dać podobne zachowanie, zdecydowanie nie jest taki sam. Zastanów się, czy wypróbowałem je w git vs hg przy użyciu dość dużego repozytorium chromu.
$ time git checkout -b some-new-branch
Switched to new branch 'some-new-branch'
real 0m1.759s
user 0m1.596s
sys 0m0.144s
A teraz w HG za pomocą klonowania
$ time hg clone project/ some-clone/
updating to branch default
29387 files updated, 0 files merged, 0 files removed, 0 files unresolved.
real 0m58.196s
user 0m19.901s
sys 0m8.957
Oba są gorącymi przebiegami. To znaczy, uruchomiłem je dwa razy i to jest drugi bieg. klon hg jest tak samo jak git-new-workdir. Oba tworzą zupełnie nowy, działający katalog, prawie tak, jakbyś pisał na maszynie cp -r project project-clone
. To nie to samo, co utworzenie nowej gałęzi w git. To o wiele większa waga. Jeśli istnieje prawdziwy odpowiednik rozgałęzienia gita w hg, nie wiem co to jest.
Rozumiem, że na pewnym poziomie hg i git mogą robić podobne rzeczy. Jeśli tak, to nadal istnieje ogromna różnica w przepływie pracy, do którego prowadzą. W git typowym przepływem pracy jest utworzenie gałęzi dla każdej funkcji.
git checkout master
git checkout -b add-2nd-joypad-support
git checkout master
git checkout -b fix-game-save-bug
git checkout master
git checkout -b add-a-star-support
To właśnie stworzyło 3 gałęzie, każda oparta na gałęzi o nazwie master. (Jestem pewien, że jest jakiś sposób, aby zrobić 1 linię zamiast 2)
Teraz do pracy nad jednym, który właśnie wykonuję
git checkout fix-game-save-bug
i zacznij działać. Zatwierdź rzeczy itp. Przełączanie między gałęziami nawet w projekcie tak dużym jak chrom jest niemal natychmiastowe. Właściwie nie wiem jak to zrobić w HG. To nie jest część samouczków, które przeczytałem.
Jeszcze jedna wielka różnica. Scena Gita.
Git ma pomysł na scenę. Możesz myśleć o tym jak o ukrytym folderze. Kiedy popełniasz, zatwierdzasz tylko to, co jest na scenie, a nie zmiany w działającym drzewie. To może brzmieć dziwnie. Jeśli chcesz zatwierdzić wszystkie zmiany w działającym drzewie, zrobiłbyś to, git commit -a
co dodaje wszystkie zmodyfikowane pliki do stołu montażowego, a następnie je zatwierdza.
Jaki jest zatem sens etapu? Możesz łatwo rozdzielić swoje zobowiązania. Wyobraź sobie, że edytowałeś joypad.cpp i gamesave.cpp i chcesz zatwierdzić je osobno
git add joypad.cpp // copies to stage
git commit -m "added 2nd joypad support"
git add gamesave.cpp // copies to stage
git commit -m "fixed game save bug"
Git ma nawet polecenia, które decydują, które konkretne wiersze w tym samym pliku chcesz skopiować na scenę, abyś mógł oddzielnie rozdzielić te zatwierdzenia. Dlaczego chcesz to zrobić? Ponieważ jako osobne zatwierdzenia inni mogą wyciągać tylko te, których chcą, lub jeśli wystąpił problem, mogą cofnąć tylko zatwierdzenie, które miało problem.