0%

github課程筆記-Git分支(branch)

分支簡介

首先,網站上面的正式版本,都是在master的這條線底下。
但是,當你想要修改網站上的bug或者想要新增功能的時候,一定會在修改完後,
進行很多次的重新整理,這個時候,如果你用master底下的正式版的程式碼的話,
會影響到使用者在使用網站。
所以,這時候,我們需要多開其他的分支,也就是所謂的branch。
那我們在branch底下,可以盡情的修改或新增內容,等到全部的變更都確定之後,
才將最終定稿的程式碼,丟到master中,更新網頁的正式版程式碼。

範例分支圖網址

HEAD - 瞭解目前所在位置

首先,當我們為一個git的檔案提交第一次的commit的時候,此時,
git 會出現以下的架構。

會出現master指標和Head指標取指向你當前的版本。

接著,當我們提交第二次的commit的時候,git會出現以下的結構

這個時候,你可以看到Head和Master指標還是都指向當前的程式版本,
但是,這個時候我們就可以透過Head這個指標來變換他所指向的程式版本,
進而來獲取當前本版資訊或者之前的版本的資訊囉。

下面呢,我們就直接實地操作一次
step1.
首先,先用git Bash進到你的專案檔中。
接著,先輸入git init建立當地的數據庫。
接著,輸入touch index.html新增一個檔案在這個資料夾中。
接著,輸入git add . 提交索引
接著,輸入git commit -m “update”
經過以上的步驟之後,你在git Bash中輸入git branch
這個時候,應該會出現*master像下圖這樣

step2.
此時,我們在剛剛新增的index.html檔案中,做一些修改。
接著,再重複剛剛的步驟,git add.提交到索引,git commit -m “update index.html” 提交更新資訊。
這個時候,你輸入git log,你應該可以看到你過往commit的紀錄,如下圖所示。

那這個時候,我們想要返回指定版本的時候,我們就可以使用Head來做到囉。

git checkout 前4碼

接著,你剛剛用git log可以看到commit後面有跟著一對亂碼,所謂的前4碼,就是commit後面的亂碼的
前4碼。

再來,依照上面的圖片中的前4碼,我們就在git Bash中輸入git checkout e5656,
輸入完之後,你可以看到妳的git Bash介面變成下面這樣,

你可以看到原本是master的部分轉換成你剛剛輸入的前4碼。
接著,你再打開剛剛有修改過的index.html檔案,就會發現,它又回到上一版本沒有新增內容的狀態。

所以,我們可以透過轉換Head指標,來轉換指向不同版本的程式碼,讓當下的git的環境,變成該版本當下的狀態。

step3.
接下來,我們想要從剛剛的舊版本回到目前的當前版本。

git checkout master

你就在git Bash中,輸入git checkout master,這樣一來就可以讓你的程式內容又回到mster的狀態囉。

git branch - 分支創立

這個小節要示範,假使我們在master的版本中,有發現bug,那我們要怎麼利用git branch來做?
step1.
我們要在目前的master的節點,新增一個branch,
所以,我們就要輸入git branch 分支名稱
git branch分支

git branch 分支名稱

以上圖的圖為例,我們要新增一支叫feature1的分支。
故你就在git Bash中輸入git branch feature1,就可以新增一支feature1的分支。
step2.
接下來,我們要將程式的環境轉換到新增的feature1。

git checkout 分支名稱

這個時候,你就輸入git checkout feature1。
接著,你再輸入git branch,你可以看到目前的星號,是轉移到feature1的地方,
就代表你的環境已經成功轉換到feature1的分支囉。

那這個時候,你就可以放心的修改程式碼囉,因為,目前你是在feature1這個分支下做修改。
當你在這個分支做完修改後,並完成提交到索引,並完成提交commit的更新紀錄時,
你當下的git的結構會呈現像下圖這樣。

這個時候,Head指標就會指向現在的feature1。

step3.
而這個時候,你在git Bash中輸入git checkout master,回到master正式版,你會發現
index.html還是維持沒有被修改的狀態。

很神奇吧!!! 用這樣的方式,我們就可以把正式發行版本的程式碼,和正在修改的程式碼的環境切開囉。

git merge - fast-forward

這邊當你的分支的程式碼已經完成修改了,我們就要將修改完的程式碼合併到master的正式上線的版本中。
這個時候,我們就需要用git merge 分支名稱
step1.
假設你現在在分支的支線上,在你修改完所有的檔案之後,你要記得先把這些狀況提交到索引,並完成提交更新commit的紀錄。
step2.
接著,我們就要將分支的內容併到master中。
所以,我們就要用git merge的指令。

git merge 分支名稱

你要記得,當你要使用這個指令的時候,你必須先將Head指標指回你的master底下,才能使用這個指令喔。
好,假設現在你已經回到master上了,並且要合併feature1這個分支的內容。
這個時候,你就在git Bash中輸入git merge feature1。
此時,你就會發現,你的master底下的程式碼環境,就會變成修改完後的樣子囉,很神奇吧~~~

git merge - 自動合併篇 - 無衝突版本

這小節要教的情境是若有多位開發者同時開發,那有人先開發好,先更新完master的版本了,
那等到你要更新到正式版的時候,要怎麼辦?

就像上面的流程圖所示,你是在第一個正式版中所開出的branch,但是,當你還在修改feature1分支的時候,
正式版就已經進到下一版了。

此時,當你的分支的檔案已經修改完了,也提交完索引和提交更新commit資訊之後。
你就要用git Bash切回去master的支線上,然後,輸入git merge feature1。
如果,是沒有衝突的狀態的話,你的分支檔案就會和master主線的檔案成功合併囉。

你就會看到,你的master進版了,而這個進版的內容就是新增了你在feature1分支中,修改的內容囉。

git merge - 解決衝突篇

當程式碼的某一行,剛好都被不同的開發者碰到了,就會產生衝突的狀況囉。
step1.
那這個時候,你在master的主線底下,輸入git merge 分支名稱,
這個時候,應該會在git Bash中跳出以下的衝突提示訊息。
衝突

step2.
接下來,你就必須要手動去解決個合併的衝突。
你打開這個專案檔時,就會出現以下的圖示訊息

這個時候,你就可以選擇要保留之前的部分,還是用你修改的部分覆蓋掉之前一樣的部分,
或者都把你之前的部分和擬修改的部分都合併再一起。

step3.
接著,你完成這個手動合併的部分之後,儲存合併完的檔案。
最後,你就提交索引和提交commit的更新資訊之後,就完成這次的衝突合併囉。

git tag - 標籤

step1.
當你在master支線底下,你完成修改程式之後->完成提交索引->並且完成提交commit更新的資訊。
在還沒有push上去之前,你就輸入git tag 標籤訊息

git tag 標籤名稱

這個指令可以新增一個標籤名稱。
比如說輸入git tag v1
那在輸入完之後,你就再輸入git tag,你應該會看到一個v1的標籤。

step2.
這個時候,我們要利用標籤來回到那個標籤當時的程式環境。
這個時候,你就輸入git checkout v1
此時,你的程式環境就會回到v1標籤的狀態。
其實,跟你用”git checkout 前4碼”的方式,跑到相對應的版本的方式是一樣的,只不過這邊是用tag。

step3.
最終,你想要退回master的支線,你就再輸入git checkout master即可。

git tag -am ‘標籤詳細內容’ 標籤名稱

如果,你今天想為某個標籤加入詳細的內容的話,就可以用以上的語法。
比如說: git tag -am "edit index.html" v2
我們新增了v2標籤,並同時為v2標籤寫入詳細的描述edit index.html。

git tag -n

那如果我們想要查詢tag所寫下的詳細描述的話,你要輸入git tag -n才看的到喔,你直接輸入git tag是沒有辦法的看到詳細的描述內容喔。
那如果你沒有替tag寫詳細的描述內容的話,它預設的內容會是commit的內容。

git tag -d 標籤名稱 -刪除標籤

這個指令可以刪除指定的標籤,比如說git tag -d v1,這樣子,就可以刪除掉v1標籤囉。

git stash - 暫存檔案

如果程式內容寫到一半,要用某種方式儲存起來,但並不是用commit的方式,那這個時候,
就是使用git stash的時機囉,它就可以將你當下的程式碼暫時的儲存起來囉。
step1.
使用的時機在於,你還沒將當下改到一半的程式碼,用git add .的指令提交到索引,
那此時,你就可以用git stash指令。
當你輸入完這個指令之後,你會發現,你剛剛修改的程式碼都不見了。
而且使用git status去查詢,也發現沒有東西需要被提交的。

step2.
那我們要怎麼去看我們利用git stash暫存的紀錄呢?
你就輸入git stash list

git stash list - 查看暫存存列表

此時,你就可以看到以下的列表,

你可以看到,上面這張圖的紀錄中,就有紀錄一個stash的部分。

git stash pop 還原暫存紀錄

當你改完那些突發事件的問題之後,你想要回來繼續開發你沒寫完的部分,
這個時候,你就可以在git Bash直接輸入git stash pop,這個時候,你就會發現你的
程式碼內容就會還原成你之前編譯的狀態囉,那這個指令是會返回最新的暫存的程式環境喔。

建議在當時的分支上,修改這些stash的暫存檔

這個意思是,如果你是在master這條支線上,暫存的話,你就回到master之後,
再使用git stash pop,來還原最新的暫存檔來修改,不然,你在其他支線直接使用
git stash pop的話,接著,再從其他支線換回master的時候,會發生merge conflict的問題,
那這個時候,你就需要手動處理這些合併衝突的問題喔。

git stash drop - 清除最新暫存

git stash clear - 清除全部暫存