Jaka jest różnica między Mercurialem a Gitem?


727

Używam gita od jakiegoś czasu w systemie Windows (z msysGit) i podoba mi się pomysł rozproszonej kontroli źródła. Niedawno patrzyłem na Mercurial (hg) i wygląda interesująco. Jednak nie mogę owinąć głowy wokół różnic między hg a git.

Czy ktoś porównał git i hg? Interesuje mnie to, co różni hg i git bez konieczności wchodzenia w dyskusję fanów.

Odpowiedzi:


345

Artykuły te mogą pomóc:

Edycja : Porównanie Git i Mercurial z celebrytami wydaje się być trendem. Oto jeszcze jeden:


1
„Git vs Mercurial Please Relax” jest poważnie nieaktualne, chociaż jest tak stare, jak to pytanie. Być może to pytanie powinno zostać usunięte i ponownie otwarte teraz, gdy oba narzędzia mają dodane ponad 3 lata funkcji.
gman

238

Pracuję na Mercurial, ale zasadniczo uważam, że oba systemy są równoważne. Oba działają z tymi samymi abstrakcjami: serią migawek (zestawów zmian), które składają się na historię. Każdy zestaw zmian wie, skąd się wziął (nadrzędny zestaw zmian) i może mieć wiele podrzędnych zestawów zmian. Niedawne rozszerzenie hg-git zapewnia dwukierunkowy most między Mercurialem a Gitem i niejako pokazuje ten punkt.

Git kładzie duży nacisk na mutowanie tego wykresu historii (ze wszystkimi związanymi z tym konsekwencjami), podczas gdy Mercurial nie zachęca do przepisywania historii, ale i tak jest to łatwe, a konsekwencje takiego działania są dokładnie takie, jak należy się spodziewać (to znaczy , jeśli zmodyfikuję zestaw zmian, który już masz, twój klient zobaczy go jako nowy, jeśli ode mnie odciągniesz). Więc Mercurial ma uprzedzenia wobec nieniszczących poleceń.

Jeśli chodzi o lekkie oddziały, to Mercurial wspiera repozytoria z wieloma oddziałami od ..., zawsze myślę. Repozytoria Git z wieloma gałęziami są dokładnie tym: wiele rozbieżnych aspektów rozwoju w jednym repozytorium. Następnie Git dodaje nazwy do tych pasm i pozwala na zdalne zapytania o te nazwy. Zakładki rozszerzenie dla Mercurial dodaje nazwy lokalne, a także z Mercurial 1.6, można przenieść te zakładki wokół po naciśnięciu / pull ..

Używam Linuksa, ale najwyraźniej TortoiseHg jest szybszy i lepszy niż odpowiednik Git w systemie Windows (ze względu na lepsze wykorzystanie słabego systemu plików Windows). Zarówno http://github.com, jak i http://bitbucket.org zapewniają hosting online, usługa w Bitbucket jest świetna i responsywna (nie próbowałem github).

Wybrałem Mercurial, ponieważ wydaje się czysty i elegancki - zniechęciły mnie skrypty shell / Perl / Ruby, które dostałem z Git. Spróbuj zerknąć na git-instaweb.shplik, jeśli chcesz wiedzieć, co mam na myśli: jest to skrypt powłoki, który generuje skrypt Ruby , który, jak sądzę, uruchamia serwer WWW. Skrypt powłoki generuje kolejny skrypt powłoki, aby uruchomić pierwszy skrypt Ruby. Na wszelki wypadek jest też trochę Perla .

Podoba mi się post na blogu, który porównuje Mercurial i Git z Jamesem Bondem i MacGyverem - Mercurial jest w jakiś sposób bardziej cichy niż Git. Wydaje mi się, że ludzie korzystający z Mercurial nie są tak łatwo pod wrażeniem. Znajduje to odzwierciedlenie w sposobie, w jaki każdy system robi to, co Linus określił jako „najfajniejsze połączenie kiedykolwiek!” . W Git możesz łączyć się z niepowiązanym repozytorium, wykonując:

