最近在開發中遇到了需要git版本回退的問題,特此記錄一下了解到的兩種回退方式。
0. 瞭解提交歷史
git的版本回退需要了解git的提交歷史,拿到你想回退的commitId。該查看命令爲:
git log
一般到此就夠了,如果你想了解更多,可以使用命令:
git show commitId
利用此命令,可以查看某次提交詳細的信息(如merge的兩個分支的commitId)
1. 使用git reset
命令格式:
git reset --soft/–hard commitId
該方式是通過移動HEAD指針的方式進行回退的。
這種提交方式有一個問題,單純的本地回退是OK的,但是如果要回退的內容已經提交到遠程倉庫時,將此回退提交到遠程倉庫時將會失敗,因爲遠程倉庫的HEAD比當前分支更靠前,會提示你更新本地倉庫。
對此有一個解決方法,就是將回退提交到遠程倉庫時,加上-f參數(強制提交):
git push -f origin master
相信你已經看到,reset可以加參數-hard 或 -soft。默認是 -soft。
- -soft 參數使用效果:該條commitId之 後(時間作爲參考點)的所有commit的修改都會退回到git緩衝區中。啥意思?就是回退之後,但是你提交的內容並沒有刪除,還是在本地等待你add、commit、push
- -hard 參數使用效果:緩衝區中不會存儲這些修改,git會直接丟棄這部分內容。
但是如果刪完了之後又後悔了,想要恢復怎麼辦?
沒問題,因爲reset只是修改了HEAD指針指向的commitId,只要你能夠找到reset前的commitId,然後再reset就行了。如果你不知道那次提交的commitId,可以使用以下命令查詢:
git reflog
2. 使用git revert
命令格式:
git revert commitId
該方式使用一種類似“對沖”的方式進行“回退”,實際上是將commitId之後的修改再改回來,然後再提交一次。此方式可以提交到遠程倉庫,不用強制提交了。
有時候git自動給我們進行revert提交時,會存在一些衝突,這時候需要我們自己解決這些衝突,然後add、commit、push。。。流程走完,就回退完成了。
- 使用revert還有一種特殊情況:
如果要回退的是merge操作,直接操作會報類似如下錯誤:
$ git revert 05f1a67e2113cc785d132f425e654fa400913c57
error: commit 05f1a67e2113cc785d132f425e654fa400913c57 is a merge but no -m option was given.
fatal: revert failed
這裏是因爲merge操作的回滾涉及到了兩個分支,所以需要使用-m參數指定回退的分支。
-m 取值一般爲1 或 2,其中1代表主分支,使用-m 1則代表將主分支以外的分支revert掉