git版本回退方案

最近在開發中遇到了需要git版本回退的問題,特此記錄一下了解到的兩種回退方式。

0. 瞭解提交歷史

git的版本回退需要了解git的提交歷史,拿到你想回退的commitId。該查看命令爲:

git log

一般到此就夠了,如果你想了解更多,可以使用命令:

git show commitId

利用此命令,可以查看某次提交詳細的信息(如merge的兩個分支的commitId)

1. 使用git reset

命令格式:

git reset --soft/–hard commitId

該方式是通過移動HEAD指針的方式進行回退的。
這種提交方式有一個問題,單純的本地回退是OK的,但是如果要回退的內容已經提交到遠程倉庫時,將此回退提交到遠程倉庫時將會失敗,因爲遠程倉庫的HEAD比當前分支更靠前,會提示你更新本地倉庫。git reset版本回退
對此有一個解決方法,就是將回退提交到遠程倉庫時,加上-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掉

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章