git之旅,暢遊git的世界

  • 2019 年 10 月 3 日
  • 筆記

今天小銘醬帶大家探索一下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的好玩之處,謝謝大家!