溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Git命令git-reset怎么使用

發(fā)布時(shí)間:2023-03-24 10:20:10 來(lái)源:億速云 閱讀:272 作者:iii 欄目:軟件技術(shù)

這篇文章主要介紹了Git命令git-reset怎么使用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Git命令git-reset怎么使用文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

git-reset的作用是重置當(dāng)前分支的HEAD指針,將HEAD指針指向特定的狀態(tài)。

使用概述

git reset [<tree-ish>] [--] <pathspec>
git reset [--pathspec-from-file=<file> [--pathspec-file-nul]] [<tree-ish>]
git reset (--patch | -p) [<tree-ish>] [--] [<pathspec>]
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [<commit>]

前三行reset命令的作用是將指定的<tree-ish>內(nèi)容作為參考依據(jù),然后把內(nèi)容拷貝到目標(biāo)的緩存區(qū)中。

<tree-ish>就是像樹(shù)一樣的東西,git中是有很多都能組成樹(shù)的,比如commit樹(shù)或者tag樹(shù)。

最后一行reset命令的作用是將當(dāng)前分支的HEAD指針指向<commit>,同時(shí)可以使用多種可選項(xiàng)來(lái)控制是否修改緩存區(qū)或工作區(qū)。

在以上所有的命令形式中,都是把<tree-ish>或<commit>默認(rèn)作為HEAD指針。

git reset [<tree-ish>] [--] <pathspec>

該方法有如下規(guī)則:

  • 會(huì)將與<pathspec>相匹配的路徑資源在緩存區(qū)中重置成<tree-ish>中的狀態(tài)。不了解<pathspec>是什么?

  • 被提交到緩存區(qū)中的改動(dòng)會(huì)被還原到工作區(qū)中。

舉個(gè)?

假設(shè)項(xiàng)目中有一個(gè)coffee.txt文件,文件內(nèi)容如下:

卡布奇諾納瑞冰-19.9¥
標(biāo)準(zhǔn)美式-14.9¥
香草拿鐵-19.9¥
生椰愛(ài)摩卡-19.9¥
...

我們使用git的tag命令將當(dāng)前的版本標(biāo)記成v1.0.0(這里使用tag標(biāo)簽作為)。

隨后修改coffee.txt文件,修改內(nèi)容如下:

卡布奇諾納瑞冰-19.9¥ --> 卡布奇諾納瑞冰-14.9¥
標(biāo)準(zhǔn)美式-14.9¥ --> 標(biāo)準(zhǔn)美式-9.9¥
香草拿鐵-19.9¥ --> 香草拿鐵-14.9¥
生椰愛(ài)摩卡-19.9¥ --> 生椰愛(ài)摩卡-14.9¥
...

變更了coffee.txt文件后,再使用git tag打上了v1.0.1標(biāo)記。

如果此時(shí)想將coffee.txt文件還原成v1.0.0版本中的文件,就可以使用git reset命令并指定為v1.0.0,操作如下:

git reset v1.0.0 coffee.txt

使用VSCode查看緩存區(qū)的文件變動(dòng):

Git命令git-reset怎么使用

可以看到圖中的右側(cè)的代碼改動(dòng)對(duì)比,此時(shí)緩存區(qū)中的coffee.txt文件已經(jīng)成功被重置成v1.0.0版本中文件的狀態(tài)(規(guī)則1)。并且此時(shí)v1.0.1已經(jīng)提交到緩存區(qū)中的變動(dòng)也被還原到了工作樹(shù)中(規(guī)則2)。

Git命令git-reset怎么使用

可以看出git reset命令與git add命令作用相反,一個(gè)是將指定的資源添加到緩存區(qū),另一個(gè)則是從緩存區(qū)中移除。并且這個(gè)命令與git restore [--source=<tree-ish>] --staged <pathspec>具有相同的作用,對(duì)restore感興趣的可以看看這篇文章。

上面說(shuō)過(guò)了,在使用reset命令后,此時(shí)緩存區(qū)中文件內(nèi)容是v1.0.0的,可以配合git restore命令將緩存區(qū)中的內(nèi)容還原到工作區(qū)中然后進(jìn)行修改:

git restore coffee.txt --staged

也可以根據(jù)需要選擇還原工作區(qū)的內(nèi)容:

git restore coffee.txt --worktree

git reset [--pathspec-from-file=<file> [--pathspec-file-nul]] [<tree-ish>]

