邯鄲網(wǎng)站建設(shè)縱橫廣告軟文怎么寫
目錄
初識git?
本地倉庫
認(rèn)識工作區(qū)、暫存區(qū)、版本庫
add操作與commit操作?
master文件與commit id
修改文件
版本回退?
撤銷修改?
刪除文件
初識git?
Git 是一個分布式版本控制系統(tǒng),主要用于跟蹤文件的更改,特別是在軟件開發(fā)中。
為什么要版本控制?
需求:假設(shè)你的導(dǎo)師讓你為一件產(chǎn)品寫出一份文檔。
當(dāng)你寫完以后,你拿給你的導(dǎo)師,你的導(dǎo)師并不滿意,讓你拿回去進(jìn)行修改。此時你不進(jìn)行版本控制,直接在原文檔上進(jìn)行修改,最終你改完以后又拿給你的導(dǎo)師,你的導(dǎo)師還是不滿意。以此往復(fù),你對原文檔進(jìn)行了10多次的修改,而此時你的導(dǎo)師又改主意了,讓你拿出第一次修改后的文檔,你該怎么辦呢?
若是不進(jìn)行版本控制,那么上述問題是無解的,因?yàn)槟闶侵苯訉υ臋n進(jìn)行的修改!
所謂的版本控制,就是讓你有方式對自己修改的每一份代碼都有備份!版本控制器的核心功能就是對這些備份進(jìn)行管理。
版本控制器的本質(zhì)就是記錄每次的修改以及版本迭代的一個管理系統(tǒng)
git是目前最主流的版本控制器!git可以控制電腦上所有格式的文檔。對于開發(fā)人員來說,git最主要的作用是可以用來管理源代碼文件
- 對于文本文件來說,文件每一次上傳到git,git都會記錄你本次修改的內(nèi)容,如:第二行新增了xxx
- 對于二進(jìn)制文件來說,git并不會記錄它修改的內(nèi)容,只會記錄文件大小的變化?
本地倉庫
為什么要有本地倉庫??
git是用于管理我們的文件的一個版本控制器,如果文件被分散在電腦的各個角落,git是無法進(jìn)行管理的,所以git管理文件要求我們的文件必須是放在git倉庫中的?
如何創(chuàng)建本地倉庫
第一步:需要創(chuàng)建一個目錄
第二步 :在創(chuàng)建好的目錄中使用如下指令
git init
輸入完上述指令以后,會發(fā)現(xiàn)我們的目錄下多了一個.git文件
這個文件是.git文件是git提供用于追蹤并管理我們倉庫的文件,一般來說不要手動修改.git中的內(nèi)容
如何配置本地倉庫?
配置本地倉庫時,最主要配置的兩個信息:
- name
若不配置上述兩個信息,git會報錯
配置用戶名稱:
git config user.name "[用戶名稱]"
例如:
[yyf@VM-24-5-centos gitcode]$ git config user.name "yyf"
配置email郵箱地址:
git config user.email "[郵箱地址]"
?例如:
[yyf@VM-24-5-centos gitcode]$ git config user.email "123123@qq.com"
?查看配置信息:
git config -l
?刪除配置信息:
git config --unset [鍵值]
鍵值:user.name、user.email都是鍵值,查看配置信息時"="左邊的都是鍵值
例如:
?一個主機(jī)當(dāng)中,可以存在很多個本地倉庫。并且我們可以一次設(shè)置所有本地倉庫的配置信息
設(shè)置全局配置信息:
git config --global [配置鍵值] "[配置值]"
例如:
git config --global user.email "123123123@qq.com"
刪除全局配置信息:
git config --global --unset [配置鍵值]
認(rèn)識工作區(qū)、暫存區(qū)、版本庫
?
如圖,在包含.git文件的gitcode目錄下我創(chuàng)建了一個ReadMe文件
但實(shí)際上這個文件并不能被git管理。這是因?yàn)間itcode文件并不是真實(shí)的git倉庫。
真正的git倉庫是.git文件
.git文件又被稱為版本庫/倉庫!
雖然.git是倉庫,但不能直接手動修改.git中的內(nèi)容,這是不被允許的!
由于.git不能直接被修改,所以一般我們把要被管理的文件放在包含.git文件的目錄下(圖上gitcode)。而這個目錄我們又稱之為工作區(qū)!
注意:.git文件雖然是在工作區(qū)目錄下,但.git文件不屬于工作區(qū)
如何把工作區(qū)文件放到版本庫中,使git能管理該文件??
- stage我們稱之為暫存區(qū)/索引
- 圖中其他概念,后面會闡述
- 如圖所示,把工作區(qū)的所有修改內(nèi)容添加到版本庫中,是通過add操作實(shí)現(xiàn)的
- 修改內(nèi)容:在工作區(qū)中創(chuàng)建文件、修改工作區(qū)的文件、在工作區(qū)的刪除操作
- 注意:add操作是把工作區(qū)的內(nèi)容放入到版本庫的暫存區(qū)當(dāng)中
- 把暫存區(qū)的內(nèi)容放入到master中,是通過commit操作實(shí)現(xiàn)的!
- 當(dāng)工作區(qū)的修改內(nèi)容被commit到master以后,才真正意味著該內(nèi)容被添加進(jìn)了版本庫中!
git的版本控制如何體現(xiàn)??
版本庫中除了暫存區(qū)與master以外還會存在一個objects,即對象區(qū)?
?
而我們每次在工作區(qū)中add一個修改內(nèi)容時,都會新增一個修改內(nèi)容的git對象,該對象會被維護(hù)到objects中?
所以我們每次修改工作區(qū)的內(nèi)容并生成一個新的git對象被維護(hù)到objects對象區(qū)中時,就相當(dāng)于我們維護(hù)了一個版本!
暫存區(qū)和對象區(qū)之間的關(guān)系:
- objects對象區(qū)是實(shí)際存儲修改內(nèi)容對象的地方!
- stage暫存區(qū)是存儲對象區(qū)的索引,所以一般來說stage都是較為輕量級的
commit操作做了什么?
- commit操作實(shí)際上就是把暫存區(qū)中的索引樹,放入到master區(qū)
- 所以master區(qū)中存儲的也是對象在對象區(qū)的索引,master區(qū)也是較為輕量級的?
?HEAD是一個指針,它指向了master區(qū),我們只要拿到HEAD指針就能拿到master的那棵索引數(shù)
注意:有了HEAD指針就能找到master指針,所以版本庫中并沒有master區(qū)?
add操作與commit操作?
add/commit...操作對應(yīng)的Linux命令?
add操作:git add [file1] [file2] ...
commit操作:git commit -m "message" ?(message:本次提交的描述信息!)
如下:
我們在commit時,可以看到git的管理信息,即一個文件被改變,增加了1行?
獲取工作區(qū)的所有的提交記錄:
git log
- commit:即commit id,每一次提交時生成git對象的commit id都不同,它是通過某種哈希算法得到的!
- Author:表示提交的人是誰,我們之前配置的name和email都會顯示在這
- Date:提交日期?
若上述的獲取提交記錄的方法,你覺得內(nèi)容太多不好篩選,那么可以帶上如下選項(xiàng):
git log --pretty=oneline
?
?帶上選項(xiàng)以后,只打印commit id和描述信息!
master文件與commit id
之前說過HEAD指針是指向master的,所以HEAD中保存了master的地址
我們會發(fā)現(xiàn)master文件中存儲的實(shí)際上就是最近一次提交的commit id
之前說過commit id可以標(biāo)識git對象,若我們拿著這個commit id那么就能到objects對象區(qū)中找到該對象!
找之前我們得先把commit id分為兩個部分,最開始得兩位數(shù)表示得是文件夾的名稱,而其他位數(shù)表示的是文件的名稱
如何查看git對象的內(nèi)容?
查看git對象的內(nèi)容:
git cat-file -p [commid id]
輸入上述查看git對象后,我們能看到的內(nèi)容:
- parent:表示上一次提交時的commit id
- tree:Git 中的一個基本對象,表示某個特定目錄的結(jié)構(gòu)。它包含了文件和子目錄的信息。通過tree的commit id我們能查看到修改后的文件內(nèi)容
修改文件
git追蹤管理的其實(shí)是修改,而不是文件!
通過如下指令,可以查看是否有對暫存區(qū)的修改
git status
?
可以看到,若我僅僅是對工作區(qū)內(nèi)容進(jìn)行了修改,那么它會提示暫存區(qū)中的數(shù)據(jù)沒有被修改!并且也會提示被修改的文件是在工作區(qū)被修改的,即modified:ReadMe(工作區(qū)中的ReadMe文件被修改)
status僅僅能表示該文件內(nèi)容是否被修改,但不清楚具體修改了什么內(nèi)容
Linux中可以查看暫存區(qū)和工作區(qū)之間內(nèi)容的差異:
git diff [文件名]
?
版本回退?
什么是版本回退?
Git版本回退是指在Git版本控制系統(tǒng)中,將代碼庫的狀態(tài)恢復(fù)到先前的某個提交。這個操作通常用于撤銷不想要的更改、修復(fù)錯誤或查看歷史版本。
例如:
我們git在提交version0版本時,只有一行hello,world。
之后的version1版本,我們添加了一行hello,git。此時version1中有兩行的內(nèi)容
通過版本回退我們能拿到version0,即只有一行hello,world時的樣子
如何版本回退??
Git版本回退我們采用如下指令:
git reset [選項(xiàng)] [commit id]
reset進(jìn)行版本回退時,本質(zhì)是回退版本庫中的內(nèi)容?
若需要回退工作區(qū)以及暫存區(qū)的內(nèi)容,那么需要我們?yōu)樯鲜鲋噶钐砑由线x項(xiàng)
reset一共有三個選項(xiàng):
- --soft
- --mixed
- --hard?
若我們reset時選擇--soft選項(xiàng),那么版本回退只回退的是版本庫中的內(nèi)容,對于工作區(qū)以及暫存區(qū)是不進(jìn)行回退的?
若我們reset時選擇--mixed選項(xiàng),那么版本回退時既回退版本庫中的內(nèi)容,還會回退暫存區(qū)的內(nèi)容,但工作區(qū)不會進(jìn)行版本回退
若我們reset時選擇--hard選項(xiàng),那么版本回退時工作區(qū)、暫存區(qū)、版本庫都會進(jìn)行版本回退
表格示例?
假設(shè)我們version0版本時,文件內(nèi)容為git。version1版本時,文件內(nèi)容添加了 world。那么對于該文件遵循如下表格?
工作區(qū) | 暫存區(qū) | 版本庫 | |
不進(jìn)行reset | git world | git world | git world |
--soft | git world | git world | git |
--mixed | git world | git | git |
--hard | git | git | git |
版本回退時的注意事項(xiàng)?
對于--hard選項(xiàng),我們需要謹(jǐn)慎使用!
- --hard選項(xiàng),會回退工作區(qū)的內(nèi)容,這意味著,假設(shè)有人在工作區(qū)中進(jìn)行開發(fā)。那么開發(fā)的代碼會直接被回退掉!
版本回退演示?
進(jìn)行版本回退時,我們需要知道之前版本的commit id
如下圖:我首先完成version0版本的提交
如下圖:我完成了version1版本的提交
首先是進(jìn)行版本回退之--hard的測試
如圖我們會發(fā)現(xiàn),testgit文件不見了,因?yàn)槲覀兓赝说陌姹臼亲钕纫淮翁峤坏陌姹?#xff0c;--hard選項(xiàng)直接把我們的工作區(qū)也回退了
如果后悔了怎么辦?
只要有commit id,再次進(jìn)行hard回退即可,如下:
我回退的是version1版本,此時能看到文件內(nèi)容又被回退回來了!
但這種后悔藥僅僅是因?yàn)槲姨崆爸?#xff0c;所以提前git log獲取了commit id。若我們把服務(wù)器關(guān)了,或者屏幕清了,如何能恢復(fù)呢?
使用git reflog指令可以查看到本地每一次提交時的記錄
紅框中的就是commit id,嚴(yán)格來說是commit id的一部分,但我們?nèi)匀豢梢允褂眠@個commit id的一部分進(jìn)行版本回退!
如下:
需要注意的是:由于實(shí)際開發(fā)中經(jīng)常使用git操作,所以這些commit id不是一直保存的,系統(tǒng)可能會自動清理掉一些commit id,若commit id被清理,那么就沒有后悔藥可以吃了,所以如果發(fā)生誤回退行為,請盡快操作!
原理?
?
如圖所示,版本庫中的objects對象區(qū)中會管理git對象,而所謂的版本回退就是讓master指針從一個git對象指向前一個git對象。整個過程只需要改變指針的指向,所以回退操作一般是非??斓?
撤銷修改?
什么時候需要撤銷修改??
如果我們在我們的工作區(qū)中寫了很長時間代碼,越寫越寫不下去,覺得自己寫的實(shí)在是垃圾,想恢復(fù)到上一個版本
此時根據(jù)不同情況,我們可以采取不同的恢復(fù)策略
注意:以下聊的撤銷修改指的是期望工作區(qū)、暫存區(qū)、版本庫中都撤銷修改!并且如下撤銷都是基于沒有進(jìn)行push操作(推送到遠(yuǎn)程倉庫)的前提下!
第一種情況:對于工作區(qū)的代碼,還沒有add操作?
我們期待的結(jié)果是工作區(qū)的代碼都進(jìn)行撤銷
對于這種情況,我們有三種解決方式:
- 手動修改(不推薦),容易手動改出bug
- git checkout -- [文件名]
- reset進(jìn)行版本回退,之前說過不再贅述
對于git checkout --來說,就是回退到文件最近一次提交時的樣子!其中"--"是非常重要的,若不帶上"--"那么該指令是另外的含義!
如下示例:
第二種情況:已經(jīng)進(jìn)行add添加到了暫存區(qū)當(dāng)中,但還沒有commit?
我們期待的是工作區(qū)與暫存區(qū)的代碼都進(jìn)行撤銷
對于這種情況我們有兩種解決方案:
- 使用reset帶上--hard選項(xiàng)一步到位直接到最近一次提交的樣子
- 使用reset帶上--mixed選項(xiàng)轉(zhuǎn)化為第一種情況的樣子
hard我們之前已經(jīng)詳細(xì)使用過,接下來我們使用mixed進(jìn)行回退
mixed是默認(rèn)選項(xiàng),不需要顯示寫都可以!
同時我們不需要再去找commit id了
- 若我們需要回退到當(dāng)前版本,那么commit id可以替換為HEAD
- 若我們需要回退到上一個版本,那么commit id可以替換為HEAD^
- 若我們需要回退到上一個版本,那么commit id可以替換為HEAD^^
- 以此類推....
- 這種方式也適用于--hard和--soft選項(xiàng)
?
第三種情況:工作區(qū)、暫存區(qū)、版本庫中都已經(jīng)添加了修改內(nèi)容?
?參考第二種情況!
刪除文件
對于工作區(qū)的文件,直接使用rm指令刪除即可
對于既在工作區(qū),又在暫存區(qū)的文件,又或者在版本庫中的文件,git中提供了rm方式刪除文件,git中的rm和刪除工作區(qū)的rm的區(qū)別在于git提供的rm既會刪除工作區(qū)中該文件,又會刪除暫存區(qū)中該文件,使用了git rm后,我們直接提交一次即可
如下示例: