Git

平常會用到但記不起來的 Git 指令,依情境整理成速查表。最後一節是 Sparse Checkout,用在只想檢出大型 repo 其中幾個目錄的時候。

基礎

設定登入資訊:

git config --global user.name '你的名字'
git config --global user.email '你的Email'

列出有異動的檔案:

git clone https://XXX.com.tw/backweb.git 'test/backweb'
git -C 'test/backweb' status --porcelain
git -C 'test/backweb' fetch
git -C 'test/backweb' pull
git clone --filter=blob:none --no-checkout $remoteGit_Url/$childFolderName.git '$sparseCheckoutFolderDir/$childFolderName'
git -C 'test/backweb' sparse-checkout init --cone
git -C 'test/backweb' sparse-checkout set doc/
git -C 'test/backweb' switch master

(-C 後面接相對路徑)

設定 config:

git config --global user.email 'shilvain@XXX.com.tw'
git config --global user.name 'Shilvain'

遠端還沒有分支的時候,第一次對分支做 push,要加上 -u:

git push -u origin feature/somebranch

將變更狀態結果更容易讓程式判讀

git status --porcelain

從 develop 分支切一個新分支

git switch develop

git checkout -b feature/somebranch

第一次從遠端拉分支到地端

git switch -c uat --track origin/uat

取消 merge

適用情形:

  1. merge 發生衝突
  2. merge 成功但尚未 git commit
git merge --abort

備註:回到 merge 之前的狀態,工作目錄、HEAD 都會還原。

確認 Branch 對到哪個遠端 Branch

git branch -vv

設定 Branch 對到遠端 Branch

git branch --set-upstream-to=origin/dev

git add 之後,想從 add list 移除特定檔案

git restore --staged [檔案名稱(含副檔名)]

取消 git commit(回到上一個 commit 狀態)

git reset --soft HEAD~1
  • HEAD~1:代表最後一次 commit
  • --soft:保留檔案變更在 staged(ready to commit)狀態

連 staged 也取消,變成 unstaged:

git reset HEAD~1

設定 branch track remote branch

git branch --set-upstream-to=origin/develop

Git Remote

新增:

git remote set-url add origin https://xxx.aaaa.git

取代原本:

git remote set-url origin https://xxx.aaaa.git

刪除:

git remote rm origin

Git Sparse Checkout

Clone Git 結構

git clone --filter=blob:none --no-checkout http://192.168.1.130:3000/gituser/TestWeb.git

Sparse 初始化

git sparse-checkout init --cone
#設定Sparse目錄
git sparse-checkout set docs
git sparse-checkout set docs/internal docs/external

4️⃣ 保留原設定多檢出 docs/external 目錄

git sparse-checkout add docs/external

拉特定資料

git checkout HEAD
git switch master

清空 sparse-checkout 設定

git sparse-checkout set --no-cone
#刪除/sparse-checkout 檔案
rm -force .git/info/sparse-checkout

查看目前被設定檢出的資料夾:

git sparse-checkout list
#完全退出sparse模式
git sparse-checkout disable

2️⃣ 手動確保設定已關閉

git config core.sparseCheckout false

3️⃣ 重新展開完整目錄

git read-tree -mu HEAD

4️⃣ Cherry Pick

從其他分支或歷史 commit,挑選一個或多個 commit,應用到你目前所在的分支。

基本用法

git cherry-pick <commit hash ID>

如果想一次挑多個 commit:

git cherry-pick a1b2c3d e4f5g6h i7j8k9l

遇到衝突,需要手動解決,然後用 git cherry-pick --continue 繼續。

挑整個範圍

git cherry-pick a1b2c3d^..i7j8k9l

說明:

  • ^ 表示從前一個 commit 開始
  • .. 表示到結尾 commit

不產生 commit,先暫存

git cherry-pick -n a1b2c3d

中斷 cherry-pick 或取消

git cherry-pick --abort

跳過

git cherry-pick --skip

結束 cherry-pick 狀態,但保留目前的檔案

git cherry-pick --quit

常見衝突與解法

Cherry-pick 也可能碰到衝突,尤其是原本分支和目標分支同一檔案有不同修改。

處理流程:

  1. 用 git status 查看衝突檔案
  2. 編輯檔案解決衝突
  3. git add <file> 標記已解決
  4. git cherry-pick --continue 繼續套用

如果不想要這個 cherry-pick,直接 git cherry-pick --abort。