Care este Diferența Între Schimbător și Git?

Am'am fost folosind git de ceva timp pe Windows (cu msysGit) și îmi place ideea de sursă distribuită de control. Doar recent am'am fost în căutarea la Mercurial (hg) si se pare interesant. Cu toate acestea, pot't-și încheie capul meu în jurul valorii de diferențele dintre hg și git.

A făcut cineva un side-by-side comparație între git și hg? Am'm a interesat să știu ce diferă hg și git fără a fi nevoie să sari într-un fanboy discuție.

Soluția

Aceste articole pot ajuta:

Edit: Compararea Git, Mercurial pentru celebrități pare a fi o tendință. Aici's unul mai mult:

Comentarii (1)

Eu lucrez pe Mercurial, dar de fapt cred că ambele sisteme sunt echivalente. Amândoi lucrează cu același abstracțiuni: o serie de instantanee (changesets) care alcătuiesc istoria. Fiecare changeset știe de unde a venit (părinte changeset) și poate avea mai multe copil changesets. Recent hg-git extensie oferă un drum cu două punte de legătură între Schimbător și Git si fel de spectacole acest moment.

Git are un puternic accent pe mutant această istorie grafic (cu toate consecințele pe care le implică) întrucât Mercurial nu încurajează rescrierea istoriei, dar's ușor de a face, oricum și consecințele de a face deci sunt exact ceea ce ar trebui să așteptăm ca ei să fie (asta este, dacă am modifica un changeset aveți deja, clientul tău va vedea ca noi daca tragi de la mine). Deci Mercurial are o bias față de non-distructive comenzi.

Pentru ca lumina-greutate ramuri, apoi Mercurial a sprijinit centrale de tranzacții cu mai multe ramuri deoarece..., intotdeauna mi-am cred. Arhive Git cu mai multe ramuri sunt exact asta: mai multe divergente fire de dezvoltare într-un singur depozit. Git apoi adaugă nume de la aceste fire și vă permite să interogare aceste nume de la distanță. De Bookmarks extensie pentru Mercurial adaugă nume locale, și cu Mercurial 1.6, puteți muta aceste marcaje în jurul valorii de atunci când vă împinge/trage..

Eu folosesc Linux, dar se pare că TortoiseHg este mai rapid și mai bine decât Git echivalent pe Windows (din cauza la o mai bună utilizare a săracilor Windows sistem de fișiere). Ambele http://github.com și http://bitbucket.org furnizarea on-line de hosting, serviciul la Bitbucket este mare și receptiv (m-am't încercat github).

Am ales Mercurial deoarece se simte curat și elegant, am fost pus în afara de shell/Perl/Ruby script-uri am primit cu Git. Încercați să luați o privire la git-instaweb.sh file dacă vrei să știi ce vreau să spun: este un shell script care generează o Rubin script-ul, care cred ca ruleaza un server de web. Shell script generează un alt script de shell pentru a lansa primul script Ruby. Există, de asemenea, un pic de Perl, pentru o bună măsură.

Îmi place blog, care compară Mercurial și Git cu James Bond și MacGyver -- Mercurial este cumva mai low-cheie decât Git. Mi se pare, că oamenii care folosesc Mercurial nu sunt atât de ușor de impresionat. Acest lucru se reflectă în modul în care fiecare sistem ce Linus descris ca "cel mai tare merge VREODATĂ!". În Git puteți fuziona cu un alt depozit de a face:

git fetch 
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

Aceste comenzi arata destul de arcane pentru ochiul meu. În Mercurial noi:

hg pull --force 
hg merge
hg commit

Observați cum Mercurial comenzile sunt simple și nu la toate ... singurul lucru neobișnuit este --force steag hg trage, care este necesară, deoarece Mercurial va abandona în caz contrar, atunci când trage de la un alt depozit. Este diferențe de genul acesta Mercurial pare mult mai elegant pentru mine.

Comentarii (7)

