小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

為什么選擇GIT--GIT與其他SCM工具的比較

 shaobin0604@163.com 2010-06-05

原文地址:http://zh-tw./


我會做這個(gè)網(wǎng)站是因?yàn)槲一撕芏鄷r(shí)間在替 Gitsters 辯護(hù),對抗那些狂熱者 (fanboyism),從眾者 (badwagonism) 還有 koolaid-thirst。這裡要說明的就是為什麼大家都要從 X 換成 Git,而為什麼你也應(yīng)該這樣做的原因。直接點(diǎn)擊任何一個(gè)原因來展開查看。

使 Git 從幾乎所有其他 SCM 中脫穎而出,最受矚目的特色,恐怕非它的分支模型莫屬。 它完全不同於我在此一起比較的其他模型,大部分它們推薦的最佳分支方法僅僅只是複製倉儲 (repository) 到新的目錄而已。
Git 可不這麼做。 Git 讓你可以擁有多個(gè)本地的分支,它們可能是完全獨(dú)立的,而且建立、合併和刪除這些開發(fā)的支線只需要幾秒鐘的時(shí)間。
這表示你可以這樣做:
  • 建立一個(gè)分支來試試新點(diǎn)子,提交 (commit) 個(gè)幾次然後切回你原本的分支,加上一個(gè) patch 然後再切回剛剛實(shí)驗(yàn)用的分支,把它合併進(jìn)來。
  • 有一個(gè)分支只用來放要釋出的版本,另一個(gè)用來合併開發(fā)中的部份供測試,其他幾個(gè)小分支用來放每天的開發(fā)工作。
  • 替每一個(gè)你正在實(shí)做的新功能建立新的分支,然後你就可以平順的在它們之中切換,最後刪除掉每一個(gè)新功能已經(jīng)合併回主線的分支。
  • 建立一個(gè)新的分支做實(shí)驗(yàn),結(jié)果發(fā)現(xiàn)這樣行不通就刪掉這個(gè)分支;放棄一個(gè)分支,甚至沒有任何人知道它曾經(jīng)存在 (同時(shí)你還可以把其他的分支公佈出去)
branches flowchart
最重要的是,當(dāng)你要發(fā)布到一個(gè)遠(yuǎn)端的倉儲,你不需要把你所有的分支都推出去。 你可以只分享你的分支的其中一個(gè)而不是全部。這讓大家可以嘗試新的點(diǎn)子而不需要擔(dān)心要計(jì)劃要如何、何時(shí)合併或與其他人分享。
你在其他系統(tǒng)上可以找到方法做同樣的事,但是會比較困難且容易出錯(cuò)。 Git 讓這個(gè)過程變得非常簡單,而且當(dāng)開發(fā)人員開始學(xué)習(xí),它常常會改變他們工作的方法。

svn perforce

這基本上對所有分散式 SCM 來說都是一樣的,但是在我的經(jīng)驗(yàn)中 Git 把這個(gè)特性發(fā)揮的更好。 除了 'fetch', 'pull' 和 'push' 這些命 令外,幾乎沒有其他命令會需要硬碟之外的東西。
這不只讓大部分操作變得比你可能習(xí)慣的還要快得多,它還讓你可以離線工作。 這聽起來也許沒有什麼,但是我總是驚訝於我有多麼常離線工作。 當(dāng)你在飛機(jī)上或火車上,你還可以建立分支、合併和提交工作、瀏覽專案的歷史,這是多麼的有生產(chǎn)力。
local repo to remote repo flowchart
就算是用 Mercurial,一些常用的指令如 'incoming' 和 'outgoing' 也需要連線伺服器,而用 Git 你可以在離線前 'fetch' 伺服器上所有的資料,然後比較、合併和查看紀(jì)錄,這些資料原本是在伺服器上還沒有在你的本分支中的。
這表示你可以很容易擁有不只你自己的分支的副本,還有其他任何和你一起工作的人的分支都可以存在你的 Git 倉儲中而不打亂你原有的東西。

Git 很快。大家都這麼說,甚至那些其他系統(tǒng)的死忠支持者也都會給予 Git 這個(gè)評價(jià)。 使用 Git,所有的操作都是在本地端的特性讓它比 SVN 與 Perforce 跑得快許多,它們兩個(gè)都需要網(wǎng)路連線才能完成大部分操作。 然而,就算是與其他也是在本地端操作的 DSCM 比較,Git 還是快非常多。
一部分的原因可能是因?yàn)樗墙碛迷?Linux 核心上的,這表示它從一開始就必須有效率的處理非常大的倉儲。 此外,因?yàn)?Git 是用 C 寫的,減少了使用其他高階語言在執(zhí)行期的開銷。 另外一個(gè) Git 這麼快地原因是因?yàn)樗闹饕_發(fā)者們將這個(gè)列為設(shè)計(jì)的目標(biāo)。
底下是一些我測試的數(shù)據(jù),使用 Django 的原始碼倉儲與三種不同的 SCM: Git, Mercurial 和 Bazaar。 我也用 SVN 測試了一些同樣的項(xiàng)目,不過相信我,它慢更多 — 基本上是 Bazaar 的數(shù)字再加上網(wǎng)路的延遲...
init benchmarks add benchmarks status benchmarks diff benchmarks branching benchmarks
tag benchmarks log benchmarks large commit benchmarks small commit benchmarks
測試的結(jié)果是所有操作,除了加新檔案之外都是 Git 最快。 (還有大量的提交操作,Hg 基本上一樣快,可是我測試的提交量是如此之大,你平常不太可能有同樣的的量 — 正常的提交操作在 Git 快多了。)
 GitHgBzr
Init 0.024s 0.059s 0.600s
Add 8.535s 0.368s 2.381s
Status 0.451s 1.946s 14.744s
Diff 0.543s 2.189s 14.248s
Tag 0.056s 1.201s 1.892s
Log 0.711s 2.650s 9.055s
Commit (Large) 12.480s 12.500s 23.002s
Commit (Small) 0.086s 0.517s 1.139s
Branch (Cold) 1.161s 94.681s 82.249s
Branch (Hot) 0.070s 12.300s 39.411s
Cold 和 Hot 分支數(shù)字是我第一次和第二次分支一個(gè)倉儲 — 第二次分支的數(shù)據(jù)有使用磁碟快取。
要特別注意的是雖然 'add' 操作的速度慢很多,但這是在大量的檔案 — 超過 2000 個(gè) — 上進(jìn)行新增操作 。 對於大部分人日常使用來說,在任何系統(tǒng)上新增操作都只會用到幾分之一秒而已。 其他測試到的操作 (除了大量提交...大概) 應(yīng)該與你日常用到的差不多。
這些數(shù)字不會很難重現(xiàn),只要用不同的系統(tǒng) clone 一份 Django 計(jì)劃然後試試這些指令就可以了。
  • git clone git://github.com/brosner/django.git dj-git
  • hg clone http://hg./django/trunk dj-hg
  • bzr branch lp:django dj-bzr
  • svn checkout http://code./svn/django/trunk dj-svn
Git 真的很懂得怎麼節(jié)省磁碟空間。 你的 Git 目錄只會 (一般來說) 比一個(gè) SVN checkout 大一點(diǎn)點(diǎn) — 一些情況下甚至更小 (顯然 .svn 目錄裡面有很多東西可以丟掉)。
以下數(shù)據(jù)是用不同系統(tǒng)使用同樣的歷史紀(jì)錄點(diǎn)取出 Django 之後得到。
 GitHgBzrBzr*SVN
Repo Alone 24M 34M 45M 89M  
Entire Directory 43M 53M 64M 108M 61M
* 第二個(gè) Bzr 數(shù)字是我執(zhí)行 'bzr pack' 後得到,我原本以為會讓它更小,結(jié)果反而讓它變大許多...。
hg bzr svn perforce

