1. 程式人生 > >git之旅,暢遊git的世界

git之旅,暢遊git的世界

今天小銘醬帶大家探索一下git的奧祕!

1.初步探索

首先我在一個空的資料夾新建了一個名叫hello.html檔案,檔案內容只有一句話“hello git”。我們先引入git,看看git能為我們它能幹什麼,嘻嘻~

1) git init

初始化後,在當前目錄下會出現一個名為 .git 的目錄,所有 Git 需要的資料和資源都存放在這個目錄中。就這麼簡單,我們已經有一個程式碼倉庫了。

2) git add

有了倉庫,那第二部我們要讓git知道哪些檔案需要被管理或跟蹤的。輸入"git add ." (這裡.是代表所有檔案,也可以輸具體檔名) 讓當前所有檔案都被git跟蹤到。

3) git commit

add後我們需要第一次commit,這樣git才會幫我們建立一個主分支,什麼是分支後面會講。我們先輸入"git commit -m "init commit" 這裡-m必須加,表示這次提交的描述,內容我們隨意輸,主要是給自己做標記用的。

4) git log

試試輸入git log,我們發現我們的提交已經被記錄下來了。就這樣一個最基本簡單的流程已經走完了。哎呀,媽呀,這git到底有啥用?我咋完全不懂呢?別急,我們看看神奇的事情開始發生了。

 

 

2.進入git的世界

1) git checkout

這時粗心的我不小心把hello檔案中的程式碼給誤刪了,而且我又忘了程式碼寫些什麼來著~~~咋辦尼?

嘿嘿,這時git閃亮登場。試試輸入"git checkout hello.html"看看會怎樣。

咦!我們發現那句程式碼神奇的又回來了。難道這個命令是可以把我現在的程式碼還原到上次提交的嗎?好像沒那麼簡單,不過我們也暫時這樣理解吧,稍後會詳細介紹。這下我會玩了,我可以隨便修改程式碼,如果錯了,直接checkout不就行了嗎,哈哈。

2) git status

這時我們繼續編輯程式碼,當代碼敲得差不多時,咦~ 我到底改了什麼呢?輸入"git status",我們看到以下資訊,它告訴我們hello.html檔案被修改了。

大家肯定跟我一樣,那到底這個檔案修改了哪些內容呢?不急,這"git status"只是列了個大概,告訴你有哪些檔案被修改過,但如果想知道具體內容,就要藉助git diff命令。

3)git diff

輸入"git diff"這裡顯示了詳細的修改。

ok,查看了修改內容,覺得沒問題,那就提交吧。輸入“git add ."  等等,我好像發現了個問題。為什麼git要先add然後再commit呢?幹嘛不直接commit要多一部這麼麻煩呢?這裡就涉及git的設計了。

3.git 你到底是啥構造?

1)理解git構造

首先我們先來理解以下git的概念

  • 工作區:就是你在電腦看到的目錄
  • 暫存區:英文叫stage或index
  • 版本庫:工作區隱藏目錄.git
  • 分支:一連串提交組成了一個分支

 

這裡借用w3c的圖給大家看,當我們編輯完程式碼,然後準備提交。當我們add時候,其實是把我們工作區的程式碼放到了暫存區了。然後當我們commit時候,才是真的寫到分支上了。分支是什麼呢?分支就相當於把我們每一次提交串連成一條時間軸。而這條時間軸就相當於一個分支,哦~ 這樣大概理解了。至於為什麼要搞一個暫存區,是因為中間有了緩衝,使得管理程式碼更具有靈活性了。

2)重溫git status 和 git diff 和 git checkout

現在,我們新建一個html檔案,取名heihei。輸入"git add heihei.html"讓git跟蹤這個檔案。同時這時我們修改一下hello.html檔案(注意,hello檔案沒有現在是沒執行add)。這時試試status一下會怎樣?

這下我好像看懂了,哈哈。那再試試diff命令?

Yoshi(日文)原來這是預設檢視工作區和暫存區之間的差異變化,也就是修改之後還沒暫存起來的變化內容。那我要看暫存區和上次提交的詳細變化該怎麼看呢?輸入"git diff --staged"

Yoshi 原來是這樣子 哈哈 好簡單是吧~ 就是這麼簡單,不過這只是最基本的操作,我們再看看checkout命令,這時候先忽略掉heihei檔案,把hello檔案add一下,再給hello檔案新增一句程式碼。

現在工作區,暫存區,分支上的程式碼分別是這樣的

好,現在三個地方的程式碼都不一樣,這時候我們執行checkout命令會怎樣呢?我們知道checkout是把工作區修改的程式碼刪去,那它是根據暫存區的呢還是分支上的呢?

輸入命令checkout,我們發現竟然回到了暫存區的程式碼。噢~ 這下我懂了,原來checkout是回退到暫存區的程式碼。這下好玩了,我可以隨便敲程式碼,然後把確定的程式碼放到暫存區,一出問題,就checkout回退到暫存區的就可以了。這時候有孩童又想問了,那如何回退分支上的程式碼尼?

