一篇文章帶你瞭解熱門版本控制系統——Git

2022-10-18 12:01:17

一篇文章帶你瞭解熱門版本控制系統——Git

這篇文章會介紹到關於版本控制的相關知識以及版本控制神器Git

我們可能在生活中經常會使用GitHub網頁去查詢一些開源的資源或者專案,GitHub就是基於Git而產生的平臺

接下來讓我們來細細道來~

Git是一門非常簡單的技術,但在實際開發中佔有很重要的地位,請務必瞭解掌握

版本控制

在介紹Git之前我們先來介紹一個名詞:版本控制

版本控制概念

我們在標題已經提到了Git的最大作用:版本控制

那麼我們先來了解一下版本控制:

  • 版本控制是指對軟體開發過程中各種程式程式碼、組態檔及說明檔案等檔案變更的管理,是軟體設定管理的核心思想之一。

通俗來說的話:

  • 版本控制用於在開發的過程中管理我們的檔案
  • 我們可以檢視檔案、目錄或工程等內容的修改歷史,方便檢視更改歷史記錄,備份以便恢復以前的版本。

例如我們所使用的產品有Version,版本常分為1.0,2.0...版本區分

但是我們所淘汰掉的版本是不會被直接拋棄刪除,而是被像Git這樣的軟體所儲存傳送到相關倉庫中

又或者我們的軟體開發之後,會由許多人進行開發修改

但是並非所有人的開發版本都會被保留使用,那些被淘汰的版本就會被像Git這樣的軟體所儲存傳送到相關倉庫中

版本控制的優勢:

  • 實現跨區域多人協同開發
  • 追蹤和記載一個或者多個檔案的歷史記錄
  • 組織和保護你的原始碼和檔案
  • 統計工作量
  • 並行開發、提高開發效率
  • 跟蹤記錄整個軟體的開發過程
  • 減輕開發人員的負擔,節省時間,同時降低人為錯誤

總而言之版本控制在我們的實際開發中佔有很重要的地位!

多人開發就必須要使用版本控制,否則無法控制專案的開發狀態

版本控制工具

我們目前常用的控制工具大致分為五種:

  • Git
  • SVN(Subversion)
  • CVS(Concurrent Versions System)
  • VSS(Micorosoft Visual SourceSafe)
  • TFS(Team Foundation Server)

其中SVN屬於版本控制的老大哥,但目前大部分公司已經不再使用

我們目前學的Git就屬於版本控制的主流工具,基本上大部分公司都在使用Git工具

版本控制分類

我們通常將版本控制分為三類:

  1. 本地版本控制
  • 概念:

本地版本控制通常用於個人開發,我們將我們自己的專案進行版本控制,在迭代後將原版本的專案原件保留下來

記錄檔案每次的更新,可以對每個版本做一個快照,或是記錄修補程式檔案,如RCS。

  • 優缺點:

只能用於個人開發,多人開發在多臺計算機上,本地版本控制無法滿足

  1. **集中版本控制 **
  • 概念:

集中版本控制通常用於團隊開發,將一個電腦作為主機,將所有需要儲存的專案資料都存放在該電腦上,實現集中控制

協同開發者從伺服器上同步更新或上傳自己的修改,如SVN

  • 優缺點:

集中版本控制將所有資料儲存在一臺電腦上,相當於單機儲存,保密性較高;但一旦計算機出現損壞,專案備份丟失,無法找回

  1. 分散式版本控制
  • 概念:

分散式版本控制通常用於團隊開發,所有人都儲存有專案的所有資料,實現分散式控制

  • 優缺點:

保密性差,所有人都攜帶專案原始碼,具有一定安全隱患;但同時所有人都儲存有原始碼,一臺電腦損壞並不影響專案的儲存

Git和SVN的主要區別

我們在前面提及到了集中版本控制和分散式版本控制,實際上它們就分別對應著SVN和Git的控制方式

因而我們給出相關總結:

  • 資料存放地址:SVN存放在一臺計算機;Git存放在所有計算機
  • 專案開發方式:SVN需要聯網獲得主機上的專案,然後開發完後推播回原電腦;Git直接開發並比對研究即可
  • 優缺點:SVN安全性低但容易丟失;Git不易丟失但安全性差

Git環境設定

首先我們來講解Git的安裝以及環境設定等資訊

Linux常用指令

在正式開始Git教學之前,我們來複習一些Linux相關指令:

# 表示註釋

cd : 改變目錄。

cd . . : 回退到上一個目錄,直接cd進入預設目錄

pwd : 顯示當前所在的目錄路徑。

ls(ll) :  都是列出當前目錄中的所有檔案,只不過ll(兩個ll)列出的內容更為詳細。

touch : 新建一個檔案 如 touch index.js 就會在當前目錄下新建一個index.js檔案。

