1. 程式人生 > >版本控制之SVN與GIT

版本控制之SVN與GIT

**版本控制是指對軟體開發過程中各種程式程式碼、配置檔案及說明文件等檔案變更的管理,是軟體配置管理的核心思想之一。專案在開發過程中要用到相應的配置管理工具對配置項(包括各個階段的產物)進行變更控制,配置管理的使用取決於專案規模和複雜性及風險的水平。軟體的規模越大,配置管理就越顯得重要。 **版本控制工具我學習過SVN和GIT,以下對他們進行一些總結。

一、SVN的基本概念

SVN 是一個開源的版本控制系統, 有一箇中央資料檔案庫(配置庫),管理著檔案每一次的變動。 在這裡插入圖片描述 *版本庫 : 原始碼統一存放的地方; *Checkout(提取):當你手上沒有原始碼的時候,你需要從版本庫checkout一份; *Commit(提交

):當你已經修改了程式碼,你就需要Commit到版本庫; *Update (更新):當你已經Checkout了一份原始碼, Update一下你就可以和版本庫上的原始碼同步,你手上的程式碼就會有最新的變更; *如果兩個程式設計師同時修改了同一個檔案呢, SVN可以合併這兩個程式設計師的改動,實際上SVN管理原始碼是以行為單位的,就是說兩個程式設計師只要不是修改了同一行程式,SVN都會自動合併兩種修改。如果是同一行,SVN會提示檔案Confict, 衝突,需要手動確認。

伺服器端與客戶端之間: 在這裡插入圖片描述 客戶安裝必須跟隨伺服器安裝,無伺服器無法單獨工作。

二、Git

git是一個開源的分散式版本控制系統,用於敏捷高效地處理任何或大或小專案,它與CVS,SVN不同,它採用了分散式版本庫的方式,不必伺服器端軟體支援。

分散式版本控制比集中式版本控制的優點:可避免單點故障。 單點故障:例在SVN中,若伺服器崩潰了,客戶端上只有當前的資料,不能得到伺服器上的全部資料和歷史記錄了。

1、Git與SVN的區別: 1):Git是分散式的,SVN是集中式的;這是Git與其他非分散式的版本控制系統最核心的區別; 2):Git把內容按元資料方式儲存,SVN是按檔案儲存,所以的資源控制系統都是把檔案的元資訊隱藏在一個類似 .svn , .cvs等的檔案裡; 3):版本管理:SVN採用的是增量式管理方式(只儲存每一次有修改的部分歷史),Git採用檔案系統快照; 4):Git分支與SVN不同,分支在SVN中一點也不特別,就是版本庫中的另外一個目錄;分支在Git中地位十分重要;(當Git建立一個分支時,只是建立一個指標;而SVN則是把所以檔案目錄都複製一遍) 5):Git的內容完整性要優於SVN,Git的內容儲存使用的是SHA-1雜湊演算法,這能確保程式碼內容的完整性; 6):Git沒有一個全域性的版本號,而SVN有,這是跟SVN相比Git缺少的最大的一個特徵;

2、Git的三棵“樹”----工作區,暫存區,版本庫 在這裡插入圖片描述 *工作區:你的工作副本,就是你電腦上能看到的目錄; *暫存區:(stage,index):一般存放在 .git目錄下的index檔案中; *版本庫:工作區有一個隱藏目錄 .git,這個不算工作區,而是git的版本庫;

3、Git和程式碼託管中心 程式碼託管中心的任務:維護遠端庫。 1)區域網環境下:GitLab伺服器 2)外網環境下:GitHub,碼雲

4、本地庫與遠端庫的互動 1)團隊內部協作 在這裡插入圖片描述 2)跨團隊協作 在這裡插入圖片描述

5、Git命令列操作之本地庫操作

1)git init:初始化一個git庫。 在這裡插入圖片描述 a、建立一個目錄作為我的git倉庫; 在這裡插入圖片描述 b、進入到我的倉庫中 在這裡插入圖片描述 c、初始化我的git庫 (注:.git目錄中存放的是本地庫相關的子目錄和檔案,不要刪除,也不要修改)

2)git status:檢視狀態 在這裡插入圖片描述 剛建立了一個空的git庫,什麼檔案也沒有寫,所以這裡是No commit yet(目前沒有提交任何東西);nothing to commit(也沒有什麼可提交的);

3)git add 檔名:將檔案放入暫存區

在這裡插入圖片描述 a、新建了一個檔案abc.txt,但還未提交,此時檔案被標記為紅色; 在這裡插入圖片描述 b、使用add將檔案放入暫存區;再檢視狀態,檔案變為綠色; 在這裡插入圖片描述 4)git commit 檔名:將暫存區中的檔案上傳至版本庫; 在這裡插入圖片描述 在提交時直接寫上提交的附加資訊,這樣不用開啟vim編輯器

5)git log :版本歷史記錄 a、git log - -pretty=oneline :每條記錄只顯示一行 b、git log - -oneline c、git reflog:(此種顯示方法,對於移動指標HEAD有很大作用) HEAD @{移動到當前版本需要多少步}

6)前進後退 每一條歷史記錄都對應有一個唯一的雜湊值 a、基於索引值:git reset - - hard 索引值(推薦使用); b、使用^符號(只能往後退) git reset - - hard HEAD^ (退一步) git reset - - hard HEAD^^ (退2步) git reset - - hard HEAD~3 (退3步)……以此類推;

7)刪除檔案:rm 檔名

8)diff:比較檔案差異 a、git diff 檔名:將工作區中的檔案和暫存區的進行比較; b、git diff [本地庫中的歷史版本] (檔名):將工作區中的檔案和本地庫歷史記錄比較; c、不帶檔案比較多個檔案;

9)設定簽名

作用:區分不同開發人員的身份。

辨析:這裡設定的簽名和登入遠端庫(程式碼託管中心)的賬戶,密碼沒有任何關係;

命令:a、專案級別/倉庫級別:僅在當前本地庫範圍內有效; git config user.name 使用者名稱; git config user.email 郵箱;

b、系統使用者級別:登入當前作業系統的使用者範圍; git config - - global user.name 使用者名稱; git config - - global user.email 郵箱;

級別優先順序: 就近原則:專案級別優先順序高於系統使用者級別,二者都有時採用專案級別; 二者都沒有是不允許的。

6、分支管理 在這裡插入圖片描述 1)什麼是分支? 在版本控制過程中,使用多條線同時推進多個任務。

2)分支的好處: a、同時並行推進多個功能開發,提高開發效率; b、各個分支在開發過程中,如果某個分支開發失敗,不會影響其他分支;失敗的分支刪除重來即可;

3)與分支有關的操作 a、檢視分支:git branch --v; b、建立分支:git branch 分支名; c、刪除分支:git branch --d 分支名; d、切換分支:git checkout 分支名; e、合併分支:首先切換到接受修改的分支上; 再執行merge命令:git merge 要合併的子分支名; f、解決合併時發生的衝突: *編輯檔案刪除特殊符號; *把檔案修改到滿意的程度; *git add 檔名; *git commit --m“日誌資訊” (注:此時提交不能帶檔名)

7、本地庫與遠端庫互動 1)git remote add origin [遠端庫的地址];(origin,你建立的別名,因為遠端庫地址很長,先為他建立一個別名); 2)推送:git push origin 分支名;要推送到哪個分支上; 3)克隆:git clone 遠端庫的地址 特點:a、完整地把遠端庫下載到本地; b、建立origin遠端庫地址別名; c、初始化本地庫; 4)加入團隊; 5)pull;

8、push到遠端庫時衝突 如果不是基於GitHub遠端庫的最新版所做的修改,不能推送,必須先拉取。拉取下來後如果進入衝突,則按照“分支衝突解決”操作。