git fetch <project-to-union-merge>
GIT_INDEX_FILE=.git/tmp-index git-read-tree FETCH_HEAD
GIT_INDEX_FILE=.git/tmp-index git-checkout-cache -a -u
git-update-cache --add -- (GIT_INDEX_FILE=.git/tmp-index git-ls-files)
cp .git/FETCH_HEAD .git/MERGE_HEAD
git commit

Te polecenia wydają mi się dość tajemnicze. W Mercurial wykonujemy:

hg pull --force <project-to-union-merge>
hg merge
hg commit

Zauważ, że polecenia Mercurial są proste i wcale nie specjalne - jedyną niezwykłą rzeczą jest --forceflaga do hg pull, która jest potrzebna, ponieważ Mercurial przerwie działanie, gdy wyciągniesz z niepowiązanego repozytorium. Takie różnice sprawiają, że Mercurial wydaje mi się bardziej elegancki.


21
Zauważ, że TortoiseHg współpracuje również z Nautilus, menedżerem plików Gnome w systemie Linux.
oenli

4
Skrypt Ruby jest generowany tylko wtedy, gdy httpd to Webrick, serwer ruby.
alternatywnie

4
Podobnie jak Git, Mercurial przechowuje migawki twoich plików podczas zatwierdzania. Nie zgadzam się, że zmiany nazw można śledzić tylko za pomocą heurystyki, takiej jak w Git, w tym modelu nie ma nic, co wykluczałoby dodanie dodatkowych informacji do migawki, np. Zmiana nazwy informacji. Robimy to w Mercurial.
Martin Geisler

63
Aby scalić (przyciąganie) niezwiązanego z projektem git, można po prostu zrobić: git pull <url-of-project>. cytowana poczta pochodzi z pierwszych dni git (2005)
knittl

5
knittl: ah, dobrze, cieszę się, że Git robi się mniej tajemny. Mimo to wydaje mi się, że przykład pokazuje, jak różne systemy różnią się tym, co według nas jest fajne, a Git jest dla mnie bardziej niski w porównaniu z Mercurialem (ale nie bardziej wydajny).
Martin Geisler

73

Git to platforma, Mercurial to „tylko” aplikacja. Git jest wersjonowaną platformą systemu plików, która jest dostarczana z aplikacją DVCS w pudełku, ale jak zwykle w przypadku aplikacji platformowych, jest bardziej złożona i ma ostrzejsze krawędzie niż aplikacje skoncentrowane. Ale oznacza to również, że VCS gita jest niezwykle elastyczny i istnieje ogromna głębia rzeczy bez kontroli źródła, które możesz zrobić z git.

To jest istota różnicy.

Git najlepiej rozumieć od podstaw - od formatu repozytorium do góry. Git Talk Scott Chacon jest doskonałym podkładem do tego. Jeśli spróbujesz użyć git, nie wiedząc, co dzieje się pod maską, w pewnym momencie skończysz zdezorientowany (chyba że będziesz trzymał się tylko bardzo podstawowej funkcjonalności). Może to zabrzmieć głupio, gdy wszystko, czego potrzebujesz, to DVCS do codziennej rutyny programowania, ale genialność git polega na tym, że format repozytorium jest w rzeczywistości bardzo prosty i dość łatwo można zrozumieć całą operację git.

Dla niektórych porównań bardziej technicznych, najlepszymi artykułami, które osobiście widziałem, są Dustin Sallings:

Właściwie używał obu DVCS i dobrze je rozumie - i ostatecznie wolał git.


78
Często czytam, że ludzie wspominają, że git jest „platformą”, ale jest to bardziej teoria lub wspólny mit, ponieważ nie ma większych przykładów na to, że jest platformą do robienia czegoś innego niż uruchamianie git.
Ian Kelling

@Ian - jeśli się nie mylę, Aptana Studio 3 używa go do wewnętrznego systemu aktualizacji.
Mac

22
Krótko mówiąc: Mercurial to rozproszony system kontroli wersji open source, a git to wybór stylu życia.
Tim Keating

51

Duża różnica dotyczy systemu Windows. Mercurial jest obsługiwany natywnie, Git nie. Możesz uzyskać bardzo podobny hosting do github.com z bitbucket.org (w rzeczywistości nawet lepiej, ponieważ otrzymujesz bezpłatne prywatne repozytorium). Przez jakiś czas korzystałem z msysGit, ale przeniosłem się do Mercurial i byłem z tego bardzo zadowolony.


64
Tak więc „natywnie” nie jest właściwym słowem, ale na pewno nie jest dobrze obsługiwane w systemie Windows.
Ian Kelling

14
git jest obsługiwany do pewnego momentu w systemie Windows. Ale spróbuj użyć nazw plików Unicode na różnych platformach i przekonaj się, jaki ból odczuwasz.
Craig McQueen

@Craig: To raczej wada platformy. Kompetentna platforma pozwoliłaby Ci przejść do odpowiedniej lokalizacji. Jeśli pozostaniesz przy utf-8, wszystko będzie dobrze, z wyjątkiem tego, że Mac OS X ma nieco inną normalizację utf-8, jednak nie jestem pewien, czy Windows pozwala nawet na użycie utf-8 ...
Arafangion

23
Windows obsługuje Unicode, chociaż MS zdecydowało się na UTF-16 w API zamiast UTF-8. Mimo to git mógłby obsługiwać wieloplatformowy system Unicode. SVN rozwiązał ten problem całkiem dobrze. Ale w tej chwili nie jest to wysoki priorytet dla rozwoju msysGit. code.google.com/p/msysgit/issues/detail?id=80
Craig McQueen

38

Jeśli jesteś programistą systemu Windows i szukasz podstawowej kontroli odłączonej wersji, skorzystaj z Hg. Odkryłem, że Git jest niezrozumiały, podczas gdy Hg był prosty i dobrze zintegrowany z powłoką Windows. Pobrałem Hg i postępowałem zgodnie z tym samouczkiem (hginit.com) - dziesięć minut później miałem lokalne repozytorium i wróciłem do pracy nad moim projektem.


1
Wykonałem ten sam samouczek. To jest ostateczne.
Nathan


20

Są prawie identyczne. Najważniejsza różnica z mojego punktu widzenia (mam na myśli powód, dla którego wybrałem jeden DVCS zamiast drugiego), to sposób, w jaki oba programy zarządzają gałęziami.

Aby uruchomić nową gałąź, dzięki Mercurial, po prostu sklonuj repozytorium do innego katalogu i zacznij programować. Następnie ciągniesz i scalasz. W git musisz jawnie nadać nazwę nowej gałęzi tematu, której chcesz użyć, a następnie zacznij kodować przy użyciu tego samego katalogu .

Krótko mówiąc, każda gałąź Mercurial potrzebuje własnego katalogu; w git zwykle pracujesz w jednym katalogu. Zmiana gałęzi w Mercurial oznacza zmianę katalogów; w git oznacza proszenie git o zmianę zawartości katalogu za pomocą git checkout.

Jestem szczery: nie wiem, czy można zrobić to samo z Mercurialem, ale ponieważ zwykle pracuję nad projektami internetowymi, używanie zawsze tego samego katalogu z git wydaje mi się bardzo wygodne, ponieważ nie muszę ponownie -konfiguruj Apache i zrestartuj go, a nie bałaganię mojego systemu plików za każdym razem, gdy się rozgałęziam.

Edycja: Jak zauważył Deestan, Hg nazwał gałęzie , które można przechowywać w jednym repozytorium i pozwolić programistom na przełączanie gałęzi w tej samej kopii roboczej. gałęzie git nie są dokładnie takie same jak gałęzie nazwane Mercurial: są trwałe i nie wyrzucają gałęzi, jak w git. Oznacza to, że jeśli użyjesz nazwanego oddziału do zadań eksperymentalnych, nawet jeśli zdecydujesz się go nigdy nie łączyć, zostanie on zapisany w repozytorium. To jest powód, dla którego Hg zachęca do korzystania z klonów do eksperymentalnych, krótkoterminowych zadań i nazwanych gałęzi do długotrwałych zadań, takich jak gałęzie wydania.