Git este o platformă, Mercurial este "doar" o aplicație. Git este o versiune de sistem de fișiere platforma care se întâmplă pentru a navei cu un DVCS aplicație în cutie, dar la fel de normal pentru platforma de aplicații, este mult mai complex și are mai dur decât marginile concentrat aplicații face. Dar aceasta înseamnă, de asemenea, git e VCS este extrem de flexibil, și există o mare adâncime de non-control la sursă lucruri pe care le puteți face cu git.

Care este esența diferența.

Git este cel mai bine înțeleasă de la sol în sus – de la depozitul format în sus. Scott Chacon e Git Vorbi este un grund excelent pentru acest lucru. Dacă încercați să utilizați git, fără să știe ce se întâmplă sub capotă, vei sfârși prin a confundat la un moment dat (dacă nu rămânem la doar foarte funcționalitatea de bază). Acest lucru poate suna stupid atunci când tot ce vrei este un DVCS pentru dvs. de zi cu zi de programare de rutină, dar geniul git este că depozitul format este de fapt foarte simplu si poate să înțeleagă git întreaga operațiune destul de ușor.

Pentru mai tehnicitate orientate spre comparații diferitelor autoturisme, cele mai bune articole am vazut personal sunt Dustin roderick muhlhauser':

De fapt el a folosit atât DVCSs pe scară largă și de a le înțelege atât de bine – și a ajuns preferând git.

Comentarii (3)

Diferența mare este pe Windows. Mercurial este suportat nativ, Git e't. Puteți obține foarte similare hosting pentru github.com cu bitbucket.org (de fapt, chiar mai bine ca ai un privată gratuită și depozit). Am fost folosind msysGit pentru un timp, dar s-a mutat la Mercurial și a fost foarte fericit cu ea.

Comentarii (5)

