新聞中心
文末抽獎(jiǎng),兩份掘金周邊等你來拿,滑動(dòng)到文末參與抽獎(jiǎng)!

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站建設(shè)、泌陽網(wǎng)絡(luò)推廣、成都微信小程序、泌陽網(wǎng)絡(luò)營銷、泌陽企業(yè)策劃、泌陽品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供泌陽建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
一、Git 基本概念
1. Git 歷史
Git 是最流行的分布式版本控制系統(tǒng)(Distributed Version Control System,簡稱 DVCS)。它由 Linus Torvalds 創(chuàng)建,當(dāng)時(shí)非常需要一個(gè)快速、高效和大規(guī)模分布式的源代碼管理系統(tǒng),用于管理 Linux 源代碼。
由于 Linus 對幾乎所有現(xiàn)有的源代碼管理系統(tǒng)抱有強(qiáng)烈的反感,因此他決定編寫自己的源代碼管理系列。2005 年 4 月,Git 就誕生了。到了 2005 年 7 月,維護(hù)工作就交給了 Junio Hamano,自此他就一直在維護(hù)這個(gè)項(xiàng)目。
雖然最初只用于 Linux 內(nèi)核,但 Git 項(xiàng)目迅速傳播,并很快被用于管理許多其他 Linux 項(xiàng)目。現(xiàn)在,幾乎所有的軟件開發(fā),尤其是在開源世界中,都是通過 Git 進(jìn)行的。
2. 版本控制系統(tǒng)
版本控制是指對軟件開發(fā)過程中各種程序代碼、配置文件及說明文檔等文件變更的管理,是軟件配置管理的核心思想之一。版本控制技術(shù)是團(tuán)隊(duì)協(xié)作開發(fā)的橋梁,助力于多人協(xié)作同步進(jìn)行大型項(xiàng)目開發(fā)。軟件版本控制系統(tǒng)的核心任務(wù)就是查閱項(xiàng)目歷史操作記錄、實(shí)現(xiàn)協(xié)同開發(fā)。
常見版本控制主要有兩種:集中式版本控制和分布式版本控制。
(1)集中式版本控制系統(tǒng)
集中式版本控制系統(tǒng),版本庫是集中存放在中央服務(wù)器的。工作時(shí),每個(gè)人都要先從中央服務(wù)器獲取最新的版本。完成之后,再把自己添加/修改的內(nèi)容提交到中央服務(wù)器。所有文件和歷史數(shù)據(jù)都存儲在中央服務(wù)器上。SVN 是最流行的集中式版本控制系統(tǒng)之一。
集中式版本控制系統(tǒng)的缺點(diǎn)就是必須聯(lián)網(wǎng)才能使用,如果使用局域網(wǎng)還好,速度會比較快。而如果是使用互聯(lián)網(wǎng),網(wǎng)速慢的話,就可能需要等待很長時(shí)間。除此之外,如果中央服務(wù)器出現(xiàn)故障,那么版本控制將不可用。如果中心數(shù)據(jù)庫損壞,若數(shù)據(jù)未備份,數(shù)據(jù)就會丟失。
(2)分布式版本控制系統(tǒng)
分布式版本控制系統(tǒng),每臺終端都可以保存版本庫,版本庫可以不同,可以對每個(gè)版本庫進(jìn)行修改,修改完成后可以集中進(jìn)行更新。雖然它沒有中心服務(wù)器,但可以有一個(gè)備份服務(wù)器,它的功能有點(diǎn)類似于 SVN 的中央服務(wù)器,但它的作用僅是方便交換修改,而不像 SVN 那樣還要負(fù)責(zé)源代碼的管理。Git 是最流行的分布式版本控制系統(tǒng)之一。
和集中式版本控制系統(tǒng)相比,分布式版本控制系統(tǒng)的安全性要高很多,因?yàn)槊總€(gè)人電腦里都有完整的版本庫,某一個(gè)人的電腦損壞不會影響到協(xié)作的其他人。
(3)SVN vs Git
Git 相較于 SVN:
- 提交速度更快:因?yàn)樵?SVN 中需要更頻繁地提交到中央存儲庫,所以網(wǎng)絡(luò)流量會減慢每個(gè)人的速度。而使用 Git,主要在本地存儲庫上工作,只需每隔一段時(shí)間才提交到中央存儲庫。
- 沒有單點(diǎn)故障:使用 SVN,如果中央存儲庫出現(xiàn)故障,則在修復(fù)存儲庫之前,其他開發(fā)人員無法提交他們的代碼。使用 Git,每個(gè)開發(fā)人員都有自己的存儲庫,因此中央存儲庫是否損壞并不重要。開發(fā)人員可以繼續(xù)在本地提交代碼,直到中央存儲庫被修復(fù),然后就可以推送他們的更改;
- 可以離線使用:與 SVN 不同,Git 可以離線工作,即使網(wǎng)絡(luò)失去連接,也可以繼續(xù)工作而不會丟失功能。
3. Git 安裝
在Git官網(wǎng)下載、安裝即可:https://git-scm.com/download
安裝完成之后,可以使用以下命令來查看 Git 是否安裝成功:
git --version
如果安裝成功,終端會打印安裝的 Git 的版本:
4. Git 初始化
要給項(xiàng)目初始化一個(gè)Git倉庫,可以在終端中打開項(xiàng)目目錄,執(zhí)行以下命令即可:
git init
初始化之后,就會創(chuàng)建一個(gè)名為.git的新子文件夾,其中包含 Git 將用于跟蹤項(xiàng)目更改的多個(gè)文件和更多子目錄:
在使用 Git 進(jìn)行代碼管理時(shí),不希望一些文件出現(xiàn)在跟蹤列表中,比如node_modules文件。這種情況下,可以在項(xiàng)目的根目錄中創(chuàng)建一個(gè)名為.gitignore的文件,在該文件中列出要忽略的文件和文件夾,來看一個(gè)示例:
# 所有以.md結(jié)尾的文件
*.md
# lib.a不能被忽略
!lib.a
# node_modules和.vscode文件被忽略
node_modules
.vscode
# build目錄下的文件被忽略
build/
# doc目錄下的.txt文件被忽略
doc/*.txt
# doc目錄下多層目錄的所有以.pdf結(jié)尾的文件被忽略
doc/**/*.pdf
注意:以 # 符號開頭的行是注釋。
我們可以在本地克隆Git存儲庫上的代碼,首先要找到Git存儲庫上的HTTPS或SSH的地址,如下:
然后使用以下命令將遠(yuǎn)程倉庫克隆到本地:
git clone https://github.com/facebook/react.git
5. Git 結(jié)構(gòu)和狀態(tài)
從Git的角度來看,可以在三個(gè)區(qū)域進(jìn)行文件更改:工作區(qū),暫存區(qū)和存儲庫。
- 工作區(qū):本地看到的工作目錄;
- 暫存區(qū):一般存放在.git 目錄下的 index 文件(.git/index)中,所以暫存區(qū)有時(shí)也叫作索引(index)。暫存區(qū)是一個(gè)臨時(shí)保存修改文件的地方;
- 版本庫:工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不算工作區(qū),而是 Git 的版本庫,版本庫中存儲了很多配置信息、日志信息和文件版本信息等。
Git 工作目錄下的文件存在兩種狀態(tài):
- untracked:未跟蹤,未被納入版本控制,即該文件沒有被Git版本管理;
- tracked:已跟蹤,被納入版本控制,即該文件已被Git版本管理。
其中已跟蹤狀態(tài)可以細(xì)分為以下三種狀態(tài):
- Unmodified:未修改狀態(tài)
- Modified:已修改狀態(tài)
- Staged:已暫存狀態(tài)
可以通過運(yùn)行以下命令來檢查當(dāng)前分支的狀態(tài):
git status
顯示結(jié)果如下:
此命令不會更改或更新任何內(nèi)容。它會打印出哪些文件被修改、暫存或未跟蹤。未跟蹤的文件是尚未添加到 git 索引的文件,而自上次提交以來已更改的文件將被視為已被 git 修改。
二、Git 入門
1. 全局配置
當(dāng)安裝Git后首先要做的就是配置所有本地存儲庫中使用的用戶信息。每次Git提交都會使用該用戶信息。
config 命令適用于不同的級別:
- 本地級別:所有配置都僅限于項(xiàng)目目錄。默認(rèn)情況下, 如果未通過任何配置, 則git config將在本地級別寫入;
- 全局級別:此配置特定于操作系統(tǒng)上的用戶,配置值位于用戶的主目錄中;
- 系統(tǒng)級別:這些配置放在系統(tǒng)的根路徑下,它跟蹤操作系統(tǒng)上的所有用戶和所有存儲庫。
下面的配置均為寫入系統(tǒng)級別:
(1)設(shè)置用戶名
可以使用以下命令設(shè)置使用 Git 時(shí)的用戶名:
git config --global user.email "email"
可以使用以下命令查看設(shè)置的user.name:
git config user.email
(2)設(shè)置郵箱
可以使用以下命令設(shè)置使用 Git 時(shí)的郵箱:
git config --global user.email "email"
可以使用以下命令查看設(shè)置的 email:
git config user.email
(3)設(shè)置命令顏色
除了上述兩個(gè)基本的設(shè)置之外,還可以設(shè)置命令的顏色,以使輸出具有更高的可讀性:
git config --global color.ui auto
(4)查看所有配置
通過上面的命令設(shè)置的信息會保存在本地的.gitconfig文件中??梢允褂靡韵旅畈榭此信渲眯畔ⅲ?/p>
git config --list
如果在全局輸入這個(gè)命令,就會顯示全局的配置:
如果在使用 Git 的項(xiàng)目中輸入該命令,除了會顯示全局的配置之外,還會顯式本地倉庫的一些配置信息,如下:
(5)設(shè)置別名
git config 命令為我們提供了一種創(chuàng)建別名的方法,這種別名通常用于縮短現(xiàn)有的命令或者創(chuàng)建自定義命令。來看一個(gè)例子:
git config --global alias.cm "commit -m"
這里為commit -m創(chuàng)建一個(gè)別名 cm,這樣在提交暫存區(qū)文件時(shí),只需要輸入以下命令即可:
git cm
2. 分支操作
分支是源代碼控制的核心概念,它允許將工作分離到不同的分支中,這樣就可以自由地處理源代碼,而不會影響其他任何人的工作或主分支中的代碼。下面來看一些常見的分支操作。
(1)查看分支
可以使用以下命令來查看當(dāng)然所在的分支以及該項(xiàng)目所有的分支情況:
git branch
該命令可以列出項(xiàng)目所有的本地分支,顯示綠色的分支就是當(dāng)前分支:
可以使用以下命令來列出所有的遠(yuǎn)程分支:
git branch -r
可以使用以下命令來查看所有的本地分支和遠(yuǎn)程分支:
git branch -a
(2)創(chuàng)建分支
我們在計(jì)算機(jī)上只能訪問本地分支,在將分支推送到遠(yuǎn)程倉庫之前,需要先創(chuàng)建一個(gè)本地分支。
可以使用以下命令來創(chuàng)建分支:
git checkout
加上-b就可以在創(chuàng)建新的分支之后,直接切換到新創(chuàng)建的分支上:
git checkout -b
如果想將新建的本地分支推送到遠(yuǎn)程倉庫,以在遠(yuǎn)程倉庫添加這個(gè)分支??梢詧?zhí)行以下命令:
git push -u origin
(3)刪除分支
可以使用以下命令來刪除本地分支:
git branch -d
需要注意,在刪除分支之前,要先切換到其他分支,否則就會報(bào)錯(cuò):
切換到其他分支再刪除即可:
有時(shí) Git 會拒絕刪除本地分支,因?yàn)橐獎(jiǎng)h的分支可能有未提交的代碼。這是為了保護(hù)代碼以避免意外丟失數(shù)據(jù)??梢允褂靡韵旅顏韽?qiáng)制刪除本地分支:
git branch -D
這樣就刪除成功了:
當(dāng)然,我們也可以刪除遠(yuǎn)程倉庫分支,執(zhí)行以下命令即可:
git push origin --delete
(4)合并分支
可以使用以下命令將其他分支的代碼合并到當(dāng)前分支:
git merge
如果想將A分支合并到B分支,就要先切換到B分支,然后執(zhí)行命令:git merge A。
(5)重命名分支
可以使用以下命令來將分支重命名:
git branch -m
如果newname名字分支已經(jīng)存在,則需要使用-M來強(qiáng)制重命名:
t branch -M
3. 基礎(chǔ)操作
Git 數(shù)據(jù)工作流程如下:
(1)暫存文件
可以使用以下命令來暫存已修改的文件,命令最后需要指定要暫存的文件名稱:
git add
如果想要將所有未跟蹤和修改的文件添加到暫存區(qū),可以執(zhí)行以下命令:
git add .
此時(shí)分支的狀態(tài)如下:
(2)提交暫存
可以使用以下命令將暫存區(qū)的文件修改提交到本地倉庫,
git commit -m "meaasge"
其中-m參數(shù)表示message日志信息,參數(shù)后面要加一個(gè)日志信息,用雙引號括起來。
此時(shí)分支的狀態(tài)如下:
如果上次提交暫存的messge寫錯(cuò)了怎么辦呢?可以使用使用以下命令來更新提交,而不需要撤銷并重新提交:
git commit --amend -m
如果有一個(gè)新的文件修改,也想提交到上一個(gè)commit中,可以使用以下命令來保持相同的提交信息:
git add .
git commit --amend --no-edit
(3)存儲更改
假如我們正在開發(fā)迭代功能,但是還沒開發(fā)完。這時(shí)有一個(gè)緊急的bug需要修復(fù)上線??赡芫托枰袚Q到一個(gè)hotfix分支去修復(fù)bug。這時(shí)對于開發(fā)了一部分的功能創(chuàng)建提交是沒有邏輯意義的??梢允褂靡韵氯我幻顏泶鎯π薷牡膬?nèi)容:
git stash
git stash push
git stash push -m ""
該命令回保存所有未提交的更改并恢復(fù)到上次提交時(shí)存儲庫的狀態(tài)。
當(dāng)想再次繼續(xù)開發(fā)此功能時(shí),就可以使用以下命令檢查所有存儲:
git stash list
這時(shí)終端中就會顯示帶有時(shí)間戳的所有已經(jīng)暫存的列表。可以使用以下任一命令來取回所有的更改:
git stash apply
git stash pop
apply 和 pop 之間的區(qū)別在于,pop 應(yīng)用了 stash 中的更改并將其也從 stash 中刪除,但 apply 即使在應(yīng)用后仍將更改保留在 stash 中。
可以使用以下任一命令應(yīng)用存儲列表中的第 N 個(gè)存儲:
git stash apply stash@{N}
git stash apply 整個(gè)過程的輸出如下:
(4)合并指定提交
在不同分支之間進(jìn)行代碼合并時(shí),通常會有兩種情況:一種情況是需要另一個(gè)分支的所有代碼變動(dòng),那么就可以直接合并(git merge),另一種情況是只需要部分代碼的變動(dòng)(某幾次提交),這時(shí)就可以使用以下命令來合并指定的提交:
git cherry-pick
建議添加 -x 標(biāo)志,因?yàn)樗鼤蓸?biāo)準(zhǔn)化的提交消息,通知用戶它是從哪里pick出來的:
git cherry-pick -x
那么這個(gè)commit hash是從哪里來的呢?可以在需要被合并的分支上執(zhí)行以下命令:
git log
這時(shí)終端就會顯示出所有的提交信息:
這里黃色文字中commit后面的部分就是commit hash,復(fù)制即可。
(5)檢查提交
Git允許我們在本地檢查特定的提交。輸入以下命令就可以查看有關(guān)當(dāng)前提交的詳細(xì)信息:
git show
輸出的結(jié)構(gòu)如下,可以看到,它顯示出了上次提交的commit id、作者信息(郵箱和姓名)、提交日期、commit message、代碼diff等:
還可以使用HEAD~n語法或提交哈希來檢查過去的提交。使用以下命令就可以獲取往前數(shù)的第三次提交的詳細(xì)信息:
git show HEAD~3
除此之外,還可以添加一個(gè)--oneline標(biāo)志,以簡化輸出信息:
git show --oneline
這樣提交信息就簡潔了很多:
(6)查看貢獻(xiàn)者
可以使用以下命令來返回每個(gè)貢獻(xiàn)者的commit次數(shù)以及每次commit的commit message:
$ git shortlog
其可以添加兩個(gè)參數(shù):
- s:省略每次 commit 的注釋,僅僅返回一個(gè)簡單的統(tǒng)計(jì)。
- n:按照 commit 數(shù)量從多到少的順利對用戶進(jìn)行排序。
加上這兩個(gè)參數(shù)之后就可以看到每個(gè)用戶中的提交次數(shù)以及排名情況:
git shortlog -sn
這樣就會顯示出該項(xiàng)目所有貢獻(xiàn)者的commit次數(shù),從上到下依次減?。?/p>
除此之外,還可以添加一個(gè)--no-merges標(biāo)志,以忽略合并提交的次數(shù):
git shortlog -sn --no-merges
4. 遠(yuǎn)程操作
(1)查看遠(yuǎn)程倉庫
可以使用以下命令來查看遠(yuǎn)程倉庫:
git remote
該命令會列出指定的每一個(gè)遠(yuǎn)程服務(wù)器的簡寫。如果已經(jīng)克隆了遠(yuǎn)程倉庫,那么至少應(yīng)該能看到 origin ,這是 Git 克隆的倉庫服務(wù)器的默認(rèn)名字:
可以執(zhí)行以下命令來獲取遠(yuǎn)程倉庫的地址:
git remote -v
其中fetch是獲取,push是推送:
可以使用以下命令來查看更加詳細(xì)的信息:
git remote show origin
輸出結(jié)果如下:
(2)添加遠(yuǎn)程倉庫
可以使用以下命令來將本地項(xiàng)目鏈接到遠(yuǎn)程倉庫:
git remote add
其中:
- remote_name:倉庫名稱(默認(rèn)是origin)
- remote_url:遠(yuǎn)程倉庫地址
該命令允許 Git 跟蹤遠(yuǎn)程存儲庫并將本地存儲庫連接到遠(yuǎn)程倉庫。
(3)移除遠(yuǎn)程倉庫
可以使用命令來移除遠(yuǎn)程倉庫:
git remote rm origin
需要注意,該命令只是從本地移除遠(yuǎn)程倉庫的記錄(也就是解除本地倉庫和遠(yuǎn)程倉庫的關(guān)系),并不會真正影響到遠(yuǎn)程倉庫。
(4)從遠(yuǎn)程倉庫抓取與拉取
可以使用以下命令來從遠(yuǎn)程倉庫獲取最新版本到本地倉庫,不會自動(dòng)merge(合并數(shù)據(jù)):
git fetch
由于該命令不會自定合并數(shù)據(jù),所以該命令執(zhí)行完后需要手動(dòng)執(zhí)行 git merge 遠(yuǎn)程分支到所在的分支。
可以使用以下命令來將遠(yuǎn)程指定分支拉取到本地指定分支上:
git pull origin <遠(yuǎn)程分支名>:<本地分支名>
使用以下命令來將遠(yuǎn)程指定分支拉取到本地當(dāng)前分支上:
git pull origin <遠(yuǎn)程分支名>
使用以下命令開將與本地當(dāng)前分支同名的遠(yuǎn)程分支拉取到本地當(dāng)前分支上:
git pull
注意:如果當(dāng)前本地倉庫不是從遠(yuǎn)程倉庫克隆,而是本地創(chuàng)建的倉庫,并且倉庫中存在文件,此時(shí)再從遠(yuǎn)程倉庫拉取文件的時(shí)候會報(bào)錯(cuò)(fatal: refusing to merge unrelated histories ),解決此問題可以在git pull命令后加入?yún)?shù)--allow-unrelated-histories,即:
git pull --allow-unrelated-histories
(5)推送到遠(yuǎn)程倉庫
可以使用以下命令將本地指定分支推送到遠(yuǎn)程指定分支上:
git push origin <本地分支名>:<遠(yuǎn)程分支名>
可以使用以下命令將本地指定分支推送到與本地當(dāng)前分支同名的遠(yuǎn)程分支上:
it push origin <本地分支名>
使用以下命令將本地當(dāng)前分支推送到與本地當(dāng)前分支同名的遠(yuǎn)程分支上:
git push
可以使用以下命令來將本地分支與遠(yuǎn)程同名分支相關(guān)聯(lián):
git push -u origin <本地分支名>
由于遠(yuǎn)程庫是空的,第一次推送master分支時(shí),加上了-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來,在以后的推送或者拉取時(shí)就可以簡化命令為git push。
三、Git 進(jìn)階
1. 修改操作
如果只是簡單地從工作目錄中手工刪除文件,運(yùn)行 git status 時(shí)就會在 Changes not staged for commit 的提示
(1)刪除文件
可以使用以下命令將文件從暫存區(qū)和工作區(qū)中刪除:
git rm
如果刪除之前修改過并且已經(jīng)放到暫存區(qū)域的話,則必須要用強(qiáng)制刪除選項(xiàng) -f:
git rm -f
如果想把文件從暫存區(qū)域移除,但仍然希望保留在當(dāng)前工作目錄中,換句話說,僅是從跟蹤清單中刪除,使用 --cached 選項(xiàng)即可:
git rm --cached
可以使用以下命令進(jìn)行遞歸刪除,即如果后面跟的是一個(gè)目錄做為參數(shù),則會遞歸刪除整個(gè)目錄中的所有子目錄和文件:
git rm –r *
進(jìn)入某個(gè)目錄中,執(zhí)行此語句,就會刪除該目錄下的所有文件和子目錄。
(2)取消修改
取消修改有三種情況:
1)未使用 git add 將修改文件添加到暫存區(qū)這種情況下,可以使用以下命令來撤銷所有還沒有加入到緩存區(qū)的修改:
git checkout --
需要注意,此文件不會刪除新建的文件,因?yàn)樾陆ǖ奈募€沒加入到Git管理系統(tǒng)重,所以對Git來說事未知的,需要手動(dòng)刪除。
2)已使用 git add 將修改文件添加到暫存區(qū),未使用 git commit 提交緩存這種情況下,相當(dāng)于撤銷了 git add 命令對于文件修改的緩存:
git reset HEAD
上面的命令可以撤銷指定文件的緩存,要想放棄所有文件的緩存,可以執(zhí)行以下命令:
git reset HEAD
需要注意,在使用此命令后,本地的修改并不會消失,而會回到第一種情況。要想撤銷本地的修改,執(zhí)行第一種情況中的命令即可。
除此之外,還可以指定返回到N次提交之前的階段,執(zhí)行以下命令即可:
git reset HEAD~N
這樣就能退回到n個(gè)版本之前,同樣不會修改本地文件的內(nèi)容,這些新的內(nèi)容會變成未更新到緩存區(qū)的狀態(tài)。
3)已使用 git commit 提交緩存這種情況下,可以使用以下命令來回退到上一次 commit 的狀態(tài):
git reset --hard HEAD^
也可以使用以下命令來回退到任意版本:
git reset --hard
注意,使用 git log 命令來查看 git 提交歷史和 commit id。
(3)恢復(fù)刪除內(nèi)容
這是一個(gè)很重要的命令,假如你回退到某個(gè)舊版本,現(xiàn)在想恢復(fù)到新版本,又找不到新版本的commit id怎么辦?Git提供了下面的命令用來記錄每一次命令:
git reflog show HEAD
git reflog
執(zhí)行之后輸出如下:
可以看到,最左側(cè)黃色字體就是修改的commit id,根據(jù)這個(gè)id就可以將代碼恢復(fù)到對應(yīng)節(jié)點(diǎn)位置。HEAD@{n}表示HEAD更改歷史記錄,最近的操作在上面。
假如需要把代碼回退到HEAD@{5}處,可以執(zhí)行以下命令:
git reset --hard HEAD@{5}或者執(zhí)行下面的命令:
git reset --hard 8a0fd74
需要注意,如果有任何本地修改,該命令也會將其銷毀,因此在reset之前建議使用stash將本地修改儲存。
2. 標(biāo)簽操作
標(biāo)簽指的是某個(gè)分支某個(gè)特定時(shí)間點(diǎn)的狀態(tài),通過標(biāo)簽可以很方便的了解到標(biāo)記時(shí)的狀態(tài)。
標(biāo)簽有兩種類型 :
- 輕量標(biāo)簽 :只是某個(gè)commit 的引用,可以理解為是一個(gè)commit的別名;
- 附注標(biāo)簽 :存儲在Git倉庫中的一個(gè)完整對象,包含打標(biāo)簽者的名字、電子郵件地址、日期時(shí)間 以及其他的標(biāo)簽信息。它是可以被校驗(yàn)的,可以使用 GNU Privacy Guard (GPG) 簽名并驗(yàn)證。
(1)展示標(biāo)簽
可以使用以下命令來獲取所有標(biāo)簽:
git tag
它會列出所有標(biāo)簽的名稱:
可以使用以下命令來查看某一個(gè)標(biāo)簽的詳細(xì)信息:
git show
還可以根據(jù)條件來顯示標(biāo)簽,比如列出以v1.開頭的所有tag:
git tag -l "v1."
(2)創(chuàng)建標(biāo)簽
可以使用以下命令在本地創(chuàng)建新標(biāo)簽:
git tag
例如:
git tag v1.0.0
通常遵循的命名模式如下:
v. .
- major(主版本號):重大變化
- minor(次要版本號):版本與先前版本兼容
- patch(補(bǔ)丁號):bug修復(fù)
除此之外,我們還可以為特定的commit創(chuàng)建標(biāo)簽,其命令格式如下:
git tag
以上面的的形式創(chuàng)建的標(biāo)簽都屬于輕量標(biāo)簽,下面來看看如何創(chuàng)建一個(gè)附注標(biāo)簽。
在創(chuàng)建標(biāo)簽時(shí),可以添加一個(gè)-a標(biāo)志以創(chuàng)建一個(gè)帶備注的標(biāo)簽,備注信息使用-m message來指定:
git tag
(3)推送標(biāo)簽
標(biāo)簽創(chuàng)建完成之后就可以使用以下命令將其推送到遠(yuǎn)程倉庫:
git push origin --tags
以上命令會將本地所有tag都推送到遠(yuǎn)程倉庫。如果想推送指定標(biāo)簽,可以執(zhí)行以下命令:
git push origin
(4)切換標(biāo)簽
可以使用以下命令來切換標(biāo)簽:
git checkout
(5)刪除標(biāo)簽
可以使用以下命令來刪除本地倉庫指定標(biāo)簽:
git tag -d
可以使用以下命令來刪除遠(yuǎn)程倉庫指定標(biāo)簽:
git push origin :refs/tags/
也可以使用以下命令來刪除遠(yuǎn)程倉庫的指定標(biāo)簽:
git push origin --delete
(6)拉取標(biāo)簽
可以使用以下命令來將遠(yuǎn)程倉庫的標(biāo)簽拉取(同步)到當(dāng)前分支:
git fetch --tags
(7)檢出標(biāo)簽
檢出標(biāo)簽實(shí)際上就是在標(biāo)簽的基礎(chǔ)上進(jìn)行其他開發(fā)或操作。需要以標(biāo)簽指定的版本為基礎(chǔ)版本,新建一個(gè)分支,繼續(xù)其他的操作。執(zhí)行以下命令即可:
git checkout -b
3. 日志記錄
(1)基礎(chǔ)日志
可以使用以下命令來查看分支的歷史提交信息:
git log
這是其最基礎(chǔ)的用法,輸出如下:
可以看到,終端上輸出了該分支近期的提交記錄,它包含了所有貢獻(xiàn)者的提交。
(2)按作者查看
如果想只看某個(gè)人的提交,可以添加過濾條件:
git log --author="username"
當(dāng)然也可以搜索多個(gè)作者的提交信息,只需要在用|分隔用戶名即可,注意需要使用\來對|進(jìn)行轉(zhuǎn)義:
git log --author="username1\|usernmae2"
這里列出的是每次提交的詳細(xì)信息,如果指向看到每個(gè)提交的概要,可以在命令中添加--oneline標(biāo)志:
git log --author="username" --oneline
(3)按時(shí)間查看
除了可以按照作者來查看日志之外,還可以按照時(shí)間查看日志??梢圆榭茨硞€(gè)時(shí)間之前的日志,也可以查看某個(gè)日期之后的日志:
//某個(gè)日期之后
git log --since=
git log --after=
//某個(gè)日期之前
git log --until=
git log --before=
如果想查看某個(gè)具體時(shí)間區(qū)間之間的日志,可以組合以上參數(shù):
git log --since="2022.05.15" --until="2022.05.20"
(4)按文件查看
如果我們想查看某個(gè)文件都在哪些提交中修改了內(nèi)容,也是可以的。使用以下命令即可:
git log --
比如查看README.md文件的修改記錄:
(5)按合并查看
在歷史提交中可能會有很多次合并的提交記錄,想要只查看代碼合并的記錄,可以執(zhí)行以下命令:
git log --merges
如果想查看非合并操作的操作記錄,可以執(zhí)行以下命令:
git log --no-merges
(6)按分支查看
可以按照分支查看日志,如果想查看test分支比master分支多提交了哪些內(nèi)容,就可以執(zhí)行以下命令:
git log master..test
相反,如果想看master分支比test分支多提交了哪些內(nèi)容,就可以執(zhí)行以下命令:
git log test..master
(7)美化日志
git log命令可以用來查看提交歷史,此命令的問題在于,隨著項(xiàng)目復(fù)雜性的增加,輸出變得越來越難閱讀??梢允褂靡韵旅顏砻阑罩镜妮敵觯?/p>
git log --graph --oneline --decorate
輸出結(jié)果如下,這樣就能看到更簡潔的細(xì)分以及不同分支如何連接在一起:
(8)其他標(biāo)志
上面我們提到了,可以使用--oneline標(biāo)志來簡化日志的輸出:
git log --oneline
可以使用--stat標(biāo)志來簡要顯示文件增改行數(shù)統(tǒng)計(jì),每個(gè)提交都列出了修改過的文件,以及其中添加和移除的行數(shù),并在最后列出所有增減行數(shù)小計(jì):
git log --stat
可以添加-N標(biāo)志來僅顯示最近N次的提交,其中N是一個(gè)正整數(shù),例如查看最近三次提交:
git log -3
可以使用-p標(biāo)志來展開顯示每次提交的內(nèi)容差異對比:
git log -p
注意,以上這些命令標(biāo)識符都可以組合使用。
4. 差異對比
git diff 命令可以用來比較文件的不同,即比較文件在暫存區(qū)和工作區(qū)的差異。
(1)未緩存改動(dòng)
當(dāng)工作區(qū)有改動(dòng),暫存區(qū)為空時(shí), diff對比的是工作區(qū)與最后一次commit提交的共同文件;當(dāng)工作區(qū)有改動(dòng),暫存區(qū)不為空時(shí),diff對比的是工作區(qū)與暫存區(qū)的共同文件。
(2)已緩存改動(dòng)
當(dāng)已緩存改動(dòng)時(shí),可以使用以下任一命令來顯示暫存區(qū)(已a(bǔ)dd但未commit文件)和最后一次commit(HEAD)之間的所有不相同文件的差異對比:
it diff --cached
git diff --staged
(3)已緩存和未緩存改動(dòng)
可以使用以下命令來顯示工作目錄(已修改但未add文件)和暫存區(qū)(已a(bǔ)dd但未commit文件)與最后一次commit之間的的所有不相同文件的差異對比:
git diff HEAD
(4)不同分支差異
可以使用以下命令來比較兩個(gè)分支上最后 commit 的內(nèi)容的差別:
git diff <分支名1> <分支名2>
這樣就可以顯示出兩個(gè)分支的詳細(xì)差異,如果只是想看有哪些文件存在差異,可以在命令中添加--stat標(biāo)志,這樣就不會顯示每個(gè)文件的內(nèi)容的詳細(xì)對比:
git diff <分支名1> <分支名2> --stat
5. 定位問題
git bisect 可以用來查找哪一次代碼提交引入了錯(cuò)誤。它的原理很簡單就是將代碼提交的歷史使用二分法來縮小出問題的代替提交范圍,確定問題出在前半部分還是后半部分,不斷執(zhí)行這個(gè)過程,直到找到引入問題的那一次提交。
其命令合適如下:
git bisect start
其中end就是最近的提交,start就是最開始的提交。假如第一次的提交的 commit id為685f868,總共有21次提交。那么執(zhí)行以下命令,從第一次提交到最近一次提交:
git bisect start HEAD 685f868
執(zhí)行完之后,驗(yàn)證那個(gè)問題是否存在,如果發(fā)現(xiàn)問題不存在了,就執(zhí)行以下命令來標(biāo)識第11次提交是沒問題的:
git bisect good
這樣就說明前半段是沒有問題的,問題出在后半段,也就是第11-21次提交中。這時(shí)再去刷新瀏覽器,如果問題出現(xiàn)了,使用以下命令來標(biāo)記:
git bisect bad
這樣就說明第11-16次提交是有問題的。繼續(xù)重復(fù)上面的步驟,直到成功找出那一次提交位為止,這時(shí)Git就會給出如下的提示:
c8ad045 is the first bad commit
這時(shí)就確認(rèn)了是這一次提交導(dǎo)致的問題,可以去查看時(shí)那些修改導(dǎo)致的問題。
之后就可以使用以下命令退出錯(cuò)誤查找過程,回到最近一次代碼提交:
git bisect reset
四、實(shí)用 Git 工具
1. GitLens
GitLens 是一個(gè)VS Code插件,可以用來查看項(xiàng)目的提交記錄、文件修改記錄、顯示每行代碼的提交記錄等。通過豐富的可視化和強(qiáng)大的比較命令獲得有價(jià)值的見解。
2. Git History
Git History 是一個(gè)VS Code插件,增強(qiáng)了Git 的功能,它可以用來查看日志信息,查看和搜索歷史,進(jìn)行分支對比、提交對比,跨提交對比文件等。
3. Git Automator
Git Automator 是一個(gè)VS Code插件,主要用來自動(dòng)化Git提交消息和 Git 工作流程。它允許用一個(gè)快捷方式添加和提交文件。它還為提交信息提供了自動(dòng)填充功能。當(dāng)動(dòng)作很明顯時(shí),例如你刪除了一個(gè)文件,Git Automator 會猜測該動(dòng)作并將其添加到預(yù)填充的提交消息中。
4. LearnGitBranching
LearnGitBranching 是一個(gè) git 存儲庫可視化工具、沙箱和一系列教程和挑戰(zhàn)。它的主要目的是幫助開發(fā)人員通過可視化的力量來理解 git。這是通過不同級別的游戲來熟悉不同的git命令來實(shí)現(xiàn)的。
Github:https://github.com/pcottle/learnGitBranching
網(wǎng)站題目:學(xué)習(xí) Git,看這一篇就夠了!
轉(zhuǎn)載注明:http://m.fisionsoft.com.cn/article/codjoce.html


咨詢
建站咨詢
