assumeengage挖的坑

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

关键理念总结

  1. 工作区永远是一个 commit,不用担心"忘记 add"
  2. change ID 是稳定的,rebase/amend 后不变,用它来引用 commit
  3. 大胆操作jj undo 可以撤销任何操作
  4. 冲突可以延后处理,不会卡住流程
  5. 不需要暂存区jj squash -i 可以做到 git add -p 的效果,而且更灵活