Dacă sunteți un dezvoltator Windows caută bază deconectat de revizuire de control, du-te cu Hg. Am găsit Git pentru a fi de neînțeles, în timp ce Hg a fost simplu și bine integrat cu Windows shell. Am descarcat Hg și au urmat acest tutorial (hginit.com)](http://hginit.com/) - zece minute mai târziu, am avut un repo locală și s-a întors să lucrez la proiectul meu.

Comentarii (1)

Cred că cea mai bună descriere despre "Mercurial vs Git" este:

"Git este Wesley Snipes. Mercurial este Denzel Washington"

Comentarii (5)

Ele sunt aproape identice. Cea mai importantă diferență, din punctul meu de vedere (adică, motivul pentru care m-a făcut să alegeți una DVCS peste celălalt) este modul în care cele două programe de filiale.

Pentru a începe o nouă ramură, cu Mercurial, pur și simplu clona depozit la un alt director, și de a începe în curs de dezvoltare. Apoi, trage si merge. Cu git, trebuie să dea în mod explicit un nume pentru noul subiect de ramură doriți să o utilizați, apoi începe de codificare folosind același director.

Pe scurt, fiecare ramură în Mercurial are nevoie de propriul său director; in git lucrați de obicei pe un singur director. Trecerea de filiale în Mercurial înseamnă schimbarea directoare; in git, înseamnă să-i ceri git pentru a schimba directorul's de conținut cu git checkout.

Am'm sincer: eu nu't știu dacă l's posibil pentru a face același lucru cu Mercurial, dar de obicei lucrez pe proiecte web, folosind întotdeauna același director cu git pare mult mai comod pentru mine, deoarece eu nu't trebuie să re-configura Apache și reporniți-l și nu - 't mizeria mea de fișiere de fiecare dată când am de ramură.

Edit: Ca Deestan remarcat, Hg a nume ramuri, care pot fi stocate într-un singur depozit și permite dezvoltator pentru a comuta sucursale în aceeași copie de lucru. git ramuri nu sunt exact la fel ca Mercurial numit ramuri, oricum: ele sunt permanente și nu arunca ramuri, cum ar fi în git. Asta înseamnă că, dacă utilizați un nume de ramură pentru sarcini experimentale chiar dacă vă decideți pentru a nu fuziona vor fi stocate în depozit. Ca's motivul Hg încurajează să folosesc clone pentru experimentale, scurt-execută sarcini și numit ramuri pentru mult timp-sarcini de funcționare, cum ar fi pentru eliberarea ramuri.

Motivul pentru care o mulțime de Hg utilizatorii place clone peste numit ramură este mult mai socială sau culturală decât tehnice. De exemplu, cu ultimele versiuni de Hg, l's posibil pentru a închide un nume de ramură și recursiv elimina metadatele din changesets.

Pe de altă parte, git invită să utilizați "nume ramuri" care nu sunt permanente și nu sunt stocate ca metadate pe fiecare changeset.

Din punctul meu de vedere personal, atunci, git's model este profund legat de conceptul de nume ramuri și a comuta între o ramură și un alt termen de același director; hg poate face același lucru cu nume ramuri, dar încă se încurajează utilizarea de clone, pe care eu personal nu't place prea mult.

Comentarii (4)

Nu's o mare diferența dintre git și mercurial; modul în care reprezintă fiecare a comis-o. git reprezintă angajează ca instantanee, în timp ce mercurial le reprezintă ca diff.

Ce înseamnă acest lucru în practică? Ei bine, multe operațiuni sunt mai rapide in git, cum ar fi trecerea la un alt comite, comparându-se angajează, etc. În special dacă acestea se angajează sunt departe.

AFAIK nu's nici un avantaj de mercurial's de abordare.

Comentarii (7)

Dacă le-am înțeles în mod corect (și am'm departe de a fi un expert pe fiecare) au în mod fundamental fiecare are o filozofie diferită. Am folosit prima mercurial pentru 9 luni. Acum am'am folosit git pentru 6.

hg este versiunea software-ului de control. L's scop principal este de a urmări versiuni de o bucată de software.

git este un timp pe sistemul de fișiere. L's scopul este de a adăuga o altă dimensiune a unui sistem de fișiere. Cele mai multe au fișiere și foldere, git adaugă timp. Care se întâmplă să lucreze minunat ca un VCS este un produs secundar de design.

În hg, acolo's o istorie a întregului proiect it's întotdeauna încearcă să se mențină. În mod implicit cred hg vrea toate modificările la toate obiectele de către toți utilizatorii atunci când împingând și trăgând.

În git acolo's doar un bazin de obiecte și aceste fișiere de urmărire (sucursale/capete), care determina care set de aceste obiecte reprezintă arborele de fișiere într-un anumit stat. Atunci când împingând sau trăgând git trimite doar obiectele necesare pentru anumite ramuri sunt împingere sau tragere, care este un mic subset de obiecte.

Cât git este în cauză, nu există nici o "1 proiect". Ai putea avea 50 de proiecte, toate în același repo și git n't de îngrijire. Fiecare dintre ele ar putea fi gestionate separat în același repo și de a trăi bine.

Hg's conceptul de ramuri se ramifică principalul proiect sau sucursale de pe ramuri etc. Git nu are un astfel de concept. O sucursală în git este doar o stare de copac, totul este o ramură în git. Care filiala este oficial, curent, sau mai nou are nici un sens în git.

Eu nu't știu dacă asta are vreun sens. Dacă am putea desena imagini hg ar putea arata ca aceasta în cazul în care fiecare comite este un "o"

             o---o---o
            /        
o---o---o---o---o---o---o---o
         \         /
          o---o---o

Un copac cu o singură rădăcină și ramuri provenind de pe ea. În timp ce git poate face asta și de multe ori oamenii folosesc, în acest fel ca's nu puse în aplicare. Un git de imagine, dacă există un astfel de lucru, ar putea cu ușurință să arate acest lucru

o---o---o---o---o

o---o---o---o
         \
          o---o

o---o---o---o

În fapt, în unele privințe nu't nici un sens pentru a arăta ramuri în git.

Un lucru care este foarte confuz pentru discuții, git, mercurial ambele au ceva numit "branch" dar ele nu sunt la distanță aceleași lucruri. O sucursală în mercurial vine atunci când există conflicte între diferite repos. O sucursală în git este aparent similar cu o clona in hg. Dar o clona, în timp ce s-ar putea da un comportament similar este cel mai sigur, nu la fel. Consideră-mă încearcă în aceste git vs hg folosind crom repo, care este destul de mare.

$ time git checkout -b some-new-branch
Switched to new branch 'some-new-branch'

real   0m1.759s
user   0m1.596s
sys    0m0.144s

Și acum în hg folosind clona

$ 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

Ambele sunt fierbinte ruleaza. De exemplu, le-am verificat de două ori și acesta este cel de-al doilea termen. hg clona este, de fapt, la fel ca git-nou-workdir. Ambele fac un complet nou de lucru dir aproape ca și cum ai fi scris cp-r proiect-clona. Ca's nu la fel ca a face o noua filiala in git. L's mult mai grele în greutate. Dacă nu este adevărat echivalent de git's ramificare în hg eu nu't știu ce este.

Am înțeles la un nivel hg și git poate fi capabil să facă lucruri similare. Dacă este așa, atunci există încă o mare diferență în fluxul de lucru se duce la. În git, fluxul de lucru tipic este de a crea o ramură pentru fiecare caracteristică.

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

Că doar l-a creat 3 ramuri, fiecare bazat pe o ramură numită master. (M-am'm sigur că nu's un fel in git pentru a face aceste 1 linie, fiecare loc de 2)

Acum, pentru a lucra pe unul fac

git checkout fix-game-save-bug

și începe să lucreze. Comite lucruri, etc. Comutarea între ramuri chiar și într-un proiect la fel de mare ca chrome este aproape instantanee. De fapt eu nu't știu cum să fac asta în hg. L's nu face parte din nici tutoriale nu'am citit.

O altă mare diferență. Git's etapă.

Git are această idee de o etapă. Vă puteți gândi la ea ca la un folder ascuns. Atunci când comite numai comite ceea ce'e pe scenă, nu schimbări în lucru copac. Asta ar putea suna ciudat. Dacă doriți să comită toate modificările în lucru copac'd nu git commit -o care se adaugă toate fișierele modificate de la scenă și apoi le comite.

Ce's punctul de scenă? Puteți separa cu ușurință comite. Imaginați-vă că editate joypad.cpp și gamesave.cpp și vrei să-i angajeze separat

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 chiar are comenzi pentru a decide care anume linii în același fișier pe care doriți să-l copiați pe scenă astfel încât să puteți împărți aceste se angajează separat, precum și. De ce ai vrea să faci asta? Pentru ca separat se angajează alții pot trage doar cele pe care le vreau sau dacă nu a fost o problemă, ei pot reveni doar comite care a avut problema.

Comentarii (3)

Nimic. Ambele fac același lucru, ambele efectua aproximativ la fel. Singurul motiv pentru care ar trebui să alegeți una peste alta este dacă vrei să ne ajuți cu un proiect care utilizează deja unul..

Alte posibile motive pentru alegerea unuia este o aplicație sau un serviciu care acceptă numai una din sistem.. De exemplu, am ales să învețe git din cauza github..

Comentarii (1)

De asemenea, google's comparație (deși l's un pic mai vechi, făcut în 2008)

http://code.google.com/p/support/wiki/DVCSAnalysis

Comentarii (0)

Există o dinamică în comparație diagramă la versioncontrolblog unde poți compara mai multe versiuni diferite sisteme de control.

Aici este un tabel comparativ între git, hg și bzr.

Comentarii (3)

Există diferențe destul de semnificative atunci când vine vorba de a lucra cu ramuri (mai ales cele pe termen scurt).

Acesta este explicat în acest articol (BranchingExplained), care compară Mercurial cu Git.

Comentarii (0)

Un lucru de observat între mercurial de bitbucket.org și git de github este, mercurial poate avea cât mai multe privat centrale de tranzacții, după cum doriți, dar github trebuie să faceți upgrade la un cont platit. Deci, ca's de ce am merge pentru bitbucket care folosește un mercurial.

Comentarii (0)

Sunt acolo orice Windows pe bază de colaboratori la proiectul tău?

Pentru că dacă există, Git-pentru-Windows GUI pare ciudat, dificil, neprietenos.

Mercurial-pe-Windows, prin contrast, este un nu-brainer.

Comentarii (2)

Anul trecut am evaluate atât git și hg pentru uzul meu, și a decis să meargă cu hg. Am simțit că arăta ca un cleaner soluție, și a lucrat mai bine pe mai multe platforme, în timp. A fost cea mai mare parte o aruncare-up, totuși.

Mai recent, am început să folosesc git din cauza git-svn și capacitatea de a acționa ca un client de Subversiune. Asta m-a cucerit și m-am'am acum a trecut complet la git. Cred că's a primit un ușor mai mare curbă de învățare (mai ales dacă aveți nevoie pentru a scormoni în jurul valorii de interiorul), dar de fapt este un mare sistem. Am'm de gând să du-te și citește cele două comparație articole care John a postat acum.

Comentarii (1)

Am'm în prezent în procesul de migrare de la SVN-ul de la un DVCS (în timp ce blogging-ul despre descoperirile mele, primul meu blog efort...), și am'am făcut un pic de cercetare (=pe google). În măsura în care pot vedea, puteți face cele mai multe dintre lucrurile cu ambele pachete. Se pare ca git are câteva mai mult sau mai bine puse în aplicare caracteristici avansate, Eu nu simt că integrarea cu windows este un pic mai bine pentru mercurial, cu TortoiseHg. Știu că nu's Git Ghepard la fel de bine (am incercat ambele), dar mercurial soluție pare mai robust.

Văzând cum au're ambele open-source (nu?) Eu nu't cred că va fi lipsit de caracteristici importante. Dacă ceva este important, oamenii vor cere pentru el, oamenii vor cod.

Cred că pentru practici comune, Git, Mercurial sunt mai mult decât suficiente. Ambele au mari proiecte pe care le folosesc (Git -> linux kernel, Mercurial -> Mozilla foundation proiecte, atât printre altele, desigur), așa că am don't cred că sunt într-adevăr lipsit ceva.

Acestea fiind spuse, sunt interesat de ceea ce spun alte persoane despre asta, ca s-ar face o mare sursă pentru blogging-ul meu eforturi ;-)