Powód, dla którego wielu użytkowników Hg ​​woli klony nad nazwaną gałęzią, jest o wiele bardziej społeczny lub kulturalny niż techniczny. Na przykład w ostatnich wersjach Hg można nawet zamknąć nazwaną gałąź i rekurencyjnie usunąć metadane z zestawów zmian.

Z drugiej strony git zaprasza do używania „nazwanych gałęzi”, które nie są trwałe i nie są przechowywane jako metadane na każdym zestawie zmian.

Z mojego osobistego punktu widzenia model gita jest zatem głęboko powiązany z koncepcją nazwanych gałęzi i przełączania się między gałęziami i innymi za pomocą tego samego katalogu; hg może zrobić to samo z nazwanymi gałęziami, ale zachęca to do korzystania z klonów, których osobiście nie lubię za bardzo.


6
To nie jest różnica; Hg także nazwał oddziały. Używamy ich cały czas podczas normalnego rozwoju zamiast gałęzi klonów.
Deestan

2
AFAIK, nazwany oddział w Hg, otrzymuje metadane przechowujące w każdym zatwierdzeniu; Mogę się mylić, ale czytam, że kiedy utworzysz gałąź, jej metadane zostaną osadzone w każdym zestawie zmian i staną się częścią historii. To ogromna różnica z git. „Klony świetnie nadają się do szybkich eksperymentów, w których nie chcesz rejestrować nazwy gałęzi, a nazwane gałęzie są dobre dla gałęzi długoterminowych” tinyurl.com/2wz39qx Chciałem powiedzieć w moim poście, że standardowy przepływ pracy git zaprasza użyć jednego egzemplarza roboczego; Standardowy przepływ pracy Hg obejmuje klony, które nie odpowiadają moim osobistym potrzebom.
Arialdo Martini,

Aby uzyskać dobre wyjaśnienie podobieństw / różnic dotyczących: rozgałęziania w Git i Hg, patrz: mercurial.selenic.com/wiki/GitConcepts#Branch_model
sampablokuper

2
nazwane gałęzie w hg nie są niczym gałęzie w git. W Hg istnieje jedna prawdziwa ścieżka. Wszystkie gałęzie są gałęziami na tej ścieżce. W git nie ma jednej prawdziwej ścieżki. Istnieją tylko różne stany repozytorium i wskaźniki do tego stanu. Każda gałąź to po prostu inny wskaźnik. Który wskaźnik jest główny, jest gotowy do użycia. Wszystkie oddziały są równorzędne.
gman

17

Jest jedna ogromna różnica między gitem a rtęcią ; sposób, w jaki reprezentują każde zatwierdzenie. git reprezentuje zatwierdzenia jako migawki, a mercurial przedstawia je jako diffs.

Co to oznacza w praktyce? Cóż, wiele operacji jest szybszych w git, takich jak przełączanie na inne zatwierdzanie, porównywanie zatwierdzeń itp. Zwłaszcza jeśli te zatwierdzenia są daleko.

AFAIK nie ma przewagi podejścia rtęciowego.


29
Zaletą zestawów zmian (różnic) jest zajmowanie mniej miejsca. Git odzyskuje przestrzeń używaną do zatwierdzania za pomocą kompresji, ale wymaga to od czasu do czasu jawnego kroku ponownej kompresji („git pack”).
kwark

8
Nazywa się teraz „git gc”, ale istnieją różne poziomy odśmiecania, a niektóre poziomy są wykonywane automatycznie w najnowszych wersjach git.
FelipeC

6
właściwie merkurial również używa migawek
Ronny

