Git 20 周年的 20 個 Git 技巧
Git 于 2005 年 4 月 7 日發(fā)布,至今已整整 20 年!為了慶祝這一里程碑,我整理了 20 個 Git 技巧,幫助你更高效地使用 Git!
這些技巧沒有特定的順序,從初學者到高級用戶都能從中受益。希望它們對你有用!
Git 20 周年
0. 正確設置個人信息
首先,全局配置你的姓名和郵箱:
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
如果需要為不同的倉庫使用不同的郵箱(例如工作郵箱和個人郵箱),可以按倉庫配置:
git config user.email "work.email@company.com"
額外提示:設置 GPG 簽名以驗證你的提交!簽名可以讓你的提交更加安全,因為它驗證了提交是由你完成的。了解更多,可以參考我的書 Docker 和 Kubernetes 安全。
1. 使用 .mailmap 清理作者名稱
Git 通過姓名和郵箱來跟蹤作者。有時可能會有人誤用不同的姓名或郵箱提交,這會讓提交歷史變得混亂。
在這種情況下,我們可以使用 Git 的 mailmap 功能來統(tǒng)一這些信息。在倉庫根目錄下創(chuàng)建一個名為 .mailmap 的文件,并添加如下內(nèi)容:
Proper Name <proper@example.com> <alias@example.com>
現(xiàn)在,git shortlog 和其他命令將顯示干凈的作者列表。
2. 新功能始終使用分支
避免直接提交到 main 或 master 分支。為每個功能和修復創(chuàng)建小的主題分支:
git switch -c feature/new-login
我個人會使用 GitHub 用戶名、問題編號和簡短的描述來命名分支:
git switch -c aerabi/1234-new-login
之后,你可以在提交信息中提到問題編號,GitHub 或 GitLab 會自動將其鏈接到問題。你還可以通過在提交信息中添加 Fixes #1234 來自動關閉問題:
Add new login page
Closes #1234
這樣提交后,讀者可以通過查看問題來了解提交的上下文。
3. 跨分支 Cherry-Pick 提交
如果你想將一個分支的某個提交應用到另一個分支,可以使用 cherry-pick。首先,記下你要 cherry-pick 的提交哈希,可以通過 git log 查看并復制。
然后,切換到目標分支并執(zhí)行:
git cherry-pick <commit-hash>
該提交會被添加到新分支,你可以繼續(xù)在該分支上工作。
4. 從另一個倉庫 Cherry-Pick 提交
你甚至可以從另一個倉庫 cherry-pick 提交:
git remote add other-repo <repo-url>
git fetch other-repo
git cherry-pick <commit-hash>
完成后,可以移除該遠程倉庫。
5. 使用 git switch 和 git restore 替代 git checkout
checkout 在過去是一個被過度使用的命令,它被用于切換分支、恢復文件等?,F(xiàn)在,我們有了 git switch 和 git restore 來使操作更清晰:
git switch branch-name # 切換分支
git switch -c new-branch # 創(chuàng)建并切換到新分支
git restore file.txt # 丟棄文件的更改
git restore --staged file.txt # 取消暫存文件
這些命令更加明確且用戶友好!
6. 理解三種合并方式
- 三方合并:常規(guī)合并,會創(chuàng)建一個合并提交。
- 快進合并:當沒有分叉時自動進行,即分支領先于基礎分支。
- 壓縮合并:在合并前將所有提交壓縮為一個(適用于 PR)。
在 GitHub 和 GitLab 中,你可以配置 PR 的默認合并方式。
如果不確定使用哪種方式,建議使用壓縮合并。它保持歷史記錄干凈,更易于理解。
如果你是高手,可以將 rebase 和快進作為默認的合并方式。在合并前,將你的分支 rebase 到基礎分支:
git pull --rebase origin master
使用 rebase 和快進,你可以保持功能分支的歷史記錄干凈。
7. 使用 git add -p 選擇性暫存更改
與其暫存所有更改,不如選擇性地暫存部分更改:
git add -p
這種方式是交互式的且安全!
8. 安全撤銷 Rebase
如果你在 rebase 過程中搞砸了,可以撤銷它:
git reflog
找到 rebase 開始前的提交,然后重置:
git reset --hard <commit-hash>
9. 使用交互式 Rebase 清理歷史
使用交互式 rebase 來重新排序、壓縮或編輯提交:
git rebase -i HEAD~5
這是保持提交歷史整潔的秘訣。使用交互式 rebase,你可以:
- 壓縮提交
- 刪除提交
- 重新排序提交
- 重寫提交信息
10. 使用 --autosquash 加速 Rebase
當添加一個提交來修復之前的提交時,你可以將其標記為 "fixup" 或 "squash" 提交:
git commit --fixup <commit-hash>
提交信息應以 fixup! 或 squash! 開頭。這樣可以在 rebase 時自動壓縮它們。
在進行交互式 rebase 時,可以使用 --autosquash 選項:
git rebase -i --autosquash
Git 會自動將這些提交移動到正確的位置,并標記為壓縮或修復。
11. 使用 --update-refs 處理分支鏈
如果你從一個分支創(chuàng)建了另一個分支,并 rebase 了基礎分支,通常需要手動 rebase 所有依賴分支。但有了 --update-refs,你就不需要這么做了:
git rebase --update-refs
它會自動更新子分支。
12. 使用 git stash --keep-index
只需要暫存未暫存的更改?使用:
git stash push --keep-index
它會保留你已暫存的工作。
13. 創(chuàng)建空提交
有時你可能需要創(chuàng)建空提交來測試或觸發(fā) CI/CD 流水線。你可以這樣做:
git commit --allow-empty -m "Trigger deployment"
如果是為了創(chuàng)建部署標記,可以使用標簽代替:
git tag -a v1.0 -m "Deployment marker for version 1.0"
14. 清理未跟蹤的文件
快速刪除未跟蹤的文件(小心使用?。?/p>
git clean -fd
可以先使用 -n 進行試運行:
git clean -fdn
這個命令會顯示將要刪除的內(nèi)容,而不會實際刪除。
15. 同時獲取所有遠程倉庫
如果你有多個遠程倉庫:
git fetch --all
這對于 fork 非常有用。
16. 查看分支歷史圖
使用以下命令查看分支圖:
git log --oneline --graph --all --decorate
你也可以為其創(chuàng)建別名:
git config --global alias.graph "log --oneline --graph --all --decorate"
然后你可以使用:
git graph
17. 添加別名節(jié)省時間
厭倦了輸入冗長的 Git 命令?添加別名:
git config --global alias.enforce "push --force-with-lease"
現(xiàn)在 git enforce 等同于 git push --force-with-lease,它用于推送更改,同時確保不會覆蓋其他人的更改。
永遠不要使用 git push --force!
18. 使用 git worktree 進行多分支工作
與其來回切換分支,你可以同時檢出多個分支:
git worktree add ../branch-folder branch-name
Worktree 非常適合同時測試多個分支,而無需來回切換。
19. 使用 git bisect 查找 Bug
如果你的代碼中有 Bug,可以使用 git bisect 來找到引入 Bug 的提交。這是對提交歷史的二分搜索。
git bisect start
git bisect bad # 當前提交是壞的
git bisect good <commit-hash> # 最后一個已知的好提交
然后,Git 會檢出中間的提交。你可以測試每個提交并標記為好或壞:
git bisect good # 如果提交是好的
git bisect bad # 如果提交是壞的
例如,你可以運行測試來查看 Bug 是否存在。一旦找到引入 Bug 的提交,可以重置 bisect:
git bisect reset
這將返回到原始分支。
20. 閱讀之前的技巧
Git 20 歲生日快樂!??