好代碼是管出來的——使用Git來管理源代碼

  軟件開發過程當中一個重要的產出就是代碼,軟件的編碼過程通常是由一個團隊共同完成,它是一個並行活動,爲了保證代碼在多人開發中可以順利完成,咱們須要使用代碼版本控制工具來對代碼進行統一存儲,並追蹤每一份代碼的歷史以便於對代碼的更改進行追溯,另一些版本控制工具還提供了衝突合併等高級功能來協調多人對同一代碼文件修改。因此版本控制工具能夠看作整個編碼工做的基礎,若是沒有版本控制來統一代碼庫,那麼對於複雜且參與人數較多的項目是難以完成的,同時若是沒有統一的代碼庫基礎,那麼如持續集成、發佈等工做將沒法開展。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來管理源代碼

Git簡介

  Git是一個基於文件快照的分佈式版本控制工具,對於文件快照來講它體如今當提交更新時,它會對全部文件製做一個快照,在快照中對於沒變的文件以連接的方式指向以前存儲的文件數據庫

  

  圖中每個Version都是一個包含全部文件的快照,其中虛線框表明的是未改變的文件,經過連接指向前面的文件。
  而分佈式能夠理解爲去中心化,沒有特定服務器,每個節點都擁有全部的內容,而每一臺安裝了Git的計算機就能夠看做一個節點,因此Git幾乎全部的操做都是在本地執行的(能夠在本地建立倉庫、添加/修改/提交文件等等)。
Git中對於文件有三個重要的工做區:vim

  • 數據倉庫:保存了全部Git提交的狀態爲Commited的文件,至關於集中式版本管理工具中服務器管理的文件數據庫,數據倉庫文件位於.git目錄下
  • 工做目錄:工做目錄就是用於開發的區域,工做目錄的內容從數據倉庫中檢出指定版本進行修改,修改完成後可將修改內容提交到暫存區域。
  • 暫存區域:暫存區域保存了工做區域提交的文件,「暫存」的意思就是隻是對用戶修改後須要提交到數據倉庫的文件進行暫存,最後可一次性將暫存的內容提交到數據倉庫。

  它們的工做流程以下(將它們看做普通的文件目錄,它們的操做當作目錄間文件的複製操做更容易理解Git的工做原理,其中git倉庫比較特殊會保存每一次複製(提交)的內容,而其它兩個目錄相同內容會被覆蓋):windows

    

安裝Git

  說到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有哪些經常使用操做呢?

文件的跟蹤、修改、提交

  將新的文件添加到git中管理涉及到的相關操做:

  • 跟蹤新文件:(git add 文件名 或 git add -a 後者添加除被忽略之外的全部文件)

  

  • 提交文件:(git commit -m "提交信息")

  

  • 文件修改:(當已經提交的文件再次被修改時,若是要再次提交該文件仍然須要使用git add命令,或者使用git commit -a來跳過暫存區進行提交。注:git commit -a只能提交已經被git管理的修改文件)

  

  跳過暫存區提交:

  

  • 手動刪除工做區文件(即直接刪除目錄下文件):

   

  • 從git中刪除文件:(git rm 1.md 或 git rm 1.md -force強制刪除)

  

文件的比較

  • 比較修改內容:(git diff)

  

  • 比較暫存區的修改內容:(git diff --cached 或 git diff --staged)

  

  注:須要保證暫存區有內容纔會有結果。

  • 使用內置vimdiff比較器查看修改內容:(git difftool)

  

  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

文件狀態及歷史查看

  • 查看狀態:(git status)

  

  • 查看提交歷史:(git log)

  

  • 查看狀態概要:(git status -s)

  

  狀態由2位字符構成,第一位表明暫存區狀態有(添加A、修改M)第二位表明工做區狀態(修改M),另外??表明git未跟蹤的文件。

操做的撤銷

  • 撤銷工做區的修改:(git checkout -- README.md)

  

  • 撤銷暫存區的文件:( git reset HEAD README.md)

  

  • 提交補充(屢次提交合併爲一個後續提交信息會覆蓋以前的):(git commit --amend)

  

  上圖對文件READ.md進行了2次修改和提交,可是日誌中只會看到最後一次提交的信息:

  

標籤

  • 打標籤:(git tag -a v0.1 -m "version 0.1")

   

  • 對提交歷史打標籤:(git tag -a v0.01 -m "created repository")

  

  • 推送標籤到遠程服務器:(git push origin v0.1 注:須要有遠程倉庫)

  

  GitHub上的標籤:

  

  • 檢出標籤代碼:(git checkout -b version0 v0.01 注:須要有遠程倉庫)

  

  注:該命令建立了一個新的分支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

本文連接:http://www.cnblogs.com/selimsong/p/9051137.html 

 好代碼是管出來的——淺談.Net Core的代碼管理方法與落地(更新中...)

相關文章
相關標籤/搜索