Onları doğru anlarsam (ve her birinde uzman olmaktan uzaksam) temelde her birinin farklı bir felsefesi vardır. İlk önce 9 ay boyunca cıva kullandım. Şimdi git'i 6 için kullandım.
hg sürüm kontrol yazılımıdır. Temel amacı bir yazılımın sürümlerini takip etmektir.
git zamana dayalı bir dosya sistemidir. Amacı bir dosya sistemine başka bir boyut eklemektir. Çoğu dosya ve klasöre sahiptir, git zaman ekler. Bir VCS olarak harika çalışmanın tasarımının bir yan ürünü olması.
Hg'de, her zaman sürdürmeye çalıştığı tüm projenin bir geçmişi vardır. Varsayılan olarak hg'nin itme ve çekme sırasında tüm kullanıcılar tarafından tüm nesnelerde tüm değişiklikleri istediğine inanıyorum.
Git'te sadece bir nesne havuzu ve bu izleme dosyalarının (dallar / kafalar) belirli bir durumdaki dosya ağacını temsil ettiğini belirleyen bu izleme dosyaları (dallar / başlıklar) vardır. Git'i iterken veya çekerken, yalnızca ittiğiniz veya çektiğiniz belirli dallar için gereken nesneleri gönderir, bu da tüm nesnelerin küçük bir alt kümesidir.
Git söz konusu olduğunda "1 proje" yoktur. Aynı repoda 50 projeniz olabilir ve git umursamazdı. Her biri aynı repoda ayrı ayrı yönetilebilir ve iyi yaşayabilir.
Hg'nin şubeler kavramı ana projenin şubeleri veya şubeler vb. Git'teki bir dal sadece ağacın durumudur, her şey Git'teki bir daldır. Hangi dalın resmi, güncel veya en yeni olduğu, git'te hiçbir anlam ifade etmiyor.
Bunun bir anlam ifade edip etmediğini bilmiyorum. Eğer resim çizebilseydim, hg bu gibi görünebilir.o
o---o---o
/
o---o---o---o---o---o---o---o
\ /
o---o---o
Tek bir kök ve dallardan çıkan bir ağaç. Git bunu yapabilir ve çoğu zaman insanlar zorla kullanılmayan şekilde kullanır. Git resmi, eğer böyle bir şey varsa, kolayca böyle görünebilir
o---o---o---o---o
o---o---o---o
\
o---o
o---o---o---o
Aslında bazı yönlerden git'te şubeleri göstermek bile mantıklı değil.
Tartışma için çok kafa karıştırıcı olan bir şey, git ve mercurial'ın her ikisi de "dal" olarak adlandırılan bir şey var, ancak uzaktan aynı şey değiller. Farklı depolar arasında anlaşmazlıklar olduğunda, mercurial'daki bir dal ortaya çıkar. Git'teki bir dal görünüşe göre hg cinsinden bir klona benzer. Ancak bir klon, benzer davranışlar verebilirken kesinlikle aynı değildir. Bunları git vs hg'de oldukça büyük olan krom repo kullanarak denemeyi düşünün.
$ time git checkout -b some-new-branch
Switched to new branch 'some-new-branch'
real 0m1.759s
user 0m1.596s
sys 0m0.144s
Ve şimdi hg'de klon kullanarak
$ 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
Her ikisi de sıcak koşu. Yani, onları iki kez çalıştırdım ve bu ikinci koşu. hg klonu aslında git-new-workdir ile aynıdır. Bunların her ikisi de neredeyse yazmışsınız gibi tamamen yeni bir çalışma direktörücp -r project project-clone
. Bu git'te yeni bir dal yapmakla aynı şey değil. Çok daha ağır. Git'in dallanmasının hg cinsinden gerçek eşdeğeri varsa bunun ne olduğunu bilmiyorum.
Bazı düzey hg de anlamak ve git olabilecek benzer şeyleri yapmaya muktedir. Eğer öyleyse, sizi yönlendirdikleri iş akışında hala büyük bir fark vardır. Git'te tipik iş akışı, her özellik için bir dal oluşturmaktır.
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
Bu, her biri master adı verilen bir dalı temel alan 3 şube oluşturdu. (Eminim git'te 2 yerine 1 satır yapmanın bir yolu vardır)
Şimdi sadece üzerinde çalıştığım
git checkout fix-game-save-bug
ve çalışmaya başlayın. İşleri yapın, vb. Krom kadar büyük bir projede bile şubeler arasında geçiş yapmak neredeyse anlıktır. Aslında bunu hg olarak nasıl yapacağımı bilmiyorum. Okuduğum öğreticilerin bir parçası değil.
Bir diğer büyük fark. Git'in sahnesi.
Git'in bir sahne fikri var. Bunu gizli bir klasör olarak düşünebilirsiniz. Taahhüt ettiğinizde, çalışma ağacınızdaki değişiklikleri değil, yalnızca sahnede olanları taahhüt edersiniz. Kulağa garip gelebilir. Çalışma ağacınızdaki tüm değişiklikleri yapmak istiyorsanız git commit -a
, değiştirilen tüm dosyaları sahneye ekleyen ve sonra bunları taahhüt eden yapardınız .
Sahnenin amacı ne? Taahhütlerinizi kolayca ayırabilirsiniz. Joypad.cpp ve gamesave.cpp dosyalarını düzenlediğinizi ve bunları ayrı ayrı taahhüt etmek istediğinizi düşünün
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'in aynı dosyadaki hangi belirli satırların sahneye kopyalamak istediğinize karar verme komutları bile vardır, böylece bu taahhütleri ayrı olarak bölebilirsiniz. Bunu neden yapmak istiyorsun? Çünkü ayrı taahhütler olarak diğerleri sadece istediklerini çekebilirler ya da bir sorun varsa, sadece sorunu içeren taahhüdü geri alabilirler.