前面一篇文章簡單介紹了Git,並前在Windows平臺上搭建了Git環境,如今就正式的Git使用了。git
在開始Git的使用以前,須要先介紹一些概念,經過這些概念對Git有些基本的認識,這將會對咱們後面的操做有很大的幫助。函數
在Git中,每一個版本庫都叫作一個倉庫(repository),每一個倉庫能夠簡單理解成一個目錄,這個目錄裏面的全部文件都經過Git來實現版本管理,Git都能跟蹤並記錄在該目錄中發生的全部更新。spa
如今咱們已經知道什麼是repository(縮寫repo)了,假如咱們如今創建一個倉庫(repo),那麼在創建倉庫的這個目錄中會有一個".git"的文件夾。這個文件夾很是重要,全部的版本信息、更新記錄,以及Git進行倉庫管理的相關信息全都保存在這個文件夾裏面。因此,不要修改/刪除其中的文件,以避免形成數據的丟失。命令行
進一步的講解請參考下面一張圖,大概展現出了咱們須要瞭解的基本知識(注意,".git"目錄中還有不少別的東西,圖中並無涉及,這裏也不作解釋了)。3d
根據上面的圖片,下面給出了每一個部分的簡要說明:版本控制
有了上面概念的瞭解,下面就開始在本地repo上進行Git的操做了。指針
經過"Git Bash"命令行窗口進入到想要創建版本倉庫的目錄,經過"git init"就能夠輕鬆的創建一個倉庫。rest
這時,咱們的倉庫目錄中會自動的產生一個".git"文件夾,這個就是咱們前面提到的Git管理信息的目錄。code
如今咱們在倉庫中新建一個"calc.py"的文件,文件內容以下。blog
def add(a, b): print a + b if __name__ == "__main__": add(2, 3)
經過"git status"能夠查看WorkSpace的狀態,看到輸出顯示"calc.py"沒有被Git跟蹤,而且提示咱們可使用"git add <file>..."把該文件添加到待提交區(暫存區)。
注意,這時的更新只是在WorkSpace中。
使用"git add calc.py"或者"git add .",而後繼續查看WorkSpace的狀態。這是發現文件已經被放到暫存區。
這時的更新已經從WorkSpace保存到了Stage中。
最後,咱們就能夠經過"git commit -m"來提交更新了。-m後面跟的是對commit的描述(message)。
這時的更新已經又從Stage保存到了Local Repo中。
經過上面的操做,文件"calc.py"就成功的被添加到了倉庫中。
假設如今須要對"calc.py"進行更新,修改文件後,查看WorkSpace的狀態,會發現提示文件有更新,可是更新只是在WorkSpace中,沒有存到暫存區中。
def add(a, b): print a + b def sub(a, b): print a - b if __name__ == "__main__": add(2, 3)
一樣,經過add、commit的操做,咱們能夠把文件的更新先存放到暫存區,而後從暫存區提交到repo中。
注意,只有被add到暫存區的更新纔會被提交進入repo。好比下面的一系列操做,操做結束後只有"multi"函數的更新會被提交到repo中,"div"函數的更新還在WorkSpace中。這點應該也是比較容易理解的。
def multi(a, b): print a * b def div(a, b): if b != 0: print a / b
"git diff"是一個頗有用,並且會常常用到的命令。基於上面的例子,咱們經過"git diff"來查看WorkSpace和Stage的diff狀況,當咱們把更新add到Stage中,diff就不會有任何輸出了。
固然,咱們也能夠把WorkSpace中的狀態跟repo中的狀態進行diff,命令以下,關於HEAD,將在後面解釋。
git diff HEAD~n
根據前面對基本概念的瞭解,更新可能存在三個地方,WorkSpace中、Stage中和repo中。下面就分別介紹一下怎麼撤銷這些更新。
接着上面的例子,咱們想撤銷WorkSpace中的"div"函數的更新,能夠看到"git status"的輸出中有提示,咱們可使用"git checkout -- <file>…"(注意必定不要漏掉--)來撤銷WorkSpace中的更新。
注意,在使用這種方法撤銷更新的時候必定要慎重,由於經過這種方式撤銷後,更新將沒有辦法再被找回。
加入咱們在WorkSpace中從新添加了"div"函數的更新,而且使用了"git add"把這個更新提交到了暫存區。這時,"git status"的輸出中提示咱們能夠經過"git reset HEAD <file>..."把暫存區的更新移出到WorkSpace中。
若是想繼續撤銷WorkSpace中的更新,請參考上面一步。
介紹撤銷repo中的更新以前,咱們先看一下"git log"這個命令,經過這個命令咱們能夠查看commit的歷史記錄。能夠看到咱們進行的三次提交。
其中"WilberTian"和"Wilber***com"就是咱們在前面一片文章中配置的用戶名和郵箱。
假設咱們如今要撤銷"add mulit function in calc.py"這個提交,有兩種方式:使用HEAD指針和使用commit id。
在Git中,有一個HEAD指針指向當前分支中最新的提交,在上面的例子中HEAD就是對應1a72f49ae49c1716e52c12f2b93fdcef6aac0886(commit id)此次提交。
因此可使用下面的命令來撤銷"add mulit function in calc.py"這個提交。注意,當前版本,咱們使用"HEAD^",那麼再前一個版本可使用"HEAD^^",若是想回退到更早的提交,可使用"HEAD~n"。(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2)
git rest --hard HEAD^
等價於
git rest --hard 1a72f49ae49c1716e52c12f2b93fdcef6aac0886
再次查看,發現"add mulit function in calc.py"的commit已經被撤銷了,查看"calc.py"文件,"multi函數"也已經被刪除了。
那麼問題就來了,我如今又想要恢復"add mulit function in calc.py"這個提交了,固然Git是支持這樣的操做。
下面來看看"git reflog"這個命令。"git log"只是包括了當前分支中的commit記錄,而"git reflog"中會記錄這個倉庫中全部分支的全部更新記錄,包括已經撤銷的更新。
有了這個,咱們就能夠查找到"add mulit function in calc.py"提交,而後能夠經過下面命令來恢復對"add mulit function in calc.py"的撤銷操做。
git reset --hard HEAD@{1}
等價於
git reset --hard 1a72f49
再次查看,發現咱們的"add mulit function in calc.py"更新已經回來了。
前面在使用reset來撤銷更新的時候,咱們都是使用的"--hard"選項,其實與之對應的還有一個"--soft"選項,區別以下:
這裏就再也不對--soft進行演示了。
在Git中,若是咱們要刪除一個文件,可使用下面的命令,"git rm"相比"rm"只是多了一步,把此次刪除的更新發到Stage中。
rm <file>
git rm <file>
刪除操做仍是很簡單的,這裏就很少作演示了。
經過這篇文章,瞭解了Git的一些基本概念。
而後介紹了Git中經常使用的命令來操做本地repo,內容比較多,可是都是基本的,只要本身動手操做一遍就清楚了。
到這裏,下面命令流圖中的命令都已經被介紹到了。相信經過這些命令,咱們已經能夠對本身的本地repo進行Git的版本管理了。
最後,一樣share出文章中的兩個visio圖。