Right now the default variant does this:

> --force-with-lease alone, without specifying the details, will protect all 
> remote refs that are going to be updated by requiring their current value to 
> be the same as the remote-tracking branch we have for them.

The problem is people sometimes run "git fetch".   And so "git push
--force-with-lease" is going to do the push even if the local version
is stale.

Instead I think the default behavior should require that the remote
ref's current value be equal to the merge-base of the local-branch and
remote-tracking-branch.

Here's an example (password is "test" for the push):

git clone http://t...@vm.bit-booster.com/bitbucket/scm/bb/a.git
cd a
git checkout bugfix/TKT-123
git reset --hard HEAD~1   (to simulate situation where local is stale,
but remote is up to date)

At this point "git push --force-with-lease" is going to work.   But I
think it shouldn't.   (Note: I use push.default = simple).

Here's how I think it should work:

git push --force-with-lease=bugfix/TKT-123:$(git merge-base HEAD
origin/bugfix/TKT-123)
To http://vm.bit-booster.com/bitbucket/scm/bb/a.git
 ! [rejected]        bugfix/TKT-123 -> bugfix/TKT-123 (stale info)


For now I'm happy with this alias:

git config --global alias.please '!sh -c "git push
--force-with-lease=$(git rev-parse --abbrev-ref HEAD):$(git merge-base
HEAD @{u})"'

But I'd like to put together a patch if people are interested in a
tweak like this to the --force-with-lease default behaviour.  I
haven't written much C in my life, but thought this might make a good
force-myself-to-learn-C exercise.


- Sylvie Davies

ps.  I never thought about the fetch problem with --force-with-lease
until reading https://developer.atlassian.com/blog/2015/04/force-with-lease/
and https://buddyreno.me/git-please-a182f28efeb5#.s291gh5jn , so
thanks to them!

Reply via email to