??當(dāng)我們提交代碼中出現(xiàn)一些錯(cuò)誤時(shí)比如上傳了錯(cuò)誤代碼方咆,錯(cuò)誤提交穴亏,遺漏文件等等玫锋,這個(gè)時(shí)候代碼回滾的功效就顯露出來了挠乳,git reset
权薯、git checkout
和 git revert
是其中最有用的一些命令。它們都用來撤銷代碼倉庫中的某些更改欲侮,而前兩個(gè)命令不僅可以作用于提交崭闲,還可以作用于特定文件肋联。
Reset
??如果你的更改還沒有共享給別人威蕉,git reset 是撤銷這些更改的簡(jiǎn)單方法。當(dāng)你開發(fā)一個(gè)功能的時(shí)候發(fā)現(xiàn)「糟糕橄仍,我做了什么韧涨?我應(yīng)該重新來過!」時(shí)侮繁,reset 就像是 go-to 命令一樣虑粥。
#讓 hotfix 分支向后回退了兩個(gè)提交。
git checkout hotfix
git reset HEAD~2
??除了在當(dāng)前分支上操作宪哩,你還可以通過傳入這些標(biāo)記來修改你的緩存區(qū)或工作目錄:
- --soft – 緩存區(qū)和工作目錄都不會(huì)被改變
- --mixed – 默認(rèn)選項(xiàng)娩贷。緩存區(qū)和你指定的提交同步,但工作目錄不受影響
- --hard – 緩存區(qū)和工作目錄都同步到你指定的提交
??把這些標(biāo)記想成定義 git reset 操作的作用域就容易理解多了锁孟。
??這些標(biāo)記往往和 HEAD 作為參數(shù)一起使用彬祖。比如,git reset --mixed HEAD 將你當(dāng)前的改動(dòng)從緩存區(qū)中移除品抽,但是這些改動(dòng)還留在工作目錄中储笑。另一方面,如果你想完全舍棄你沒有提交的改動(dòng)圆恤,你可以使用 git reset --hard HEAD突倍。這是 git reset 最常用的兩種用法。
- 當(dāng)你傳入 HEAD 以外的其他提交的時(shí)候要格外小心盆昙,因?yàn)?reset 操作會(huì)重寫當(dāng)前分支的歷史羽历。正如 rebase 黃金法則所說的,在公共分支上這樣做可能會(huì)引起嚴(yán)重的后果淡喜。
Checkout
??當(dāng)傳入分支名時(shí)秕磷,可以切換到那個(gè)分支。當(dāng)你移到一個(gè)新的分支拆火,然后更新工作目錄跳夭。但是因?yàn)檫@可能會(huì)覆蓋本地的修改涂圆,Git 會(huì)強(qiáng)制你提交或者緩存工作目錄中的所有更改,不然在 checkout 的時(shí)候這些更改都會(huì)丟失币叹。和 git reset 不一樣的是润歉,git checkout 沒有移動(dòng)這些分支。
??除此之外颈抚,你還可以傳入提交的引用來 checkout 到任意的提交踩衩。這和 checkout 到另一個(gè)分支是完全一樣的:把 HEAD 移動(dòng)到特定的提交。比如贩汉,下面這個(gè)命令會(huì) checkout 到當(dāng)前提交的祖父提交驱富。
git checkout HEAD~2
將HEAD移動(dòng)到任意commit
??這對(duì)于快速查看項(xiàng)目舊版本來說非常有用。但如果你當(dāng)前的 HEAD 沒有任何分支引用匹舞,那么這會(huì)造成 HEAD 分離褐鸥。這是非常危險(xiǎn)的,如果你接著添加新的提交赐稽,然后切換到別的分支之后就沒辦法回到之前添加的這些提交叫榕。因此,在為分離的 HEAD 添加新的提交的時(shí)候你應(yīng)該創(chuàng)建一個(gè)新的分支姊舵。
Revert
??Revert 撤銷一個(gè)提交的同時(shí)會(huì)創(chuàng)建一個(gè)新的提交晰绎。這是一個(gè)安全的方法,因?yàn)樗粫?huì)重寫提交歷史括丁。比如荞下,下面的命令會(huì)找出倒數(shù)第二個(gè)提交,然后創(chuàng)建一個(gè)新的提交來撤銷這些更改史飞,然后把這個(gè)提交加入項(xiàng)目中尖昏。
git checkout hotfix
git revert HEAD~2
??相比 git reset,它不會(huì)改變現(xiàn)在的提交歷史祸憋。因此会宪,git revert 可以用在公共分支上,git reset 應(yīng)該用在私有分支上蚯窥。
??你也可以把 git revert 當(dāng)作撤銷已經(jīng)提交的更改掸鹅,而 git reset HEAD 用來撤銷沒有提交的更改。
??就像 git checkout 一樣拦赠,git revert 也有可能會(huì)重寫文件巍沙。所以,Git 會(huì)在你執(zhí)行 revert 之前要求你提交或者緩存你工作目錄中的更改荷鼠。
-參考
代碼回滾