Source code control 一直是軟件開發(fā)過程中重要的環(huán)節(jié),從最初的純文件備份关摇,到使用工具進(jìn)行管理荒叶。Source code control 工具的作用也不僅僅只是單純的對同一個版本進(jìn)行管理了。從目前主流的source code control工具當(dāng)中不難發(fā)現(xiàn)里面的Branch, tag等功能的應(yīng)用場景越來越多输虱,特別是現(xiàn)在多數(shù)企業(yè)使用的敏捷編程些楣,結(jié)合branch和tag等功能真的能夠很好的做到多版本開發(fā),快速迭代宪睹。
思考: 沒有source code control我們?nèi)绾慰焖俚幕谝环荽a同時進(jìn)行多個功能的并行開發(fā)愁茁。
回過頭來說下本人在行業(yè)當(dāng)中所用到的幾款source code control工具。
VSS
VSS(Visual Source Salf)亭病,是一款微軟提供的代碼管理工具鹅很,作為Visual Studio的一員,在早期的開發(fā)過程當(dāng)中確實能夠確保代碼不被開發(fā)人員錯誤的修改罪帖,也解決了異地開發(fā)協(xié)作的代碼共享管理的難點促煮。但是依舊有一些不足,比如:
- 文件基本以獨占的形勢進(jìn)行鎖定整袁。如果A在修改的時候B沒有辦法進(jìn)行修改污茵。
- VSS只支持Windows版本,支持的開發(fā)工具僅支持微軟系葬项。
- 基于文件存儲,服務(wù)器必須共享文件夾迹蛤。安全性值得考慮民珍。以前一般用于內(nèi)網(wǎng)開發(fā)環(huán)境。
- 收費
SVN
SVN(Subversion)盗飒,一個開源的source code control system嚷量。除開最基本的如VSS提供的代碼管理功能外,最大的亮點是提供了分支逆趣,且提交內(nèi)容的級別基于代碼行了蝶溶。也就是說,不用再有獨占文件開發(fā)的問題了。比如抖所,一個實現(xiàn)接口的代碼文件可以由多個開發(fā)人員同時修改梨州。誰先做完誰可以先進(jìn)行提交,不會等到必須所有的人做完后再進(jìn)行合并田轧。對于不能使用VSS的工程師來說暴匠,SVN的出現(xiàn)完全是一個福音,直接從CVS跳到了這么強大的工具上傻粘。
總結(jié)一下每窖,SVN的優(yōu)劣如下:
-
優(yōu)勢:
- 代碼一致性高。
- 支持提交事物性操作弦悉。
- Diff 功能窒典。
- Branch,Tag的引用,方便版本管理稽莉。
- 輕松上手瀑志。
-
劣勢
- 必須是聯(lián)網(wǎng)狀態(tài)下才可以進(jìn)行一些數(shù)據(jù)的讀取。
- 不是分布式的代碼庫肩祥。
- SVN服務(wù)器崩潰的災(zāi)難是巨大的后室。
Git
隨著開源運動的流行(Liunx開發(fā)人員的功勞),Git也就這么流行起來的混狠。說是在隨著開源運動的流行而流行起Git的呢岸霹?這歸功于Git的分布式這一特性。試想将饺,如果全世界所有的Liunx愛好者都在幾臺機器上進(jìn)行開發(fā)和提交贡避,這酸爽不敢想象。抑或是主服務(wù)器崩潰了予弧,那么其他的開發(fā)人員也只有淚奔刮吧。
Git的牛逼之處在于以下:
- 每一次Clone就是從服務(wù)器上pull到了所有的內(nèi)容,包括版本信息掖蛤。
- 在本地可以根據(jù)不同的需要杀捻,本地新建自己的分支。
- 分支之間的任意切換蚓庭。
- 單機上就可以進(jìn)行分支合并致讥。
- 牛人+插件加持。 Git flow, 按Vincent Driessen 分支模型提供的一個插件.
A successful Git branching model
如何使用Git
安裝
$ Brew install git
創(chuàng)建倉庫
$ git init
-
文件操作
有了倉庫后就可以對文件進(jìn)行 add , commit, push 和pull等操作了器赞。
Tables | Are |
---|---|
git add | 添加至?xí)捍鎱^(qū) |
git add–interactive | 交互式添加 |
git apply | 應(yīng)用補丁 |
git am | 應(yīng)用郵件格式補丁 |
git annotate同義詞垢袱,等同于 git blame | |
git archive | 文件歸檔打包 |
git bisect | 二分查找 |
git blame | 文件逐行追溯 |
git branch | 分支管理 |
git cat-file | 版本庫對象研究工具 |
git checkout | 檢出到工作區(qū)、切換或創(chuàng)建分支 |
git cherry-pick | 提交揀選 |
git citool | 圖形化提交港柜,相當(dāng)于 git gui 命令 |
git clean | 清除工作區(qū)未跟蹤文件 |
git clone | 克隆版本庫 |
git commit | 提交 |
git config | 查詢和修改配置 |
git describe | 通過里程碑直觀地顯示提交ID |
git diff | 差異比較 |
git difftool | 調(diào)用圖形化差異比較工具 |
git fetch | 獲取遠(yuǎn)程版本庫的提交 |
git format-patch | 創(chuàng)建郵件格式的補丁文件请契。參見 git am 命令 |
git grep | 文件內(nèi)容搜索定位工具 |
git gui | 基于Tcl/Tk的圖形化工具,側(cè)重提交等操作 |
git help | 幫助 |
git init | 版本庫初始化 |
git init-db* | 同義詞,等同于 git init |
git log | 顯示提交日志 |
git merge | 分支合并 |
git mergetool | 圖形化沖突解決 |
git mv | 重命名 |
git pull | 拉回遠(yuǎn)程版本庫的提交 |
git push | 推送至遠(yuǎn)程版本庫 |
git rebase | 分支變基 |
git rebase–interactive | 交互式分支變基 |
git reflog | 分支等引用變更記錄管理 |
git remote | 遠(yuǎn)程版本庫管理 |
git repo-config* | 同義詞爽锥,等同于 git config |
git reset | 重置改變分支“游標(biāo)”指向 |
git rev-parse | 將各種引用表示法轉(zhuǎn)換為哈希值等 |
git revert | 反轉(zhuǎn)提交 |
git rm | 刪除文件 |
git show | 顯示各種類型的對象 |
git stage* | 同義詞涌韩,等同于 git add |
git stash | 保存和恢復(fù)進(jìn)度 |
git status | 顯示工作區(qū)文件狀態(tài) |
git tag | 里程碑管理 |
.
.
Best practice
建議使用github進(jìn)行上手實驗。使用郵箱注冊一次Git hub后即可在Github上創(chuàng)建自己的Repository.
創(chuàng)建完成后救恨,我們會得到一個Repository的地址贸辈。有了這個地址我們就可以進(jìn)行Git的練習(xí)了。
-
使用 git clone 將遠(yuǎn)程倉庫clone到本地肠槽。
git clone
- 添加一些文件
echo "Hello Scott" -> "Hello" //寫了一個文件到Hello
git add Hello // 將Hello文件添加到暫存區(qū)擎淤。(Index)
git commit -m "this is my first file" // 提交到本地倉庫
git push //推送本地倉庫到遠(yuǎn)程倉庫
以上,文件就被推送到了遠(yuǎn)程倉庫秸仙。其他工程師如果執(zhí)行Pull操作的話即可把變動的文件拉到本地嘴拢。
- 如果有其他工程師修改了文件,需要遠(yuǎn)程獲取下寂纪。
git pull //拉取遠(yuǎn)端文件
git log //可以查看變更歷史
- 沖突的解決
沖突往往是因為版本不一致而產(chǎn)生席吴。如工程師A修改了Hello文件并提交到遠(yuǎn)端倉庫,而B在本地修改了Hello捞蛋,也想提交孝冒。由于A和B的Hello文件并不一致,所以沖突產(chǎn)生了拟杉。
只需要git pull一次即可庄涡。 (注:git pull 會自動merge,但是通常情況下自動merge效果不會太好搬设。比如A和B 都在修改function A (){} )
沖突長這模樣。
一般手動解決沖突后拿穴,重新添加泣洞,提交,push即可默色。
如上描述球凰,手動合并沖突比較麻煩。建議使用工具進(jìn)行g(shù)it 的操作腿宰,現(xiàn)在一般的工具都提供了分支管理弟蚀,合并等功能。
推薦 SourceTree
分支的管理
在很多時候會遇到同時需要開發(fā)多個功能酗失,開發(fā)任務(wù)將會交給多個工程師進(jìn)行開發(fā),這個時候在Git上的實踐為-->創(chuàng)建多個分支昧绣。 N個工程師從Master或Dev分支進(jìn)行分支創(chuàng)建规肴。
git checkout -b NewFeature // 分支建好后,會直接切換到該分支。
git push --set-upstream origin NewFeature //與遠(yuǎn)程分支關(guān)聯(lián)
完成開發(fā)后拖刃,需要合并到Master 或Dev 分支删壮。
git merge origin/NewFeature // 將遠(yuǎn)程分支NewFeature與當(dāng)前分支合并。
寫在最后
以上從source code control擴散到Git的使用兑牡,僅僅只是拋磚引玉央碟。歡迎大家多多指教。