和其他系統(tǒng)不一樣,Git 有它稱為 "staging area" 或 "index" 的東西。 這是一個(gè)中間地帶讓你可以在提交前設(shè)定你想要提交什麼。
Staging area 最酷的地方,讓 Git 遠(yuǎn)遠(yuǎn)拋開其他工具的,就是你可以輕易的 在工作告一段落後 stage 一些你的檔案,然後提交上去而不需要提交所有修改過的檔案,或是必須在命令列上列出所有想要提交的檔案。
add
commit workflow diagram
這還允許你只 stage 修改過的檔案的一部分。 想像有一天你對一個(gè)檔案做了兩項(xiàng)毫不相關(guān)的修改,然後你發(fā)現(xiàn)忘了先提交其中一個(gè)。 現(xiàn)在你可以只 stage 你現(xiàn)在要提交的部份,然後在 stage 剩下的改變給下一次提交。 這個(gè)功能可擴(kuò)大應(yīng)用到任何你對檔案的改變。
當(dāng)然了,Git 也可以很簡單的略過這些特性。 如果你不想要控制這麼多 — 只要加上 '-a' 到你的 commit 命令就可以一次把所有的修改都丟到 staging area 去。
commit
only workflow diagram
svn perforce

任何分散式 SCM,當(dāng)然包括 Git,最酷的功能之一就是它是分散式的。 這表示你不是只 "checkout" 目前最新版的原始碼,而是 "clone" 整個(gè)倉儲。
這表示甚至你是使用中央集中式的工作流程,每一位使用者都有會一份主伺服器的備份,每一份都可以在主伺服器當(dāng)機(jī)或損 壞時(shí)推上去取代主伺服器。 基本上使用 Git 不會因?yàn)檫z失單一的點(diǎn)而造成災(zāi)難,除非就只有那一個(gè)點(diǎn)。
而且這不會使得操作變慢太多。平均來說,一次 SVN 的 checkout 只比其他 DSCM 快一點(diǎn)。 當(dāng)然在我測試過的 DSCM 中,Git 是最快的。
cloning benchmarks
Git 1m 59s
Hg 2m 24s
Bzr 5m 11s
SVN 1m 4s
svn perforce

其中一個(gè) Git 令人驚訝的事情就是因?yàn)樗姆稚⑹皆O(shè)計(jì)以及超級分支系統(tǒng),你可以輕易的實(shí)做出幾乎任何你想得到的工作流程。

Subversion 式的工作流程

這是一種很常見的 Git 工作流程,特別是那些從集中管理式系統(tǒng)轉(zhuǎn)換過來的人會使用的,是一種集中管理式的工作流程。 如果在你最後一次 fetch 後有人發(fā)布過改變,Git 不會允許你跟著發(fā)布,所以使用這種集中式的模型,所有的開發(fā)人員都發(fā)布到同一個(gè)伺服器也可以工作的很好。
subversion-style workflow

整合管理員工作流程

另外一種常見的 Git 工作流程就是有一個(gè)整合管理員 — 一個(gè)負(fù)責(zé)提交到 'blessed' 倉儲的人,然後其他數(shù)位開發(fā)人員從這個(gè)倉儲複製,發(fā)布到他們自己的獨(dú)立倉儲去,然後要求整合者 pull 他們的修改。 這是在開放原始碼界或是 GitHub 倉儲上常見的開發(fā)模型。
integration manager workflow

司令官與副手的工作流程

對於一些更複雜的專案,你可以讓你的開發(fā)人員們使用類似於 Linux 核心的開發(fā)流程,開發(fā)人員們各自負(fù)責(zé)專案中不同的子系統(tǒng) (副手) 然後合併所有關(guān)於此子系統(tǒng)的改變。另外一位整合者 (司令官) 只可以從他的副手手上 pull 改變,然後發(fā)布到 'blessed' 倉儲讓所有人都可以複製回去。
dictator and lieutenants workflow

在一次的,Git 是完全非常有彈性的,所以你可以混合和取用適合你的工作流程。
hg bzr svn perforce

