Git Step by Step – (2) 本地Repo

前面一篇文章簡單介紹了Git,並前在Windows平臺上搭建了Git環境,如今就正式的Git使用了。git

Git基本概念

在開始Git的使用以前,須要先介紹一些概念,經過這些概念對Git有些基本的認識,這將會對咱們後面的操做有很大的幫助。函數

在Git中,每一個版本庫都叫作一個倉庫(repository),每一個倉庫能夠簡單理解成一個目錄,這個目錄裏面的全部文件都經過Git來實現版本管理,Git都能跟蹤並記錄在該目錄中發生的全部更新。spa

如今咱們已經知道什麼是repository(縮寫repo)了,假如咱們如今創建一個倉庫(repo),那麼在創建倉庫的這個目錄中會有一個".git"的文件夾。這個文件夾很是重要,全部的版本信息、更新記錄,以及Git進行倉庫管理的相關信息全都保存在這個文件夾裏面。因此,不要修改/刪除其中的文件,以避免形成數據的丟失。命令行

進一步的講解請參考下面一張圖,大概展現出了咱們須要瞭解的基本知識(注意,".git"目錄中還有不少別的東西,圖中並無涉及,這裏也不作解釋了)。3d

根據上面的圖片,下面給出了每一個部分的簡要說明:版本控制

  • Directory:使用Git管理的一個目錄,也就是一個倉庫;包含咱們的工做空間和Git的管理空間。
  • WorkSpace:從倉庫中checkout出來的,須要經過Git進行版本控制的目錄和文件;這些目錄和文件組成了工做空間。
  • .git:存放Git管理信息的目錄,初始化倉庫的時候自動建立。
  • Index/Stage:暫存區,或者叫作待提交更新區;在提交進入repo以前,咱們能夠把全部的更新放在暫存區。
  • Local Repo:本地倉庫,一個存放在本地的版本庫;HEAD會指示當前的開發分支(branch)。
  • Stash:是一個工做狀態保存棧,用於保存/恢復WorkSpace中的臨時狀態。

有了上面概念的瞭解,下面就開始在本地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"是一個頗有用,並且會常常用到的命令。基於上面的例子,咱們經過"git diff"來查看WorkSpace和Stage的diff狀況,當咱們把更新add到Stage中,diff就不會有任何輸出了。

固然,咱們也能夠把WorkSpace中的狀態跟repo中的狀態進行diff,命令以下,關於HEAD,將在後面解釋。

git diff HEAD~n

 

撤銷更新

根據前面對基本概念的瞭解,更新可能存在三個地方,WorkSpace中、Stage中和repo中。下面就分別介紹一下怎麼撤銷這些更新。

撤銷WorkSpace中的更新

接着上面的例子,咱們想撤銷WorkSpace中的"div"函數的更新,能夠看到"git status"的輸出中有提示,咱們可使用"git checkout -- <file>…"(注意必定不要漏掉--)來撤銷WorkSpace中的更新。

注意,在使用這種方法撤銷更新的時候必定要慎重,由於經過這種方式撤銷後,更新將沒有辦法再被找回。

撤銷Stage中的更新

加入咱們在WorkSpace中從新添加了"div"函數的更新,而且使用了"git add"把這個更新提交到了暫存區。這時,"git status"的輸出中提示咱們能夠經過"git reset HEAD <file>..."把暫存區的更新移出到WorkSpace中。

若是想繼續撤銷WorkSpace中的更新,請參考上面一步。

撤銷repo中的更新

介紹撤銷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"更新已經回來了。

--hard和--soft

前面在使用reset來撤銷更新的時候,咱們都是使用的"--hard"選項,其實與之對應的還有一個"--soft"選項,區別以下:

  • --hard:撤銷並刪除相應的更新
  • --soft:撤銷相應的更新,把這些更新的內容放的Stage中

 這裏就再也不對--soft進行演示了。

 

刪除文件

在Git中,若是咱們要刪除一個文件,可使用下面的命令,"git rm"相比"rm"只是多了一步,把此次刪除的更新發到Stage中。

rm <file>
git rm <file>

刪除操做仍是很簡單的,這裏就很少作演示了。

 

總結

經過這篇文章,瞭解了Git的一些基本概念。

而後介紹了Git中經常使用的命令來操做本地repo,內容比較多,可是都是基本的,只要本身動手操做一遍就清楚了。

到這裏,下面命令流圖中的命令都已經被介紹到了。相信經過這些命令,咱們已經能夠對本身的本地repo進行Git的版本管理了。

 最後,一樣share出文章中的兩個visio圖

相關文章
相關標籤/搜索