<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: martinvonz</title><link>https://news.ycombinator.com/user?id=martinvonz</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 09 Apr 2026 10:32:55 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=martinvonz" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by martinvonz in "Git commands I run before reading any code"]]></title><description><![CDATA[
<p>Not really very similar at all for the scenario discussed here. Rerere remembers how you have resolved a conflict before. It doesn't let you rebase a stack of commits that result in different conflicts. You will have to stop and resolve each conflict and then `git rebase --continue`.<p>However, the conflict algebra does remove many common uses of rerere. See <a href="https://github.com/jj-vcs/jj/issues/175#issuecomment-1079831788" rel="nofollow">https://github.com/jj-vcs/jj/issues/175#issuecomment-1079831...</a> for a longer discussion.</p>
]]></description><pubDate>Thu, 09 Apr 2026 04:47:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=47699377</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=47699377</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47699377</guid></item><item><title><![CDATA[New comment by martinvonz in "Awesome-Jj: Jujutsu Things"]]></title><description><![CDATA[
<p>> To me that counts as commit splitting<p>Correct me I'm I'm wrong but I think were talking about using `git reset HEAD^` for splitting a commit. That will move the current branch backwards one step. With `--mixed`, it will also move the index back one step, so the index is empty (relative to HEAD) and the working copy has the combination of changes that were in the previous HEAD commit and the working copy (relative to the previous HEAD). I think that's more like squashing than splitting because we have fewer "things" after: we have one commit fewer (the previous HEAD commit may of course still be reachable from another branch, in which case we still have the same number of "things" afterwards). It's similar with `--soft` and `--hard`, except that the old changes end up in a different "thing".<p>At a less technical level, the point of splitting a commit is to end up with some of the changes from one commit in a new commit and the rest of the changes in another commit. That's what meant when I said "`git reset` by itself doesn't split a commit", because you need to do something like this:<p><pre><code>  git reset HEAD^
  git add -p
  git commit -C HEAD@{1}
</code></pre>
> Ok, but then what was your point?<p>Just that additional steps are needed.<p>For example, if you wanted to split the HEAD commit but you had already started working on a new commit so have some changes in the working copy, then you might instead have to do something like this:<p><pre><code>  git commit -m tmp
  git rebase -i HEAD^^ # Use the "edit" action for the first commit
  git add -p
  git commit -m first
  git rebase --continue
  git reset HEAD^
</code></pre>
The other case I mentioned was if you want to split a commit on another branch. Then you have to insert some additional commands in that sequence. As I said, I know how to do this with Git. I just find it easier to do with jj, where it's `jj split -r xyz` to split commit xyz, whether it's the current working copy, an ancestor commit, or on an unrelated branch.<p>(Take my Git commands with a grain of salt because I haven't used Git in 10 years.)</p>
]]></description><pubDate>Mon, 15 Dec 2025 01:04:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=46269072</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46269072</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46269072</guid></item><item><title><![CDATA[New comment by martinvonz in "Awesome-Jj: Jujutsu Things"]]></title><description><![CDATA[
<p>Those were rhetorical questions. I know how to use Git. Sorry that I was unclear.</p>
]]></description><pubDate>Sun, 14 Dec 2025 22:32:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=46267822</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46267822</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46267822</guid></item><item><title><![CDATA[New comment by martinvonz in "Awesome-Jj: Jujutsu Things"]]></title><description><![CDATA[
<p>I have used both Git and jj. I find it easier in jj.<p>`git reset` by itself doesn't split a commit AFAIK. You need to then `git add -p` and `git commit` (and recover the commit message from the old commit). And what happens if you had other changes in the working copy first? Or if you want to split a commit that's not at HEAD?</p>
]]></description><pubDate>Sun, 14 Dec 2025 22:02:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=46267482</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46267482</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46267482</guid></item><item><title><![CDATA[New comment by martinvonz in "Awesome-Jj: Jujutsu Things"]]></title><description><![CDATA[
<p>You can do that with just `jj split` too. The FAQ entry you linked to is for when you accidentally amended a commit and now you want to restore the bookmark to the old commit and move the changes you amended into a new commit on top instead.</p>
]]></description><pubDate>Sun, 14 Dec 2025 18:11:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=46265304</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46265304</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46265304</guid></item><item><title><![CDATA[New comment by martinvonz in "Using Git add -p for fun (and profit)"]]></title><description><![CDATA[
<p>That depends on the forge and the configuration of the forge. See the parent of the comment you replied to. Not everyone uses squash merge.</p>
]]></description><pubDate>Sun, 14 Dec 2025 16:47:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=46264391</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46264391</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46264391</guid></item><item><title><![CDATA[New comment by martinvonz in "Stacked Diffs with git rebase —onto"]]></title><description><![CDATA[
<p>Maybe you know this already but it's `jj squash --into @----` whether there are conflicts or not.</p>
]]></description><pubDate>Sun, 07 Dec 2025 19:39:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=46184420</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46184420</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46184420</guid></item><item><title><![CDATA[New comment by martinvonz in "Stacked Diffs with git rebase —onto"]]></title><description><![CDATA[
<p>> There is probably some lingering unfamiliarity with git among jj enthusiasts as well.<p>I've heard this a few times. But from what I've seen, it seems like often it's the Git enthusiasts who seem to be unfamiliar with jj. I haven't heard from anyone who used jj for a few months and knew it well and then switched to Git.</p>
]]></description><pubDate>Sun, 07 Dec 2025 19:20:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=46184250</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46184250</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46184250</guid></item><item><title><![CDATA[New comment by martinvonz in "Stacked Diffs with git rebase —onto"]]></title><description><![CDATA[
<p>Let's say you have this (modified from `git rebase --help`):<p>```
A---B---C  main
     \
      D---E---F  feature1
               \
                \---G---H  feature2
                 \
                  \---I---J  feature3
```<p>(sorry about the formatting here. I guess you'll have to copy & paste it to read it)<p>What I'm saying is that if I want to fix something in D, I do `jj new D` to create a new commit on top of D. Then I make the fix, run tests, etc., and then I run `jj squash` to amend the changes into D. The descendant commits (E through J) then get automatically rebased and the feature bookmarks/branches get updated.<p>I didn't follow what you about it other changes needed for updating the ancestor. Can you explain in the context of this example?</p>
]]></description><pubDate>Sat, 06 Dec 2025 17:45:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=46175139</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46175139</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46175139</guid></item><item><title><![CDATA[New comment by martinvonz in "Stacked Diffs with git rebase —onto"]]></title><description><![CDATA[
<p>Mostly, yes. It also covers changes to the working copy (because jj automatically snapshots changes in the working copy). It's also much easier to use, especially when many refs were updated together. But, to be fair, it's kind of hard to update many refs at once with Git in the first place (there's `git rebase --update-refs` but not much else?), so undoing multiple ref-updates is not as relevant there.</p>
]]></description><pubDate>Sat, 06 Dec 2025 16:47:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=46174690</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46174690</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46174690</guid></item><item><title><![CDATA[New comment by martinvonz in "Stacked Diffs with git rebase —onto"]]></title><description><![CDATA[
<p>You can specify a commit, yes, but how do you remember your set of unnamed commits? Once HEAD no longer points to a commit, it will not show up in `git log`.<p>I agree that Git could gain an operation log. I haven't thought much about it but it feels like it could be done in a backwards-compatible way. It sounds like a ton of work, though, especially if it's going to be a transition from having the current ref storage be the source of truth to making the operation log the source of truth.</p>
]]></description><pubDate>Sat, 06 Dec 2025 16:40:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=46174636</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46174636</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46174636</guid></item><item><title><![CDATA[New comment by martinvonz in "Stacked Diffs with git rebase —onto"]]></title><description><![CDATA[
<p>The author of `git history` is a GitLab employee and prolific Git contributor. I think he knows how `git rebase` works.</p>
]]></description><pubDate>Sat, 06 Dec 2025 14:43:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=46173709</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46173709</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46173709</guid></item><item><title><![CDATA[New comment by martinvonz in "Stacked Diffs with git rebase —onto"]]></title><description><![CDATA[
<p>> I don't think I would want to rewrite all branches based on rewriting one of the ancestors of those branches. This only makes sense for local branches, and I just never have such a set of branches.<p>Yes, it's only meant for local branches. When I used Git, I had a script for rebasing dependent branches. I remember that a coworker had written a similar script.<p>I think jj is generally more useful for people like me who often have lots of independent and dependent work in progress. If you mostly just have a one review at a time, there's much less benefit. Perhaps I would say that `jj undo` might be the most useful feature for users with simpler development (yes, I know about the reflog, but see the video I linked to in the other message).</p>
]]></description><pubDate>Sat, 06 Dec 2025 07:20:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=46171390</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46171390</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46171390</guid></item><item><title><![CDATA[New comment by martinvonz in "Stacked Diffs with git rebase —onto"]]></title><description><![CDATA[
<p>This seems to be a common misconception, that many jj users don't understand Git. Most jj users I know were pretty good at Git as far as I can tell. Perhaps you'll find this recent video where Scott Chacon talks about Jujutsu interesting: <a href="https://www.youtube.com/watch?v=PsiXflgIC8Q" rel="nofollow">https://www.youtube.com/watch?v=PsiXflgIC8Q</a>. Scott is a GitHub cofounder, author of Pro Git, and now runs GitButler.<p>> I don't think making another tool entirely is the right solution.<p>I considered making the changes to Git but the changes I wanted to make would make the UX so different that it would basically mean introducing a whole parallel command set to Git. I figured it would take ages to get Git to that state, if I could sell the ideas to the Git community at all. By the way, the video above talks about an proposed `git history` series of commands inspired by Jujutsu (also see <a href="https://lore.kernel.org/git/20250819-b4-pks-history-builtin-v1-0-9b77c32688fe@pks.im/" rel="nofollow">https://lore.kernel.org/git/20250819-b4-pks-history-builtin-...</a>).</p>
]]></description><pubDate>Sat, 06 Dec 2025 07:14:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=46171368</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46171368</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46171368</guid></item><item><title><![CDATA[New comment by martinvonz in "Stacked Diffs with git rebase —onto"]]></title><description><![CDATA[
<p>> I don't even want to learn another commit graph model, because git's model is very good.<p>I agree. That's why jj uses practically the same model. That's how Git can quite easily be used as a backend.<p>> I just looked at its FAQ, and saw a bunch of nonsensical new terms as well.<p>Like what? Perhaps we can improve it.</p>
]]></description><pubDate>Sat, 06 Dec 2025 06:21:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=46171163</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46171163</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46171163</guid></item><item><title><![CDATA[New comment by martinvonz in "Stacked Diffs with git rebase —onto"]]></title><description><![CDATA[
<p>I can pick only one? Perhaps automatic rebasing then, i.e. that all descendant commits and bookmarks (branches) are automatically updated when you rewrite a commit, e.g. by amending into it.</p>
]]></description><pubDate>Sat, 06 Dec 2025 05:06:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=46170885</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=46170885</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46170885</guid></item><item><title><![CDATA[New comment by martinvonz in "Show HN: A visual guide to learning Jujutsu (JJ)"]]></title><description><![CDATA[
<p>> but splitting is harder than selectively adding after blindly merging all changes.<p>Is the scenario that you make many changes in the working copy and then run `git add -p` a few times until you're happy with what's staged and then you `git commit`? With jj, you would run `jj split` instead of the first `git add -p` and then `jj squash -i` instead of the subsequent ones. There's no need to do anything instead of `git commit`, assuming you gave the first commit a good description when you ran `jj split`. This scenario seems similarly complex with Git and jj. Did you have a different scenario in mind or do you disagree that the complexity is similar between the tools in this scenario? Maybe I'm missing some part of it, like unstaging some of the changes?</p>
]]></description><pubDate>Sat, 15 Nov 2025 04:43:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=45935100</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=45935100</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45935100</guid></item><item><title><![CDATA[New comment by martinvonz in "Jujutsu at Google [video]"]]></title><description><![CDATA[
<p>Are you saying that that text implies that the you can undo the rebase with a single command or that all the reflogs get updated atomically? Or how is it related to the comment you replied to?</p>
]]></description><pubDate>Tue, 04 Nov 2025 06:04:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=45807828</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=45807828</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45807828</guid></item><item><title><![CDATA[New comment by martinvonz in "Jujutsu at Google [video]"]]></title><description><![CDATA[
<p>> Do you want to educate us of the command?<p>Not sure that they had in mind but you can do `jj squash --from <oldest commit with unwanted file>:: --destination 'root()' <path to unwanted file>`. That will take the changes to the unwanted file from all those commits and move them into a new commit based on the root commit (the root commit is virtual commit that's the ancestor of every other commit).</p>
]]></description><pubDate>Tue, 04 Nov 2025 00:10:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=45806072</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=45806072</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45806072</guid></item><item><title><![CDATA[New comment by martinvonz in "Jujutsu at Google [video]"]]></title><description><![CDATA[
<p>>  it always seem to amount to that people bother to read the manual and understand the tool AFTER they used a VCS for years.<p>Perhaps, but I don't think that's true for me (or for Steve). I've contributed something like 90 patches to Git itself (mostly to the rebase code). To be fair, that was a while ago.<p>My impression is actually that many people who disagree with the sentiment that jj is much easier to use seem to have not read <i>its</i> manual :) Some of them seem to have not even tried it. So, the way it looks to me, it's usually the people who argue for jj who have a better understanding of the differences between the two tools.<p>Have you tried jj yourself and/or have you read some of the documentation?</p>
]]></description><pubDate>Fri, 31 Oct 2025 22:14:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=45777283</link><dc:creator>martinvonz</dc:creator><comments>https://news.ycombinator.com/item?id=45777283</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45777283</guid></item></channel></rss>