從VSS到SVN再到Git 記Git的基本操做

Source code control 一直是軟件開發過程當中重要的環節,從最初的純文件備份,到使用工具進行管理。Source code control 工具的做用也不只僅只是單純的對同一個版本進行管理了。從目前主流的source code control工具當中不難發現裏面的Branch, tag等功能的應用場景愈來愈多,特別是如今多數企業使用的敏捷編程,結合branch和tag等功能真的可以很好的作到多版本開發,快速迭代。git

思考: 沒有source code control咱們如何快速的基於一份代碼同時進行多個功能的並行開發。github

回過頭來講下本人在行業當中所用到的幾款source code control工具。編程

VSS

VSS(Visual Source Salf),是一款微軟提供的代碼管理工具,做爲Visual Studio的一員,在早期的開發過程中確實可以確保代碼不被開發人員錯誤的修改,也解決了異地開發協做的代碼共享管理的難點。可是依舊有一些不足,好比:安全

  • 文件基本以獨佔的形勢進行鎖定。若是A在修改的時候B沒有辦法進行修改。
  • VSS只支持Windows版本,支持的開發工具僅支持微軟系。
  • 基於文件存儲,服務器必須共享文件夾。安全性值得考慮。之前通常用於內網開發環境。
  • 收費

SVN

SVN(Subversion),一個開源的source code control system。除開最基本的如VSS提供的代碼管理功能外,最大的亮點是提供了分支,且提交內容的級別基於代碼行了。也就是說,不用再有獨佔文件開發的問題了。好比,一個實現接口的代碼文件能夠由多個開發人員同時修改。誰先作完誰能夠先進行提交,不會等到必須全部的人作完後再進行合併。對於不能使用VSS的工程師來講,SVN的出現徹底是一個福音,直接從CVS跳到了這麼強大的工具上。
總結一下,SVN的優劣以下:bash

  • 優點:
    • 代碼一致性高。
    • 支持提交事物性操做。
    • Diff 功能。
    • Branch,Tag的引用,方便版本管理。
    • 輕鬆上手。
  • 劣勢
    • 必須是聯網狀態下才能夠進行一些數據的讀取。
    • 不是分佈式的代碼庫。
    • SVN服務器崩潰的災難是巨大的。

Git

隨着開源運動的流行(Liunx開發人員的功勞),Git也就這麼流行起來的。說是在隨着開源運動的流行而流行起Git的呢?這歸功於Git的分佈式這一特性。試想,若是全世界全部的Liunx愛好者都在幾臺機器上進行開發和提交,這酸爽不敢想象。抑或是主服務器崩潰了,那麼其餘的開發人員也只有淚奔。
Git的牛逼之處在於如下:服務器

  • 每一次Clone就是從服務器上pull到了全部的內容,包括版本信息。
  • 在本地能夠根據不一樣的須要,本地新建本身的分支。
  • 分支之間的任意切換。
  • 單機上就能夠進行分支合併。
  • 牛人+插件加持。 Git flow, 按Vincent Driessen 分支模型提供的一個插件.

git-model@2x.png

A successful Git branching modelapp

如何使用Git

  1. 安裝
  2. $ Brew install git分佈式

  3. 建立倉庫工具

  4. $ git init
  5. 文件操做post

    有了倉庫後就能夠對文件進行 add , commit, push 和pull等操做了。

Tables Are
git add 添加至暫存區
git add–interactive 交互式添加
git apply 應用補丁
git am 應用郵件格式補丁
git annotate同義詞,等同於 git blame
git archive 文件歸檔打包
git bisect 二分查找
git blame 文件逐行追溯
git branch 分支管理
git cat-file 版本庫對象研究工具
git checkout 檢出到工做區、切換或建立分支
git cherry-pick 提交揀選
git citool 圖形化提交,至關於 git gui 命令
git clean 清除工做區未跟蹤文件
git clone 克隆版本庫
git commit 提交
git config 查詢和修改配置
git describe 經過里程碑直觀地顯示提交ID
git diff 差別比較
git difftool 調用圖形化差別比較工具
git fetch 獲取遠程版本庫的提交
git format-patch 建立郵件格式的補丁文件。參見 git am 命令
git grep 文件內容搜索定位工具
git gui 基於Tcl/Tk的圖形化工具,側重提交等操做
git help 幫助
git init 版本庫初始化
git init-db* 同義詞,等同於 git init
git log 顯示提交日誌
git merge 分支合併
git mergetool 圖形化衝突解決
git mv 重命名
git pull 拉回遠程版本庫的提交
git push 推送至遠程版本庫
git rebase 分支變基
git rebase–interactive 交互式分支變基
git reflog 分支等引用變動記錄管理
git remote 遠程版本庫管理
git repo-config* 同義詞,等同於 git config
git reset 重置改變分支「遊標」指向
git rev-parse 將各類引用表示法轉換爲哈希值等
git revert 反轉提交
git rm 刪除文件
git show 顯示各類類型的對象
git stage* 同義詞,等同於 git add
git stash 保存和恢復進度
git status 顯示工做區文件狀態
git tag 里程碑管理

.
.

Best practice

建議使用github進行上手實驗。使用郵箱註冊一次Git hub後便可在Github上建立本身的Repository.


2.png

建立完成後,咱們會獲得一個Repository的地址。有了這個地址咱們就能夠進行Git的練習了。


3.png
  • 使用 git clone 將遠程倉庫clone到本地。

    git clone

5.png
  • 添加一些文件
echo "Hello Scott" -> "Hello" //寫了一個文件到Hello git add Hello // 將Hello文件添加到暫存區。(Index) git commit -m "this is my first file" // 提交到本地倉庫 git push //推送本地倉庫到遠程倉庫

6.png

以上,文件就被推送到了遠程倉庫。其餘工程師若是執行Pull操做的話便可把變更的文件拉到本地。


7.png
  • 若是有其餘工程師修改了文件,須要遠程獲取下。
    git pull  //拉取遠端文件 git log //能夠查看變動歷史

A5B85BFD-764E-468F-81C4-0B727BA70428.png
  • 衝突的解決
    衝突每每是由於版本不一致而產生。如工程師A修改了Hello文件並提交到遠端倉庫,而B在本地修改了Hello,也想提交。因爲A和B的Hello文件並不一致,因此衝突產生了。

4EB9EB75-2FF9-4363-AD78-9E13D1415EA8.png

只須要git pull一次便可。 (注:git pull 會自動merge,可是一般狀況下自動merge效果不會太好。好比A和B 都在修改function A (){} )
衝突長這模樣。


10.png

通常手動解決衝突後,從新添加,提交,push便可。


11.png

如上描述,手動合併衝突比較麻煩。建議使用工具進行git 的操做,如今通常的工具都提供了分支管理,合併等功能。
推薦 SourceTree

分支的管理

在不少時候會遇到同時須要開發多個功能,開發任務將會交給多個工程師進行開發,這個時候在Git上的實踐爲-->建立多個分支。 N個工程師從Master或Dev分支進行分支建立。

git checkout -b NewFeature   // 分支建好後,會直接切換到該分支。 git push --set-upstream origin NewFeature //與遠程分支關聯

完成開發後,須要合併到Master 或Dev 分支。

git merge origin/NewFeature // 將遠程分支NewFeature與當前分支合併。

12.png

寫在最後

以上從source code control擴散到Git的使用,僅僅只是拋磚引玉。歡迎你們多多指教。

相關文章
相關標籤/搜索