jj 没有明确的暂存区或存储区的概念,但它以更强劲的方式支持这两者。
在 jj 中,暂存区只是图中的一个终端节点。可以进行更改。当准备提交时,只需将所有更改推送到父节点即可。终端节点是索引,父节点是已提交的节点。
你是否有过这样的经历:先执行了git add,然后做了一些修改,又执行了一次git add ,却发现你破坏了第一次git add中一些重大的代码?你该如何恢复?我不知道 git reflog 中是否有这些信息。
在 jj 中,所有内容都会被保存。将 jj 中的每次提交视为一个超节点。超节点内部包含一堆原子节点。您可以将每个原子节点视为执行 git add 的等效操作,每个git add 操作都相当于该超节点中的另一个原子节点。因此,如果曾经像这样破坏过更改,只需删除最后一个原子节点或以想要的方式修改它即可。
实际上,jj 为索引提供了自己的版本控制。
类似地,在 jj 中,bookmark实则就是一个分支。它是分支中的一个节点,用于存储工作目录的状态。如果你正在开发某个功能,突然需要停止它去处理其他内容,只需在要开始工作的节点上创建一个新节点即可。换句话说,只需创建一个新分支,同时将工作保留在其自己的分支中。
你是否有过这样的经历:从存储中弹出代码,做了一些修改,然后意识到你破坏了一些超级重大的内容,于是后悔当初没有弹出代码,而是应用了存储?在 jj 中,这根本不是问题。实际上,你有一个受版本控制的存储,你可以很自然地在 jj 中进行存储,而无需了解存储的概念。
自从我开始使用 jj 之后,突然觉得“索引”和“存储”这两个概念单独存在很荒谬。我不清楚 Git 为什么会设计出这两个截然不同的概念。说到底,它们都是一个图,你操作的是节点以及每个节点内的内容。你需要的是一些操作来协助你操作它们。
我必须强调的是,典型的 jj 用户只需学习一些操作即可获得所有这些功能 – 他们不必学习那么多不同的概念。
有多少种不同的方法可以执行git reset?在 jj 中,我只需要执行 jj undo ,它几乎涵盖了所有这些用例。