在上面的例子中每次進(jìn)行reset和restore的都是想同的<pathspec>路徑(coffee.txt)。因?yàn)樵撐募窂奖容^簡(jiǎn)單,所以每次操作都比較方便輸入。但是在一些情況下,可能需要reset比較復(fù)雜的<pathspec>路徑,比如項(xiàng)目目錄層次較深,那么很可能需要輸入一長(zhǎng)串的<pathspec>路徑,這樣每次進(jìn)行操作就會(huì)很麻煩,所以git提供了一個(gè)--pathspec-from-file選項(xiàng),讓我們能夠直接指定一個(gè)文件,這個(gè)文件就包含了可能需要重復(fù)使用的<pathspec>路徑。這里有更詳細(xì)的用法。

該文件每一行都是一個(gè)<pathspec>,如果有多個(gè)<pathspec>使用換行符作為分隔。當(dāng)然也可以使用--pathspec-file-nul讓NUL作為每一個(gè)<pathspec>的分隔符。

git reset (--patch | -p) [<tree-ish>] [--] [<pathspec>]

交互式的選擇<tree-ish>與緩存區(qū)之間的差異而產(chǎn)生的hunks。這些被選擇的hunks將會(huì)撤銷緩存區(qū)中的產(chǎn)生的修改。這里有更詳細(xì)的--patch選項(xiàng)用法。

git reset [<mode>] [<commit>]

該命令會(huì)把當(dāng)前分支的HEAD指針指向某個(gè)<commit>,然后由<mode>決定是否同時(shí)更新緩存區(qū)或工作區(qū)的內(nèi)容。<mode>默認(rèn)值是--mixed,且必須是以下幾種:

--soft

工作區(qū)和緩存區(qū)中的文件變動(dòng)都將被保留,然后將HEAD指針指向<commit>。

還是以咖啡菜單為?,假如第一次commit到倉(cāng)庫(kù)中的文件內(nèi)容如下:

卡布奇諾納瑞冰-19.9¥
標(biāo)準(zhǔn)美式-14.9¥
香草拿鐵-19.9¥
生椰愛(ài)摩卡-19.9¥
...

然后做第二次commit操作,刪除標(biāo)準(zhǔn)美式,增加生椰拿鐵:

卡布奇諾納瑞冰-19.9¥
-標(biāo)準(zhǔn)美式-14.9¥
+生椰拿鐵-19.9¥
香草拿鐵-19.9¥
生椰愛(ài)摩卡-19.9¥
...

在commit后,修改卡布奇諾納瑞冰的價(jià)格,添加到緩存區(qū)。再修改香草拿鐵的價(jià)格,保留在工作區(qū):

-卡布奇諾納瑞冰-19.9¥
+卡布奇諾納瑞冰-14.9¥ // 添加到緩存區(qū)中
生椰拿鐵-19.9¥
-香草拿鐵-19.9¥
+香草拿鐵-14.9¥ // 保留在工作區(qū)
生椰愛(ài)摩卡-19.9¥
...

此時(shí)我想保留工作區(qū)和緩存區(qū)做的改動(dòng),并且將HEAD指針指向第一次commit。這時(shí)可以使用--soft選項(xiàng)實(shí)現(xiàn):

git reset HEAD^ --soft // 這里使用HEAD^表示上一個(gè)commit,同樣也可以使用hash id

使用git log查看當(dāng)前HEAD指針確實(shí)已經(jīng)指向第一個(gè)commit,第二個(gè)commit被拋棄了:

Git命令git-reset怎么使用

同時(shí)所有的工作區(qū)和緩存區(qū)的改動(dòng)都被保留了:

Git命令git-reset怎么使用

當(dāng)前只有兩次的commit,是為了方便演示--soft選項(xiàng)的作用。但是在實(shí)際開(kāi)發(fā)中,我們可能會(huì)commit多次,尤其是在測(cè)試環(huán)境改幾個(gè)BUG就要提交到發(fā)布平臺(tái),這樣會(huì)導(dǎo)致很多無(wú)意義的commit。這時(shí)候就可以使用--soft選項(xiàng),重置HEAD到指定的<commit>只保留一到兩個(gè)重要的commit。

--mixed

重置緩存區(qū),但是會(huì)保留工作區(qū)的內(nèi)容,這是<mode>的默認(rèn)值。

相信在理解了--soft作用后,理解--mixed不難,上面例子中如果是使用--mixed那么最終結(jié)果如下:

Git命令git-reset怎么使用

該選項(xiàng)會(huì)重置緩存區(qū),但是保留工作區(qū)的改動(dòng),并將當(dāng)前指針指向<commit>。

--hard

重置緩存區(qū)和工作區(qū)中的所有的變動(dòng),并且將指針指向<commit>。

--hard更加的簡(jiǎn)單粗暴,我們將--soft例子改為--hard來(lái)查看結(jié)果:

Git命令git-reset怎么使用

