iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0

學習原因:

開始進入從 0 到 1 建立測試專案的流程,但在此之前需要先學會應用版本控制的工具 Git 。學習如何設計開發,版控的流程。

學習目標:

  • 認識 Git 的作用
  • 認識 Git 的基本指令與使用流程 (Git Flow)
  • 學習處理 Conflict 和版本還原的操作

為什麼要使用 Git?

Git 是一個分散式版本控制系統,用於管理和追蹤軟體程式碼的變更。

以下是使用 Git 的一些主要原因:

  1. 版本控制: 記錄每次的更改,並保留每個版本的歷史記錄 (包括修改人 / 時間 / 內容),出現了錯誤或問題,能夠輕鬆回溯、比較和恢復不同的版本。

  2. 遠程協作: 允許在不同地點的開發者之間進行協作。你可以將代碼推送到遠程 儲存庫 (Repository),讓其他人能夠查看、評審和使用你的更改。

  3. 多人協作: 團隊成員可以同時在不同 分支 (Branch) 上工作,每個人可以獨立進行更改,然後將這些更改 合併 (Merge) 回主幹。這有助於避免代碼衝突和確保有效的協作,也允許同時進行不同特性的開發。

    如下例:

    1. 各自開不同的 分支 (Branch) 來開發不同的功能
    2. 把完成的部分 / 準備上線的部分 才 合拼 (Merge)。

    https://ithelp.ithome.com.tw/upload/images/20230924/20162038ZE1rt6qFhe.png

    圖片來源: https://nulab.com/zh-tw/learn/software-development/git-tutorial/

開始使用 Git

  1. 安裝 Git: 參考文件,根據作業系統安裝,用以進行 Git 的操作。

  2. 應用 Git Service: Git 本來是免費的開源軟體,讓我們可以自己架起 Git Server 作使用,但我們一般會使用商家的 Git Service 如 GithubGitlabBitbucket 等,會有更多的管理功能。他們都有各自有免費的方案可以使用,同時亦會有進階的收費服務,詳情可以參看官方網站。初學的選用其中一個來創建應用,並根據各個官方文件 (GitHub, Gitlab, BitBucket) 以應用 SSH 使本地端與遠端連接。

    **SSH(Secure Shell)**是一種加密的網路傳輸協定,可在不安全的網路中為網路服務提供安全的傳輸環境。

  3. 開始使用專案

    • 建立專案: 會使用 git init 的指令來使本機的專案初始化為 Git Repository ( Git 存儲庫),會建立 Local 的 Git Repository 以及創建名為 master/main 的默認分支。
    • 使用已在 Remote Repository (遠端儲存庫) 的專案: 會使用 git clone 從 Remote Repository 的主分支內容複製到 Local Repository (本地儲存庫),使可以在本地編輯開發。

常用的名詞與 Git Commands:

  • Repository(儲存庫) ,是指存儲和管理軟體代碼及相關文件的地方,用於版本控制和協作一般包含項目的全部歷史記錄、不同版本的代碼、配置文件、文檔、圖像等,分別有 遠端 (Remote) 儲存庫和 本地端 (Local) 儲存庫。

  • Stage (暫存) 用於指定哪些修改要包含在下一次提交中。當你對代碼進行了一些更會存放到 Stage,以便稍後 提交 (Commit)

  • Working Space(工作區) 是指正在進行編輯和修改的實際代碼文件的位置,對文件進行更改的地方,包括新增、修改或刪除文件內容。

    對於獨立的分支,常用的 Git Command 如下:

    https://ithelp.ithome.com.tw/upload/images/20230924/20162038otlsuzDhzK.png

  1. Add(添加): 使用 git add 指令將新檔案從 Work Space 新增到 Stage。
  2. Commit(提交): 使用 git commit 指令將 Stage 中的更改提交到版本庫中,會記錄你所做的更改以及相關的 提交信息 (Commit Message)。 (這裡需要提醒務必寫有意義的 Commit Message 以更好的識別修改內容,才能提供日後有效的追蹤)
  3. Push(推送): 使用 git push 指令可以將 Local Repository 的更改推送到 Remote Repository,使其他團隊成員可以查看和下載這些更改。
  4. Pull(拉取): 使用 git pull 指令可以從 Remote Repository 拉取最新的更改,並將它們合併到本地版端儲存庫中,再將合併的更改應用到你的工作區,以便在本地計算機上查看和編輯這些更改。

