本文原則:開門見山匾浪、簡(jiǎn)明扼要,希望能給大家學(xué)習(xí)工作提供幫助!
場(chǎng)景一:撤銷工作區(qū)的修改(未執(zhí)行g(shù)it add)
指令:git checkout 【目錄或文件名】
實(shí)例:
1、修改了test.txt文檔犀概,git status 會(huì)出現(xiàn)如下提示:
2、git checkout test.txt夜惭,無提示
3阱冶、git status,顯示干凈的工作區(qū)
場(chǎng)景二:撤銷暫存區(qū)的修改(已執(zhí)行g(shù)it add滥嘴,但未執(zhí)行g(shù)it commit)
指令:git reset 【HEAD或某一版本號(hào)】【可選:文件名】(HEAD指向最近的一個(gè)版本木蹬,一個(gè)commit就是一個(gè)版本,版本號(hào)可以通過git log指令查詢)
注意:git reset有三個(gè)參數(shù)若皱,--soft镊叁、--mixed、--hard走触,如果不指定晦譬,會(huì)默認(rèn)指行--mixed參數(shù),它的意思是將指定版本之后的修改(在本場(chǎng)景中互广,就是最近一次提交后的修改)敛腌,都撤回到工作區(qū)中,也就是未執(zhí)行g(shù)it add的狀態(tài)惫皱。如果加上--hard參數(shù)像樊,就會(huì)放棄指定版本之后的所有修改,會(huì)出現(xiàn)干凈的工作區(qū)與暫存區(qū)(此參數(shù)會(huì)在下個(gè)場(chǎng)景展示實(shí)例)旅敷。如果加上--soft參數(shù)生棍,則會(huì)把指定版本之后的修改撤回到暫存區(qū),工作區(qū)內(nèi)容不變媳谁。
實(shí)例:
1涂滴、修改test.txt文檔友酱,并提交修改到暫存區(qū)
2、git reset HEAD
3柔纵、git status缔杉,顯示修改撤回到了工作區(qū)
場(chǎng)景三:撤銷已經(jīng)執(zhí)行g(shù)it commit的修改(真正意義上的版本回退)
指令:git reset或git revert
git reset與git revert的區(qū)別:
git reset會(huì)修改git log的版本歷史,如果你回退到了幾個(gè)版本前搁料,那git log時(shí)就會(huì)發(fā)現(xiàn)你丟失了被回退的版本或详。而git revert不會(huì)修改版本歷史,你回退哪個(gè)版本加缘,git revert就會(huì)新建一個(gè)提交鸭叙,把你要回退版本的修改抵消掉。如果沒看懂拣宏,請(qǐng)看實(shí)例:
實(shí)例一:git reset
1沈贝、git log --pretty=online 顯示有三個(gè)版本
2、git reset --hard 版本號(hào)(輸前幾位即可)勋乾,回退版本到Second commit
3宋下、git log --pretty=online,丟失版本Third commit
實(shí)例二:git revert
1辑莫、git log --pretty=online 顯示有三個(gè)版本
2学歧、git revert 版本號(hào),抵消某個(gè)版本與其之后版本的修改各吨,注意枝笨,這里的邏輯與git reset不一樣,如果想回到Second commit的版本揭蜒,就需要抵消掉Third commit的修改横浑。所以這里應(yīng)該git revert Third commit的版本號(hào)
3、revert的過程中可能會(huì)有沖突屉更,git status查看沖突位置徙融,解決沖突,git commit 文件名(無需git add)
4瑰谜、git log --pretty=online欺冀,Third commit并沒有丟失,而是多了一個(gè)revert版本萨脑,你可以 ? ? ? ? git log -p查看每個(gè)版本的修改隐轩,發(fā)現(xiàn)revert的版本所做的修改與Third commit恰恰相反,正好抵消掉了它的修改砚哗。
忠告:如果你的回退涉及到了遠(yuǎn)程分支龙助,在版本回退時(shí)最好使用revert,因它沒有修改版本歷史蛛芥;如果使用reset提鸟,因?yàn)槟愕膔eset操作,會(huì)使你比遠(yuǎn)程少了幾個(gè)提交仅淑,遠(yuǎn)程會(huì)提示你落后于遠(yuǎn)程版本称勋,應(yīng)該先git pull代碼,那么你的reset操作又有何意義呢涯竟?