Git - 進階指令 & git flow
常用 Git 指令
與分支相關
git branch
: 檢查本地目錄下有哪些分支。git branch develop
: 創建 XXX 分支。git branch -d develop
: 刪除 XXX 分支。-d
:只能刪除已經合併的分支。-D
:強制刪除分支。
與分支切換相關
git switch develop
: 切換路徑到 XXX 分支。- 同
git checkout develop
。
- 同
git checkout -b develop
: 建立並更換路徑。- 同
git switch -c
。
- 同
與遠端 repo 相關
git remote -v
: 查詢連線的遠端 repo。git remote remove origin
: 解除跟遠端 repo 的連線。
與變更相關
git log --oneline
: 查詢 commit 紀錄 (行列式)。git reset --hard <commit>
: 回到指定 commit。git reset --soft HEAD~1
: 回到上一個 commit,並保留變更。
git stash
: 暫存變更。git stash list
: 查看暫存清單。git stash apply stash@{0}
: 恢復某暫存。git stash drop stash@{0}
: 刪除某暫存。
git merge xxx
: 合併 xxx 分支到目前分支。git rebase xxx
: 將目前分支的 commit 移到 xxx 分支後面。git merge --no-edit xxx
: 合併時使用預設 commit。
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
特點:
- 有 2 條主要分支: main 與 develop,這兩條會長期存在。
- 有 3 條支援分支:release、hotfix、feature。
各 branch 專職如下:
- main:主要分支,正式上線的版本。
- develop:開發分支,統整所有開發中的程式碼。
- release:預發分支,指 develop branch 併回 main branch 前,需進行版本測試而產生的分支。所以 release 從 develop branch 分出來,版本測試完 merge 回 main 和 develop branch。
- hotfix:修復分支,指的是上線版本遇到急需處理的 bug,分出來進行修復的分支。所以是從 main branch 分出來,修復完 merge 回 main 和 develop branch。
- feature: 功能分支,由 develop 分出來進行細項功能的開發分支。開發結束併回 develop。
GitHub flow
特點:
- 只有 1 條主要分支:main branch。
- 以 pull request 為合併核心。
簡單來說,就是各個開發者自己從 main branch 拉一條自己的分支出去,在開發完後發起 PR 請專案負責人 (或是其他開發者) 來審閱、討 論發起 PR 的程式碼。
如果 PR 通過,即 merge 回 main branch,原本提交 PR 的分支即刪除。
Git 踩雷紀錄
GitLab 問題紀錄集錦
- 如果
git clone
了一份專案,解除原先的遠端 repo 儲存後,要接到自己的遠端 repo 時出現錯誤! [remote rejected] main -> main (pre-receive hook declined)
。- 先刪除該專案本地的 git repo。
Remove-Item -Path .git -Recurse -Force
- 檢查是否刪除乾淨:
git status
- 重新安裝本地 git repo:
git init