Comentarii (1)

Există o mare și exhaustivă comparație tabele și grafice pe git, Mercurial și Bazar la InfoQ's ghid despre DVCS.

Comentarii (0)

Îmi dau seama că nu e't o parte din răspuns, dar pe această notă, cred, de asemenea, disponibilitatea de stabil plugin-uri pentru platforme, cum ar fi NetBeans și Eclipse juca un rol în care instrumentul este mai potrivit pentru sarcina, sau, mai degrabă, instrument care este cel mai potrivit pentru "tu". Asta este, dacă nu *într-adevăr *** vreau să-l fac CLI-un fel.

Ambele Eclipse (și totul bazat pe el) si NetBeans, uneori, au probleme cu telecomanda sisteme de fișiere (cum ar fi SSH) și externe actualizări de fișiere, care este încă un alt motiv pentru care vrei orice ai alege să lucreze "perfect".

Am'm încercat să răspundă la această întrebare pentru mine acum prea .. și am'am fiert în jos candidații la Git sau Mercurial .. vă mulțumesc tuturor pentru furnizarea de contribuții utile pe acest subiect, fără a merge religioase.

Comentarii (1)

Dacă sunteți interesat într-o comparație de performanță de Mercurial și Git avea o privire la acest articol]1. Concluzia este:

Git, Mercurial ambele rândul său, în mare număr, dar face un interesant compromis între viteză și depozit dimensiune. Mercurial este rapid, cu atât se adaugă și modificări, și păstrează depozit de creștere sub control în același timp. Git este, de asemenea, rapid, dar repository creste foarte repede cu fișierele modificate până repack — și cei repacks poate fi foarte lent. Dar ambalate depozit este mult mai mică decât Mercurial's.

Comentarii (0)