search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

Git居然有3種“後悔藥”(撤銷/刪除/反悔)![git reset 、 git revert 、 git checkout] – jashliao部落格

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==&devicetype=Windows+10+x64&version=62090529&lang=zh_TW&exportkey=As0+QaFqBlJXUQe3qk1ghTE=&pass_ticket=MrbYu7NVHmttevS3FAb7rcXLoi3NbzO+LfIQoHrdfNDQlhB3ZEcp5ANIU9AJF6Zj&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   當前場景下就是: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的提交信息
    git revert -n :重做執行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 切換分支
    git checkout -b 創建分支等操作
    
    它還有回滾指定文件的修改的功能
    命令:git checkout —
    
    上述語句的作用,就是將file_name的本地工作區的修改全部撤銷,有兩種情況:
    
    如果file_name在commit後沒有add過這個文件,則撤銷到版本庫中的狀態
    
    如果file_name在commit後add過這個文件,則撤銷到暫存區的狀態,也就是add後的狀態
    
    總之,就是讓指定的文件回滾到最近的一次git add或者git commit時的狀態!



熱門推薦

本文由 jashliaoeuwordpress 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