Skip to main content

Git - 進階使用

常用 Git 指令

  1. git branch: 檢查本地目錄下有哪些分支。
  2. git branch develop: 創建 XXX 分支。
  3. git branch -d develop: 刪除 XXX 分支。
    • -d:只能刪除已經合併的分支。
    • -D:強制刪除分支。
  4. git switch develop: 切換路徑到 XXX 分支。
    • git checkout develop
  5. git checkout -b develop: 建立並更換路徑。
    • git switch -c
  6. git remote -v: 查詢連線的遠端 repo。
  7. git remote remove origin: 解除跟遠端 repo 的連線。
  8. git log --oneline: 查詢 commit 紀錄 (行列式)。
  9. git reset --hard <commit>: 回到指定 commit。
    • git reset --soft HEAD~1: 回到上一個 commit,並保留變更。
  10. git stash: 暫存變更。
    • git stash list: 查看暫存清單。
    • git stash apply stash@{0}: 恢復某暫存。
    • git stash drop stash@{0}: 刪除某暫存。
tip

如果今天突然跟我一樣想把舊專案整合到一個新資料夾中推送到遠端 repo 做整合,記得先刪除舊專案的 .git 資料夾,如果發現推上去後有一個小箭頭圖標可以執行 git rm --cache <<client_folder>>
詳情可參考 GitHub folders have a white arrow on them


git add -p 拆解 commit

假設你一口氣變更了很多程式碼,現在準備提交,卻發現剛剛的變更裡包含太多功能,而通常我們會希望單一功能 (目的) 就單獨一個 commit,這時候就可以使用 git add -p 來拆解變更。
git add -p 執行下去後,git 會先自動拆解每個變更並且逐個問你是否要加入這個變更到 commit 中,可以用這些指令來操作:

  • y:加入這個變更到 commit 中。
  • n:不加入這個變更到 commit 中。
  • s:拆解這個變更。
  • q:退出 git add -p
  • d:跳過當前文件中的所有剩餘片段。
  • a:加入當前文件中的所有剩餘片段。
warning

如果是新增的檔案,git add -p 會抓不到,可以先用 git add <<file_name>> 加入暫存區。


Git 版控流程

info

無論哪種版控流程都只是一個建議,不是規範。

Git flow

特點:

  1. 有 2 條主要分支: main 與 develop,這兩條會長期存在。
  2. 有 3 條支援分支:release、hotfix、feature。

各 branch 專職如下:

  1. main:主要分支,正式上線的版本。
  2. develop:開發分支,統整所有開發中的程式碼。
  3. release:預發分支,指 develop branch 併回 main branch 前,需進行版本測試而產生的分支。所以 release 從 develop branch 分出來,版本測試完 merge 回 main 和 develop branch。
  4. hotfix:修復分支,指的是上線版本遇到急需處理的 bug,分出來進行修復的分支。所以是從 main branch 分出來,修復完 merge 回 main 和 develop branch。
  5. feature: 功能分支,由 develop 分出來進行細項功能的開發分支。開發結束併回 develop。

GitHub flow

特點:

  1. 只有 1 條主要分支:main branch。
  2. 以 pull request 為合併核心。

簡單來說,就是各個開發者自己從 main branch 拉一條自己的分支出去,在開發完後發起 PR 請專案負責人 (或是其他開發者) 來審閱、討論發起 PR 的程式碼。
如果 PR 通過,即 merge 回 main branch,原本提交 PR 的分支即刪除。

GitLab flow

特點:

  1. 上游優先原則:即唯一主要分支 main branch 是所有分支的上游,只有上游允許的程式碼變化才可應用在下游分支。

所以下游分支是什麼?現來簡單說一下 Gitlab flow 的運作流程:

  1. feature 分支開發完畢,merge 回 main branch。
  2. main branch 分出 production branch 和 stable branch,這些分支就會被視為下游。

解釋一下什麼是 gitlab flow 的 production branch 和 stable branch:

  1. production:用在持續部署時,此分支的程式碼應是隨時可部署、經測試的穩定程式碼版本。
  2. stable:用在版本發佈時,為最新穩定釋放版本的分支。

Git 踩雷紀錄

GitLab 問題紀錄集錦

  • 如果 git clone 了一份專案,解除原先的遠端 repo 儲存後,要接到自己的遠端 repo 時出現錯誤 ! [remote rejected] main -> main (pre-receive hook declined)
    1. 先刪除該專案本地的 git repo。
    Remove-Item -Path .git -Recurse -Force
    1. 檢查是否刪除乾淨:
    git status
    1. 重新安裝本地 git repo:
    git init

Reference

  1. git workflow tutorial
  2. 三種版控流程
  3. 一文弄懂 Gitflow、Github flow、Gitlab flow 的工作流
  4. 【狀況題】手邊的工作做到一半,臨時要切換到別的任務
Buy Me A Coffee