軟件開發過程當中一個重要的產出就是代碼,軟件的編碼過程通常是由一個團隊共同完成,它是一個並行活動,爲了保證代碼在多人開發中可以順利完成,咱們須要使用代碼版本控制工具來對代碼進行統一存儲,並追蹤每一份代碼的歷史以便於對代碼的更改進行追溯,另一些版本控制工具還提供了衝突合併等高級功能來協調多人對同一代碼文件修改。因此版本控制工具能夠看作整個編碼工做的基礎,若是沒有版本控制來統一代碼庫,那麼對於複雜且參與人數較多的項目是難以完成的,同時若是沒有統一的代碼庫基礎,那麼如持續集成、發佈等工做將沒法開展。html
本文將從如下幾個方面介紹版本控制工具及Git的使用方法:git
CVS:github
CVS(Concurrent Versions System)是一個開源的版本控制系統,基於C/S模式,CVS將代碼存儲在服務器上,經過客戶端來獲取、提交代碼及其它操做。
SVN:
SVN(Subversion)和CVS同樣是一個C/S模式的開源版本控制系統。
TFS/VSTS:
TFS(Team Foundation Server)/VSTS(Visual Studio Team Services)是微軟推出的針對團隊協做的軟件開發工具,版本控制只是其中一個功能,除此以外還提供敏捷開發支持、持續集成等高級功能,TFS和VSTS功能相同,VSTS能夠看做是雲版本的TFS。TFS按照服務器來受權,VSTS安裝帳戶來受權,另外VSTS提供了免費試用版本(注:VSTS支持Git做爲版本控制工具)。
Git:
Git是一個分佈式的版本控制工具,相對於其它版本控制工具來講,它有一些特有的性質如:分佈式/去中心化(每一個客戶端保存了完整的代碼倉庫),強大的分支能力,速度很是快(由於代碼庫在本地基本是本地操做)。由於自己的特性因此Git很是適合開源項目的代碼管理,因此使用很是普遍。shell
Git是一個基於文件快照的分佈式版本控制工具,對於文件快照來講它體如今當提交更新時,它會對全部文件製做一個快照,在快照中對於沒變的文件以連接的方式指向以前存儲的文件:數據庫
圖中每個Version都是一個包含全部文件的快照,其中虛線框表明的是未改變的文件,經過連接指向前面的文件。
而分佈式能夠理解爲去中心化,沒有特定服務器,每個節點都擁有全部的內容,而每一臺安裝了Git的計算機就能夠看做一個節點,因此Git幾乎全部的操做都是在本地執行的(能夠在本地建立倉庫、添加/修改/提交文件等等)。
Git中對於文件有三個重要的工做區:vim
它們的工做流程以下(將它們看做普通的文件目錄,它們的操做當作目錄間文件的複製操做更容易理解Git的工做原理,其中git倉庫比較特殊會保存每一次複製(提交)的內容,而其它兩個目錄相同內容會被覆蓋):windows
說到Git有人可能會有疑惑,爲何Git能夠在Visual Studio中使用,而GitHub也提供了本身的客戶端,可是像國內也有碼雲(gitee)這樣的託管平臺,那麼Git這個工具究竟是怎樣的?要如何使用?
Git它有多種表現形式,其一是原生的命令行工具,另外其它工具如VS中的、GitHub的客戶端實際上都是對命令的封裝以簡化用戶操做的GUI工具,換句話說Git的工具不管怎麼變,它的核心都是原生的命令行工具,同時也說明了只要有命令行工具那麼就可使用如GitHub、gitee等不一樣的基於Git的代碼託管平臺。
在Windows下安裝git命令行工具(注:Windows下的Git項目是一個獨立於Git的項目,好像由微軟維護):
下載地址:https://git-scm.com/download/win
安裝Git:
選擇組件:服務器
注:若是勾選了GitBash Here及Git GUI Here,那麼在window的資源管理器中能夠經過右鍵在當前目錄打開GitBash(Git專用的命令執行工具,相似cmd/powershell,同時也能夠將git的cmd目錄配置到環境變量中用Windows的命令行工具執行git命令)或新版本中內置的簡單GUI程序:編輯器
安裝運行結果:分佈式
左爲Git Bash右爲Windows cmd工具。
注:因爲新版本VS會安裝內置的Git工具,若是出現一下信息,可檢查是否存在路徑如「Microsoft Visual Studio 14.0\Web\External\git」的環境變量,刪除便可:
本文使用基於.Net Core的My Blog應用程序代碼爲例進行演示,My Blog的目錄結構以下:
src目錄中包含全部代碼:
1. 在My Blog的根目錄下打開Git Bash,使用git init建立一個本地倉庫:
同時該目錄下將生成一個.git隱藏目錄。
2. 爲該倉庫配置用戶信息,在提交代碼時將使用該用戶信息進行提交:
git config user.name "Selim"
git config user.email "yqszt@qq.com"
注:此處用戶信息僅對當前倉庫有效,若是要配置全局用戶信息需添加--global選項:
git config --global user.name "Selim"
git config --global user.email "yqszt@qq.com"
3. 最後爲該倉庫添加忽略文件配置(僅管理代碼,如編譯結果等文件應該進行過濾):
文件內容來源:https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
注:windows沒法直接建立.gitignore文件,能夠用編輯器另存爲改變文件名,另外gitignore文件的格式可參考文檔:https://git-scm.com/docs/gitignore。
4. 將全部文件添加到暫存區:(git add --a)
注:LF是Unix下的換行符CRLF是Windows下的換行符,默認git中使用Unix換行符,能夠經過git config –global core.autocrlf false 禁用自動轉換 。
5. 查看狀態:(git status)
能夠看到全部必須的文件都已經被添加到了暫存區。
6. 將暫存區代碼提交到倉庫:(git commit -m "create a repository")
7. 查看日誌:(git log)
8. 使用VS2017打開該解決方案後,團隊資源管理器中將會自動識別這個本地的git倉庫:
前面已經完成了代碼倉庫的建立,那麼Git有哪些經常使用操做呢?
將新的文件添加到git中管理涉及到的相關操做:
跳過暫存區提交:
注:須要保證暫存區有內容纔會有結果。
windows上可使用winmerge來替換默認的比較/合併工具:
winmerge下載地址:http://winmerge.org/
配置方法參考:https://blog.csdn.net/guoxinian/article/details/52297804
https://stackoverflow.com/questions/1881594/use-winmerge-inside-of-git-to-file-diff
狀態由2位字符構成,第一位表明暫存區狀態有(添加A、修改M)第二位表明工做區狀態(修改M),另外??表明git未跟蹤的文件。
上圖對文件READ.md進行了2次修改和提交,可是日誌中只會看到最後一次提交的信息:
GitHub上的標籤:
注:該命令建立了一個新的分支version0,並獲取了v0.01tag的代碼,改代碼是版本庫最初的版本。
git中能夠設置命令別名,以簡化命令:
上圖的別名設置是將checkout等命令簡化爲co、br、ci、st。
更多命令和使用方法請參考:
https://git-scm.com/docs
https://git-scm.com/book/en/v2
本地的git倉庫已經實現了代碼版本控制功能,可是本地的倉庫沒法實現團隊的合做,並且代碼庫都在本地沒法發揮分佈式的特性。因此能夠將本地的代碼倉庫提交到遠程託管平臺如GitHub、Gitee等等。
在GitHub上建立一個新的倉庫(注:須要先註冊一個GitHub帳戶):
建立成功後GitHub會給出提示如何使用這個庫,好比建立新庫的流程、導入已有庫的流程以及導入代碼的流程:
這裏咱們須要第二種方法:
注:若是第一次經過git將代碼push到github,那麼會出現如下登錄提示:
在Windows下僅須要登錄一次,git就會記住登錄信息,避免後續的重複登錄,記錄登錄信息的功能由git credential manager提供,詳見: https://github.com/Microsoft/Git-Credential-Manager-for-Windows
這樣就可以成功將代碼提交到GitHub上:
更多使用GitHub託管代碼的內容後續介紹。
本文主要介紹了經常使用的代碼版本控制工具,版本控制工具可分爲集中式的和分佈式的,其中集中式的經常使用的有SVN而分佈式的有Git,隨着軟件開發方式的發展Git更加的符合現代的敏捷、遠程協做等概念,因此本系列文章選擇了Git做爲代碼版本控制工具。
另外本文主要是介紹了Git命令行工具的使用方法並使用了GitHub做爲遠程代碼託管平臺對代碼進行了託管,Git的GUI工具很是多,但全部的GUI工具的原理都是對Git命令封裝,而後提供一些便捷的功能,因此理解Git命令是很是必要的,理解了Git的基礎命令再去使用GUI工具會更加駕輕就熟。但要注意的是本文介紹的命令並不全面,由於一個命令還有不少參數選項,因此更多內容可參考Git的官方文檔或書籍:https://git-scm.com/docs https://git-scm.com/book/en/v2
下一篇文章將對Git的核心特性分支以及pull request進行介紹,敬請期待。
參考:
https://git-scm.com/docs
https://git-scm.com/book/en/v2
https://github.com/Microsoft/Git-Credential-Manager-for-Windows
https://blog.csdn.net/guoxinian/article/details/52297804
https://stackoverflow.com/questions/1881594/use-winmerge-inside-of-git-to-file-diff
https://github.com/github/gitignore/blob/master/VisualStudio.gitignore