13
Nie rozumiem rozróżnienia, które rysujesz między „migawkami” a „różnicami”. Zarówno hg, jak i git store zatwierdzają jako (grupy) delty plików . Te delty są oparte na poprzedniej wersji wybranej przez SCM. Czy masz liczby wskazujące, że git jest rzeczywiście szybszy dla operacji, o których wspomniałeś? Aktualizacja do innego zatwierdzenia spędza większość czasu na pisaniu do działającego katalogu, a zresztą nie czytaniu repozytorium.
Kevin

2
Różnice „Snapshot vs. vs.” - zupełnie nieistotne. Jednak repo jest przechowywane wewnętrznie, nie ma wpływu na to, co widzi użytkownik. Zarówno git, jak i mercurial przedstawiają użytkownikowi „migawkę”. Nie ma powodu, dla którego format repozytorium zaimplementowany w taki sam sposób jak git nie mógłby zostać dodany do mercurial, tak jak sądzę, że zrobił to Bazaar.
Mark Booth

11

Nic. Oba robią to samo, oba działają mniej więcej tak samo. Jedynym powodem, dla którego powinieneś wybrać jedno z drugiego, jest pomoc w projekcie, który już korzysta z jednego.

Innym możliwym powodem wyboru jednej jest aplikacja lub usługa, która obsługuje tylko jeden system. Na przykład, zdecydowałem się nauczyć git z powodu github ..


6
Wygląda na to, że twoja odpowiedź była zbyt pragmatyczna. :)
Arafangion


11

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 -aco 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.


„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”. Jakie są te polecenia?
James McMahon

1
@James: git add --patchpatrz linux.die.net/man/1/git-add lub użyj git add -i, jak w stackoverflow.com/questions/2372583/…
tanascius

@gman: zamiast sprawdzać master i rozgałęzianie, checkout -b <name>możesz po prostu git branch <name>utworzyć nowy oddział bez przełączania się na niego
tanascius

8

Na blogu versioncontrolblog znajduje się dynamiczna tabela porównawcza, na której można porównać kilka różnych systemów kontroli wersji.

Oto tabela porównawcza między git, hg i bzr.


1
Informacje o Mercurial nie są do końca dokładne: Mercurial ma „inteligentne połączenia po ruchach lub zmianach nazw”. Konkretnie oznacza to, że jeśli zmiana nazwy dir-a/foo.c, aby dir-b/foo.ci nadal pracować na dir-b/foo.c, wówczas prace nad dir-a/foo.cbędą prawidłowo połączył się z moją pracą po pull.
Martin Geisler

Informacje (pochodzące z porównania Better SCM Initiative , IIRC) na temat Git są również niedokładne, a nawet w niektórych miejscach niewidoczne.
Jakub Narębski


7

Czy w twoim projekcie są współpracownicy z systemem Windows?

Ponieważ jeśli tak, GUI dla systemu Windows wydaje się niezręczny, trudny i nieprzyjazny.

Natomiast Mercurial-on-Windows nie jest żadnym problemem.


Lubię gita, ale muszę się z tym zgodzić. Git ma ładniejszy wiersz poleceń ze sceną i lepszą dokumentacją. Z przyjemnością użyłbym poleceń git z powłoką posix. Jednak tortoiseHG w systemie Windows jest świetny, integruje się nawet z kilkoma narzędziami różnicowymi (poza porównywaniem) i ma pełne wsparcie dla
repozytoriów

Dostępny jest przynajmniej jeden bardzo dobry graficzny interfejs użytkownika Git dla systemu Windows (i OS X + Linux).
Mot

7

Jedną rzeczą, na którą należy zwrócić uwagę między mercurial z bitbucket.org i git z github, jest to, że mercurial może mieć tyle prywatnych repozytoriów, ile chcesz, ale github musisz uaktualnić do konta płatnego. Dlatego właśnie wybieram bitbucket, który używa rtęci.


5

W zeszłym roku oceniłem git i hg na własne potrzeby i zdecydowałem się na hg. Czułem, że to wygląda na czystsze rozwiązanie i działało wówczas lepiej na większej liczbie platform. Było to jednak głównie podrzucenie.

Ostatnio zacząłem używać git z powodu git-svn i zdolności do działania jako klient Subversion. To mnie przekonało i teraz całkowicie zmieniłem na git. Wydaje mi się, że ma nieco wyższą krzywą uczenia się (szczególnie jeśli musisz szturchać wnętrze), ale to naprawdę świetny system. Przeczytam te dwa artykuły porównawcze, które John opublikował teraz.


4
Spójrz na hgsubversion: bitbucket.org/durin42/hgsubversion . Obecnie wymaga wersji rozwojowej Mercurial, ale wydadzą wersję dla Mercurial 1.3, która ma się ukazać 1 lipca.
Martin Geisler

4

Obecnie jestem w trakcie migracji z SVN do DVCS (podczas blogowania o moich odkryciach, moim pierwszym prawdziwym wysiłku blogowania ...), i przeprowadziłem trochę badań (= google). O ile widzę, możesz zrobić większość rzeczy za pomocą obu pakietów. Wygląda na to, że git ma kilka bardziej lub lepiej zaimplementowanych zaawansowanych funkcji. Wydaje mi się, że integracja z Windows jest nieco lepsza dla mercurial, z TortoiseHg. Wiem, że jest też Git Cheetah (próbowałem obu), ale rozwiązanie rtęciowe wydaje się bardziej niezawodne.

Widząc, że oba są open-source (prawda?), Nie sądzę, że w żadnym z nich nie zabraknie ważnych funkcji. Jeśli coś jest ważne, ludzie będą o to prosić, ludzie to kodują.

Myślę, że w przypadku powszechnych praktyk Git i Mercurial są więcej niż wystarczające. Obaj mają duże projekty, które ich używają (projekty Git -> jądro linuksa, Mercurial -> Mozilla Foundation, oba oczywiście oczywiście), więc nie sądzę, żeby w żadnym z nich czegoś brakowało.

Biorąc to pod uwagę, jestem zainteresowany tym, co mówią o tym inni ludzie, ponieważ byłoby to świetnym źródłem moich blogów ;-)


1
Tak, oba są projektami typu open source.
Martin Geisler


3

Zdaję sobie sprawę, że to nie jest część odpowiedzi, ale w tej kwestii myślę również, że dostępność stabilnych wtyczek dla platform takich jak NetBeans i Eclipse odgrywa rolę, w której narzędzie lepiej pasuje do zadania, a raczej które narzędzie najlepiej pasuje do „ciebie”. To znaczy, chyba że naprawdę chcesz to zrobić w sposób CLI.

Zarówno Eclipse (i wszystko na nim oparte), jak i NetBeans czasami mają problemy ze zdalnymi systemami plików (takimi jak SSH) i zewnętrznymi aktualizacjami plików; co jest kolejnym powodem, dla którego chcesz, aby wszystko, co wybierzesz, działało „płynnie”.

Próbuję teraz odpowiedzieć sobie na to pytanie… i przygotowałem kandydatów do Git lub Mercurial .. dziękuję wszystkim za udzielenie użytecznych informacji na ten temat bez konieczności zakonników.


2
+1, ponieważ „płynne” doświadczenie jest ważniejsze niż myślą ludzie, którzy nie pracują z tymi rzeczami. Solidna wtyczka do IDE robi dużą różnicę.
eksortso


2

Jeśli jesteś zainteresowany porównaniem wydajności Mercurial i Git, zapoznaj się z tym artykułem . Z tego wniosek:

Git i Mercurial obracają się w dobrych liczbach, ale stanowią interesujący kompromis między szybkością a rozmiarem repozytorium. Mercurial jest szybki, zarówno z dodawaniem, jak i modyfikacjami, i jednocześnie kontroluje wzrost repozytorium. Git jest również szybki, ale jego repozytorium rośnie bardzo szybko ze zmodyfikowanymi plikami, aż do ponownego spakowania - a te przepakowania mogą być bardzo wolne. Ale zapakowane repozytorium jest znacznie mniejsze niż Mercurial.



