本篇文章給大家?guī)?lái)了關(guān)于Git的相關(guān)知識(shí),其中主要介紹了git的基本工作原理,入門(mén)級(jí)教程,通過(guò)玩轉(zhuǎn)Git本地倉(cāng)庫(kù),幫助新手快速入手Git,希望對(duì)大家有幫助。
推薦學(xué)習(xí):《Git學(xué)習(xí)教程》
一、分區(qū)及工作流程
1. Git分區(qū)
Git的分區(qū)包括工作區(qū)、暫存區(qū)、本地倉(cāng)庫(kù)(本地版本庫(kù))、遠(yuǎn)程倉(cāng)庫(kù)(遠(yuǎn)程版本庫(kù))。
-
工作區(qū)
工作區(qū)(Workspace)即本地代碼所在的目錄,同時(shí)也是存放 .git/ (本地倉(cāng)庫(kù))的目錄。 -
暫存區(qū)
暫存區(qū)(Index/Stage)是工作區(qū)和本地倉(cāng)庫(kù)的緩存空間,里面記錄著即將提交給本地倉(cāng)庫(kù)(版本庫(kù))的文件修改信息,.git/ 目錄里的index文件就是暫存區(qū)。 -
本地倉(cāng)庫(kù)
本地倉(cāng)庫(kù)(Repository)也稱(chēng)本地庫(kù)或版本庫(kù),存放了本地的所有版本(commit提交記錄),本地倉(cāng)庫(kù)的文件都在 .git/ 目錄中。 -
遠(yuǎn)程倉(cāng)庫(kù)
遠(yuǎn)程倉(cāng)庫(kù)(Remote)在網(wǎng)絡(luò)上,GitHub、Gitee和GitLab都能創(chuàng)建遠(yuǎn)程倉(cāng)庫(kù),和本地倉(cāng)庫(kù)一樣,遠(yuǎn)程倉(cāng)庫(kù)存放的也是不同的代碼版本,只是這些版本可以來(lái)自多個(gè)本地倉(cāng)庫(kù)。
2. 工作流程
——————————————————下圖來(lái)源網(wǎng)絡(luò)———————————————————
上圖生動(dòng)地描述了Git不同分區(qū)之間的操作命令。
- 假如要實(shí)現(xiàn)上傳代碼功能,工作區(qū)使用add添加文件到暫存區(qū),暫存區(qū)再通過(guò)commit提交版本給本地倉(cāng)庫(kù),最后本地倉(cāng)庫(kù)使用push將版本推送到遠(yuǎn)程倉(cāng)庫(kù);
- 工作區(qū)修改的文件可以通過(guò)checkout命令從本地倉(cāng)庫(kù)或暫存區(qū)恢復(fù);如果要將工作區(qū)某分支的代碼更新為遠(yuǎn)程倉(cāng)庫(kù)最新版本,可以使用pull命令;
- 對(duì)遠(yuǎn)程倉(cāng)庫(kù)使用clone可以將遠(yuǎn)程倉(cāng)庫(kù)主分支拷貝到本地倉(cāng)庫(kù),fetch命令與pull類(lèi)似,只是pull會(huì)合并本地代碼,而fetch只會(huì)把最新版本抓取到本地版本庫(kù),不考慮本地倉(cāng)庫(kù)是否有新增。
二、本地倉(cāng)庫(kù)初始化
1. git init
本地倉(cāng)庫(kù)(版本庫(kù))需要使用 git init 命令來(lái)創(chuàng)建(也可以直接從遠(yuǎn)程倉(cāng)庫(kù)克隆,后面介紹)。
進(jìn)入工作區(qū)(代碼存放目錄),輸入git init,git會(huì)在工作區(qū)新建一個(gè).git/目錄:
2. .git/目錄簡(jiǎn)單介紹
在一個(gè)新建的.git/目錄中,有3個(gè)文本文件:
- config存放了本地倉(cāng)庫(kù)的配置信息;
- description用來(lái)描述倉(cāng)庫(kù)的名字;
- HEAD為本地倉(cāng)庫(kù)當(dāng)前分支,默認(rèn)為master,指向了refs/heads/master,可見(jiàn)refs/目錄主要存放一些分支信息;
后面在對(duì)本地倉(cāng)庫(kù)進(jìn)行操作時(shí),還會(huì)產(chǎn)生其他文件,比如logs/——保存提交的記錄,index——暫存區(qū)。
【注意】 千萬(wàn)不要手動(dòng)更改.git/里的文件,可能會(huì)破壞本地倉(cāng)庫(kù)的結(jié)構(gòu),造成不良后果。
三、用戶(hù)信息配置
1. 用戶(hù)名和郵箱配置介紹
初始化本地倉(cāng)庫(kù)后的第一件事情就是給本地倉(cāng)庫(kù)添加用戶(hù)配置信息,包括用戶(hù)名和郵箱地址,這里的用戶(hù)名和郵箱地址和托管平臺(tái)(如gitee)的賬戶(hù)沒(méi)有直接關(guān)系,它唯一的作用就是讓別的用戶(hù)或托管平臺(tái)知道代碼的上傳者信息,郵箱亂填也不會(huì)導(dǎo)致不能上傳代碼。
比如下面我用“張三”和“李四”上傳了代碼,郵箱地址不是真實(shí)存在的,同樣可以上傳成功:(commit信息出了點(diǎn)意外)
李四的郵箱地址顯然不是真實(shí)的。
由于“張三”和“李四”的郵箱沒(méi)有在gitee綁定賬戶(hù),所以點(diǎn)擊它們頭像時(shí),不會(huì)顯示用戶(hù)信息,如果用戶(hù)配置里填寫(xiě)了gitee賬號(hào)的提交郵箱,則可以在gitee上查看上傳者賬號(hào)信息。
gitee用戶(hù)的提交郵箱,可以在gitee->個(gè)人主頁(yè)->個(gè)人設(shè)置->郵箱管理中設(shè)置和查看:
2.使用git config配置用戶(hù)信息
講了那么多用戶(hù)名和郵箱的注意事項(xiàng),其實(shí)用戶(hù)信息配置十分簡(jiǎn)單:
git config --global user.name "your name"git config --global user.email "your email"
user.name 后接用戶(hù)名,任意填寫(xiě)。
user.email 后接用戶(hù)郵箱,任意填寫(xiě)。
–global 為配置全局屬性
提交代碼到本地倉(cāng)庫(kù)時(shí),git會(huì)先檢索本地倉(cāng)庫(kù)的.git/config文件,如果沒(méi)有user的信息,則使用全局的配置文件(符合就近原則)。
全局配置文件存放位置為 系統(tǒng)用戶(hù)目錄/用戶(hù)名/.gitconfig,里面只有user屬性。
不加–global時(shí),僅設(shè)置本地倉(cāng)庫(kù)的用戶(hù)配置,本地倉(cāng)庫(kù)用戶(hù)配置信息存放位置:.git/config
上圖我僅設(shè)置了本地配置的用戶(hù)名,此時(shí)如果提交修改到本地倉(cāng)庫(kù),提交記錄(下圖)中用戶(hù)名使用本地配置,因?yàn)楸镜貨](méi)有配置用戶(hù)郵箱,所以郵箱依然使用全局配置中指定的郵箱。
四、管理暫存區(qū)文件
配置完用戶(hù)信息后,我們就可以開(kāi)始考慮提交代碼了,但是有時(shí)候,我們并不想把整個(gè)工作區(qū)的文件都提交到本地倉(cāng)庫(kù)(版本庫(kù))。暫存區(qū)(index/stage)的存在,替我們解決了這個(gè)困擾,我們可以先把代碼文件添加到暫存區(qū),如果覺(jué)得還需要改動(dòng),可以將文件從暫存區(qū)刪除,直到我們覺(jué)得文件選擇得差不多了,再進(jìn)行下一步(提交到本地倉(cāng)庫(kù))。
1. Git文件狀態(tài)
在管理暫存區(qū)之前,我們還需要了解工作區(qū)文件的幾種狀態(tài):
- Untracked 未跟蹤,工作區(qū)中沒(méi)有加入過(guò)暫存區(qū)的文件,不參與版本控制;
- Unmodified 未修改,加入版本控制,但和版本庫(kù)中文件快照相同;
- Modified 已修改,加入版本控制,而且和上次加入版本庫(kù)時(shí)的快照不同;
- Staged 已暫存,下一步可以提交到本地倉(cāng)庫(kù)(版本庫(kù))。
——————————————————下圖來(lái)源網(wǎng)絡(luò)———————————————————
git status命令可以用來(lái)查看工作區(qū)文件當(dāng)前的狀態(tài):
#查看特定文件的狀態(tài) git status [filename]#查看所有文件狀態(tài) git status #精簡(jiǎn)的方式顯示文件狀態(tài) git status -s
2. 添加文件到暫存區(qū)
先查看工作區(qū)所有文件的狀態(tài),發(fā)現(xiàn)還沒(méi)有任何文件:
現(xiàn)在創(chuàng)建3個(gè)文件,再次使用git status(-s表示精簡(jiǎn)顯示),3個(gè)文件的狀態(tài)為Untracked,??為精簡(jiǎn)顯示下Untracked的標(biāo)志,意思是新創(chuàng)的文件沒(méi)有被本地倉(cāng)庫(kù)(版本庫(kù))跟蹤。
git add [文件…] 可以添加一個(gè)或多個(gè)文件到暫存區(qū),使文件狀態(tài)變?yōu)镾taged,A表示該文件被add到暫存區(qū)。
也可以使用 git add . 或 git add -A 將工作區(qū)所有文件添加到暫存庫(kù)(除了.gitignore里聲明的文件,本文暫不介紹)。
3. 刪除暫存區(qū)的文件
既然可以向暫存區(qū)添加文件,那么反向操作必然也不能少,git rm –cached [文件…] 命令可以將暫存區(qū)的文件移除,使其恢復(fù)到Untracked狀態(tài)。
4. 文件修改管理
如果已經(jīng)存入暫存區(qū),但在文件提交到本地倉(cāng)庫(kù)前,我們對(duì)其進(jìn)行了修改,那么它的狀態(tài)將變?yōu)镸odified。
對(duì)于Modified狀態(tài)的文件,我們可以使用git add將修改后的版本加入到暫存區(qū),也可以使用git checkout -- [file...]
將工作區(qū)的該文件恢復(fù)到暫存區(qū)的版本。
git add a.c重新添加a.c到暫存區(qū):
下圖為使用git checkout -- a.c
從暫存區(qū)恢復(fù)a.c文件,下圖中我沒(méi)有加 “ –”,它的作用是讓checkout不檢測(cè)任何其他選項(xiàng)參數(shù),目的是防止該命令把a(bǔ).c當(dāng)做一個(gè)分支(checkout 還有一個(gè)作用是切換分支)。
對(duì)Modified狀態(tài)下的文件使用 git diff 可以得出文件修改的詳細(xì)記錄,git diff和diff命令雖然作用都是對(duì)比文件,但git diff的作用是對(duì)比不同的狀態(tài)下的同一文件,而diff用來(lái)對(duì)比兩個(gè)不同的文件。
五、提交文件到本地倉(cāng)庫(kù)
文件添加到暫存區(qū)的目的就是將其提交到本地倉(cāng)庫(kù)(版本庫(kù)),提交命令為git commit -m “message”
我們可以在commit 后面添加文件,這樣能指定提交的文件:
通過(guò)git log 可以查看提交記錄,HEAD為本地倉(cāng)庫(kù)當(dāng)前分支,指向主分支master:
直接使用 git commit -m “message” 可以將整個(gè)暫存區(qū)都提交到本地倉(cāng)庫(kù):
#以一行的形式顯示所有提交版本: git log --pretty=oneline
#一行顯示,只顯示哈希值的前7位: git log --oneline
#顯示歷史提交版本與當(dāng)前版本的間隔數(shù): git reflog
六、推送到遠(yuǎn)程倉(cāng)庫(kù)
代碼文件提交到本地倉(cāng)庫(kù)后,還需要推送到遠(yuǎn)程倉(cāng)庫(kù)進(jìn)行托管。
1. 創(chuàng)建遠(yuǎn)程倉(cāng)庫(kù)
我以碼云為例,遠(yuǎn)程倉(cāng)庫(kù)的創(chuàng)建可以通過(guò)以下三步實(shí)現(xiàn):
2. 添加遠(yuǎn)程倉(cāng)庫(kù)地址
git remote add <name> <url> 命令可以添加遠(yuǎn)程倉(cāng)庫(kù),name為遠(yuǎn)程倉(cāng)庫(kù)地址的別名,自定義,url為倉(cāng)庫(kù)網(wǎng)絡(luò)地址。
如果要用https的方式上傳代碼,需要添加遠(yuǎn)程倉(cāng)庫(kù)https地址;用ssh上傳代碼,則url填遠(yuǎn)程倉(cāng)庫(kù)ssh地址。
先從碼云倉(cāng)庫(kù)主頁(yè)將倉(cāng)庫(kù)地址復(fù)制下來(lái):
我將遠(yuǎn)程倉(cāng)庫(kù)的本地別名命名為origin:
遠(yuǎn)程倉(cāng)庫(kù)可以設(shè)置多個(gè),只要本地別名不沖突即可。
3. 查看遠(yuǎn)程倉(cāng)庫(kù)地址
git remote -v 命令可以查看遠(yuǎn)程倉(cāng)庫(kù)地址,也可以通過(guò)git config -l查看
4. 刪除遠(yuǎn)程倉(cāng)庫(kù)地址
git remote remove <name> 可以刪除本地別名為name的遠(yuǎn)程地址:
5. 推送到遠(yuǎn)程倉(cāng)庫(kù)
首先確認(rèn)遠(yuǎn)程倉(cāng)庫(kù)的別名,我當(dāng)前設(shè)置的遠(yuǎn)程倉(cāng)庫(kù)https協(xié)議地址對(duì)應(yīng)的別名為https,ssh協(xié)議地址對(duì)應(yīng)的別名為ssh,這兩個(gè)地址其實(shí)是一個(gè)倉(cāng)庫(kù),只是協(xié)議不同。
https上傳
git push name可以實(shí)現(xiàn)本地倉(cāng)庫(kù)的上傳,name為遠(yuǎn)程倉(cāng)庫(kù)在配置文件中的別名,使用https上傳,需要輸入賬號(hào)和密碼才能完成上傳,Window系統(tǒng)會(huì)自動(dòng)保存賬號(hào)和密碼,如果想修改Window已經(jīng)保存的用戶(hù)名和密碼,可以參考修改Gitee登錄憑據(jù)。
有時(shí)第一次上傳會(huì)出現(xiàn)不成功的情況,可以嘗試使用git push -u name master,該命令的作用是將 name 倉(cāng)庫(kù)的主分支作為上流分支,-u和–set-upstream作用相同。
ssh上傳
如果要使用ssh上傳,需要先生成SSH密匙,并將公匙保存到gitee個(gè)人設(shè)置的SSH公匙設(shè)置中,具體過(guò)程可以參考:生成SSH密匙,實(shí)現(xiàn)代碼上傳
有時(shí)第一次上傳會(huì)出現(xiàn)不成功的情況,可以嘗試使用git push -u name master,該命令的作用是將 name 倉(cāng)庫(kù)的主分支作為上流分支,-u和–set-upstream作用相同。
七、從遠(yuǎn)程倉(cāng)庫(kù)clone、fetch或pull
1. 克隆遠(yuǎn)程倉(cāng)庫(kù)到本地
git的克隆可以將遠(yuǎn)程倉(cāng)庫(kù)拷貝到本地,同時(shí)自動(dòng)進(jìn)行本地倉(cāng)庫(kù)的初始化。
在任意目錄下打開(kāi)Git bash,輸入 git clone <repo> [<dir>],repo為遠(yuǎn)程倉(cāng)庫(kù)網(wǎng)址,dir為克隆倉(cāng)庫(kù)的存放路徑(可以不用提前創(chuàng)建),如果不填,則默認(rèn)為遠(yuǎn)程倉(cāng)庫(kù)名(不是本地別名)。
[注意]:clone和push一樣需要密碼。
克隆成功,進(jìn)入該倉(cāng)庫(kù)目錄,和上傳時(shí)的工作區(qū)一模一樣,提交日志也相同。
2. 獲取遠(yuǎn)程倉(cāng)庫(kù)(fetch)
git fetch的作用是將遠(yuǎn)程倉(cāng)庫(kù)的分支拷貝到本地倉(cāng)庫(kù),并把最新版本保存在FETCH_HEAD分支,獲取遠(yuǎn)程倉(cāng)庫(kù)分支后,還需手動(dòng)將其合并到當(dāng)前分支。
命令格式: git fetch [<repository>] ,repository為遠(yuǎn)程倉(cāng)庫(kù)的網(wǎng)絡(luò)地址。
git merge <分支名>用來(lái)合并分支
3. 拉取遠(yuǎn)程倉(cāng)庫(kù)(pull)
git pull和git fetch類(lèi)似,但git pull會(huì)自動(dòng)將遠(yuǎn)程倉(cāng)庫(kù)的分支合并到本地的當(dāng)前分支。
推薦學(xué)習(xí):《Git視頻教程》