目錄
1、版本控制工具應具備的特點
- 協同修改:多人並行不悖的修改服務器端的同一個文件。
- 數據備份:不僅保存目錄和文件的當前狀態,還能夠保存每一個提交過的歷史狀態。
- 版本管理:在保存每一個版本的文件信息的時候要做到不保存重複數據,以節約存儲空間,提高運行效率。這方面 SVN 採用的是增量式管理的方式,而 Git 採取了文件系統快照的方式。
- 權限控制:對團隊中參與開發的人員進行權限控制。對團隊外開發者貢獻的代碼進行審覈——Git 獨有。
- 歷史記錄:查看修改人、修改時間、修改內容、日誌信息。將本地文件恢復到某一個歷史狀態。
- 分支管理:允許開發團隊在工作過程中多條生產線同時推進任務,進一步提高效率
2、版本控制工具分類
- 集中式版本控制工具:服務器一旦故障則歷史記錄全部丟失,用戶本地只有一份最終文件。例如 cvs,svn
- 分佈式版本控制工具:用戶本地也是一個服務器,有完整的歷史記錄版本控制,可以和其他用戶之間進行數據的恢復。例如 Git,Mercurial
3、Git結構
先不看遠程服務器,只關注自己的本地電腦。git的使用過程如下:
4、代碼託管中心
- git已經實現本地的版本控制
- 代碼託管中心就是去維護遠程庫(遠程服務器,在上面也維護了一份代碼,開發者可以從其中拷貝到本地,也可以從本地推送到遠程服務器)
- 局域網環境下:GitLab服務器(公司內部一般使用該服務器)
- 外網環境下:GitHub(全世界的人可以在這上面共享項目,進行開源)
5、本地庫和遠程庫的聯繫
- 團隊內部協作
遠程庫由 B 創建,此時B把A也加入團隊,則A就擁有了項目的權限。
- 跨團隊協作
開發者C不是團隊成員,不能直接修改遠程庫代碼,則通過fork操作得到一個屬於C的遠程庫。那麼C修改了遠程庫後需要發起 pull request請求, 由B進行審覈並merge,把 C的遠程庫中修改的內容合併到 遠程庫B。
6、安裝Git
- 下載對應的安裝包,如下圖所示。並安裝到一個非中文每空格的目錄下。
- 安裝成功後可以在windows任何一個目錄下右鍵,選擇 Git Bash Here 進入命令窗口。如下圖所示
7、基本命令操作
鼠標右鍵-->Git Bash Here-->進入命令窗口-->通過命令開始使用Git(linux的命令在此處基礎都適用)
初始化本地庫 | git init |
操作步驟:創建文件夾gitTest,進入文件夾, 使用命令 git init 初始化本地庫。 產生結果:會生成一個 gitTest/.git 目錄,不要修改。 |
設置簽名 | git config |
簽名作用:區分開發者,在本地提交後通過查看日誌,可以看到開發人員的名稱和郵件。 項目級別簽名:僅在當前本地庫範圍內有效,信息保存在 ./.git/config 文件中。 設置方式:git config user.name Tom git config user.email [email protected] 系統級別簽名:登錄當前操作系統的用戶範圍有效,信息保存在 ~/.gitconfig 文件中 設置方式:git config --global user.name Tom git config --global user.email [email protected] 簽名級別優先級:項目級別優先於系統級別,不允許二則同時不存在 |
查看狀態 | git status | 查看工作區,暫存區的狀態 |
添加到暫存區 | git add [fileName/*] |
將工作區的 ‘新建/修改’ 添加到暫存區 git add * 表示添加所有改動的文件 |
添加操作回退 | git rm --cached [fileName] | 把未追蹤的文件添加到暫存區後的還原操作,文件重新恢復到未追蹤狀態 |
提交到本地庫 | git commit |
將暫存區的內容提交到本地庫 git commit -m “msg” [fileName] 提交的時候附帶說明 git commit [fileName] 進入到vim編輯器去編寫提交說明 |
查看日誌 | git log |
控制方式: 空格-翻頁,b-向上翻頁,q-退出 最全的展示:git log 一行展示日誌:git log --pretty=oneline 一行展示日誌簡潔版: git log --oneline (會截取hash值展示) |
下圖可以看到一整套操作過程:創建本地庫-->新建文件-->查看狀態-->添加到暫存區-->提交-->查看日誌
8、版本管理
- 我們通過git reflog命令打印的日誌來理解版本
如下圖/表,每一次提交都會生成一個全局唯一hash值,對應到一個版本。有一個指針(HEAD) 通過移動來指向對應的版本。我們通過移動該指針可以控制版本的前進和回退,即可以進行文件的還原或恢復。
hash值的部分值 | HEAD指針指向的位置 | 回到當前版本需要回退的步數 | 提交的日誌 |
---|---|---|---|
5d80a53 | (HEAD -> master) | HEAD@{0}: | commit: test2.txt第一次提交 |
a5eb47d | HEAD@{1}: | commit: test1.txt追加內容def | |
56a073a | HEAD@{2}: | commit: test1.txt追加內容abc | |
cd9ca2d | HEAD@{3}: | commit (initial): test1.txt第一次提交 |
- 前進後退操作
方法 | 命令 | 作用 |
---|---|---|
基於索引值(hash值) | git reset --hard [局部索引值] | 回到某個版本 |
使用^符號 | git reset --hard HEAD^ | 只能後退,後退一步 |
使用~符號 | git reset --hard HAED~n | 只能後退,後退n步 |
- reset命令的三個參數對比
--soft | 僅在本地庫移動 HEAD 指針 | 不常用 |
--mixed |
在本地庫移動 HEAD 指針 重置暫存區 |
不常用 |
--hard |
在本地庫移動 HEAD 指針 重置暫存區 重置工作區 |
常用(可以通過其重置特性來恢復工作區被刪除的文件) |
- 比較文件
git diff [filename] | 和暫存區的文件比較 |
git diff [本地庫中歷史版本] [filename]
|
和本地庫中的某個版本比較 例如: git diff HEAD^ test.txt git diff 5d80a53 test.txt |
不帶文件名比較多個文件 |
9、分支
項目創建之初默認有一個主幹分支(master),但是多個版本無法同時在一個分支上並行開發。所以我們需要創建多個分支,來讓團隊並行開發,開發完成後分別再合併到主幹分支上。
- 分支的操作
創建分支 | git branch [分支名] | |
查看分支 | git branch -v | |
切換分支 |
git checkout [分支名] |
|
合併分支 | git merge [有新內容的分支名] | 例如上圖中:feature_blue分支開發完成後,我們切換到master分支,並執行命令 git merge feature_blue,把開發的內容合併到master主幹。 |
解決衝突 |
合併後有的文件可能有衝突,需要我們手動修改文件。 然後添加到暫存區 git add [fileName] 最後提交 git commit -m "msg" ,注意commit 此時不能帶具體文件名 |
10、Git原理
- 保證數據的完整性
保證通過網絡下載的文件跟服務器上一樣:Git利用哈希算法的特性,對服務器和本地同一個文件進行哈希,得到的結果一致則表示文件沒有丟失或損壞。
- Git保存版本的機制
Git每次提交,都會對當前全部文件製作一個快照,並保存這個快照的索引。若相比較上個版本有改變的文件,在快照中則保存完整的文件,若沒有改變則保留一個指向文件的鏈接即可。
- Git提交機制
每一次提交都會產生一個區塊
各個提交區塊之間則由父子關係連接成一條鏈路
類似於區塊鏈,通過對每個數據進行哈希,且把每次的哈希值都記錄到上層的區塊,再對上層區塊進行哈希.......依此類推。這樣只要任何一個地方數據有變動,其上層的所有數據的哈希值都會有變化,校驗機制就會檢測不通過。
- Git分支管理機制
對於svn而言 ,創建一個分支,是直接把項目copy一份,顯得太笨重。
對於git而言,創建一個分支,只需要新增一個指針,詳情如下圖: