不小心將測(cè)試代碼提交到生產(chǎn)環(huán)境,教你 6 種方法秒解決!

Git 版本管理時(shí),往往需要撤銷某些操作。
本文介紹幾種最主要的情況,給出詳細(xì)的解釋。
一、撤銷提交
一種常見(jiàn)的場(chǎng)景是,提交代碼以后,你突然意識(shí)到這個(gè)提交有問(wèn)題,應(yīng)該撤銷掉,這時(shí)執(zhí)行下面的命令就可以了。
$ git revert HEAD上面命令的原理是,在當(dāng)前提交后面,新增一次提交,抵消掉上一次提交導(dǎo)致的所有變化。它不會(huì)改變過(guò)去的歷史,所以是首選方式,沒(méi)有任何丟失代碼的風(fēng)險(xiǎn)。
git revert 命令只能抵消上一個(gè)提交,如果想抵消多個(gè)提交,必須在命令行依次指定這些提交。比如,抵消前兩個(gè)提交,要像下面這樣寫。
$ git revert [倒數(shù)第一個(gè)提交] [倒數(shù)第二個(gè)提交]git revert 命令還有兩個(gè)參數(shù)。
--no-edit:執(zhí)行時(shí)不打開(kāi)默認(rèn)編輯器,直接使用Git自動(dòng)生成的提交信息。--no-commit:只抵消暫存區(qū)和工作區(qū)的文件變化,不產(chǎn)生新的提交。
二、丟棄提交
如果希望以前的提交在歷史中徹底消失,而不是被抵消掉,可以使用 git reset 命令,丟棄掉某個(gè)提交之后的所有提交。
$ git reset [last good SHA]git reset 的原理是,讓最新提交的指針回到以前某個(gè)時(shí)點(diǎn),該時(shí)點(diǎn)之后的提交都從歷史中消失。
默認(rèn)情況下,git reset 不改變工作區(qū)的文件(但會(huì)改變暫存區(qū)),--hard 參數(shù)可以讓工作區(qū)里面的文件也回到以前的狀態(tài)。
$ git reset --hard [last good SHA]執(zhí)行 git reset 命令之后,如果想找回那些丟棄掉的提交,可以使用 git reflog 命令,具體做法參考這里。不過(guò),這種做法有時(shí)效性,時(shí)間長(zhǎng)了可能找不回來(lái)。
三、替換上一次提交
提交以后,發(fā)現(xiàn)提交信息寫錯(cuò)了,這時(shí)可以使用 git commit 命令的 --amend ?參數(shù),可以修改上一次的提交信息。
$ git commit --amend -m "Fixes bug #42"它的原理是產(chǎn)生一個(gè)新的提交對(duì)象,替換掉上一次提交產(chǎn)生的提交對(duì)象。
這時(shí)如果暫存區(qū)有發(fā)生變化的文件,會(huì)一起提交到倉(cāng)庫(kù)。所以,--amend 不僅可以修改提交信息,還可以整個(gè)把上一次提交替換掉。
四、撤銷工作區(qū)的文件修改
如果工作區(qū)的某個(gè)文件被改亂了,但還沒(méi)有提交,可以用 git checkout 命令找回本次修改之前的文件。
$ git checkout -- [filename]它的原理是先找暫存區(qū),如果該文件有暫存的版本,則恢復(fù)該版本,否則恢復(fù)上一次提交的版本。
注意,工作區(qū)的文件變化一旦被撤銷,就無(wú)法找回了。
五、從暫存區(qū)撤銷文件
如果不小心把一個(gè)文件添加到暫存區(qū),可以用下面的命令撤銷。
$ git rm --cached [filename]上面的命令不影響已經(jīng)提交的內(nèi)容。
六、撤銷當(dāng)前分支的變化
你在當(dāng)前分支上做了幾次提交,突然發(fā)現(xiàn)放錯(cuò)了分支,這幾個(gè)提交本應(yīng)該放到另一個(gè)分支。
# 新建一個(gè) feature 分支,指向當(dāng)前最新的提交# 注意,這時(shí)依然停留在當(dāng)前分支$ git branch feature# 切換到這幾次提交之前的狀態(tài)$ git reset --hard [當(dāng)前分支此前的最后一次提交]# 切換到 feature 分支$ git checkout feature
上面的操作等于是撤銷當(dāng)前分支的變化,將這些變化放到一個(gè)新建的分支。
本文轉(zhuǎn)載自:「阮一峰的網(wǎng)絡(luò)日志」,原文:https://url.cn/5NLK2pC,版權(quán)歸原作者所有。
往期推薦