octocat
這由我來說可能有點(diǎn)偏頗,因?yàn)槲姨?nbsp;GitHub 工作,但是我還是決定要寫這一部份,因?yàn)楹芏嗳苏f他們是因?yàn)?GitHub 而選擇 Git。
GitHub 是很多人使用 Git 的原因之一,因?yàn)樗袷且粋€(gè)社交網(wǎng)路而不僅僅是簡單的 hosting 服務(wù)。 人們找到其他開發(fā)人員或是專案,和他們想要做的事類似,因此可以輕易的分支然後貢獻(xiàn),以 Git 和各種專案為中心創(chuàng)造出一個(gè)非?;钴S的社群。
網(wǎng)路上還有其他類似的服務(wù),有 Git 的也有其他 SCM 的,但是很少是使用者導(dǎo)向或社交導(dǎo)向的,沒有一個(gè)其他服務(wù)有類似的用戶群。 這個(gè) GitHub 的社交觀點(diǎn)是它的殺手級應(yīng)用,合併以上的特色使得使用 Git 與 GitHub 工作變成快速開發(fā)開放原始碼專案的極佳組合。
這樣的社群不是其他 SCM 所擁有的。
perforce

這本來不是真的 — 早期 Git 不是一個(gè)真正的 SCM,比較像是一組工具讓你可以用分散式的觀點(diǎn)做出有版本控制的檔案系統(tǒng)。 但是現(xiàn)在,Git 的命令集以及學(xué)習(xí)曲線已經(jīng)變得和其他 SCM 類似,甚至比一些更好。
不特別去做研究的話很難證明這一點(diǎn),我在這僅顯示出 Mercurial 與 Git 的預(yù)設(shè) 'help' 菜單之間的差異。 我把兩個(gè)系統(tǒng)間相同 (或是近似) 的命令做了高亮顯示。 (在 Hg 中,如果你輸入 'hg help',你會得到一個(gè) 40 多個(gè)指令的清單。)

Mercurial Help

add        add the specified files ...
            annotate   show changeset informati...
            clone      make a copy of an existi...
            commit     commit the specified fil...
            diff       diff repository (or sele...
            export     dump the header and diff...
            init       create a new repository ...
            log        show revision history of...
            merge      merge working directory ...
            parents    show the parents of the ...
            pull       pull changes from the sp...
            push       push changes to the spec...
            remove     remove the specified fil...
            serve      export the repository vi...
            status     show changed files in th...
            update     update working directory
            

Git Help

add        Add file contents to the index
            bisect     Find the change that introduce...
            branch     List, create, or delete branches
            checkout   Checkout a branch or paths to ...
            clone      Clone a repository into a new ...
            commit     Record changes to the repository
            diff       Show changes between commits, ...
            fetch      Download objects and refs from...
            grep       Print lines matching a pattern
            init       Create an empty git repository
            log        Show commit logs
            merge      Join two or more development h...
            mv         Move or rename a file, a direc...
            pull       Fetch from and merge with anot...
            push       Update remote refs along with ...
            rebase     Forward-port local commits to ...
            reset      Reset current HEAD to the spec...
            rm         Remove files from the working ...
            show       Show various types of objects
            status     Show the working tree status
            tag        Create, list, delete or verify...
            
在 Git 1.6 之前,所有的 Git 命令都放在執(zhí)行檔路徑下,常使一些人的感到迷惑。 現(xiàn)在雖然 Git 仍然認(rèn)識這些指令,但在執(zhí)行檔路徑下的命令只剩下 'git' 一個(gè)。 如果你仔細(xì)比較 Mercurial 和 Git 會發(fā)現(xiàn),Git 和 Mercurial 有幾乎一樣的指令集和說明系統(tǒng) — 以初學(xué)者的 UI 角度來說兩者之間幾乎沒有差別?,F(xiàn)在已經(jīng)很難說 Mercurial 或 Bzr 比 Git 容易學(xué)習(xí)了。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多