GitReset三種模式hard,soft,mix各自的用法

這篇文章主要講解了“Git Reset三種模式hard,soft,mix各自的用法”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Git Reset三種模式hard,soft,mix各自的用法”吧!

創(chuàng)新互聯(lián)長期為超過千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為康縣企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè),康縣網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

有時候,我們用Git的時候有可能commit提交代碼后,發(fā)現(xiàn)這一次commit的內(nèi)容是有錯誤的,那么有兩種處理方法:
1、修改錯誤內(nèi)容,再次commit一次 2、使用git reset 命令撤銷這一次錯誤的commit
第一種方法比較直接,但會多次一次commit記錄。
而我個人更傾向第二種方法,錯誤的commit沒必要保留下來。
那么今天來說一下git reset。它的一句話概括

git-reset - Reset current HEAD to the specified state

意思就是可以讓HEAD這個指針指向其他的地方。例如我們有一次commit不是不是很滿意,需要回到上一次的Commit里面。那么這個時候就需要通過reset,把HEAD指針指向上一次的commit的點。
它有三種模式,soft,mixed,hard,具體的使用方法下面這張圖,展示的很全面了。

git各個區(qū)域和命令關(guān)系

Git Reset三種模式hard,soft,mix各自的用法

這三個模式理解了,對于使用這個命令很有幫助。在理解這三個模式之前,需要略微知道一點Git的基本流程。正如上圖,Git會有三個區(qū)域:

  • Working Tree 當前的工作區(qū)域

  • Index/Stage 暫存區(qū)域,和git stash命令暫存的地方不一樣。使用git add xx,就可以將xx添加近Stage里面

  • Repository 提交的歷史,即使用git commit提交后的結(jié)果

文件存入Repository流程

Git Reset三種模式hard,soft,mix各自的用法

以下簡單敘述一下把文件存入Repository流程:

  1. 剛開始 working tree 、 index 與 repository(HEAD)里面的內(nèi)容都是一致的

    階段1

Git Reset三種模式hard,soft,mix各自的用法

  1. 當git管理的文件夾里面的內(nèi)容出現(xiàn)改變后,此時 working tree 的內(nèi)容就會跟 index 及 repository(HEAD)的不一致,而Git知道是哪些文件(Tracked File)被改動過,直接將文件狀態(tài)設(shè)置為 modified (Unstaged files)。

     

    階段2

Git Reset三種模式hard,soft,mix各自的用法

  1. 當我們執(zhí)行 git add 后,會將這些改變的文件內(nèi)容加入 index 中 (Staged files),所以此時working tree跟index的內(nèi)容是一致的,但他們與repository(HEAD)內(nèi)容不一致。

    階段3

Git Reset三種模式hard,soft,mix各自的用法

  1. 接著執(zhí)行 git commit 後,將Git索引中所有改變的文件內(nèi)容提交至 Repository 中,建立出新的 commit 節(jié)點(HEAD)后, working tree 、 index 與與repository(HEAD)區(qū)域的內(nèi)容 又會保持一致。

    階段4

Git Reset三種模式hard,soft,mix各自的用法

實戰(zhàn)演示

reset --hard:重置stage區(qū)和工作目錄:

reset --hard 會在重置 HEAD 和branch的同時,重置stage區(qū)和工作目錄里的內(nèi)容。當你在 reset 后面加了 --hard 參數(shù)時,你的stage區(qū)和工作目錄里的內(nèi)容會被完全重置為和HEAD的新位置相同的內(nèi)容。換句話說,就是你的沒有commit的修改會被全部擦掉。

例如你在上次 commit 之后又對文件做了一些改動:把修改后的ganmes.txt文件addstage區(qū),修改后的shopping list.txt保留在工作目錄

git status

Git Reset三種模式hard,soft,mix各自的用法

最初狀態(tài)


然后,你執(zhí)行了reset并附上了--hard參數(shù):

git reset --hard HEAD^

你的 HEAD 和當前 branch 切到上一條commit 的同時,你工作目錄里的新改動和已經(jīng)add到stage區(qū)的新改動也一起全都消失了:

git status

Git Reset三種模式hard,soft,mix各自的用法

reset --hard head^之后


可以看到,在 reset --hard 后,所有的改動都被擦掉了。

reset --soft:保留工作目錄,并把重置 HEAD 所帶來的新的差異放進暫存區(qū)

reset --soft 會在重置 HEAD 和 branch 時,保留工作目錄和暫存區(qū)中的內(nèi)容,并把重置 HEAD 所帶來的新的差異放進暫存區(qū)。

什么是「重置 HEAD 所帶來的新的差異」?就是這里:

