分工:GUI 用来看,CLI 用来做
图形客户端的价值在可视化:分支拓扑图、逐行 blame、按块暂存、并排 diff、冲突三窗合并。命令行的价值在精确和可编排:交互式 rebase、bisect、reflog、hook、批量改写、脚本化处理。别试图在 GUI 里点出 rebase -i,也别在终端里硬看几十条分支的交叉关系。我的习惯是 Fork 看历史和解冲突,终端做提交整理,VS Code 里随手看单文件 diff。
| 客户端 | 平台 | 授权 | 适合 |
|---|---|---|---|
| Fork | Win / mac | 试用后付费 | 启动快、交互清爽 |
| SourceTree | Win / mac | 免费 | 功能全但偏重 |
| GitKraken | 跨平台 | 订阅 | 团队协作、图形漂亮 |
| TortoiseGit | Windows | 免费 | 资源管理器右键集成 |
| VS Code / GitHub Desktop | 跨平台 | 免费 | 已有编辑器 / 只推 GitHub |
纯 Windows 且不喜欢新窗口的话,TortoiseGit 的右键菜单最顺手;已经常驻 VS Code 就别再装第二个重型客户端,内置的源代码管理加 GitLens 覆盖八成场景。
命令行这边先把 .gitconfig 打好
[core]
autocrlf = input
quotepath = false
editor = code --wait
[init]
defaultBranch = main
[merge]
conflictstyle = zdiff3
[pull]
rebase = true
[alias]
lg = log --graph --oneline --all --decorate -20
st = status --short
undo = reset --soft HEAD~1
[difftool "vscode"]
cmd = code --wait --diff $LOCAL $REMOTE
autocrlf 的取值看团队:跨平台项目用 input(提交时转 LF、检出不变),纯 Windows 项目用 true(检出转 CRLF);全组必须统一,再配一份 .gitattributes 把 *.sh、*.bat 的换行写死。quotepath = false 让中文路径不再显示成一串八进制转义。conflictstyle 用 zdiff3 会多显示冲突前的共同祖先版本,比默认 diff3 更容易判断该留哪边。
git lg
git rebase -i HEAD~5
git bisect start
git bisect bad HEAD
git bisect good v1.2.0
git reflog
git stash -u
git log -S "removeUser" --oneline -- src/ # pickaxe 找引入某字符串的提交
冲突交给 mergetool,别对着标记硬改
配好 merge.tool 之后,冲突时执行 git mergetool 会拉起 Beyond Compare 或 VS Code 的三窗界面,比在文本文件里对着冲突标记一行行数可靠得多。
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd "code --wait --merge $LOCAL $BASE $REMOTE $MERGED"
git mergetool
踩坑:CRLF 配置不一致会让整个文件每行都算改动,提交前先看 git diff --stat;客户端默认自动 fetch,看历史时容易把远端新提交和本地混在一起;误点 "Discard all changes" 往往没有二次确认,重要改动先 stash;已经 push 出去的分支别做 rebase -i 改写历史,除非明确知道谁在基于它工作。