rm:  刪除一個檔案, rm index.js 就會把index.js檔案刪除。

mkdir :  新建一個目錄,就是新建一個資料夾。

rm -r :  刪除一個資料夾, rm -r src 刪除src目錄

mv : 移動檔案, mv index.html src index.html 是我們要移動的檔案, src 是目標資料夾,

reset : 重新初始化終端/清屏。

clear : 清屏。

history : 檢視命令歷史。

help : 幫助。

exit : 退出。

Git下載與開啟

  1. 官網下載安裝(官網地址:https://git-scm.com/)

安裝基本只需要修改安裝路徑和預設開啟方式,其他選項一律預設即可

  1. 啟動Git

我們啟動一般有三種方法:

  • Git Bash:Unix與Linux風格的命令列,使用最多,推薦最多
  • Git CMD:Windows風格的命令列
  • Git GUI:圖形介面的Git,不建議初學者使用,儘量先熟悉常用命令

我們通常選用Git Bash,採用Linux命令列來進行

下載Git之後,我們可以在資料夾下直接點選右鍵,可以看到出現有Git Bash的選項,點選即可開啟

Git相關設定

我們在下面介紹一些Git的設定檢視方法以及設定方法

首先我們需要知道檢視Git設定的方法:

# 檢視全部設定
git config -l

Git中存在有系統預設設定以及我們自己設定的資訊:

# 檢視系統config
git config --system --list
  
# 檢視當前使用者(global)設定
git config --global  --list

我們在Git中有必須設定的兩個屬性:

# 這是非常重要的,因為每次Git提交都會使用該資訊。

# 設定名稱
git config --global user.name "QiuLuo"  

# 設定郵箱
git config --global user.email [email protected]   

如果你希望在單個專案中修改name和email可以去掉--global,表示不在全域性中設定

Git基本理論

我們下面將從Git的資料傳遞方面講起,是很重要的地方哦~

Git四個區域

我們的Git會將我們的資料儲存下來,作為版本保留下來

而保留的地點通常被我們劃分為四個區域:

  • 工作目錄(Working Directory)
  • 暫存區(Stage/Index)
  • 資源庫(Repository或Git Directory)
  • 遠端倉庫(Remote Directory)

這四個區域的轉換方式如下圖所示:

接下來讓我們依次介紹這四個區域:

  • 工作目錄:第一層,主機存放程式碼的區域
  • 暫存區:第二層,用於臨時存放你的改動,事實上它只是一個檔案,儲存即將提交到檔案列表資訊
  • 資源庫:第三層,本地倉庫,安全存放資料的位置,儲存有你提交到所有版本的資料。
  • 遠端倉庫:第四層,受控程式碼的伺服器

Git區域工作流程

在我們程式碼書寫完畢後,我們通常會將資料存放到資源庫

具體的Git流程如下:

1、在工作目錄中新增、修改檔案 [Git狀態:已修改(modified)]

2、將需要進行版本管理的檔案放入暫存區域 [Git狀態:已暫存(staged)]

3、將暫存區域的檔案提交到git倉庫 [Git狀態:已提交(committed)]

Git專案搭建

接下來我們開始Git專案搭建的講解~

本地倉庫搭建

我們前面說到,我們Git會將工作目錄的專案傳遞到本地倉庫上

那麼首先我們需要學會建立本地倉庫:

  1. 本地倉庫建立
# 在當前目錄新建一個Git程式碼庫(注意:會在當前頁面下產生一個隱藏目錄.git,需要開啟隱藏目錄標籤才可以檢視到)
$ git init
  1. 遠端倉庫克隆
# 克隆一個專案和它的整個程式碼歷史(版本資訊) 提供一個url:https://gitee.com/kuangstudy/openclass.git
$ git clone [url]  

Git常用六個方法

Git專案檔案的處理一共只有六個方法,用於控制四個區域的流動:

  • add:工作目錄 -> 暫存區
  • commit: 暫存區 -> 資源庫
  • push: 資源庫 -> 遠端倉庫
  • clone: 遠端倉庫 -> 資源庫
  • checkout: 資源庫 -> 工作目錄
  • pull: 遠端倉庫 -> 工作目錄

Git檔案操作

我們Git的專案操作實際上來說就是對檔案進行操作

下面我們來介紹Git操作檔案的一些方法以及檔案的四種常見狀態

Git檔案狀態

我們對檔案進行不同的操作或採用了不同的程式碼之後,檔案的狀態會發生變化

我們通常將檔案的狀態分為四種:

  • Untracked : 未跟蹤, 此檔案在資料夾中, 但並沒有加入到git庫, 不參與版本控制. 通過git add 狀態變為Staged.
  • Unmodify : 未修改, 即版本庫中的檔案快照內容與資料夾中完全一致.
  • Modified : 檔案已修改, 僅僅是修改, 並沒有進行其他的操作.
  • Staged : 暫存狀態.

檔案之間的狀態轉換如下:

  • Untracked通過git add狀態變為Staged.
  • Unmodify如果被修改, 而變為Modified. 如果使用git rm移出版本庫, 則成為Untracked檔案
  • Modified通過git add可進入暫存staged狀態, 使用git checkout 則丟棄修改過, 返回到unmodify狀態
  • Staged執行git commit則將修改同步到庫中, 這時庫中的檔案和本地檔案又變為一致, 檔案為Unmodify狀態.

Git檔案指令

Git提供了兩個方法可以檢視單個檔案以及所有檔案的狀態:

# 檢視指定檔案狀態
git status [filename]

# 檢視所有檔案狀態
git status

同時Git也提供了兩個方法進行檔案型別的轉換:

# 新增所有檔案到暫存區
git add .        

# 提交暫存區中的內容到本地倉庫 -m 提交資訊
git commit -m "訊息內容"    

Git檔案忽略

在我們的實際開發中,有些檔案並不需要新增到本地倉庫中,因而Git為我們提供了一個設定類:

  • .gitignore設定類

該檔案存在以下規則:

  • 忽略檔案中的空行或以井號(#)開始的行將會被忽略。

  • 可以使用Linux萬用字元。例如:星號(*)代表任意多個字元,問號(?)代表一個字元

  • 如果名稱的最前面有一個感嘆號(!),表範例外規則,將不被忽略。

  • 如果名稱的最前面是一個路徑分隔符(/),表示要忽略的檔案在此目錄下,而子目錄中的檔案不忽略。

  • 如果名稱的最後面是一個路徑分隔符(/),表示要忽略的是此目錄下該名稱的子目錄,而非檔案(預設檔案或目錄都忽略)。

我們給出相關範例:

#為註釋

#忽略所有 .txt結尾的檔案,這樣的話上傳就不會被選中!
*.txt      

#但lib.txt除外
!lib.txt     

#僅忽略專案根目錄下的TODO檔案,不包括其它目錄temp
/temp        

#忽略build/目錄下的所有檔案
build/       

#會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt    

Gitee碼雲

我們在實際開發中通常需要一個遠端倉庫來存放我們的專案版本

目前可靠的Git開發平臺有GitHub,Gitab,Gitee,我們在這裡採用Gitee為例

  1. 註冊登入碼雲頁面

  1. 獲得SSH公鑰
# 首先我們採用Git獲得SSH公鑰

# 生成SSH公鑰 然後進入 C:\Users\Administrator\.ssh 目錄 可以檢視相關資訊
ssh-keygen
  1. 設定本機繫結SSH公鑰,實現遠端倉庫免密碼登入

  1. 建立一個遠端倉庫

  1. 克隆至本地即可
$ git clone 遠端倉庫HTTPS

IDEA整合Git

這一小節我們來介紹如何在IDEA中使用Git儲存資料

  1. 建立專案,繫結Git

我們通常將我們遠端倉庫中的程式碼直接拷貝複製到當前專案資料夾下即可

此時我們的IDEA頁面會發生變化(紅色檔案為選中檔案):

  1. 修改檔案,逐步實現add,commit,push操作

我們可以選擇在Terminal控制檯輸出:

同樣可以選擇IDEA介面快捷輸出:

  1. 返回Gitee頁面檢視資料即可(注意:需要設定為公開才可更新成功)

Git分支

分支就是脫離於主線之外的內容

版本控制系統都以某種形式支援分支,一個分支代表一條獨立的開發線,讓我們在不影響主線的同時繼續工作

如果同一個檔案在合併分支時都被修改了則會引起衝突:

  • 解決的辦法是我們可以修改衝突檔案後重新提交
  • 但是我們需要選擇要儲存某一人的程式碼而捨棄另一個人的程式碼

那麼我們的日常開發應該是以哪種方式開發呢:

  • master主分支應該非常穩定,用來發布新版本,一般情況下不允許在上面工作
  • 工作一般情況下在新建的dev開發分支上工作,在分支穩定後可以合併到主分支master上來。

我們在這裡給出Git分支的常用指令:

# 列出所有本地分支
git branch

# 列出所有遠端分支
git branch -r

# 新建一個分支,但依然停留在當前分支
git branch [branch-name]

# 新建一個分支,並切換到該分支
git checkout -b [branch]

# 合併指定分支到當前分支
$ git merge [branch]

# 刪除分支
$ git branch -d [branch-name]

# 刪除遠端分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

結束語

好的,關於Git的內容就介紹到這裡,希望能為你帶來幫助!

附錄

該文章屬於學習內容,具體參考B站遇見狂神說的秦江老師的Git課程

這裡附上視訊連結:1、前言之版本控制_嗶哩嗶哩_bilibili