對於分支之間的操作,常用的 Git Command 如下:

  1. Switch (切換分支): 使用 git switch 命令可以切換到不同的分支,或者創建新的分支。 git switch 是 Git 2.23 版本引入的新命令,比 git checkout 更單純的處理切換分支的操作。

  2. Checkout (切換分支或單一文件)git checkout 同樣可以切換及創建分支,甚至切換到分支的某個 commit 版本,還可以指定文件切到特定的提交版本。 git checkout 代表的功能太多,於指令的應用上也不夠直觀,比較容易誤用而發生非預期的錯誤,所以較建議初學者應用 git switch 作單純的切換分支操作。

  3. Merge (合併)git merge 指令用於將一個分支的更改合併到另一個分支。

  4. Rebase (變基)git rebase 將一個分支的提交歷史重新應用在另一個分支的操作,目的是創建一個更整潔的提交歷史,而不是單純地合併分支。

    引用下圖講述 git mergegit rebase 的分別,雖然最後 Source Code 的內容一樣,但 Rebase 會有很清晰的歷史紀綠。對於日後若要進行退版操作,更清楚的知道選擇哪個版本。

    https://ithelp.ithome.com.tw/upload/images/20230924/20162038dt4VmK2TOU.png

    圖片來源:https://twitter.com/alexxubyte/status/1617926474279030784

  5. Cherry-pick (擇優選擇): 把指定的分支的某個 Commit 加入到當前的分支。

    https://ithelp.ithome.com.tw/upload/images/20230924/20162038Yj9mCuZFau.png

    圖片來源:https://nulab.com/zh-tw/learn/software-development/git-tutorial/

常用的 Git 使用流程 (Git Flow)

https://ithelp.ithome.com.tw/upload/images/20230924/20162038JKDbcqnbbZ.png

上圖簡單展示我們常用的 Git 使用流程:

  1. 會以 Develop Branch 作開發的綜合分支,收集各 Feature 分支開發的內容。
  2. 會透過 Develop Branch 切出分支來作個別的開發 (I.e. Feature A / B Branch),使可以基於 Develop Branch 的內容進行開發。
  3. Feature A / B Branch 開發完成後,可以 Merge 到 Develop Branch。Feature A 修改的內容若會影響到 Feature B 的開發,會使用 rebase 來更新 Feature B 的基底內容。
  4. Develop Branch 確認沒有 Conflict (版本衝突) 以及測試過後,會再 Merge 到 Master Branch 作正式的使用。
  5. 一般來說 Develop / Master Branch 需要設權限避免未經審核的內容 Merge 到重要的分支,所以一般我們在這個過程需要發 Pull Request (合併請求),讓有權限的帳號作審查 (Code Review) 確認才 Merge 到重要分支。

這只是一般簡單的使用流程,實際的應用需要根據實際的開發流程設計,像是系統的開發還會有 hotfix,release 等分支的設計。

遇到 Conflict (版本衝突) 怎麼辦?

合併分支時,如果兩個分支對同一個部分進行了不同的更改,就會產生 Conflict。

解決的步驟如下:

  1. 確認衝突: 在執行 git mergegit pull 後,系統會通知你存在合併衝突。你可以運行 git status 查看哪些檔案有衝突。

  2. 解決衝突: 打開有衝突的檔案,你會看到類似以下的內容:

    <<<<<<< HEAD
    這是在 main 分支上的內容
    =======
    這是在 feature 分支上的內容
    >>>>>>> feature
    

    這表示 <<<<< HEAD======= 之間是 main 分支的內容,而 =======>>>>>> feature 之間是 feature 分支的內容。你需要手動選擇要保留的內容,或根據需要編輯內容。

  3. 解決衝突並保存: 編輯衝突的部分,將其修改為你想要的內容。然後保存檔案。

  4. 完成合併: 當你解決了所有衝突並暫存了解決的更改,使用 git commit 來確認合併。

  5. 繼續合併: 如果有多個檔案有衝突,繼續重複上述步驟,直至解決所有衝突。

解決合併衝突需要謹慎和耐心,確保選擇正確的更改,以保持程式碼的一致性和功能。

版本還原處理

  1. Revert(還原): git revert 指令是一種創建新提交來取消之前的提交的方法,而不是從歷史中刪除提交。這是一種安全的方法,因為它不會更改過去的歷史。Revert 會創建一個新的提交,將之前的提交的更改反轉,從而還原更改。這樣可以保留先前的歷史記錄,並在需要時能夠很容易地找回這些變更。

    https://ithelp.ithome.com.tw/upload/images/20230924/20162038vz00p8PRNI.png

  2. Reset(重設): git reset 退回指定的版本,會刪除之前的新增紀錄

    https://ithelp.ithome.com.tw/upload/images/20230924/20162038WTZxAa7yb1.png

    它有不同的模式,例如 -soft-mixed-hard

    -soft工作區和暫存區的更改不會被修改。這意味著你可以重新提交之前的更改,而不需要重新編輯它們。

    -mixed工作區保留為未提交的更改,刪除暫存區的更改,可以重新將這些更改添加到暫存區。

    -hard 清除工作區和暫存區的所有更改

應用 Git 工具:

git 除了用 command 操作,亦有很多有介面的工具 (I.e. Fork Source Tree 等),操作相對簡單,但前提需要了解每個指令的意義。此外,很多 IDE 也配有 Git 的使用工具,像是 Pycharm,而 VSCode 亦可安裝 Git 的 Plugin 來使用。

這篇簡單提及 Git 的基本應用,它是對於版本控制及協作流程管理是非常實用的工具。


上一篇
Day 21: 應用 Python 作 API 測試
下一篇
Day 23: 測試框架 - PyTest
系列文
從 0 開始培育成為自動化測試工程師的學習指南30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言