feather-quic 是一个个人实验性质项目,使用 Rust 实现 QUIC 协议的同时,也实现了一个客户端工具 feather-quic-tool,提供更多 QUIC 协议底层相关的灵活配置,用来对 QUIC 协议进行测试和学习。
最近尝试了一下jj,感觉这个dvcs还算不错,有点想要用它替代git,于是我把jj的文档喂给claude让它生成了一份最佳实践
jj 最佳实践
核心心智模型差异
| 概念 | Git | jj |
|---|---|---|
| 工作区 | 独立于 commit | 工作区本身就是一个 commit,自动 amend |
| 暂存区 | git add |
不需要,文件改动自动追踪 |
| 分支 | branch | bookmark(概念相似但不是必须的) |
| commit 标识 | 只有 hash | change ID(稳定)+ commit hash(变化) |
日常工作流
克隆仓库
jj git clone https://github.com/xxx/repo
查看状态 / 日志
jj st # git status
jj log # git log
jj diff # git diff
写代码 → 提交
# 1. 先写 commit message(养成好习惯)
jj describe # 相当于提前写 commit message
# 2. 改代码(不需要 git add!)
# 3. 开始下一个 commit
jj new # 相当于"我做完了,开始新的"
修改上一个 commit(amend)
# 方式一:回到那个 commit 继续编辑
jj edit <change-id>
# 方式二:在新 commit 里改完,再 squash 回去
jj squash # 把当前改动 squash 进父 commit
最重要的命令
| 命令 | 用途 | Git 对应 |
|---|---|---|
jj new |
新建 commit,“完成当前开始下一个” | git commit |
jj describe |
写/改 commit message | git commit --amend -m |
jj squash |
把改动合并进父 commit | git commit --amend |
jj squash -i |
交互式选择哪些改动合并进父 commit | git add -p + commit |
jj edit <id> |
切换到某个 commit 继续编辑 | git checkout + amend |
jj rebase -s <id> -o <dest> |
rebase 某个 commit(含子孙) | git rebase |
jj abandon <id> |
丢弃某个 commit | git reset / drop |
jj undo |
撤销上一个操作 | git reflog + reset |
冲突处理(jj 的大优势)
jj 最大的不同:冲突不会阻止 rebase 完成,冲突被记录在 commit 里,可以稍后解决。
# rebase 遇到冲突后,新建一个 commit 来解决它
jj new <conflicted-change-id>
# 手动编辑冲突文件,或者用工具
jj resolve
# 解决完后 squash 回去
jj squash
操作日志(后悔药)
jj op log # 查看所有操作历史
jj undo # 撤销上一步操作(比 git reflog 好用太多)
jj undo 是真正的撤销,不仅恢复 commit,也恢复工作区状态。
与 Git 协作推送
jj git fetch # git fetch
jj git push # git push
jj bookmark set main -r @- # 移动 bookmark 到某个 commit
关键理念总结
- 工作区永远是一个 commit,不用担心"忘记 add"
- change ID 是稳定的,rebase/amend 后不变,用它来引用 commit
- 大胆操作,
jj undo可以撤销任何操作 - 冲突可以延后处理,不会卡住流程
- 不需要暂存区,
jj squash -i可以做到git add -p的效果,而且更灵活