影片連結:https://youtu.be/buecKro3Tq8
教學文件:https://quip.com/g9gIAQXVBmF2
1-分支與 commit 的簡介
除了 commit 記錄外,還可以看到實他的內容。
在 GitHub 的 Insights > network 裡的圖示,以 Bootstrp 來說一個 commit 就是一個點,以黑線來說就可能是正式版的資料。
為了不讓正式版的線壞掉,此時會使用新的線來放 commit 記錄,確任 commit 記錄沒問題後,在將其他色的 commit 記錄合併到主線黑色上,其他的線不在主線又是另外的色上就是分支。
以 MOPCON 開發為例,上面有 origin 就是指在主機上的程式碼 (水藍色), deploy 就是開發中的分支 (粉紅色),像是開發時就會用一條分支的線,或是新增資訊時會在另外開新分支 commit ,確任好分支沒問題時才會合併到正式主機的分支上。
2-什麼是分支
2-1-本地分支與遠端分支 GitHub
1 2 3 4 5 6 7 8 | mkdir project // 桌面上建立資料夾 cd project // 進入資料夾 git init // 開新數劇庫 touck index.html //新建 index 檔 git add . // 加入索引 git commit -m '新增 index.html' // 在 index.html 加入 HTML 結構,並加入 link:css 存檔,引入 all.css 檔。 touch all.css // 加入 body{color:red;} 存檔。 git status // 查看目前資料夾內的版控獎狀態 |
目前的話有一個 Git 追蹤檔,另外一個 all.css 還沒加入索引。
1 2 | git add . git commit -m 'update' // 目前有二個 commit 記錄 |
接著到 GitHub 上開啟一個遠端數劇數,命名為 1029,如果要將本地端先前所輸入的版控記錄,準備推送到 GitHub 上的話,要使用第二個部份 (…or push an existing repository from the command line),並將二段指令都輸入到終端機中。。
在 SourceTree 裡開始資料夾,可以看有二個分支,裡面有二個 commit 記錄,本地分支有一支,遠端分支也有一支。
之前的課都會說是更新到遠端,而針對此課程要改成合併到遠端分支,實際上是合併程式碼與 commit。
目前的話是 Git 是這樣的狀態。
2-2-GitHub Pages 靜態頁面
GitHub 有開啟靜態頁面的功能,可以點進設定項目中的 Settings(設定功能),選要發佈的靜態網頁分支,這裡在 GitHub Pages 的 Source 的分支選項謝 mater branch 的項目。
設定完成後會在卡片抬頭的部份,多一個 GitHub Pages 的頁面連結網址,點按下去後開啟頁面首頁。
開啟連結的話會是空白頁面,原因是因為只有 HTML 的架構而沒有任何的內容在網頁上。
目前的話分支 GitHub 的遠端分支是在的位置。
專案資料夾中在 index.html 加入 <h1>1244</h1> 內容,另外 all.css 的部份在加入 h1{color: bule;},內容加入後在切到終端機輸入下面指令。
1 2 | git add . git ci -m 'add h1' |
1 | git push origin master |
注意遠端分支名是 origin 不是 GitHub,分支名輸入錯話會回應錯誤提示,遠端分支可自定名稱。
目前本地與遠端的分支情形,推送上去後到切到 GitHub Pages 的頁面更新頁面,此時所推上去的樣式就會更新在頁面上。
本地端與遠端分支,透過比對後如果沒問題,才會推送到新的 commit 記錄合併到遠端分支。
2-3-為何使用分支-正式與測試主機使用的開發的分支
線上正式主機更新沒有處理檢查而直接推到正式主機上,使得程式產生問題,此時就是開發者的問題。
在開發時都會有個專屬測試的分支,對應測試專用的主機,在檢查沒問題之後才會推到正式主機。
在新分支可以針對開發專用,在開發沒問題後才推到遠端正式主機的使用分支,進行合併分支的動作。
2-4-開啟新分支
接著要開啟一個新的分支,命名為 devlope 或是簡寫為 dev,輸入指令 git branch devlop。
輸入指令完後感覺沒有任何變化,但使用 SourceTree 時可以看到多了個 devlop 的分支。
目前三個本地端的分支,都指向同一個 commit 記錄點上。
2-5-查看目前有多少分支
輸入指令 git branch ,在終端機上就會回應出分支名稱,目前有二個分支顯示,離開分支列表按下 q 鍵。
2-6-切換分支
輸入指令 git checkout devlop 切換到 devlop 分支上,在對應的分支上可以做出獨立的額外開發。
輸入完指令後,可以在 SourceTree 上的 devlop 分支名變成粗黑體,另外使用 git branch 查分支時,會在 devlop 分支前多一個 *。
2-7-切換分支與 HEAD
1 2 3 4 | touch index2.html touch index3.html git add . git ci -m 'updata' |
輸入完指令後,就可以看到 devlop 分支的記錄往前。
目前因為在新開的分支 devlop 也切換過去,切過去之後的 HADE 就會跑到 devlop 分支上。
新加入一個 commit 的記錄,所以 HEAD 與 devlop 就會多一個 commit 上去,
目前專案資料夾內的分支 devlop 的情形。
接著要切換到 master 分支,輸入指令 git checkout master 切換到 master 分支,切換後的 index2 與 index3 檔不見了。
因為切換到 master 分支,所以 HEAD 也跟著到 master 分支旁。
1. branch 就像便利貼,會貼在 commit 的位置上。
2. 使用 git checkout <分支名> 時,HEAD 也會依照對應位置指定 commit 位置。
2-8-合併分支
2-8-1-合併方式一 – git merge <合併對象分支名> (合併分支執行快轉)
目前的分支情形在 devlop 分支,多加入了 index2 與 index3 的檔案後,多加一個 commit 記錄。
切換到 master, HEAD 也因為切回到 master 分支後跟著移動,此時不見 index2 與 index3 的檔案。
git merge 合併程式碼,要將 master 上分支與 devlop 分支上的檔案與程式碼合併,將 devlop 的 commit 記錄中的內容也讓 master 擁有。
2-8-1-1-切換到要合併分支上,與對象分支進行合併 (由舊分支沒有的內容取得新分支上的內容)
要讓 master 分支有 devlop 上的資料,要先切到 master 分支上,因為還沒有 devlop 分支上的內容,所以要先切過去。
2-8-1-2-執行合併分支指令 (git merge <對象分支>)
確任現在 master 分支上後,輸入指令 git merge devlop ,輸入送出完成 merge 的動作。
輸入完成後 master, devlop, HEAD 都會在同一個 commit 記錄點上,而遠端的 commit 也還是在第三個 commit 記錄上。
git 快轉
像是時空快轉,當二條分支在同一個基底與同一個 commit 記錄點上,如果使用指令 git merge 後,還是會在同一條線上,但實際上還是二個分支。
2-8-2-合併方式二 – git merge <合併對象分支名> –no-ff (合併分支不執行快轉)
使用指令 git merge <合併對象分支名> 加上參數指令 --no-ff ,會使得同線同基底的 commit 在合併時,產生不執行快轉的動作,也就是開發者常說的小耳朵。
1 2 3 4 | git checkout devlop touch index4.html git add . git commit -m "add index4" |
輸人完後在使用 git checkout master 切回 master 分支上。
此時在 master 分支上輸入合併 devlop 分支指令 git merge --no-ff。
--no-ff 是不希望有快轉情形產生,會在針對合份上多個 commit 記錄。
輸入完指令後會跳出 commit 訊息的編輯檔,會等同於 git commit -m "Merge branch 'devlop'",如果都確任合併訊息沒問題,只要將右方的關閉後就完成合併與新增 commit 記錄的動作。
在 SourceTree 上的 devlop 往 master 分支上也會多個 commit 點,產生出小耳朵。
目前分支與合併後的情形。
為何要有小耳朵的合併分支方式,如果在許多分支在同一條線上時,在許多 commit 點都在不同分支上,會比較不清楚所修過 commit 與分支的關係,也不知在何時有合併分支的動作。
在分支上如果產生新的內容後,就在同一個 commit 點上另外在產生一個點交待合併分支的說明情形。
3-透過 learngitbranching 了解分支操作
練習 Git 指令連結:https://learngitbranching.js.org/
3-1-第一題 ( git merge 所產生合併的快轉 )
1 2 | git commit git branch dev |
1 2 3 4 5 | git branch dev git checkout dev git commit git checkout master git merge dev |
git merge dev 指令輸入後,會出現快轉的情形,主要是在合併時在同一條線上。
3-2-第一題補充說明-合併分支的使用情境
- 在開發時有可能在 c1 時,就開一個分支命名為 r/master 的遠端分支,有可能因為客戶要看資料,先推上遠端的分支上。
- 接著因為本地端要和 master 分支切開,怕在開發的過程式使的 master 產生問題,所以本地端另外在用一支分支 dev。
- 在開發上針對開發使用,所以切到分支 dev 上,使用指令 git checkout dev。
- 新做二個功能,使用二個 commit 記錄。
- 給分支管理者 (腦板) 確任 dev 開發功能正確,確任可以直接合併 master 分支,輸入指令 git checkout master 與 git merge dev。
目前的 HEAD 在 dev 的分支上
所以需要將 HEAD 切換 master 分支上,透過合併分支 dev 的內容,才能將裡面的內容加入到 master 分支內。
輸入指令 git chekout master 切換到分支 master 之後。
在使用 git merge dev 將分支的功能做合併取得分支 dev 的內容。
合併分支主要都是舊的合併新的,少有新的合併舊的。
接著要讓遠端分支 r/master 也有 master 分支的內容,輸入指令 git checkout r/master。
接著輸入 git merge master 就會讓 r/master 快轉,目前三個分支都會在同一條線上。
git push 也是使用遠端數劇庫是透過本地分支合併遠端分支。
3-3-第二題 ( git reset HEAD^ 還原記錄點並重新修正分支記錄點、快轉情形下合併會不知合併時間點 )
一開始開給測試主機用的 dev 分支。
接著連二次的 commit,此時發現錯誤,因為還沒有切回到 dev 分支,所以直接在 master 做二次的 commit 記錄。
此時使用還原 N 版本功能,輸入指令 git reset HEAD ^ ( ^ 還原提交次數,如果二個就是 ^^), HEAD 是指目前的分支與記錄點位置,透過指令可以連同分支一定退還原點,不需要的記錄點就會不見。
git reset HEAD^^ 的 ^^ 指的是還原前二個記錄點,在使用 sourctree 軟體上查看時,放棄的還原點就會不見。
輸入 git checkout dev 切換到 dev 分支,接連打二個 git commit
3-4-第三題 (分支使用情境)
目前依分支的處理情形,是要多開 dev 分支,在與 dev 分支合併到 master 的最新記錄點
1 2 3 4 5 6 7 | git commit // 目前還在 master 分支 git branch dev git checkout dev git commit // dev 分支上多一個記錄點 git checkout master // 切回 master 分支 git commit git merge dev // 在 master 合併 dev 分支上的內容 |
- 情境一:在 master 於 c2 時新增分支 dev,情境就像是 master 的正式主機上的內容已正式使用,所以不要在動到,需要由 dev 分支在加入新的內容,確任好的內容沒問題後,在由 master 分支合併到 dev 分支裡的內容過去。
- 情境二:是有二個開發者,另外一個開發者在開發較複雜的功能,所以就會切到分支 dev 處理,而原本在 master 發現有問題是字打錯,所以在 master 分支上,在加上一個記錄點,最後都確任沒有問題的情形下,由 master 合併 dev 的內容進來。
在 master 的顏色點還是一樣,主要是由 master 合併 dev 的內容進來,所以色彩上也還是會與 master 一樣。
3-5-第四題 ( git merge 加參數 –no-ff 不讓合併產生快轉 )
1 2 3 4 5 6 | git commit git branch dev git checkout dev git commit git checkout master git merge dev --no-ff // 在同線上不讓記錄點在合併時同線 |
先使用指令 git reset HEAD^ 指定,將原本合併的記錄點還原到前一個記錄點。
如果是在同線上的話,直接使用 git marge <分支名稱> 的話,在執行完成後就會直接移動分支的記錄點,會不知道在那一個記錄點上執行過合併的動作,也不知道何時開出的 dev 分支出來。
3-6-第五題 ( 在不同分支上已有各自的記錄點,不需在加上 –no-ff 參數合併分支 )
1 2 3 4 5 6 7 8 | git commit git branch develop git checkout develop git commit git commit git checkout master git commit git merge develop //分支不在同一線上不使用 --no-ff 參數,不會執行也沒辨法執行快轉 |
目前的話是由 c2 為基底,二個分支各自有廷伸的記錄點,所以不用使用參數 --no-ff 來快轉。
3-7-第六題 (遠端分支與本地 master 分支配合本地 dev 分支,不影響遠端分支在本地進行開發)
有三個分支,多一個 r/master
1 2 3 4 5 6 7 8 9 | git commit git banch dev git banch r/master git checkout dev git commit git commit git commit git checkout master git merge dev --no-ff // master 沒新的記錄點同基底,需使用參數 --no-ff |
情境說明,目前 r/master 的遠端分支停在 c2 的記錄點,不在動到上線的遠端主機,為了進行開發在本地端處理 master 與 dev 分支,在 dev 分支到 c5 時, master 與 r/master 分支沒有新的記錄點,為了不讓快轉的情形產生要在合併時加上參數 --no-ff,此時在新的線圖上就不會在同一線上,了解到 master 分支在何時與 dev 分支合併。
3-8-第七題 ( 本地分支合併加 –no-ff 參數 )
1 2 3 4 5 6 7 8 9 | git commit git commit git branch dev git checkout dev git commit git commit git commit git checkout master git merge dev --no-ff |
3-9-第八題 ( 本地 dev 分支與遠端分支配合更新,將遠端分支透過合併更新至最新記錄點 )
1 2 3 4 5 6 7 8 9 10 11 12 13 | git branch dev git checkout dev git commit git checkout master git merge dev --no-ff // 因為是同基底,為了不產生快轉使用參數 git branch r/master git checkout dev git commit git commit git checkout master git merge dev // 因為不是同基底,不會產生快轉 git checkout r/master // 如果是遠端分支的話是使用 git push git merge master |
3-10-第九題 ( 本地分支進行 dev 分支更新內容,等待確任後再將遠端分支,進行合併更新至最新記錄點 )
在遠端分支只會有五個記錄點,在本地端才處理到 dev 分支併到 master 分支裡,正準備推送上遠端。
1 2 3 4 5 6 7 8 9 10 11 12 13 | git commit git branch dev git checkout dev git commit git commit git checkout master git merge dev --no-ff git branch r/master git checkout dev git commit git commit git checkout master git merge dev |
3-11-第十題 ( 本地分支 master 合併二個不同的測試分支,不需使用 –no-ff 合併參數 )
1 2 3 4 5 6 7 8 9 10 11 | git commit git branch dev git branch dog git checkout dev git commit dev git checkout dog git commit git checkout master git commmt git merge dev // 合併 dev 分支不在同基底,不用加 --no-ff git merge dog // 合併 dog 分支不在同基底,不用加 --no-ff |
4-learngitbranching 分支 commit 記錄點分享方式
在輸入完一次 git commit 後,輸入語法 export tree ,此時會出現面版將裡面的程式碼 COPY 起來。
如果要讀入程式碼輸入程式碼 inport tree 指令,在把取得的程式碼貼入後點按 Confirm ,就會將原本輸入的狀態顯示在畫面上。