Git基礎整理

arlendp2012發表於2019-11-01

Git是平常軟體開發中經常使用的版本控制系統,本文對git的原理、基礎和配置方式進行了介紹,同時總結了平時使用過程中常見的git操作。

1. 概念

  1. 集中式版本控制系統:有一個單一的集中管理的伺服器,開發人員都可以連線到這臺伺服器,進行協同工作。
  • 優點是系統容易管理和維護
  • 缺點是如果中央伺服器出現故障,工作將不能進行
  1. 分散式版本控制系統:不是隻提取最新版本的檔案快照,而是將整個程式碼倉庫拷貝到本地,即使伺服器故障也能通過本地倉庫進行完整的恢復。

2. 基礎

  • git儲存資料是儲存整個檔案系統的一個快照

    git-snapshot

  • 其他大部分系統儲存的是檔案的變更資訊

    delta

  • 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版本控制下檔案的生命週期
    life-cycle

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 撤銷操作

  1. 修改提交檔案
  • 若提交後發現漏掉其他檔案,可通過$ git commit --amend操作將當前暫存區的檔案加入上次提交中,相當於只存在一次提交。
  • 若是想修改提交檔案的提交資訊,可通過$ git commit --amend -m "newComments"
  1. 取消暫存檔案
  • 通過$ git reset HEAD fileName可將檔案從暫存區中移除,進入未暫存狀態。
  1. 取消已修改檔案
  • 通過$ 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可用於刪除遠端分支。

相關文章