Git是平常軟體開發中經常使用的版本控制系統,本文對git的原理、基礎和配置方式進行了介紹,同時總結了平時使用過程中常見的git操作。
1. 概念
- 集中式版本控制系統:有一個單一的集中管理的伺服器,開發人員都可以連線到這臺伺服器,進行協同工作。
- 優點是系統容易管理和維護
- 缺點是如果中央伺服器出現故障,工作將不能進行
- 分散式版本控制系統:不是隻提取最新版本的檔案快照,而是將整個程式碼倉庫拷貝到本地,即使伺服器故障也能通過本地倉庫進行完整的恢復。
2. 基礎
-
git儲存資料是儲存整個檔案系統的一個快照
-
其他大部分系統儲存的是檔案的變更資訊
-
git大部分操作都是在本地完成的,因此速度很快。即使沒有網路,也可以提交檔案,之後再上傳
-
git通過SHA-1(雜湊)計算校驗和,由40個十六進位制陣列成的字串。git資料庫中儲存的資訊都是通過檔案內容的hash值進行索引的而不是檔名。
-
git的三個工作區域
- git倉庫:用來儲存專案的資料以及資料庫,當從其他地方clone專案時,拷貝的就是這裡面的資料。
- 工作目錄:存放的是專案某個版本的內容,存放於磁碟可供修改等操作,來源於git倉庫中的壓縮資料庫。
- 暫存區域: 是一個檔案,儲存了將提交的檔案資訊。
-
git工作流程
- 在工作目錄中修改檔案(modified)
- 將修改的檔案暫存在暫存區域(staged)
- 提交更新,將暫存區的檔案儲存到git倉庫中(commited)
3. git配置
git config
- --system:系統上所有使用者及倉庫的通用配置
- --global:針對當前使用者的配置
- --config:針對當前倉庫的配置
上述配置具有優先順序,由上往下遞增,高優先順序的覆蓋低優先順序的配置。
第一次使用時會配置個人資訊
$ git config --global user.name yourname
$ git config --global user.email your@email.com
這些資訊會寫入每一次提交中,該配置只需配置一次。若想對某個專案使用特定的使用者資訊,通過git config來配置。
可通過git config --list檢視所有配置資訊,也可通過如git config user.name來檢視使用者名稱
4. git基礎操作
4.1 建立git倉庫
- 在已有專案中建立git倉庫:通過
$ git init
命令建立一個.git子目錄,裡面儲存了git倉庫初始化時的必須檔案,但不包括專案檔案。 - 克隆倉庫:通過
$ git clone theUrlYouWantToClone
,會克隆該倉庫的所有版本的檔案而不是最新版本的檔案。執行該操作後會在當前目錄下建立一個與該倉庫同名的目錄,並在該目錄下初始化一個.git
資料夾,將遠端倉庫中的資料拉取到該資料夾,並從中讀取最新版本的專案檔案,拷貝至其同級目錄。 - 可通過
$ git clone theUrlYouWantToClone myProjectName
修改倉庫名稱theUrlYouWantToClone
,可支援多種協議,git中常用到的是https、git和SSH協議。
4.2 檔案狀態
檔案具有兩種狀態已跟蹤和未跟蹤。
- 已跟蹤的檔案指的是已被納入版本控制的檔案,它們可能處於未修改、已修改、已暫存等狀態。
- 將檔案從git中移除、新建立一個檔案等操作產生的檔案都會處於未跟蹤狀態。 git版本控制下檔案的生命週期
4.3 git add命令
4.3.1 跟蹤新檔案
通過$ git add filename
、$ git add pathname
可分別跟蹤某個檔案和某個路徑下的所有檔案,或者通過$ git add .
來跟蹤所有檔案。
4.3.2 暫存已修改檔案
與上述方法相同
因此,git add
具有多種功能,可理解為向下次提交中新增內容
4.4 git status命令
該命令用於檢視檔案狀態
也可通過$ git status -s
或者$ git status --short
檢視簡寫的檔案狀態。
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
複製程式碼
各種記號的解釋如下:
- ??:未跟蹤檔案
- A:新新增到暫存區的檔案
- _M:檔案被修改但未新增到暫存區
- M_:檔案被修改且已新增到暫存區
- MM:檔案被修改且已新增到暫存區後又被修改
4.5 .gitignore檔案
忽略檔案的具體格式可見忽略檔案
4.6 git diff命令
git diff命令用於檢視檔案的修改,與git status相比可以具體顯示修改的內容。
$ git diff
顯示的是已修改但未暫存的檔案內容$ git diff --cached
或$ git diff --staged
檢視已暫存但未提交的內容
4.7 git commit命令
通過git commit命令可將暫存區內的檔案進行提交,而未暫存的檔案則不會被提交。
可用$ git commit
命令按提示完成提交或直接通過$ git commit -m "yourComments"
進行提交說明並提交。
若想對所有已暫存和未暫存的檔案進行提交可使用$ git commit -a -m "yourComments"
進行提交,這樣可簡化操作步驟。
4.8 移除檔案
移除檔案需要git remove操作。
- 通過
$ git rm fileName
即可將檔案移出git版本控制並同時刪除工作區中的檔案,之後執行commit操作提交即可。 - 若是直接手動將檔案刪除,此時檔案將會處於未暫存狀態,通過git add或git rm操作便可進入已暫存狀態,之後執行commit操作即可。
- 若檔案進過修改並送入暫存區,需要用
$ git rm -f fileName
才能強制刪除或通過上述第一種方式刪除。 - 若是要將檔案從git版本控制中刪除但又不想從工作區中刪除,則可通過
$ git rm --cached fileName
命令來實現。
4.9 移動檔案
移動檔案操作通過$ git mv fileFrom fileTo
來實現,該操作執行過程實際上是執行了刪除fileFrom檔案之後新增fileTo檔案。
4.10 撤銷操作
- 修改提交檔案
- 若提交後發現漏掉其他檔案,可通過
$ git commit --amend
操作將當前暫存區的檔案加入上次提交中,相當於只存在一次提交。 - 若是想修改提交檔案的提交資訊,可通過
$ git commit --amend -m "newComments"
- 取消暫存檔案
- 通過
$ git reset HEAD fileName
可將檔案從暫存區中移除,進入未暫存狀態。
- 取消已修改檔案
- 通過
$ git checkout -- fileName
將已修改的檔案還原至上一次未修改時的狀態。
4.11 遠端倉庫
git專案的協作時會用到遠端倉庫,當克隆一個專案時,會有一個預設的名為origin的遠端倉庫。
- 可通過
$ git remote
檢視所有遠端倉庫或$ git remote -v
檢視所有遠端倉庫的具體資訊。通過$ git remote show remoteName
檢視指定遠端倉庫的詳細資訊。 - 通過
$ git remote add shortNameForTheRemoteRepository RepositoryUrl
- 通過
$ git fetch shortName
可獲取該遠端倉庫中的所有資訊,但不會合並或修改當前工作區的檔案 - 通過
$ git pull
命令獲取遠端倉庫的資料併合併到當前分支,預設情況下,本地的master分支會跟蹤遠端倉庫的master分支。 - 通過
$ git push remoteName branchName
將當前分支推送到指定遠端倉庫的指定分支上。 - 重新命名遠端倉庫可使用
$ git remote rename originalName currentName
- 刪除遠端倉庫可使用
$ git remote rm repositoryName
5. git分支
使用分支可以將開發工作從主線上進行分離,git的預設分支是master分支。git使用HEAD指標指向當前分支,可看做當前分支的一個別名。
5.1 建立分支
建立分支實際上就是建立了一個指向當前專案的指標,通過$ git branch
命令可以檢視當前分支,$ git branch branchName
用於建立分支。
5.2 切換分支
命令$ git checkout branchName
用於切換分支,切換分支後當前的工作區的檔案也會隨之改變。
git分支是以提交的檔案為基礎的,一般情況下在修改檔案後只有當提交了檔案才能切換到另一個分支,但也有特殊情況,以branch1和branch2兩個分支為例,若在branch1中新增了新檔案,此時切換到branch2分支可以看到該檔案,若此時提交則該檔案屬於branch2分支,再次切回branch1中不會保留該檔案
5.3 刪除分支
通過$ git branch -d branchName
可以刪除該分支
5.4 分支合併
首先通過$ git checkout branchName
切換到某一分支,如master分支,接下來執行$ git merge branchName
將對應分支合併到master中。
合併過程中如果兩個分支對同一個檔案進行了操作,則會產生衝突,需要手動解決,產生衝突的內容會在工作區中的相應檔案中被標記出來,需要自己去判斷保留哪一份修改,之後執行提交即可。
5.5 跟蹤遠端分支
若想跟蹤遠端分支可以通過$ git checkout --track remoteRepository/remoteBranch
,也可通過$ git checkout -b branchName remoteRepository/remoteBranch
新建分支並跟蹤遠端分支,兩者的不同點只是新建分支的名字不同。
若本地已有分支,則可通過$ git branch -u remoteRepository/remoteBranch
新增或修改跟蹤。
通過$ git branch -vv
命令可以檢視遠端分支的跟蹤資訊。
5.6 刪除遠端分支
命令$ git push remoteRepository --delete remoteBranch
可用於刪除遠端分支。