前言:本文主要介紹git版本控制系統的一些基礎使用,適合小白入門,因為內容較多,會分為兩部分進行分享,查看下部請點傳送門。
Git介紹
Git是目前世界上最先進的分布式版本控制系統。並且它是一個開源的分布式版本控制系統,用於敏捷高效地處理任何或小或大的項目。
Git功能
我們先看一下Git的主要功能,從一般開發者的角度來看,git有以下功能:
- 🍊 從服務器上克隆完整的Git倉庫(包括代碼和版本信息)到單機上。
- 🍊 在自己的機器上根據不同的開發目的,創建分支,修改代碼。
- 🍊 在單機上自己創建的分支上提交代碼。
- 🍊 在單機上合並分支。
- 🍊 把服務器上最新版的代碼fetch下來,然后跟自己的主分支合並。
- 🍊 生成補丁(patch),把補丁發送給主開發者。
- 🍊 看主開發者的反饋,如果主開發者發現兩個一般開發者之間有沖突(他們之間可以合作解決的沖突),就會要求他們先解決沖突,然后再由其中一個人提交。如果主開發者可以自己解決,或者沒有沖突,就通過。
- 🍊 一般開發者之間解決沖突的方法,開發者之間可以使用pull 命令解決沖突,解決完沖突之后再向主開發者提交補丁。
從主開發者的角度(假設主開發者不用開發代碼)看,git有以下功能:
- 🍋 查看郵件或者通過其它方式查看一般開發者的提交狀態。
- 🍋 打上補丁,解決沖突(可以自己解決,也可以要求開發者之間解決以后再重新提交,如果是開源項目,還要決定哪些補丁有用,哪些不用)。
- 🍋 向公共服務器提交結果,然后通知所有開發人員。
Git的優缺點
✔️ 優點:
- 適合分布式開發,強調個體。
- 公共服務器壓力和數據量都不會太大。
- 速度快、靈活。
- 任意兩個開發者之間可以很容易的解決沖突。
- 離線工作。
❌ 缺點:
- 資料少(起碼中文資料很少)。
- 學習周期相對而言比較長。
- 不符合常規思維。
- 代碼保密性差,一旦開發者把整個庫克隆下來就可以完全公開所有代碼和版本信息。
❓ 那為什么要用版本控制系統呢?
- 更方便地存儲版本。
- 更方便地進行比對。
- 可以恢復之前的版本。
- 協同合作。
Git安裝及賬戶配置
下載
在使用Git前我們需要先安裝 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上運行,各平台安裝包都可以在官網中找到,選擇你需要的平台下載安裝即可。windows的推薦使用這個下載地址,速度相對官網會更快。
安裝
下載后安裝,直接一路點擊next安裝即可。
安裝完成后,在文件夾中右擊,看到下面兩個git選項,就說明git安裝成功了。
查看Git版本
在文件夾中右擊,點擊Git Bash Here打開git命令行窗口,輸入git --version
就可以查看git的版本信息了。
如果安裝的版本較舊,想要升級最新版,可以使用git update-git-for-windows
命令一鍵升級到最新版。當然,你也可以直接在官網下載最新版的手動安裝。
配置用戶名和郵箱
初次安裝Git時都需要配置一個用戶名和郵箱,否則使用過程會出現警告信息如:please tell me who you are。
相關配置命令:
git config --global user.name "用戶名"
:配置用戶名git config --global user.email "郵箱地址"
:配置郵箱git config --global --list
:查看全局配置列表
global 表示全局,表示你這台機器上所有的Git倉庫都會使用這個配置,提交項目內容時就會以配置的賬戶署名,當然你也可以對某個倉庫指定不同的用戶名和郵箱,也可以針對操作系統進行配置,配置命令幾乎是一樣的。
git config --local
:只對指定的倉庫有效,如果不指定時(即git config
)默認是配置local,之一如果要指定倉庫,配置時要先切換到對應倉庫的目錄。
git config --system
:對操作系統的所有用戶有效。
創建Git倉庫
倉庫(即版本庫)是什么?簡單來說它就是一個目錄,這個目錄下的所有文件都可以使用git管理起來,對文件進行的增刪改操作都會被記錄下來,之后任何時刻都可以去查看這些歷史記錄,並且可選擇回退到某一個時間點的該倉庫的版本。
創建git倉庫有兩種方式:
方式一
git init
:已經手動創建了一個目錄,直接把該目錄變成一個git倉庫。
在已經創建好的目錄下右擊,點擊Git Bash Here,輸入git init
回車,你會發現你的目錄下多了一個.git文件夾,你可以點擊進去看一下,這個文件夾是git用來跟蹤管理倉庫版本信息的,因此不要去修改里面的任何文件,否則會損壞倉庫的版本信息。(如果你看不到這個文件夾,可以在文件設置中設置顯示隱藏的文件,但強烈建議隱藏,避免誤操作破壞倉庫)
方式二
git init 倉庫名
:新建一個git倉庫
在你想要創建倉庫的目錄下右擊,點擊Git Bash Here,輸入git init 倉庫名
回車,就會在該目錄下創建一個git倉庫,並且倉庫內會生成一個.git文件夾。
提交版本
這里先科普一下兩個名詞,工作區和暫存區。
工作區就是你在電腦中能看到的目錄,比如我現在新建一個learn文件夾,這個文件夾就是一個工作區。問題來了,我在前一章中創建的my_git倉庫它是不是工作區呢?答案是否,它就是一個倉庫,一個版本庫,版本庫里存了很多的東西,其中最重要的一個就是暫存區(stage也叫index),如圖:
我們提交版本時,是分兩步執行的,第一步先把對文件的操作從工作區添加到暫存區,第二步再把暫存區的所有操作提交到當前分支,我們創建git倉庫時,git會默認創建了一個master分支,因此我們未創建其他分支時,提交版本是默認提交到master分支上的。
另外一點,我們要知道的是,所有的版本控制系統,都只能跟蹤文本文件類的改動,比如:txt文本,html網頁文件、py文件、css、js等程序代碼,版本控制系統可以清楚地記錄每個版本的改動,但是像圖片、視頻、mp3這些二進制文件,雖然也能由版本控制系統管理,但無法跟蹤文件的具體變化,只能簡單地記錄某些變動的地方,比如圖片從100kb變成250kb,但是圖片替換了還是調整了像素,具體到底改了什么,版本控制系統是不知道的。
提交版本的相關命令:
git add <file>
:把指定的文件添加到暫存區git add .
:把所在目錄下的所有文件添加到暫存區git commit -m '版本信息'
:把暫存區的操作真正地提交到git倉庫git log
:查看提交版本的log
我們先創建一個txt文本,以提交txt文本為例,提交后查看日志,日志清晰地記錄了提交版本的哈希值、提交人的信息、提交的時間、提交的版本信息。
除了上面的方式提交版本外,還有一種方法可以一步到位,就是使用git commit -a -m '版本信息'
來提交,仔細看的話就會發現其實它是把add融合在一起了,想用哪種方式提交都是可以的,看你喜歡啦!
查看版本狀態
一般在我們提交版本或對某些文件進行了一些修改時,我們如何知道修改的文件在版本控制系統中處於什么樣的狀態呢,是修改中、已添加到暫存區還是已經提交到倉庫了呢?我們可以通過以下命令行來查看版本的狀態,也可以說是查看工作區的狀態。
git status
:查看工作區的狀態git status -s
:以簡潔的方式查看工作區的狀態git status --short
:與上一個命令是一樣的效果
工作區干凈時
沒有任何文件處於修改或添加中時:
文件被修改但未提交
在test.txt文本添加一行內容,保存后關閉,再次查看git狀態,通過狀態信息我們可以看到,test.txt這個文件被標紅了,意思是說該文件被修改了,但是還未添加到暫存區,並且提示我們可以使用git add <file>
添加文件到暫存區,或者使用git restore <file>
丟棄工作目錄中的修改。
也就是說在文件被修改后,文件還未添加到暫存區,而你已經關閉文件,又想要把修改的全部撤回,那么就可以使用該命令撤銷修改的部分回到這個文件的上一個版本。
比如我修改了test.txt,在最后一行追加了“hello, git!”,使用了撤銷命令后,再去查看這個文件,就會發現追加的最后一行已經不見了,還原到了上一個版本。
文件已添加到緩存
把test.txt添加到暫存區后查看狀態,text.txt被標綠了,意思是說該文件已經添加到緩存,但是還未提交到倉庫,並且提示可以使用git restore --staged <file>
把該文件從暫存區中撤銷,重新放回到工作區中,放回到工作區中它是修改但未添加到暫存區的狀態。
如下圖例子,從暫存區撤銷后,該文件再次處於被修改但未添加暫存區的狀態。
如果選擇不撤銷,把文件提交到git版本庫,那么工作樹就會回到干凈狀態。
簡潔的狀態信息
上面中我們看到的狀態信息都是比較詳細的,如果我們不想看到太多信息,可以使用git status -s
查看簡潔的狀態信息,返回的內容分為以下幾種:
- ?? 文件名:該文件是新創建的,還未添加到暫存區
- A 文件名:該文件是新創建的已添加到暫存區,但還未提交到倉庫
- M 文件名:該文件被修改了,但還未添加到暫存區
- M 文件名:該文件已添加到暫存區,但還未提交到倉庫
A就是add的意思,M就是modified。
如果工作樹是干凈的狀態,使用該命令是沒有任何信息的。
查看歷史版本
顧名思義,就是查看歷史提交的版本信息,幾個常規查看命令如下:
git log
:不帶參數最基本的查看git log --pretty=oneline
:只顯示一行git log -p
:查看版本之間的差別git log -2
:查看最近的2個版本git log -2 p
:查看最近的2個版本之間的差別git log --stat
:查看大致的統計信息
參數之間是可以組合使用的,下面舉幾個例子:
忽略特殊文件
有時候我們不想讓某些文件被添加到版本控制系統中,比如一些緩存文件,保存了賬戶信息或數據庫密碼的配置文件等,那么我們就可以配置.gitignore文件去忽略一些特殊的文件。
首先我們要在工作區的根目錄下創建一個.gitignore文件,這個文件名是固定的,如果你直接在操作系統下重命名,可能會提示“必須鍵入文件名”,我們可以通過編輯器打開文件重新另存為即可。
匹配規則
.gitignore文件使用的是glob模式匹配,這個模式匹配有點類似正則表達式,常用的匹配語法如下:
字符 | 描述 |
---|---|
# | 注釋 |
* | 星號,匹配0個或者任意個字符 |
[abc] | 匹配任何一個在括號內的字符 |
[0-9] | 0-9的字符 |
? | 匹配一個任意字符 |
/ | 結尾指定目錄 |
! | 取反,就是否的意思,屏蔽了某文件,使用!后就不會再屏蔽 |
下面看一下.gitignore配置例子:
# .gitignore文件
# 屏蔽src文件夾
src/
# 屏蔽python緩存文件,python緩存文件有可能是.pyc,.pyo,.pyd
# 使用[cod]匹配三種文件
# *號表示匹配0個或者任意個字符,也就是說只要是.py[cod]結尾的文件都屏蔽掉
*.py[cod]
# 也可以精確屏蔽某一個文件
conf.ini
我們先在工作區新建一些對應的文件,看一下提交時是否有屏蔽:
把該工作區的文件全部添加到暫存區,然后提交到倉庫,提交后我們可以看到它只提交了.gitignore文件和test_login.py文件。
強制添加
如果你在某些時候提交文件時,發現如何都提交不了,那你可以看一下.gitignore是否配置了忽略,如果你確實想添加這個文件,但又不想把它從忽略中移除,可以使用-f
強制添加,即git add -f 文件名
。
檢查規則
還有一種可能,你在配置.gitignore時,可能會因為匹配規則編寫時不夠嚴謹,把不應該並屏蔽的文件給屏蔽了,但又不知道是因為哪一條規則引起的屏蔽,我們就可以使用git check-ignore -v <file>
命令來檢查一下。它會告訴你是.gitignore文件第幾行的匹配規則屏蔽了該文件。
版本比對
工作區比對
我們在工作區修改了一些文件,在還沒有添加到暫存區時,可能會想要去查看修改后的文件相對於上一個版本具體作了那些修改,這些修改是否合適。我們就可以使用git diff
去比對一下當前的修改相對於上一個版本有哪些差別,需要注意的是,修改的文件必須是還未添加到暫存區的,以下為例:
暫存區比對
如果文件已經添加到暫存區,但又想與上一個版本比對一下呢?這時就要加上一個--staged
參數去比對,即git diff --staged
,用法與git diff
是一樣的,這里就不做舉例了。
版本間比對
除了可以查看當前與上一個版本的區別外,我們還可以指定兩個版本查看它們間的區別。我們先查看一下git現在有哪些版本。
然后使用git diff 老版本 新版本
然后指定兩個版本,來查看它們的區別,我們只需要復制一下版本的部分哈希值即可,注意這里是老版本在前新版本在后,如果反過來的話,返回的對比信息就是新版本在前,老版本在后。