Git 版本回退

jopen 9年前發布 | 35K 次閱讀 Git 版本控制系統
 

git 版本回退

有這樣一種場景: 用git commit幾個版本,然后突然發現最近幾次ci都有問題,準備取消。

G1 - G2 - G3 - B1 - B2 - B3

G1,G2,G3都是good commit,但是從B1開始,后面的B2,B3都是bad commit。現在要"撤銷"幾次commit回滾到G3。

理解HEAD

HEAD是git的當前commit的指針,具體含義如下

G1 - G2 - G3 - B1 - B2 - B3
           \    \    \    \-- HEAD \    \    \------ HEAD~1 \    \---------- HEAD~2 \-------------- HEAD~3 

reset

  • 如果本地未曾push到remote,那么可以直接采用reset,回滾到某個版本
$ git reset --hard HEAD~3 

reset是本地的code、緩沖區都會回退到某個版本,會變成這樣,之前的commit記錄都沒了。

G1 - G2 - G3
           \-- HEAD 

這種情況下,版本是回退了,但是git push的時候會報錯,原因就是本地版本比遠程版本更低,除非使用push --force,但是這是很危險的操作,會導致G3以后所有用戶的commit都丟失!

revert

  • 如果本地ci已經push到remote,就需要revert了

revert用法是

$ git revert --no-commit <start_ci>..<end_ci> 其中start_ci不包含,區間表示 (start_ci, end_ci],回滾到start_ci版本

上面的場景

$ git revert --no-commit HEAD~2^..HEAD 

or

$ git revert --no-commit HEAD~3..HEAD 

or

$ git revert --no-commit HEAD HEAD~1 HEAD~2 

執行完 git revert后,變成了如下:R`就是最新的一次commit

G1 - G2 - G3 - B1 - B2 - B3 - R` 

查看diff

$ git diff HEAD~4 HEAD 
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!