在Git
使用過程中,一種很常見的情況是:發(fā)現(xiàn)某個(gè)已經(jīng)提交到倉(cāng)庫(kù)里的代碼文件有致命的bug
,必須將代碼回滾到上一個(gè)版本,在這種情況下就顯示出了Git
的強(qiáng)大。Git
為每次提交,都保留了日志,根據(jù)提交日志,Git
可以方便地進(jìn)行版本回退。本實(shí)訓(xùn)通過介紹Git
日志相關(guān)知識(shí)和操作,使大家掌握Git
版本回退相關(guān)內(nèi)容。
一、回到前一次提交??git revert
任務(wù)描述
如果提交到本地倉(cāng)庫(kù)中的代碼發(fā)現(xiàn)了
bug
,就必須將代碼回到上一個(gè)版本。而在Git
中,一次提交就對(duì)應(yīng)著一個(gè)版本,因此可以根據(jù)日志信息進(jìn)行版本回退。本關(guān)任務(wù):將本地倉(cāng)庫(kù)回退到上一個(gè)版本。
相關(guān)知識(shí)
強(qiáng)大的git log
在之前,我們已經(jīng)介紹了
git log
的基本使用方法,這里我們要進(jìn)一步介紹git log
的使用。
- 查看提交的內(nèi)容差異?
git log
提供了-p
參數(shù),用于查看每次提交之間的內(nèi)容差異,如下:git log -p
?即可顯示每次提交之間的變化:![]()
- 而如果想限制顯示的范圍,則可以再添加參數(shù)用于限定:
如上,則僅顯示最近的兩次更新。 如上所示,這一選項(xiàng)附帶了每次git log -p -2
commit
的內(nèi)容變化,這就為代碼審查或者瀏覽某個(gè)搭檔的修改內(nèi)容,提供了很好的參考。其他
git log
選項(xiàng):
單詞層面對(duì)比
Git
提供了--word-diff
選項(xiàng),可以顯示單詞層面的差異。當(dāng)需要在書籍、論文這種很大的文本文件上,進(jìn)行對(duì)比的時(shí)候,這個(gè)功能就非常有用。顯示簡(jiǎn)要的增改行數(shù)
Git
提供了--stat
選項(xiàng),則可以僅顯示增加或者減少了多少行。
pretty
選項(xiàng) 使用--pretty
選項(xiàng)選項(xiàng),可以指定不同的顯示屬性,如oneline
將每個(gè)提交放在一行顯示。short
,full
和fuller
可以指定展示的信息的多少。git revert實(shí)現(xiàn)版本回退
版本回退可以用
git revert
命令。git revert
撤銷提交時(shí),會(huì)保留所撤銷的提交的記錄和歷史,并將撤銷操作做為一次新的提交。即提交一個(gè)新的版本,將需要revert
的版本的內(nèi)容再反向修改回去,版本會(huì)遞增,不影響之前提交的內(nèi)容。其具體的使用方法如下:git reset實(shí)現(xiàn)版本回退
git reset
也能實(shí)現(xiàn)版本回退,但是git revert
和git reset
也存在一定的區(qū)別 :
git revert
是用一次新的commit
來回滾之前的commit
,git reset
是直接刪除指定的commit
;- 在回滾這一操作上看,效果差不多。但是,在日后繼續(xù)
merge
以前的老版本時(shí)有區(qū)別。因?yàn)?code>git revert是用一次逆向的commit
,“中和”之前的提交,因此日后合并老的branch
時(shí),導(dǎo)致這部分改變不會(huì)再次出現(xiàn)。但是git reset
是把某些commit
在某個(gè)branch
上刪除,因而和老的branch
再次merge
時(shí),這些被回滾的commit
應(yīng)該還會(huì)被引入;git reset
?是把HEAD
向后移動(dòng)了一下,而git revert
是HEAD
繼續(xù)前進(jìn),只是新的commit
的內(nèi)容和要revert
的內(nèi)容正好相反,能夠抵消要被revert
的內(nèi)容。
git reset
用法如下:
git reset HEAD
?回到前一次?commit
。也可以用于將錯(cuò)誤的文件添加進(jìn)暫存區(qū)后,想回退取消,如:git reset HEAD 文件名
git reset HEAD^
?回到前前一次?commit
。git reset commit
?比如:commit = fa042ce57ebbe5b
,回到指定的版本,撤銷也會(huì)作為一次提交進(jìn)行保存。另外
git reset
也可以指定reset
的模式:hard
、soft
、mixed
、merged
、keep
。 這幾種模式的差別如下:
--soft
?緩存區(qū)和工作目錄都不會(huì)被改變;--mixed
?– 默認(rèn)選項(xiàng)。緩存區(qū)和你指定的提交同步,但工作目錄不受影響;--hard
?– 緩存區(qū)和工作目錄,都同步到你指定的提交。幾種模式的具體使用方法如下:
#直接丟棄工作區(qū)和暫存區(qū)的修改 git reset --hard HEAD #暫存區(qū)內(nèi)容保留,工作區(qū)修改丟棄 git reset --mixed HEAD #暫存區(qū)和工作區(qū)內(nèi)容都保留 git reset --soft HEAD
編程要求
平臺(tái)已準(zhǔn)備了本地倉(cāng)庫(kù)
gitTraining
,并在master
分支進(jìn)行了三次提交:
- 第一次提交:添加了
helloGit1
;- 第二次提交:添加了
helloGit2
;- 第三次提交:添加了
helloGit3
。現(xiàn)在發(fā)現(xiàn),
helloGit3
內(nèi)容有錯(cuò)誤,需要撤銷第三次提交,即將HEAD
指向第二次提交。 本關(guān)的編程任務(wù)是,補(bǔ)全右側(cè)代碼片段中Begin
至End
中間的腳本,撤銷最近一次提交。
#進(jìn)入gitTraining
cd gitTraining
#請(qǐng)?jiān)谙路紹egin至End星號(hào)線內(nèi)填寫git命令以撤銷最近一次提交
#********** Begin **********#
#git reset --hard HEAD~1
git revert HEAD
#********** End **********#
?
?二、回到指定提交
編程要求
平臺(tái)已準(zhǔn)備了本地倉(cāng)庫(kù)
gitTraining
,并在master
分支進(jìn)行了三次提交:
- 第一次提交:添加了
helloGit1
;- 第二次提交:添加了
helloGit2
;- 第三次提交:添加了
helloGit3
。現(xiàn)在發(fā)現(xiàn),
helloGit3
、helloGit2
內(nèi)容均有錯(cuò)誤,需要撤銷第三次、第二次提交。即將HEAD
指向第一次提交。 本關(guān)的編程任務(wù)是,補(bǔ)全右側(cè)代碼片段中Begin
至End
中間的腳本,撤銷最近兩次提交,以回到第一次提交,即將HEAD
指向第一次提交,需要選擇--hard
模式。
#進(jìn)入gitTraining
cd gitTraining
#請(qǐng)?jiān)谙路紹egin至End星號(hào)線內(nèi)填寫git命令以回到第一次提交的版本
#********** Begin **********#
git reset --hard HEAD~2
#********** End **********#
`git reset --hard HEAD~2` **命令用于將當(dāng)前分支回退到上一個(gè)提交(commit),同時(shí)清除工作目錄和暫存區(qū)的改動(dòng)**。
該命令由三部分組成:
1. `git reset`: 這是Git的一個(gè)基本命令,用來重置當(dāng)前分支的HEAD指針以及工作目錄和暫存區(qū)的狀態(tài)。
2. `--hard`: 這個(gè)選項(xiàng)告訴Git不僅要移動(dòng)HEAD指針,還要清除所有相關(guān)的改動(dòng),包括工作目錄和暫存區(qū)的更改。
3. `HEAD~2`: 這里的`HEAD`代表當(dāng)前分支最新的提交,而`~2`表示要回退到當(dāng)前提交的前兩個(gè)版本,即祖父級(jí)提交。使用這個(gè)命令時(shí)需要非常小心,因?yàn)樗鼤?huì)丟棄自指定提交之后的所有工作成果,包括未提交的修改和新增的文件。如果確定要執(zhí)行這樣的操作,建議先備份重要的工作內(nèi)容,以防萬一。
#進(jìn)入gitTraining
cd gitTraining
#請(qǐng)?jiān)谙路紹egin至End星號(hào)線內(nèi)填寫git命令以回到第一次提交的版本
#********** Begin **********#
git revert HEAD~2..HEAD
#git reset --hard HEAD~2
#********** End **********#
?`git revert HEAD~2..HEAD` **命令用于撤銷當(dāng)前分支中最近兩個(gè)提交的更改**。
該命令由兩部分組成:
1. `git revert`: 這是Git的一個(gè)基本命令,用來創(chuàng)建一個(gè)新的提交,該提交會(huì)撤銷指定范圍內(nèi)的提交的更改。
2. `HEAD~2..HEAD`: 這里的`HEAD`代表當(dāng)前分支最新的提交,而`~2`表示要回退到當(dāng)前提交的前兩個(gè)版本,即祖父級(jí)提交。`..`表示范圍,所以`HEAD~2..HEAD`表示從祖父級(jí)提交到當(dāng)前提交的范圍。使用這個(gè)命令時(shí),Git會(huì)自動(dòng)生成一個(gè)新的提交,該提交會(huì)撤銷指定范圍內(nèi)所有提交的更改。這樣做的好處是保留歷史記錄,并且不會(huì)對(duì)工作目錄和暫存區(qū)產(chǎn)生任何影響。但是,如果需要撤銷的提交非常多,那么執(zhí)行這個(gè)命令可能會(huì)比較耗時(shí)。
三、?撤銷修改
任務(wù)描述
在本地開發(fā)中,經(jīng)常遇到的一個(gè)問題是:對(duì)一個(gè)文件的修改有錯(cuò)誤,需要丟棄修改。如何準(zhǔn)確地丟棄指定的修改,是一個(gè)關(guān)鍵的操作。
本關(guān)任務(wù):撤銷本地的修改。
相關(guān)知識(shí)
git reset實(shí)現(xiàn)版本回退
當(dāng)將有錯(cuò)誤的文件
add
進(jìn)暫存區(qū)后,可以使用git reset
丟棄修改。即:git reset HEAD 文件名
但此時(shí)修改仍舊保留在工作區(qū)。
如果尚未
add
進(jìn)暫存區(qū),則可以使用:git reset --hard HEAD
這樣就能徹底丟棄修改,即將修改從暫存區(qū)及工作區(qū)徹底刪除。 #####git checkout丟棄修改 當(dāng)將錯(cuò)誤的文件
add
進(jìn)暫存區(qū)后,使用git checkout
無法將修改從暫存區(qū)中撤銷,必須要先使用git reset
將修改從暫存區(qū)中撤銷。git checkout丟棄修改
當(dāng)將錯(cuò)誤的文件
add
進(jìn)暫存區(qū)后,使用git checkout
無法將修改從暫存區(qū)中撤銷,必須要先使用git reset
將修改從暫存區(qū)中撤銷。git chekcout -- hello
通過這種方式,就可將
hello
文件自上個(gè)commit
之后,尚未add
進(jìn)暫存區(qū)的修改丟棄。編程要求
平臺(tái)已為你準(zhǔn)備了本地倉(cāng)庫(kù)
gitTraining
,并在master
分支進(jìn)行了一次提交,將文件helloGit
提交到了本地倉(cāng)庫(kù)。隨后,平臺(tái)又對(duì)helloGit
進(jìn)行了修改,但是尚未添加(即add
)到暫存區(qū)。現(xiàn)在發(fā)現(xiàn)此修改有錯(cuò)誤需要丟棄。本關(guān)的編程任務(wù)是,補(bǔ)全右側(cè)代碼片段中
Begin
至End
中間的腳本,丟棄helloGit
中尚未添加到暫存區(qū)的修改。
#進(jìn)入gitTraining
cd gitTraining
#請(qǐng)?jiān)谙路紹egin至End星號(hào)線內(nèi)填寫git命令以丟棄helloGit的修改
#********** Begin **********#
#git checkout -- helloGit
git reset --hard HEAD
#********** End **********#
四、刪除文件
任務(wù)描述
在
Git
使用過程中,涉及到撤回的操作,還有從暫存區(qū)或者分支刪除文件。比如你錯(cuò)誤地將測(cè)試過程中產(chǎn)生的日志文件提交到了暫存區(qū)或者分支上面去了,那么你可能就需要?jiǎng)h除文件。本關(guān)任務(wù):徹底刪除本地倉(cāng)庫(kù)中某個(gè)文件。
相關(guān)知識(shí)
刪除文件需要用到的命令是
git rm
,且git rm
有參數(shù)--cached
。 當(dāng)我們需要?jiǎng)h除暫存區(qū)或分支上的文件,同時(shí)工作區(qū)也不再需要這個(gè)文件了,可以使用:git rm 文件路徑
當(dāng)我們需要?jiǎng)h除暫存區(qū)或分支上的文件,但本地又需要使用, 只是不希望這個(gè)文件被提交到版本庫(kù),可以使用:
git rm --cached 文件路徑
文件已添加至?xí)捍鎱^(qū)
如果文件被添加到了暫存區(qū),這種情況下直接使用
git rm file_path
會(huì)報(bào)錯(cuò):$ git rm hello.txt error: the following file has changes staged in the index: hello.txt (use --cached to keep the file, or -f to force removal)
根據(jù)提示我們可以得知,這個(gè)時(shí)候,如果不想保留
hello.txt
,則可以使用:git rm hello.txt -f
如果想保留
hello.txt
到工作區(qū)則可以使用:git rm --cached hello.txt
文件已提交至分支
如果文件已經(jīng)被提交到了某個(gè)分支,則可以使用如下命令:
#從當(dāng)前分支中徹底刪除‘文件路徑’指定的文件 git rm 文件路徑
具體使用方法如:
git rm hello.txt
或者:
#從本地版本庫(kù)中將‘文件路徑’指定的文件刪除,并保留到工作區(qū) git rm --cached 文件路徑
具體使用方法如下:
git rm --cached hello.txt
但是無論使用哪種方式,都相當(dāng)于在本地做了修改,在
git rm --cached
之后,使用git status
查看版本庫(kù)狀態(tài),可以得到如下輸出:因此,還需要通過
git commit
操作將修改提交。通過以上分析可知,從倉(cāng)庫(kù)中刪除文件的一般過程為:
git rm <--cached> 文件名 git commit -m "提交信息"
編程要求
平臺(tái)已為你準(zhǔn)備了本地倉(cāng)庫(kù)
gitTraining
,并在master
分支進(jìn)行了一次提交,將文件helloGit
提交到了本地倉(cāng)庫(kù)?,F(xiàn)在需要將helloGit
從版本庫(kù)刪除,但還需要將其保留在工作區(qū)。 本關(guān)的編程任務(wù)是,補(bǔ)全右側(cè)代碼片段中Begin
至End
中間的腳本,將helloGit
從本地版本庫(kù)中刪除,但仍保留在工作區(qū)。文章來源:http://www.zghlxwxcb.cn/news/detail-855864.html
#進(jìn)入gitTraining
cd gitTraining
#請(qǐng)?jiān)谙路紹egin至End星號(hào)線內(nèi)填寫git命令以丟棄helloGit的修改
#********** Begin **********#
git rm --cached helloGit
#********** End **********#
?文章來源地址http://www.zghlxwxcb.cn/news/detail-855864.html
到了這里,關(guān)于Git分布式管理-頭歌實(shí)驗(yàn)日志和版本回退的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!