git reset和git revert區(qū)別與作用
一、先介紹幾個名詞:
1.working copy工作區(qū)
working copy(工作區(qū))你正在工作的那個文件集
2.Index
index也被稱為staging area(暫存區(qū)),指一整套即將被下一個提交的文件集合妆艘。
3. HEAD
這是當(dāng)前分支版本頂端的別名换团,也就是版本庫中最近的一個提交。
HEAD^=HEAD~1代表版本庫中的上一次提交,即最近一次提交的父提交
HEAD^^ =HEAD~2代表HEAD^的父提交
……
下圖是工作區(qū)磺芭、暫存區(qū)與HEAD簡單的原理圖:
當(dāng)執(zhí)行一個git add,提交的內(nèi)容就暫存在index中,現(xiàn)在你的working copy和index內(nèi)容是相同的是尖,但是他們和HEAD區(qū)不同意系。
當(dāng)執(zhí)行一個git commit,就創(chuàng)建一個新的commit將內(nèi)容提交到master,隨后HEAD就指向這個新的commit饺汹,而index,working copy和HEAD就匹配相同了蛔添。
二、Git Reset
此命令就是重置HEAD(當(dāng)前分支的版本頂端)到另外一個commit處兜辞。
1.git reset HEAD
任何事情都不會發(fā)生迎瞧,HEAD就是當(dāng)前提交所在的位置。
2.git reset HEAD~1
HEAD從頂端移動到前一個提交處
3.git reset HEAD~2
HEAD從頂端往下移動兩次到倒數(shù)第三個提交處
4.git reset --soft xxx與git reset --hard xxx的區(qū)別
--soft參數(shù)讓Git重置HEAD到另外一個提交處逸吵,但也到此為止凶硅。此時暫存區(qū),工作區(qū)都不會做任何變化胁塞。
--hard參數(shù)它將重置HEAD返回到另外一個提交處咏尝,重置index以便反映HEAD的變化,并且重置working copy也使得其完全匹配起來啸罢。
如下兩圖编检,在--soft執(zhí)行后,HEAD指向的commit變成上一次commit扰才,但工作區(qū)ls前后的文件沒有變化允懂。而執(zhí)行g(shù)it reset --hard HEAD后,HEAD指向當(dāng)前commit f4cef衩匣,同時working copy工作區(qū)的d.md文件沒了蕾总。[圖片上傳失敗...(image-d1fb66-1527335571902)]
三、Git reset和Git revert區(qū)別與作用
reset是回朔到指定的commit版本(指定commit版本之后的操作都消失了)琅捏。revert是刪除指定的commit生百,此次操作之前和之后的commit和history都會保留,并且把這次撤銷作為一次最新的提交柄延。
Git reset --hard與git revert比較如下:
1.有四次提交分別提交了4個文件 a.md , b.md, c.md, d.md.當(dāng)前提交b3e2
git reset --hard HEAD^返回上次提交
執(zhí)行后蚀浆,HEAD回到f4cefc2這一版。ls當(dāng)前目錄只有 a.md , b.md, c.md搜吧。而d.md 沒了市俊,commit歷史中,b3e234這一版被抹去了滤奈。
2.提交了4個文件 a.md , b.md, c.md, d.md.
Git revert HEAD^
如下圖摆昧,上次提交的文件c.md消失,ls中剩下a.md , b.md, d.md.
但是上次提交的commit4862f版本沒有消失蜒程,此命令生成了一個新的commit59f37绅你。
所以伺帘,修復(fù)一些錯誤,可視情況來使用以上命令:
1.修復(fù)未提交文件中的錯誤(重置)勇吊, 讓工作目錄回到上次提交時的狀態(tài)
$ git reset --hard HEAD
2.修復(fù)已提交文件中的錯誤
$ git revert HEAD