如圖所示,工作區(qū)和緩存區(qū)的內(nèi)容都被重置了。不止是如此,就連Untracked文件同樣也會(huì)被刪除。

--merge

該選項(xiàng)的作用,看字面意思就知道大概就是把當(dāng)前分支和指定的<commit>進(jìn)行合并,規(guī)則如下:

  • 重置緩存區(qū),任何已經(jīng)添加到緩存區(qū)的改動(dòng)都將被拋棄

  • 如果<commit>和HEAD之間有文件存在不同(這個(gè)不同指的是文件被刪除或者新增),那么將會(huì)把該文件重置成<commit>中的狀態(tài)(新增或刪除)。

  • 如果<commit>和HEAD之間有文件存在不同(這個(gè)不同是指文件內(nèi)容的不同),且此時(shí)工作區(qū)也存在未提交的改動(dòng),那么本次的reset將會(huì)被終止。

  • 如果一個(gè)文件在<commit>和HEAD中完全相同,但是它的工作區(qū)存與緩存區(qū)存在著不同(也就是改動(dòng)未提交到緩存區(qū)),那么該文件在工作區(qū)的改動(dòng)在重置之后就會(huì)被保留。

我們舉個(gè)例子來(lái)驗(yàn)證一下以上列出的規(guī)則,假設(shè)此時(shí)的咖啡店項(xiàng)目有如下的幾個(gè)commit。

第一個(gè)commit和文件內(nèi)容如下:

Git命令git-reset怎么使用

第一個(gè)commit中只有一個(gè)coffee.txt菜單文件,此時(shí)如果咖啡店引進(jìn)了新品種開(kāi)始賣果汁,那么就需要新增果汁菜單文件fruits.txt,于是就有了第二個(gè)commit:

Git命令git-reset怎么使用

此時(shí)我們做一些改動(dòng)來(lái)驗(yàn)證1,2,4這幾點(diǎn)的規(guī)則,改動(dòng)后的文件如下:

Git命令git-reset怎么使用

首先修改coffee.txt文件,新增一款生椰拿鐵咖啡,保留在工作區(qū)中。然后增加咖啡豆菜單文件beans.txt,將其添加到緩存區(qū)中。

假設(shè)因需求變動(dòng),咖啡豆菜單文件在緩存區(qū)中需要清除,果汁菜單文件需要?jiǎng)h除,只有咖啡菜單中新增的生椰拿鐵的改動(dòng)需要保留。那么就可以使用git reset --merge將HEAD和commit-1進(jìn)行合并,操作如下:

git reset --merge HEAD^

結(jié)果如下:

Git命令git-reset怎么使用

執(zhí)行命令reset命令產(chǎn)生了如下效果:

  • 將當(dāng)前HEAD指針指向了commit-1

  • 將緩存區(qū)中的beans.txt文件拋棄(規(guī)則1)

  • HEAD(commit-2)和commit-1中的fruits.txt文件存在不同(commit-2中新增fruits.txt),所以會(huì)將fruits.txt刪除(規(guī)則2)

  • coffee.txt文件新增生椰拿鐵的改動(dòng)被保留在工作區(qū)中(規(guī)則4)

再來(lái)驗(yàn)證一下第3點(diǎn)規(guī)則,假設(shè)咖啡店項(xiàng)目此時(shí)第一個(gè)commit如下:

Git命令git-reset怎么使用

接下去同樣新增水果茶菜單,然后再修改coffee.txt文件,第二個(gè)commit如下:

Git命令git-reset怎么使用

然后在HEAD中再修改coffee.txt文件,刪除掉標(biāo)準(zhǔn)美式品種:

Git命令git-reset怎么使用

此時(shí),如果我們?cè)偈褂胓it reset --merge HEAD^就無(wú)法再進(jìn)行重置,該操作會(huì)被git終止(規(guī)則3)。并且控制臺(tái)會(huì)進(jìn)行報(bào)錯(cuò)提示:

Git命令git-reset怎么使用

--keep

該選參的作用和--merge相似,唯一的區(qū)別就是緩存區(qū)中被重置的會(huì)被保留在工作區(qū)中。

構(gòu)造如下第一個(gè)commit:

Git命令git-reset怎么使用

改造第二個(gè)commit:

Git命令git-reset怎么使用

在HEAD中進(jìn)行修改

Git命令git-reset怎么使用

使用git reset --keep命令:

Git命令git-reset怎么使用

從結(jié)果上來(lái)看,只有fruits.txt文件被刪除了,beans.txt文件被重置回了工作區(qū)中。coffee.txt文件的改動(dòng)也被保留了。

--[no-]recurse-submodules

關(guān)于“Git命令git-reset怎么使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Git命令git-reset怎么使用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

git
AI