天天看點

Git學習:Git 撤銷commit檔案 和 回退push的檔案第一種情況 : 撤銷commit檔案第二種情況 : 撤銷push檔案git reset 和 git revert 的差別

第一種情況 : 撤銷commit檔案

我們先檢視一下log日志:

兩種檢視方法:

  1. git log 顯示從近到遠的日志記錄,按向下鍵來檢視更多,按 Q 鍵退出檢視日志
  2. git log --pretty=oneline 簡潔顯示日志記錄

當然還有更多檢視 log 的方法,就不展示了,自行百度吧.

Git學習:Git 撤銷commit檔案 和 回退push的檔案第一種情況 : 撤銷commit檔案第二種情況 : 撤銷push檔案git reset 和 git revert 的差別

前五次送出是已經 push 到遠端倉庫的,第六次是 commit 的,然後我突然不想 commit 了,我想撤銷,好嘞,git 指令嗨起來

git reset --hard 送出id

Git學習:Git 撤銷commit檔案 和 回退push的檔案第一種情況 : 撤銷commit檔案第二種情況 : 撤銷push檔案git reset 和 git revert 的差別

意思就是,你要撤銷第六次 commit ,你就要把 HEAD 指向 第五次,是以 reset 一下 HEAD 就好啦

注意:工作空間的代碼的改動就沒啦

如果想保留工作空間的代碼隻是撤銷commit,請執行下面的指令:

git reset --soft HEAD^

HEAD^的意思是上一個版本,也可以寫成HEAD~1

如果你進行了2次commit,想都撤回,可以使用HEAD~2

ps : git status 檢視目前檔案的狀态

Git學習:Git 撤銷commit檔案 和 回退push的檔案第一種情況 : 撤銷commit檔案第二種情況 : 撤銷push檔案git reset 和 git revert 的差別

至于這幾個參數:

--mixed

意思是:不删除工作空間改動代碼,撤銷commit,并且撤銷git add . 操作

這個為預設參數,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一樣的。

--soft

不删除工作空間改動代碼,撤銷commit,不撤銷git add .

--hard

删除工作空間改動代碼,撤銷commit,撤銷git add .

注意完成這個操作後,就恢複到了上一次的commit狀态。

第二種情況 : 撤銷push檔案

方法一:

第一步:

git log --pretty=oneline

   檢視目前送出的日志

第二步:

git reset --soft XXX

    XXX是commitID(d6cdbba417…) 回退目前工作空間的上一個版本,并且保留代碼更改

第三步:

git log --pretty=oneline

  再次檢視目前送出的日志,确認是否成功撤銷,當然,你也可以不看,基本上都會成功,保險一下,看看呗

第四步:

git push origin master --force

  強制送出目前版本号,以達到撤銷版本号的目的。必須添加參數force進行強制送出,否則會送出失敗,報錯原因:本地項目版本号低于遠端倉庫版本号。(master 代表分支名稱,預設是 master)

注意:這種強制送出的方法隻有owner的時候可以用

Git學習:Git 撤銷commit檔案 和 回退push的檔案第一種情況 : 撤銷commit檔案第二種情況 : 撤銷push檔案git reset 和 git revert 的差別

你看,github上第五次送出也撤回咯

Git學習:Git 撤銷commit檔案 和 回退push的檔案第一種情況 : 撤銷commit檔案第二種情況 : 撤銷push檔案git reset 和 git revert 的差別

方法二

我們來看圖分析,一步步來做

最後一次送出的備注是:NNNNNN送出

倒數第二次送出的備注是:MMMMM送出

我們目标:回退最後一次送出 NNNNNN送出,讓工作空間的代碼回到 MMMMM送出 的狀态。

第一步:

git log --pretty=oneline

  檢視目前送出的日志

第二步:

git revert commitID

    revert你想回退的版本

第三步:

會進入一個新的編輯界面,編寫commit的資訊

第四步:

git log --pretty=oneline

   再次檢視目前送出的日志

第五步:

push 代碼

(git push或者用AS push)

Git學習:Git 撤銷commit檔案 和 回退push的檔案第一種情況 : 撤銷commit檔案第二種情況 : 撤銷push檔案git reset 和 git revert 的差別

看遠端送出資訊:

Git學習:Git 撤銷commit檔案 和 回退push的檔案第一種情況 : 撤銷commit檔案第二種情況 : 撤銷push檔案git reset 和 git revert 的差別

git reset 和 git revert 的差別

  1. git revert是用一次新的commit來復原之前的commit,git reset是直接删除指定的commit。
  2. 在復原這一操作上看,效果差不多。但是在日後繼續merge以前的老版本時有差別。因為git revert是用一次逆向的commit“中和”之前的送出,是以日後合并老的branch時,導緻這部分改變不會再次出現,但是git reset是之間把某些commit在某個branch上删除,因而和老的branch再次merge時,這些被復原的commit應該還會被引入。
  3. git reset 是把HEAD向後移動了一下,而git revert是HEAD繼續前進,隻是新的commit的内容和要revert的内容正好相反,能夠抵消要被revert的内容。