2

Jeśli przeprowadzasz migrację z SVN, użyj Mercurial, ponieważ jego składnia jest DUŻO bardziej zrozumiała dla użytkowników SVN. Poza tym nie możesz się pomylić z żadnym z nich. Ale sprawdź samouczek GIT i HGinit przed wybraniem jednego z nich.



1

Niektórzy uważają, że systemy VCS muszą być skomplikowane. Zachęcają do wymyślania terminów i koncepcji w terenie. Prawdopodobnie pomyśleliby, że liczne doktoraty na ten temat byłyby interesujące. Wśród nich są prawdopodobnie ci, którzy zaprojektowali Git.

Mercurial został zaprojektowany z inną mentalnością. Deweloperzy nie powinni bardzo przejmować się VCS i powinni zamiast tego poświęcić czas na swoją główną funkcję: inżynierię oprogramowania. Mercurial pozwala użytkownikom korzystać z systemu i szczęśliwie nadużywać go, nie dopuszczając do błędów, których nie można odzyskać.

Każde profesjonalne narzędzie musi mieć jasno zaprojektowany i intuicyjny interfejs użytkownika. Użytkownicy Mercurial mogą wykonać większość pracy, wydając proste polecenia bez żadnych dziwnych opcji. W Git double dash szalone opcje są normą. Mercurial ma znaczną przewagę, jeśli jesteś osobą CLI (i szczerze mówiąc, każdy szanujący się inżynier oprogramowania powinien być).

Aby dać przykład, załóżmy, że popełniłeś błąd przez pomyłkę. Zapomniałeś edytować niektórych plików. Aby cofnąć akcję w Mercurial, wystarczy wpisać:

$ hg rollback

Następnie pojawi się komunikat, że system cofnął ostatnią transakcję.

W Git musisz wpisać:

$ git reset --soft HEAD^

Więc ok, przypuśćmy, że masz pojęcie, na czym polega reset. Ale dodatkowo musisz wiedzieć, jakie są resetowania „--soft” i „--hard” (jakieś intuicyjne domysły?). No i oczywiście nie zapomnij na końcu znaku „^”! (teraz, co na imię Ritchie to ...)

Integracja Mercurial z narzędziami innych firm, takimi jak kdiff3 i meld, jest również znacznie lepsza. Wygeneruj swoje łatki, łącz swoje gałęzie bez większego zamieszania. Mercurial zawiera również prosty serwer HTTP, który aktywujesz przez wpisanie

hg serve

I pozwól innym przeglądać twoje repozytorium.

Najważniejsze jest to, że Git robi to, co robi Mercurial, w znacznie bardziej skomplikowany sposób i przy znacznie gorszym CLI. Użyj Git, jeśli chcesz przekształcić VCS swojego projektu w dziedzinę badań naukowych. Użyj Mercurial, jeśli chcesz wykonać zadanie VCS, nie troszcząc się o to, i skup się na swoich prawdziwych zadaniach.


1
W rzeczywistości możesz aliasować polecenia w git , co czyni CLI mniej skomplikowanym w użyciu. W tym pytaniu SuperUser (StackExchange) jest ich sporo .
Spoike

1
Naprawdę tak, możesz także pisać skrypty powłoki, aby radzić sobie z niektórymi typowymi zadaniami. W końcu zaczynasz zdawać sobie sprawę, że budujesz otoki CLI, aby poradzić sobie z VCS, który ma źle zaprojektowany i sprzeczny z intuicją CLI. I to nie tylko to. Git wprowadza wiele koncepcji z wątpliwą użytecznością, których użytkownik jest ostatecznie zmuszony nauczyć się i rozumieć, aby czuć się komfortowo z dokumentacją i komunikatami CLI.
Kostas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.