Git 是一個開源的分布式版本控制系統,它的用途與SVN、CVS等版本控制系統一樣,可以對檔案進行版本管理,Git是目前主流的版本控制系統,很多軟體專案都會用它作為源代碼管理工具,
什么是分布式版本控制系統
Git是分布式版本控制系統,而SVN、CVS等卻是集中式版本控制系統,那么,分布式和集中式到底有什么區別呢?我們先看下圖,

上圖中,左邊是集中式版本控制,右邊是分布式版本控制,在這里解釋一下,Server Computer是提供版本控制服務的,ComputerA、ComputerB分別是用戶機器,我們可以看出,在集中式版本控制中,Server Computer作為中央服務器,它上面有完整的版本庫,而在分布式版本控制中,每個機器上(Server Computer、ComputerA、ComputerB)都有完整的版本庫,這就是集中式和分布式版本控制最大的區別,分布式版本控制系統中,Server Computer嚴格意義上不能算中央服務器,每個用戶機器都可以脫離Server Computer,單獨做自己的版本控制,而且每個用戶機器之間都可以互相推送檔案,當然,我們在實際應用中,由于用戶機器之間不一定能互相訪問、為了統一管理代碼等原因,很少在用戶機器之間直接推送版本庫的修改,我們還是會拿一臺服務器(Server Computer)作為“中央服務器”,但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活,只是交換修改不方便而已,
分布式版本控制系統優勢
由于集中式版本控制系統是需要一個中央服務器作為版本庫,所有用戶機器都需要通過這個中央服務器作版本控制,因此,集中式版本控制系統非常依賴網路,而分布式版本控制系統由于用戶機器本身就可以作為版本庫,因此,它可以脫離網路做版本控制,等到需要推送修改后的版本給其他用戶的時候,才需要聯網,
其次,分布式版本控制系統每個機器都可以作為版本庫,因此,理論上不會因為一臺“中央服務器”出問題而導致整個版本控制系統癱瘓,
Git安裝
Git的安裝很簡單,可以到官網下載,安裝成功后,我們就可以在我們計算機上任何一個目錄上右鍵打開Git Bash,如下圖:

我們所有的Git操作命令,都會在Git Bash上完成,
Git作業流程
由于Git和SVN、CVS這些集中式版本控制系統使用起來差別還是挺大的,有必要說明一下我們在使用Git時的作業流程,如下圖:

一般作業流程如下:
- 克隆 Git 資源作為作業目錄(就是我們要修改的檔案目錄),
- 在克隆的資源上添加或修改檔案,
- 如果其他人修改了,你可以更新資源(從遠程版本庫拉取最新版本檔案下來),
- 在提交前查看修改,
- 提交修改(提交到本地版本庫),
- 在修改完成后,如果發現錯誤,可以撤回提交并再次修改并提交,
- 作業完成,可以把你本地修改的檔案推送到遠程版本庫,方便其他人獲取你修改過的檔案,
Git 作業區、暫存區和版本庫
本來不想寫這一節,但如果不了解一下這個,后面有些東西可能理解不了,那還是硬著頭皮寫一下,讀下去可能有點懵,但沒關系,先了解一下,
我們先來理解下 Git 作業區、暫存區和版本庫概念:
- 作業區:就是你在電腦里能看到的目錄,
- 暫存區:英文叫 stage 或 index,一般存放在 .git 目錄下的 index 檔案(.git/index)中,所以我們把暫存區有時也叫作索引(index),
- 版本庫:作業區有一個隱藏目錄 .git,這個不算作業區,而是 Git 的版本庫,
下面這個圖展示了作業區、版本庫中的暫存區和版本庫之間的關系:

