git 撤銷(xiāo)操作的四種情況:撤銷(xiāo)文件的修改、 撤銷(xiāo)add 、撤銷(xiāo)commit 粟耻、撤銷(xiāo)push
一垢乙、撤銷(xiāo)對(duì)文件的修改
這種命令不常用锨咙,一般直接用鼠標(biāo)在idea里面右鍵操作更便捷。
場(chǎng)景:修改了Person.java中的代碼追逮,(尚未提交)結(jié)果發(fā)現(xiàn)改錯(cuò)了酪刀,需要回到最初的版本粹舵,其實(shí)就是Idea里面的右鍵-->Git-->Rollback 操作,如果用命令行的方式就是:
git checkout -- Person.java
記不住這個(gè)命令沒(méi)關(guān)系蓖宦,可以先用git status命令看下文件狀態(tài)齐婴,狀態(tài)說(shuō)明里面就有命令提示:
J:\Idea Projects\helloworld>git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: src/main/java/com/zxj/helloworld/Person.java
no changes added to commit (use "git add" and/or "git commit -a")
(use "git checkout -- <file>..." to discard changes in working directory) ---- discard:丟棄; 拋棄;
二、撤銷(xiāo)add
場(chǎng)景:比如 git add .
添加文件添加多了稠茂,把不需要git管理的文件如.idea文件也add上去了柠偶。
J:\Idea Projects\helloworld>git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: src/main/java/com/zxj/helloworld/Person.java
git status命令查看狀態(tài),在 “Changes to be committed” 下面的文件是已暫存狀態(tài)睬关,也就是說(shuō)這些文件被add過(guò)诱担,但是還沒(méi)有commit。
狀態(tài)說(shuō)明中也有提示: use "git reset HEAD <file>..." to unstage电爹。(使用 git reset HEAD <file>... 來(lái)取消暫存)
所以蔫仙,對(duì)Person.java文件撤銷(xiāo)add的命令就是:
git reset HEAD Person.java
三、撤銷(xiāo)commit
場(chǎng)景1丐箩、執(zhí)行commit后摇邦,還沒(méi)執(zhí)行push時(shí),想要撤銷(xiāo)這次的commit屎勘。
執(zhí)行commit后的status如下:
J:\Idea Projects\helloworld>git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
(1)撤銷(xiāo)commit的命令方法一:
git reset --soft HEAD~1
這樣就成功撤銷(xiāo)了commit施籍,如果想要連著add也撤銷(xiāo)的話(huà),--soft改為--hard(刪除工作空間的改動(dòng)代碼)概漱。
--soft:不刪除工作空間的改動(dòng)代碼 丑慎,撤銷(xiāo)commit,不撤銷(xiāo)git add
--hard:刪除工作空間的改動(dòng)代碼瓤摧,撤銷(xiāo)commit且撤銷(xiāo)add
HEAD~1 表示上一個(gè)版本竿裂,即上一次的commit,也可以寫(xiě)成HEAD^照弥。
如果進(jìn)行兩次的commit腻异,都想要撤回,可以使用HEAD~2这揣,以此類(lèi)推捂掰。
(2)撤銷(xiāo)commit的命令方法二:也可以先使用git log
查看 commit日志,找到需要回退的那次commit_id曾沈,再使用git reset --hard commit_id
命令進(jìn)行回退这嚣。
場(chǎng)景2、有時(shí)候我們提交完了才發(fā)現(xiàn)漏掉了幾個(gè)文件沒(méi)有添加塞俱,或者提交信息寫(xiě)錯(cuò)了姐帚。 此時(shí),可以運(yùn)行帶有 --amend 選項(xiàng)的提交命令來(lái)重新提交:
git commit --amend
這個(gè)命令會(huì)將 已a(bǔ)dd未commit 的暫存區(qū)中的文件提交障涯。執(zhí)行這個(gè)命令后會(huì)進(jìn)入vim文本編輯器模式罐旗,修改文本內(nèi)容后保存膳汪,就可以繼續(xù)push了。
四九秀、撤銷(xiāo)push
撤銷(xiāo)push有兩種場(chǎng)景:
- 場(chǎng)景1遗嗽、想恢復(fù)到之前某個(gè)提交的版本,且那個(gè)版本之后提交的版本我們都不要了鼓蜒。--- 用 git reset 命令痹换。
- 場(chǎng)景2、想撤銷(xiāo)之前的某一版本都弹,但是又想保留該目標(biāo)版本后面的版本娇豫。--- 用 git revert 命令。
場(chǎng)景1 git reset 具體操作步驟:
(1)用git log命令查看日志畅厢,獲取需要回退的版本號(hào)冯痢。(git log 的退出方法是輸入字母q即可退出)
(2)執(zhí)行 git reset --hard <版本號(hào)> ,如 git reset --hard 1b0cb5e5f4374b6d480c16d3c674838f3674e464 框杜,重置至指定版本的提交
git reset --soft 與 git reset --hard 浦楣,區(qū)別是: 前者--soft表示只是改變了HEAD的指向,本地代碼不會(huì)變化咪辱,我們使用git status依然可以看到椒振,同時(shí)也可以git commit提交。后者--hard直接回改變本地源碼梧乘,不僅僅指向變化了,代碼也回到了那個(gè)版本時(shí)的代碼庐杨。
再用git log查看日志选调,此時(shí)本地的HEAD已經(jīng)指向之前的版本:
image.png
(3)執(zhí)行git push origin 分支名 --force
或者git push -f
,強(qiáng)制提交當(dāng)前版本號(hào)
此時(shí)如果用“git push”會(huì)報(bào)錯(cuò)灵份,因?yàn)槲覀儽镜貛?kù)HEAD指向的版本比遠(yuǎn)程庫(kù)的要舊仁堪,所以需要用 --force 強(qiáng)制推上去。至此填渠,撤銷(xiāo)push提交完成弦聂。
場(chǎng)景2 git revert 具體操作步驟:
原理: git revert是用于“反做”某一個(gè)版本,以達(dá)到撤銷(xiāo)該版本的修改的目的氛什。比如莺葫,我們commit了三個(gè)版本(版本一、版本二枪眉、 版本三)捺檬,突然發(fā)現(xiàn)版本二不行(如:有bug),想要撤銷(xiāo)版本二贸铜,但又不想影響撤銷(xiāo)版本三的提交堡纬,就可以用 git revert 命令來(lái)反做版本二聂受,生成新的版本四,這個(gè)版本四里會(huì)保留版本三的東西烤镐,但撤銷(xiāo)了版本二的東西蛋济。如下圖所示:
具體操作:
舉個(gè)例子,現(xiàn)在庫(kù)里面有三個(gè)文件:READ.md炮叶、text.txt碗旅、text2.txt。
-
查看版本號(hào):
可以通過(guò)命令行查看(輸入git log):
如圖悴灵,最近的兩個(gè)版本分別叫:“add text.txt”(即新增了文件text.txt)扛芽、“add text2.txt”(新增了文件text2.txt)。這個(gè)時(shí)候我們不需要text.txt這個(gè)文件了积瞒,那就是說(shuō)不想要“add text.txt”那個(gè)版本的操作川尖,那可以通過(guò)反做“add text.txt”這個(gè)版本來(lái)實(shí)現(xiàn)。
image.png
2.使用“git revert -n 版本號(hào)”反做茫孔,并使用“git commit -m 版本名”提交:
(1)反做叮喳,使用“git revert -n 版本號(hào)”命令。如下命令缰贝,我們反做版本號(hào)為8b89621的版本:
git revert -n 8b89621019c9adc6fc4d242cd41daeb13aeb9861
注意: 這里可能會(huì)出現(xiàn)沖突馍悟,那么需要手動(dòng)修改沖突的文件。而且要git add 文件名剩晴。
(2)提交锣咒,使用“git commit -m 版本名”,如:
git commit -m "revert add text.txt"
此時(shí)可以用“git log”查看本地的版本信息赞弥,可見(jiàn)多生成了一個(gè)新的版本毅整,該版本反做了“add text.txt”版本,但是保留了“add text2.txt”版本:
3.使用“git push”推上遠(yuǎn)程庫(kù):
git push
此時(shí)查看倉(cāng)庫(kù)的文件绽左,剩下兩個(gè):READ.md悼嫉、text2.txt,反做成功拼窥!
參考:https://blog.csdn.net/u010356768/article/details/86718534
參考:http://www.reibang.com/p/a9f327da3562
參考:https://blog.csdn.net/yxlshk/article/details/79944535
參考:https://www.cnblogs.com/chaoxiZ/p/9714085.html