Git居然有3種“後悔藥”(撤銷/刪除/反悔)![git reset 、 git revert 、 git checkout]
Git居然有3種“後悔藥”(撤銷/刪除/反悔)![git reset 、 git revert 、 git checkout]
資料來源: https://mp.weixin.qq.com/s?__biz=MzIyOTQyNzk0MQ==&mid=2247485383&idx=2&sn=3aafc1911d6236e750c0fc8568abe366&chksm=e843984ddf34115b2573d14b709d137368239b5022068e71b1221b3ab28221e8550b02cd21a0&scene=126&sessionid=1598937329&key=360754e56e033319e15abf906c9d4cb80e88d9664f7c40e1181a32f0050d2d5976527c359dd02d2ff3d4122a2b6da9ba3facc7bc6991529336b7ada3ddb4086a11e12b34e66cca03bb5fcac9ba23354efb5af50b951d347b305a966536f9b7fe20adfb7c3f0ab548f73843632f5bf2b8dae05cd5e22a0f48abd27dec31284c35&ascene=1&uin=MjIwODk2NDgxNw%3D%3D&devicetype=Windows+10+x64&version=62090529&lang=zh_TW&exportkey=As0%2BQaFqBlJXUQe3qk1ghTE%3D&pass_ticket=MrbYu7NVHmttevS3FAb7rcXLoi3NbzO%2BLfIQoHrdfNDQlhB3ZEcp5ANIU9AJF6Zj&wx_header=0
git reset [當下處理]
1、獲取當前提交的commit id
命令:git log
獲取到當前項目分支下的所有commit記錄;
假設上述小明提交錯誤的commit id為commit id:commit_id4這一次提交;
他的上一次提交就是commit id:commit_id3,我們要將修改回滾到commit_id3的時刻!
2、將某個commit id前的commit清除,並保留修改的代碼
命令:git reset <commit_id> 當前場景下就是:git reset commit_id3
將指定commit_id後的所有提交,都去除,並保留修改的代碼在本地的區域,也就是Workspace中
PS.
在進行下面的講解時,還是先假設有這麼一個提交鏈:
commit_id1 –> commit_id2 –> commit_id3 –> commit_id4
git resetcommit_id2:
reset是將HEAD重新定位到commit_id2上,對於commit_id3和commit_id4和本地當前的修改,對於不同的參數param,會有不同的處理;
reset命令有三種處理模式:
–soft:保留commit修改,將修改存儲到index中;也就是說git add後的區域
–mixed:保留commit修改,將修改存儲到本地工作區域中;也就是說git add前的區域
–hard:刪除commit修改,慎用!
git reset –soft
回滾commit_id前的所有提交,不刪除修改:
git reset –soft commit_id
重設head,不動index,所以效果是commit_id之後的commit修改全部在index中將id3 和id4的修改放到index區(暫存區),也就是add後文件存放的區域,本地當前的修改保留
git reset –mixed
回滾commit_id前的所有提交,不刪除修改:git reset commit_id 等同於git reset –mixed commit_id
與下述的git reset –hard commit_id效果不同
重設head 和index,不重設work tree,效果就是commit_id之前的修改,全部在work tree中,為還未add的狀態將id3 和id4 的所有修改放到本地工作區中,本地當前的修改保留
git reset –hard
回滾commit_id前的所有提交,將修改全部刪除:git reset –hard commit_id
重設head、index、work tree,也就是說將當前項目的狀態恢復到commit_id的狀態,其餘的全部刪除(包含commit_id後的提交和本地還未提交的修改)慎用!!
git revert [如果想要只操作修改中間的一個commit,不對其他的commit產生影響;也就是類似於我們只修改commit_id2,而對commit_id3 和commit_id4無影響,該怎麼處理呢?]
在revert命令中常用的就兩個:
git revert -e <commit_id>:重做指定commit的提交信息
git revert -n <commit_id>:重做執行commit的代碼修改
git revert -e
重做commit_id的提交信息,生成為一個新的new_commit_idgit revert -e commit_id
git revert -n
重做commit_id的提交git revert -n commit_id將commit_id中修改,放到index區,我們可以對他重新做修改並重新提交
PS
revert vs reset
git revert是用一次新的commit來回滾之前的commit,此次提交之前的commit都會被保留不動;
git reset是回到某次提交,提交及之前的commit都會被保留,但是此commit id之後的修改都會被刪除或放回工作區等待下一次提交;
git checkout [如果我在一次開發中,發現某個文件修改錯誤了,想要將文件恢復到剛pull代碼時的狀態怎麼辦呢?]
git checkout <branch_name>切換分支
git checkout -b <branch_bame>創建分支等操作
它還有回滾指定文件的修改的功能
命令:git checkout — <file_name>
上述語句的作用,就是將file_name的本地工作區的修改全部撤銷,有兩種情況:
如果file_name在commit後沒有add過這個文件,則撤銷到版本庫中的狀態
如果file_name在commit後add過這個文件,則撤銷到暫存區的狀態,也就是add後的狀態
總之,就是讓指定的文件回滾到最近的一次git add或者git commit時的狀態!