Git Reset三種模式hard,soft,mix各自的用法

由于 HEAD 從 4 移動到了 3,而且在 reset 的過程中工作目錄和暫存區(qū)的內(nèi)容沒有被清理掉,所以 4 中的改動在 reset 后就也成了工作目錄新增的「工作目錄和 HEAD 的差異」。這就是上面一段中所說的「重置 HEAD 所帶來的差異」。

此模式下會保留 working tree工作目錄的內(nèi)容,不會改變到目前所有的git管理的文件夾的內(nèi)容;也會
保留 index暫存區(qū)的內(nèi)容,讓 index 暫存區(qū)與 working tree 工作目錄的內(nèi)容是一致的。就只有 repository 中的內(nèi)容的更變需要與 reset 目標節(jié)點一致,因此原始節(jié)點與reset節(jié)點之間的差異變更集合會存在與index暫存區(qū)中(Staged files),所以我們可以直接執(zhí)行 git commit 將 index暫存區(qū)中的內(nèi)容提交至 repository 中。當我們想合并「當前節(jié)點」與「reset目標節(jié)點」之間不具太大意義的 commit 記錄(可能是階段性地頻繁提交)時,可以考慮使用 Soft Reset 來讓 commit 演進線圖較為清晰點。

Git Reset三種模式hard,soft,mix各自的用法

所以在同樣的情況下,還是老樣子:把修改后的ganmes.txt文件addstage區(qū),修改后的shopping list.txt保留在工作目錄

git status

最初狀態(tài)

Git Reset三種模式hard,soft,mix各自的用法


假設(shè)此時當前 commit 的改動內(nèi)容是新增了 laughters.txt 文件:

git show --stat

git show --stat

Git Reset三種模式hard,soft,mix各自的用法

如果這時你執(zhí)行:

git reset --soft HEAD^

那么除了 HEAD 和它所指向的 branch2 被移動到 HEAD^ 之外,原先 HEAD 處 commit 的改動(也就是那個 laughters.txt 文件)也會被放進暫存區(qū):

git status

使用git reset --soft HEAD^后

Git Reset三種模式hard,soft,mix各自的用法
這就是--soft 和 --hard 的區(qū)別:--hard 會清空工作目錄和暫存區(qū)的改動,*而 --soft則會保留工作目錄的內(nèi)容,并把因為保留工作目錄內(nèi)容所帶來的新的文件差異放進暫存區(qū)。

reset 不加參數(shù)(mixed):保留工作目錄,并清空暫存區(qū)

reset 如果不加參數(shù),那么默認使用 --mixed 參數(shù)。它的行為是:保留工作目錄,并且清空暫存區(qū)。也就是說,工作目錄的修改、暫存區(qū)的內(nèi)容以及由 reset 所導(dǎo)致的新的文件差異,都會被放進工作目錄。簡而言之,就是「把所有差異都混合(mixed)放在工作目錄中」。

還以同樣的情況為例:

git status

最初狀態(tài)

Git Reset三種模式hard,soft,mix各自的用法

修改了 的games.txt 和 shopping list.txt,并把 games.txt 放進了暫存區(qū)。

git show --stat

git show --stat

Git Reset三種模式hard,soft,mix各自的用法

最新的 commit 中新增了 laughters.txt 文件。

這時如果你執(zhí)行無參數(shù)reset或者帶--mixed參數(shù):

git reset HEAD^
git reset --mixed HEAD^

工作目錄的內(nèi)容和 --soft 一樣會被保留,但和 --soft 的區(qū)別在于,它會把暫存區(qū)清空,并把原節(jié)點和reset節(jié)點的差異的文件放在工作目錄,總而言之就是,工作目錄的修改、暫存區(qū)的內(nèi)容以及由 reset 所導(dǎo)致的新的文件差異,都會被放進工作目錄

git status

git reset HEAD^之后

Git Reset三種模式hard,soft,mix各自的用法

總結(jié)

reset 的本質(zhì):移動 HEAD 以及它所指向的 branch

實質(zhì)上,reset 這個指令雖然可以用來撤銷 commit ,但它的實質(zhì)行為并不是撤銷,而是移動 HEAD ,并且「捎帶」上 HEAD 所指向的 branch(如果有的話)。也就是說,reset 這個指令的行為其實和它的字面意思 "reset"(重置)十分相符:它是用來重置 HEAD 以及它所指向的 branch 的位置的。

而 reset --hard HEAD^ 之所以起到了撤銷 commit 的效果,是因為它把 HEAD 和它所指向的 branch 一起移動到了當前 commit 的父 commit 上,從而起到了「撤銷」的效果:

git reset

Git Reset三種模式hard,soft,mix各自的用法

Git 的歷史只能往回看,不能向未來看,所以把 HEAD 和 branch 往回移動,就能起到撤回 commit 的效果。

所以同理,reset --hard 不僅可以撤銷提交,還可以用來把 HEAD 和 branch 移動到其他的任何地方。

git reset --hard branch3

git reset --hard branch3

Git Reset三種模式hard,soft,mix各自的用法

reset三種模式區(qū)別和使用場景

區(qū)別:
  1. --hard:重置位置的同時,直接將 working Tree工作目錄、 index 暫存區(qū)及 repository 都重置成目標Reset節(jié)點的內(nèi)容,所以效果看起來等同于清空暫存區(qū)和工作區(qū)。

  2. --soft:重置位置的同時,保留working Tree工作目錄index暫存區(qū)的內(nèi)容,只讓repository中的內(nèi)容和 reset 目標節(jié)點保持一致,因此原節(jié)點和reset節(jié)點之間的【差異變更集】會放入index暫存區(qū)中(Staged files)。所以效果看起來就是工作目錄的內(nèi)容不變,暫存區(qū)原有的內(nèi)容也不變,只是原節(jié)點和Reset節(jié)點之間的所有差異都會放到暫存區(qū)中。

  3. --mixed(默認):重置位置的同時,只保留Working Tree工作目錄的內(nèi)容,但會將 Index暫存區(qū) 和 Repository 中的內(nèi)容更改和reset目標節(jié)點一致,因此原節(jié)點和Reset節(jié)點之間的【差異變更集】會放入Working Tree工作目錄中。所以效果看起來就是原節(jié)點和Reset節(jié)點之間的所有差異都會放到工作目錄中。

使用場景:
  1. --hard:(1) 要放棄目前本地的所有改變時,即去掉所有add到暫存區(qū)的文件和工作區(qū)的文件,可以執(zhí)行 git reset -hard HEAD 來強制恢復(fù)git管理的文件夾的內(nèi)容及狀態(tài);(2) 真的想拋棄目標節(jié)點后的所有commit(可能覺得目標節(jié)點到原節(jié)點之間的commit提交都是錯了,之前所有的commit有問題)。

  2. --soft:原節(jié)點和reset節(jié)點之間的【差異變更集】會放入index暫存區(qū)中(Staged files),所以假如我們之前工作目錄沒有改過任何文件,也沒add到暫存區(qū),那么使用reset --soft后,我們可以直接執(zhí)行 git commit 將 index暫存區(qū)中的內(nèi)容提交至 repository 中。為什么要這樣呢?這樣做的使用場景是:假如我們想合并「當前節(jié)點」與「reset目標節(jié)點」之間不具太大意義的 commit 記錄(可能是階段性地頻繁提交,就是開發(fā)一個功能的時候,改或者增加一個文件的時候就commit,這樣做導(dǎo)致一個完整的功能可能會好多個commit點,這時假如你需要把這些commit整合成一個commit的時候)時,可以考慮使用reset --soft來讓 commit 演進線圖較為清晰??偠灾?,可以使用--soft合并commit節(jié)點。

  3. --mixed(默認):(1)使用完reset --mixed后,我們可以直接執(zhí)行 git add 將這些改變果的文件內(nèi)容加入 index 暫存區(qū)中,再執(zhí)行 git commit 將 Index暫存區(qū) 中的內(nèi)容提交至Repository中,這樣一樣可以達到合并commit節(jié)點的效果(與上面--soft合并commit節(jié)點差不多,只是多了git add添加到暫存區(qū)的操作);(2)移除所有Index暫存區(qū)中準備要提交的文件(Staged files),我們可以執(zhí)行 git reset HEAD 來 Unstage 所有已列入 Index暫存區(qū) 的待提交的文件。(有時候發(fā)現(xiàn)add錯文件到暫存區(qū),就可以使用命令)。(3)commit提交某些錯誤代碼,或者沒有必要的文件也被commit上去,不想再修改錯誤再commit(因為會留下一個錯誤commit點),可以回退到正確的commit點上,然后所有原節(jié)點和reset節(jié)點之間差異會返回工作目錄,假如有個沒必要的文件的話就可以直接刪除了,再commit上去就OK了。

感謝各位的閱讀,以上就是“Git Reset三種模式hard,soft,mix各自的用法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Git Reset三種模式hard,soft,mix各自的用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

新聞名稱:GitReset三種模式hard,soft,mix各自的用法
當前網(wǎng)址:http://www.muchs.cn/article46/gdiheg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、微信小程序面包屑導(dǎo)航、做網(wǎng)站、動態(tài)網(wǎng)站、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司