一來就是一張大圖,若是不太瞭解git的人會有點蒙,下面簡單解釋一下(都是我我的的理解,若是不妥還請指正),git倉庫的初始化以及clone這些在這裏就不講了,請自行百度。git
遠程倉庫:就是在github或者在gitlab上的代碼。能夠用git pull
和git push
來進行本地倉庫和遠程倉庫的同步操做。github
版本庫:每一次的commit
都會生成一個記錄,每一個記錄都有一個hash值來惟一標識,不少不少的commit就造成了版本庫。爲何圖上有兩個版本庫?那是由於上面那個版本庫是commit
前,下面那個版本庫是commit
後。svn
工做區:當咱們把遠程倉庫的代碼clone
下來後,通常會默認在分支master
上,此時,該分支的全部代碼都在本地,這就是當前的工做區,之後的每一次commit
都會在這個分支上記錄。gitlab
暫存區:這個應該你們最容易理解錯的,也是用習慣了svn
的朋友最不理解的地方。每次修改了代碼後,都須要用git add
來說工做區的修改記錄到暫存區,而後咱們再用git commit
來說暫存區的內容提交到版本庫,固然這裏也能夠用git commit -a
命令一步到位指針
上面這張圖就簡單描述了咱們每次的修改,用什麼命令流轉到什麼區的一個示意圖。code
前提條件:已經執行git commit
命令了,可是沒有push
到遠程倉庫,用如下命令能夠回退get
git reset --hard HEAD^
上一個版本就是HEAD^
,上上一個版本就是HEAD^^
,固然往上100個版本寫100個^比較容易數不過來,因此寫成HEAD~100
。其實這個回退就是將本地的HEAD指針移動到某個版本上而已,因此這個操做是很是快的。同步
git log [查看commit記錄] //這個3628164 是一個commit版本號,能夠指定回退到那個版本 git reset --hard 3628164
查看提交記錄,也能看到每一次提交的版本號,這是一個很長的哈希值,這個時候咱們經過這個版本號能夠指定回退到某個版本上,用這個版本號的時候能夠只用它前面幾位,具體幾位看你心情咯,只要能惟一標識這個版本就ok。hash
git reflog [查看本地會影響HEAD指針的命令操做記錄,這個不會同步到遠程倉庫]
強調一下,注意這裏是記錄的會影響HEAD指針的操做記錄。 簡單舉例說一下這個git reflog的使用場景。git reflog 假如當前我有三次提交,再假設三次提交的版本號分別爲commitnum1,commitnum2,commitnum3,而且我當前處於commitnum3這個版本上(也就是HEAD
指向了commitnum3),這個時候我用命令git reset --hard commitnum2
就回退到了comminum2了,好,問題來了,若是忽然又想回到commitnum3怎麼辦呢,固然你能夠翻看上去看記錄,那個版本號還能看到,可是若是這是次日了,已經翻不上去了就麻煩了,這個時候git reflog
就出場啦,他能夠看到你昨天執行git reset --hard commitnum2
命令的時候的所在版本號,這個時候就能夠用git reset --hard commitnum3
來恢復回去。it
這個結果分三部分,前面黃色的文字就是執行那次命令時所在的版本號,中間的HEAD@[0]是就是HEAD指針變動記錄,最後面就是那次命令所作的事情。
最後再囉嗦一點,若是這些commit都尚未同步到遠程倉庫,你reset後那些commit記錄是不會被同步上去的。可是,若是已經同步上去了,就算你本地reset了,雖然本地工做區內容變成了你想要的了,可是記錄就抹不去了。