3) git checkout head

 現在工作區,暫存區,分支上剛剛上面的一樣

   

輸入 “git checkout head" 看看會怎麼樣?

這時候,驚奇的發現暫存區和工作區都被分支上的程式碼重寫了,也就是說工作區回退到分支上的程式碼,暫存區也被清空。(意味著你工作區和暫存區新修改的程式碼都沒了)所以這個命令是極具危險性的,一定要小心使用哦~

4) git reset命令

當你玩轉工作區,暫存區,分支三地的程式碼時,也許你還不滿足。感覺git應該有更強大的功能,我們現在就看看git reset命令到底是個啥東西。git reset命令主要有三個可選引數,分別是git reset --soft,git reset --mixed,git reset --hard,它們的危險性也是逐步增大的,下面我們詳細看一下。現在的程式碼是這樣子:

現在我們再修改一下程式碼,並提交。標記名稱 "test get reset"。

現在我們輸入"git reset --soft 3d542d6e307e067e7b281de74d328d6114084d04" 看看會怎麼樣?後面那串(3d....)是 "beautiful girl" 那次提交的id。 我們log一下,發覺最新的一次提交不見了。

status和diff看看?

不知道大家看懂沒,我們發現git reset --soft命令竟然把最近一次提交 "倒回到" 未提交的狀態,所有改變都回到了暫存區放著,哈哈,原來如此~ 那這個有什麼用呢?比如我們提交了後,誒~發現漏了點東西,那我們就可以用git reset --soft(別忘了加上上一次提交的id)回退到我們未提交的狀態,然後修改重新提交。Ok,很好用~。下面再看看git reset mixed,這是不帶引數的預設選項。我們把剛剛reset --soft回滾的再次提交,取名"text reset mixed"

輸入 "git reset mixed 3d542d6e307e067e7b281de74d328d6114084d04" 或 "git reset 3d542d6e307e067e7b281de74d328d6114084d04" 。

這個神奇了,我們發現最近的一次提交記錄沒有了(注意上圖中我忘記log一下給大家看了),暫存區沒有變化,上一次提交的修改都回到了工作區(紅色字型代表工作區的修改,也就是沒執行add)。

git reset hard這裡就不演示了,相信大家也能猜到到結果,就是最近一次提交的修改不是回到暫存區,也不是回到工作區,而是完全丟失了,所以這個操作是最危險的,一定要小心使用。到這裡小銘醬就有點不明白了,git reset好像都不是針對上一次提交回退程式碼的,而是針對上上一次進行回滾操作的,噢~ 對了,假如我工作區的程式碼胡亂寫了一番,暫存區的沒有任何修改,那我直接checkout不就相當於回退到上一個版本了嗎?那如果這時暫存區裡面已經有東西了,那該如何回到上一個版本呢?我們可以用checkoutout head是吧。好~ 這下大概懂了。

總結一下:

  • git reset --soft 加上(上上一次commit的id),那麼上一次提交會消失,回到沒提交狀態,所有修改放在暫存區裡
  • git reset --mixed 加上(上上一次commit的id),那麼上一次提交同樣消失,所有修改回放到工作區裡
  • git reset --hard 加上(上上一次commit的id),那麼上一次提交"永久"消失,上一次提交資料就完全沒了,程式碼完全回到上上一次提交的版本

說到這裡,也感嘆git的設計好厲害,好吧~ 這部分先到此為止,下面又更好玩的 ——分支

4.玩轉git分支

1)git branch (branchname)

我們輸入"git branch two" 建立一個名為two的分支

2)git checkout (branchname)

輸入"git checkout two" 切換到two分支

3) git branch

列出所有分支,媽呀,這個到底咋玩?別急,我們先切換到主分支上,現在我們修改程式碼,看下面hello.html的改動

我們把修改的提交了,命名為"test branch",好~ 神奇的事情出現了,我們切回分支two,log一下

發現在分支two上,根本沒有"test branch"提交,這說明現在程式碼已經在兩條線上開發啦~ 我們再在分支two上作一些修改,並且同樣是修改hello.html檔案看看會怎樣?同時我們畫個圖看看。

 

相信聰明的小夥伴們都知道這是有啥用,這裡不多說了,我這裡是想跟大家探究一下合併分支的問題,來~ 一起看一下。

4)git merge

切換到主分支,輸入“git merge two"

哇草,既然衝突了~ 哈哈,當我們兩個分支都同時修改了同一個檔案,合併時就會出現衝突,這時候我們就需要手動修改一下,然後重新提交,便能把分支上改的東東合併我主分支上啦~

 最後,感謝大家和小銘醬暢遊了一遍git的世界,第一次寫,寫得不是很好,哈哈~ 在後續中小銘醬將會跟大家繼續發掘git的好玩之處,謝謝大