On Thu, Jul 13, 2017 at 12:10:39PM -0700, Junio C Hamano wrote: > > - I suspect in the third example we probably ought to be using the > > reflog of the branch that HEAD points to. You would not want: > > > > $ git checkout advanced-branch $ git checkout older-branch $ git > > push --force-with-lease origin HEAD:older-branch > > > > to consider that commits in advanced-branch are part of the lease. > > The third one was meant to be rewriting on detached HEAD, not having > any underlying branch. Ah, OK, that makes a lot more sense. I'd be tempted to say that it should not allow force-with-lease at all. The HEAD reflog sees too many unrelated things to make it a good basis for "does this result account for everything in its reflog". > > - For step 3, I'm not sure if we you mean to look for exactly X, or > > if it would be OK to have any commit whose ancestor is X. I think > > you'd need the latter to accommodate a non-fast-forward "git pull" > > (or fetch+merge) where the local ref is never set precisely to the > > upstream commit. > > But the result in that case is a descendant of upstream you just > merged, so you do not even want to use any form of forcing---you > would rather want to rely on the usual "push must fast-forward" > mechanism, no? Sorry, I mean the case where you do a merge from the other side, but then you end up rewinding the history in some way, taking into account that merge and everything they did. For example: $ git pull $ git rebase ;# this will flatten the merge $ git push --force-with-lease There was never a moment where the other side's tip ref was in your local branch, but you did incorporate it via the merge. -Peff