If I'm on a project with change AAA -> BBB, suppose my friend authors CCC and I author DDD.
So my history looks like:
AAA ----> BBB ----> DDD (immutable) (immutable) (mutable)
AAA ----> BBB ----> CCC (immutable) (immutable) (mutable)
AAA -> BBB -> CCC (immutable) \ '-> DDD (mutable)
AAA -> BBB -> CCC (immutable) -> DDD (mutable)
jj force pushes by default, but unlike git, the force push defaults to the "safe" variant (similar to git's --force-with-lease). So you won't accidently overwrite someone else's changes with your force push.