From: Phillip Wood Date: Fri, 04 Nov 2022 10:40:39 GMT Subject: Re: rebase -i --update-refs can lead to deletion of branches Message-ID: In-Reply-To: <123628cc-1410-aaa0-0151-2dff35bd1855@github.com> Hi Victoria On 04/11/2022 00:31, Victoria Dye wrote: > herr.kaste wrote: >> Now, I should just have not used `--update-refs` in the first place but anyway >> I decide late that I rather don't want to update "master" etc. and it should >> probably not delete the local refs. >> > > Agreed, this doesn't seem like desired behavior - the opposite of "update > the ref" isn't "delete the ref". ;) > > The reason it's happening is because, when '--update-refs' is used, the > rebase starts by constructing a list of 'update_ref_record's for each of the > refs that *could* be updated. Each item in that list contains the > corresponding ref's "before" commit OID (i.e., what it currently points to) > and initializes the "after" OID to null. When an 'update-ref' line is > encountered in the 'rebase-todo', the "after" OID is updated with the > newly-rebased value. However, if an 'update-ref' line is removed from the > 'rebase-todo', the "after" value is never updated. Then, when the rebase > finishes and the ref state data is applied, all of the entries with null > "after" OIDs are deleted. > > The three options for a fix I can think of are: > > 1. initialize the "after" OID to the value of "before". > 2. don't update refs with a null "after" OID. > 3. initialize the "after" OID to the value of "before", don't update the > ref if "before" == "after". > > I think #3 is the best option, since it avoids the unnecessary updates of #1 > and leaves a cleaner path to a 'delete-ref' option (like the one proposed > elsewhere in the thread [1]) than #2. I'll send a patch shortly. We should be removing the entry entirely if the user removes it from the todo-list see b3b1a21d1a (sequencer: rewrite update-refs as user edits todo list, 2022-07-19) where the commit message says 1. If a '//' triple in the update-refs file does not have a matching 'update-ref ' command in the todo-list _and_ the value is the null OID, then remove that triple. Here, the user removed the 'update-ref ' command before it was executed, since if it was executed then the value would store the commit at that position. I think that is the best approach but it seems the implementation isn't actually doing that. Best Wishes Phillip > [1] https://lore.kernel.org/git/CA+JQ7M-GbBTHZZ9xOLR=FitWFpUnkfuep9kSfNPxuSbJbKteGw@mail.gmail.com/ > > Thanks for reporting! > - Victoria >