So for a long time I did my mozilla development using Mercurial (hg) and patch queues (mq). I've recently switched to using git instead. My mercurial workflow was a bit odd, but it had the advantage that I never lost my work and had to rewrite it. Never.
3
2
6
Since I've started using git I've lost work and had to rewrite it twice. Both times I ended up with two commits merged together that should have been separate. The second time was just now, and I realized what I did.
1
1
1
My work generally involves developing series of patches meant to be on top of each other. With git, this involves a lot of "git rebase -i" (interactive rebase). The problem I hit is the differences between interactive rebase's "edit" mode and rebase's conflict resolution mode.
1
4
I do much more of the "edit" mode than the conflict resolution mode. In edit mode, you edit the files, "git add" them, "git commit --amend", and then "git rebase --continue". But in conflict resolution mode, you edit the files, "git add" them, and "git rebase --continue".
2
1
1
3
If you mess up in conflict resolution mode and type "git commit --amend" (the one difference from edit mode), what happens? The patch you're resolving conflicts in gets magically merged into the patch below it. Two changes, tangled together. One commit message lost.
5
1
4
Is this a well known problem? Do other people hit this a lot? Is it a well known "be really careful not to do this, or you'll lose your work"? Because not losing work is one of the core values of version control. And I'm *this* close to switching back to hg.
11
1
5
(I should note that most of the time in an interactive rebase I type "git commit --amend --no-edit" because I know I don't want to edit the commit message; that also means I don't see the UI that might have given me a hint that stuff was going to go wrong.)

Aug 3, 2019 · 10:20 PM UTC

4
Replying to @davidbaron
I suggest using @kneecaw's git-revise. It's *explicitly* for the use case of "roll stuff into previous patches", completely in-memory, and cannot mess up state if it has to pause for any reason. Merge conflict resolution is included but works differently. github.com/mystor/git-revise
3
4
11
Replying to @davidbaron
What I do is never amend during a rebase. Just make a new commit in the middle. When I’m done splitting and reordering, I do a new rebase where I finally merge patches. That plus reflog means it’s very hard to lose commits.
Replying to @davidbaron
I indeed sometimes do accidental `--amend` while I wanted `rebase --continue` (sometimes I do the same mistake more than once with the same PR!), so I had to abort the rebase and redo it. It's annoying, but typically resolving the conflict the 2nd time is much faster.
1
This tweet is unavailable
That doesn't work if you're developing a series of changes that are supposed to make sense separately.
1