分工:GUI 用来看,CLI 用来做

图形客户端的价值在可视化:分支拓扑图、逐行 blame、按块暂存、并排 diff、冲突三窗合并。命令行的价值在精确和可编排:交互式 rebase、bisect、reflog、hook、批量改写、脚本化处理。别试图在 GUI 里点出 rebase -i,也别在终端里硬看几十条分支的交叉关系。我的习惯是 Fork 看历史和解冲突,终端做提交整理,VS Code 里随手看单文件 diff。

客户端平台授权适合
ForkWin / mac试用后付费启动快、交互清爽
SourceTreeWin / mac免费功能全但偏重
GitKraken跨平台订阅团队协作、图形漂亮
TortoiseGitWindows免费资源管理器右键集成
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 改写历史,除非明确知道谁在基于它工作。