首先,SVN 是一個集中式的版本控制系統,Git 是一個分佈式的版本控制系統,這是目前兩者最大的區別之一。
html
如上圖所示:對於不少操做來講,SVN必須在聯網下進行,而Git則在本地進行便可。但SVN有基於目錄級別的權限管理,而Git則須要藉助gitlab實現細粒度的權限管理。
前端
SVN: SVN的分支僅僅是一些有特殊含義的目錄。在建立一個新的分支時,你只是把項目的當前狀態完完整整地拷貝到這個新的分支目錄中,建立完分支後,影響所有成員,每一個人都會擁有這個分支。
Git: Git的分支技術是它的設計核心,所以它擁有一個徹底不一樣的概念。一個在 Git 中的分支就是一個指向某次所提交版本的指針( commit 對象的可變指針):不拷貝任何文件,不建立任何目錄,沒有任何額外的操做。 在 Git 中你當前永遠工做在一個分支上,至少工做在那個系統默認建立的「master」分支上。在你的工做副本上只包括你當前的活動分支中的文件( Git稱之爲「HEAD」)。全部其餘的版本和分支都被保存在你的本地倉庫中,而且隨時均可以很是快速地恢復到一箇舊的版本。必定要記住 Git 的分佈式特性,分支能夠被髮布到在遠程服務器上,可是本地上的分支對於平常的工做更加劇要,git本身本地建立的分支不會影響其餘人。git
SVN: 當你想要在 SVN 中提交一個改動,有以下的一些規則: 你必須確保與中央倉庫的鏈接。你不能進行離線提交。 提交的內容要當即存儲在中央倉庫中。 它會被分配一個全局遞增版本號。SVN具備一個很是重要的特性就是它的信息從不丟失,即便當你刪除了文件或目錄,它也許從最新版本中消失了 ,但這個對象依然存在於歷史的早期版本中。
Git: 提交在 Git 中就是徹底另一種狀況: 你沒有必要鏈接到任何一個 「中央」 倉庫,由於在你的計算機中就擁有一個完整的本地倉庫。所以提交僅僅只記錄在本地倉庫上。它們不會自動地傳遞到遠程倉庫中,除非你本身決定共享這個改動。 文件的改動並不意味着它會被自動地包含在下一次提交中。你必須指明哪些改動你想要提交,並把它添加的所謂的 「暫存區(Staging Area)」中。你甚至能夠只對文件的部分修改或是特定的幾行代碼進行提交,而其餘部分則稍後提交。「commit hashes」 替代了版本號碼。因爲提交都發生在開發人員的本地計算機上,你不可能給某個提交分配一個號碼 #5,而另一個分配 #6,這就產生了個問題,在分佈式系統下誰是第一個提交呢?在 Git 中,每個提交必須擁有一個惟一的ID,所以一個哈希字符串就代替了那個依次遞增的版本號。Git能夠丟棄最新的一個或幾個提交,使用 git reset –hard命令能夠永遠丟棄最新的一個或者幾個提交。Commit History 歷史記錄,存儲着全部提交的版本快照,並由當前分支引用的指針HEAD指向該分支最新一條提交。Git沒有一個全局版本號,而SVN有:目前爲止這是跟SVN相比Git比較明顯的區別。而且經過使用git rebase命令代替git merge命令操做,能夠更好的保持整潔的線性提交記錄。github
SVN: 在 SVN 中,在提交以後,你的工做會被自動地轉移到中央倉庫上去。只有在你鏈接到這個中央服務器時你才能夠進行提交。
Git: Git 不會自動上傳任何東西。你能夠本身決定你的哪些分支須要共享給你其餘的團隊成員。除此以外共享工做也是十分安全的。衝突只會出如今你的本地上,它決不可能發生在遠程服務器上。這會讓你有信心來解決衝突,由於你不會破壞遠程倉庫。
數據庫
更多詳細區別請參考:
1. Git與SVN對比
2. Git與SVN對比
3. Git與SVN對比
segmentfault
Git 的核心部分是一個簡單的鍵值對數據庫, 你能夠向該數據庫插入任意類型的內容。你能夠在 .git/objects 目錄下看到一些文件,這就是Git 存儲內容的方式——一個文件對應一條內容。每次咱們運行 git add 和 git commit 命令時, Git 所作的實質工做——將被改寫的文件保存爲數據對象,更新暫存區,記錄樹對象,最後建立一個指明瞭頂層樹對象和父提交的提交對象。 這三種主要的 Git 對象——數據對象、樹對象、提交對象——最初均以單獨文件的形式保存在 .git/objects 目錄下。 緩存
以下圖所示:Git工做區域分爲三部分,工做目錄(Working Directery)、暫存區(Staging Area)、Git倉庫( Repository) 安全
以上幾塊區域間的數據流動操做大體以下圖所示,更多操做命令請查閱 git文檔: 服務器
git add fileName.xx 或 git add --all(全部文件)
git ls-files --stage
git cat-file -p f48r4s(指向文件的哈希值指針)
git diff [fileName.xx](省略則對比全部)
git reset HEAD fileName.xx 或 git reset .(全部文件)
git commit [fileName.xx](省略則提交全部) [-m '這裏能夠寫提交信息']
git log
git show [commitId](不填則顯示最新提交內容) [fileName.xx](指定提交的指定文件內容)
git branch xxx(分支名)
git branch -b xxx(分支名)
git branch --set-upstream-to=origin/remoteBranchName(遠程分支名) [localBranchName](省略則默認爲當前本地分支)
git branch
git branch -r
git branch -a
git branch -vv
常見操做下的文件狀態轉換以下圖所示: 負載均衡
不一樣工做區域之間的文件對比,可使用git diff命令,以下圖所示:
答案是: Feature Toggle。
既然代碼要隨時保持可發佈,而咱們又須要只有一份代碼來支持持續集成,在代碼庫里加一個特性開關來隨時打開和關閉新特性是最容易想到的也是最容易被質疑的解決方案。 Feature Toggle 是有成本的,不論是在加 Toggle 的時候的代碼設計,仍是在移除 Toggle 時的人力成本和風險,都是須要和它帶來的價值進行衡量的。事實上,在咱們作一個前端的大特性變動的時候,咱們確實沒有由於沒辦法 Toggle 而採用了一個獨立的 Feature 分支,咱們認爲即便爲了這個分支單獨作一套 Pipeline,也比在前端的各類樣式間添加移除 Toggle 來得簡單。但同時,團隊應該約定在每次提交前都要先將 Master 分支 Merge 到 Feature 分支,以此避免分支隔離久之後合併時的痛苦。
在發佈時打上 Release Tag,一旦發現這個版本有問題,若是這個時候Master分支上沒有其餘提交,能夠直接在 Master 分支上 Hot Fix,若是 Master 分支已經有了提交就要作如下幾件事:
從 Release Tag 建立發佈分支。
在 Master 上作 Fix Bug 提交。
將 Fix Bug 提交 Cherry Pick 到 Release 分支。
在Release 分支再作一次發佈。
之因此不在 Release 分支直接 Fix,再合併到 Master 分支這樣作,是爲了防止bug fix後忘記merge回Master分支。
這裏指的是比較大規模的重構,沒法在一次提交完成,TBD 要求每一次提交都是一個可上線的版本,因此這同時還意味着這個重構沒法再一個上線週期內完成。 這種狀況,須要在代碼設計中增長一個抽象層,保證在重構過程當中先不動原來的代碼,也不破壞既有功能,相似於藍綠部署中的負載均衡器的做用,這樣的流程就是: