1、撤銷操作

一來就是一張大圖,如果不太了解git的人會有點蒙,下面簡單解釋一下(都是我個人的理解,如果不妥還請指正),git倉庫的初始化以及clone這些在這里就不講了,請自行百度。
遠程倉庫:就是在github或者在gitlab上的代碼??梢杂?code>git pull和git push來進行本地倉庫和遠程倉庫的同步操作。
版本庫:每一次的commit都會生成一個記錄,每個記錄都有一個hash值來唯一標識,很多很多的commit就形成了版本庫。為什么圖上有兩個版本庫?那是因為上面那個版本庫是commit前,下面那個版本庫是commit后。
工作區(qū):當我們把遠程倉庫的代碼clone下來后,一般會默認在分支master上,此時,該分支的所有代碼都在本地,這就是當前的工作區(qū),以后的每一次commit都會在這個分支上記錄。
暫存區(qū):這個應該大家最容易理解錯的,也是用習慣了svn的朋友最不理解的地方。每次修改了代碼后,都需要用git add來講工作區(qū)的修改記錄到暫存區(qū),然后我們再用git commit來講暫存區(qū)的內容提交到版本庫,當然這里也可以用git commit -a命令一步到位
上面這張圖就簡單描述了我們每次的修改,用什么命令流轉到什么區(qū)的一個示意圖。
2、版本回退
前提條件:已經執(zhí)行git commit命令了,但是沒有push到遠程倉庫,用以下命令可以回退
git reset --hard HEAD^
上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。其實這個回退就是將本地的HEAD指針移動到某個版本上而已,所以這個操作是非??斓?。
git log [查看commit記錄]
//這個3628164 是一個commit版本號,可以指定回退到那個版本
git reset --hard 3628164
查看提交記錄,也能看到每一次提交的版本號,這是一個很長的哈希值,這個時候我們通過這個版本號可以指定回退到某個版本上,用這個版本號的時候可以只用它前面幾位,具體幾位看你心情咯,只要能唯一標識這個版本就ok。
git reflog [查看本地會影響HEAD指針的命令操作記錄,這個不會同步到遠程倉庫]
強調一下,注意這里是記錄的會影響HEAD指針的操作記錄。
簡單舉例說一下這個git reflog的使用場景。git reflog
假如當前我有三次提交,再假設三次提交的版本號分別為commitnum1,commitnum2,commitnum3,并且我當前處于commitnum3這個版本上(也就是HEAD指向了commitnum3),這個時候我用命令git reset --hard commitnum2就回退到了comminum2了,好,問題來了,如果突然又想回到commitnum3怎么辦呢,當然你可以翻看上去看記錄,那個版本號還能看到,但是如果這是第二天了,已經翻不上去了就麻煩了,這個時候git reflog就出場啦,他可以看到你昨天執(zhí)行git reset --hard commitnum2命令的時候的所在版本號,這個時候就可以用git reset --hard commitnum3來恢復回去。

這個結果分三部分,前面黃色的文字就是執(zhí)行那次命令時所在的版本號,中間的HEAD@[0]是就是HEAD指針變更記錄,最后面就是那次命令所做的事情。
最后再啰嗦一點,如果這些commit都還沒有同步到遠程倉庫,你reset后那些commit記錄是不會被同步上去的。但是,如果已經同步上去了,就算你本地reset了,雖然本地工作區(qū)內容變成了你想要的了,但是記錄就抹不去了。