場景
回到上一次提交
這個問題,通常會有兩種情況;先說第一種情況
需要一個git的常用命令:git log
– 查看日誌
1. 沒有 push
這種情況發生在你的本地代碼庫中,我們只做了add
、commit
,但是發現代碼有點問題,不能做提交;
那麼我們將使用reset
命令恢復:
git reset [--soft | --mixed | --hard] <commit_id>
我們使用reset
命令常見有三種類型:
--mixed
: 保留源碼,只是將commit
和index
信息回退到了某個版本,–mixed 是默認參數,可以省略不寫--soft
:保留源碼,只回退到commit
信息到某個版本,不涉及index
的回退,如果還是需要提交,直接commit
即可.--hard
:不保留源碼,commit
和index
都回回退到某個版本(注意:此種方法慎用,會把自己新寫的代碼丟棄
)
如果你push代碼後,使用git reset --hard <commitID>
回退到某個版本,這樣就會有一個問題,你先上代碼沒有變,index
和commit
都沒有變,如果你修改本地代碼後進行push
,你會發現代碼是衝突的
所以這種情況需要用用到下面的方法
2. 已經 push
如果你已經把所commit
的代碼push
了,你想退回到某個版本,相當於,你想讓服務器上的代碼退回到某個版本,本地代碼保持一致
那麼我們需要使用revert
命令:
git revert <commit_id>
使用revert
有幾個注意事項:
revert
用於反轉提交- 執行
evert
命令時要求工作樹必須是乾淨的 revert
用一個新提交來消除一個歷史提交所做的任何修改
使用方式:
- 我們使用
revert
以後,本地代碼就會回滾到某一個之前的版本版本 - 然後使用
push
命令,提交這個回滾的操作
拯救災難性的反回覆
這裏我們先說一下一個重要的命令:
git reflog
有時候使用Git
工作得小心翼翼,特別是涉及到一些高級操作,例如reset
,rebase
和merge
。甚至一些很小的操作,例如刪除一個分支,我都擔心數據丟失。
這是後我們就要說一下reflog
,它會記錄所有HEAD的歷史,也就是說當你做reset
,checkout
…等操作的時候,這些操作會被記錄在reflog
中,有了這個東西,我們就不要太害怕數據丟失了。
下面我們來看一個例子:
我們首先看一下提交歷史:
$ git log --oneline
e66158d (HEAD -> master) 第三次提交
1bb2a89 第二次提交
a4c4e40 第一次提交
現在一共有三次提交,但是我想回到第一次提交的場景,我們使用reset
命令,但是我不小心執行了下面的命令:
$ git reset --hard a4c4e40
HEAD is now at a4c4e40 第一次提交
這個時候我發現新的代碼全沒了,怎麼辦,難道工作白做了嗎?
我們知道git
的修改都是指針的修改,只要我歷史做過某次提交,那麼我就一定能回到那個地方,只需要知道commit_id
,但是怎麼知道,這個時候我們就可以用reflog
命令了,他記錄了我的一切操作:
$ git reflog
a4c4e40 (HEAD -> master) HEAD@{0}: reset: moving to a4c4e40
e66158d HEAD@{1}: commit: 第三次提交
1bb2a89 HEAD@{2}: commit: 第二次提交
a4c4e40 (HEAD -> master) HEAD@{3}: commit (initial): 第一次提交
這樣我們就找到第三次提交的commit_id
了,那麼用reset
恢復吧
$ git reset --hard e66158d
HEAD is now at e66158d 第三次提交
代碼回來了,謝天謝地!!!
總結:
這裏附錄一下比較底層一個關於git的博客:https://www.cnblogs.com/kekec/p/9248487.html