-
圖中左側為作業區,右側為版本庫,在版本庫中標記為 "index" 的區域是暫存區(stage/index),標記為 "master" 的是 master 分支所代表的目錄樹,
-
圖中我們可以看出此時 "HEAD" 實際是指向 master 分支的一個"游標",所以圖示的命令中出現 HEAD 的地方可以用 master 來替換,
-
圖中的 objects 標識的區域為 Git 的物件庫,實際位于 ".git/objects" 目錄下,里面包含了創建的各種物件及內容,
-
當對作業區修改(或新增)的檔案執行 git add 命令時,暫存區的目錄樹被更新,同時作業區修改(或新增)的檔案內容被寫入到物件庫中的一個新的物件中,而該物件的ID被記錄在暫存區的檔案索引中,
-
當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(物件庫)中,master 分支會做相應的更新,即 master 指向的目錄樹就是提交時暫存區的目錄樹,
-
當執行 git reset HEAD 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是作業區不受影響,
-
當執行 git rm --cached <file> 命令時,會直接從暫存區洗掉檔案,作業區則不做出改變,
-
當執行 git checkout . 或者 git checkout -- <file> 命令時,會用暫存區全部或指定的檔案替換作業區的檔案,這個操作很危險,會清除作業區中未添加到暫存區中的改動,
-
當執行 git checkout HEAD . 或者 git checkout HEAD <file> 命令時,會用 HEAD 指向的 master 分支中的全部或者部分檔案替換暫存區和以及作業區中的檔案,這個命令也是極具危險性的,因為不但會清除作業區中未提交的改動,也會清除暫存區中未提交的改動,
Git創建倉庫
Git操作的前提是創建倉庫,也就是你要把哪個目錄納入版本管理,就把哪個目錄創建為倉庫,創建倉庫會遇到兩種情況,一種是沒有現有Git倉庫,一種是有現有Git倉庫,命令如下:
git init
如果沒有現有Git倉庫,我們可以把要創建倉庫的目錄打開,然后右鍵Git Bash,執行git init命令,把當前目錄創建為倉庫,創建成功后,當前目錄會出現一個.git的隱藏目錄,如下圖:

git clone
如果存在現有倉庫,譬如說,存在某個遠程倉庫,我們可以用git clone命令,我們首先要獲取到遠程倉庫的地址,譬如現在有很多開源專案會放到github上,我們可以到上面的某個開源專案上獲取專案的倉庫地址,如下圖:

Git常用命令
創建好本地倉庫以后,我們就可以進行更多的Git操作,Git的命令有很多,這里我簡單講幾個常用的命令,想要詳細了解各命令,麻煩再度娘一下,
git add
git add 命令可將檔案添加到暫存區,倉庫里新創建的檔案要先進行git add命令,這樣,檔案才會納入版本管理,
git status
git status 命令用于查看在你上次提交之后是否有對檔案進行再次修改,
git commit
git commit 命令可將暫存區內容添加到本地版本庫中,
git checkout
git checkout 命令用法比較多,簡單介紹如下:
1.git checkout
表示核查作業區相對于版本庫修改過的檔案,
2. git checkout + 分支名
表示切換分支,
3. git checkout -b 分支名
表示以當前分支的當前狀態創建新分支并切換到新分支 -b 表示創建新分支
4. git checkout -b 分支名 commitID
表示以當前分支的commitID提交節點創建新的分支并切換到新分支,此時作業區的內容和切換分之前commitID提交節點的內容一樣,
5. git checkout commitID
是以指定的提交節點創建了一個臨時性分支,此臨時性分支可用于做實驗性修改,
6. git checkout filename
當沒有提交版本號時將作業區的指定檔案的內容恢復到暫存區的狀態,
7. git checkout .
將作業區的所有檔案的內容恢復到暫存區的狀態,
8. git checkout <commit> filename
當有提交版本號時,表示將作業區和暫存區都恢復到版本庫指定提交版本的指定檔案的狀態,此時HEAD指標不變,此時的狀態相當于把作業區的內容修改到指定版本的檔案內容后,再把修改的內容添加到暫存區,因此git checkout <commit> filename后,可以直接執行git commit而不需要先執行git add,
git fetch
git fetch 命令用于從遠程獲取代碼,
git merge
git merge 命令用于把兩個分支進行合并,合并的時候可能會產生沖突,解決沖突最好用一些可視化工具解決,
git pull
git pull 命令用于從遠程獲取代碼并合并到本地的版本,這個命令相當于git fetch+git merge,
git push
git push 命令用于將本地的分支版本上傳到遠程并合并,
Git可視化工具
如果能把命令列用熟,Git的可視化工具其實是很容易上手的,因此,其實我是建議先熟練使用命令列,目前市面上比較流行的Git可視化管理工具有SourceTree、Github Desktop、TortoiseGit,綜合網上的一些文章分析和自己的日常開發實踐心得個人比較推薦開發者使用SourceTree,因為SourceTree同時支持Windows和Mac,并且界面十分的精美簡潔,大大的簡化了開發者與代碼庫之間的Git操作方式,SourceTree安裝和使用也請自行度娘一下,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/506087.html
標籤:其他
