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


  軟件開發過程中一個重要的產出就是代碼,軟件的編碼過程一般是由一個團隊共同完成,它是一個並行活動,為了保證代碼在多人開發中能夠順利完成,我們需要使用代碼版本控制工具來對代碼進行統一存儲,並追蹤每一份代碼的歷史以便於對代碼的更改進行追溯,另外一些版本控制工具還提供了沖突合並等高級功能來協調多人對同一代碼文件修改。所以版本控制工具可以看做整個編碼工作的基礎,如果沒有版本控制來統一代碼庫,那么對於復雜且參與人數較多的項目是難以完成的,同時如果沒有統一的代碼庫基礎,那么如持續集成、發布等工作將無法開展。

  本文將從以下幾個方面介紹版本控制工具及Git的使用方法:

常用的版本控制工具簡介

  CVS:

    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非常適合開源項目的代碼管理,所以使用非常廣泛。

使用Git來管理源代碼

Git簡介

  Git是一個基於文件快照的分布式版本控制工具,對於文件快照來說它體現在當提交更新時,它會對所有文件制作一個快照,在快照中對於沒變的文件以鏈接的方式指向之前存儲的文件

  

  圖中每一個Version都是一個包含所有文件的快照,其中虛線框代表的是未改變的文件,通過鏈接指向前面的文件。
  而分布式可以理解為去中心化,沒有特定服務器,每一個節點都擁有所有的內容,而每一台安裝了Git的計算機就可以看作一個節點,所以Git幾乎所有的操作都是在本地執行的(可以在本地創建倉庫、添加/修改/提交文件等等)。
Git中對於文件有三個重要的工作區:

  • 數據倉庫:保存了所有Git提交的狀態為Commited的文件,相當於集中式版本管理工具中服務器管理的文件數據庫,數據倉庫文件位於.git目錄下
  • 工作目錄:工作目錄就是用於開發的區域,工作目錄的內容從數據倉庫中檢出指定版本進行修改,修改完成后可將修改內容提交到暫存區域。
  • 暫存區域:暫存區域保存了工作區域提交的文件,“暫存”的意思就是只是對用戶修改后需要提交到數據倉庫的文件進行暫存,最后可一次性將暫存的內容提交到數據倉庫。

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

    

安裝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的代碼管理方法與落地(更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM