On Wed, Oct 31, 2018 at 12:13:06PM -0700, Alexander Mills wrote: > I have been confused about the need for --force-with-lease after rebasing > > Imagine I have a feature branch: > > git checkout --no-track -b 'feature' 'origin/dev' > git push -u origin feature > > I do some work, and then I rebase against origin/dev to keep up to > date with the integration branch. > > git fetch origin/dev > git rebase origin/dev > > then I try to push to the remote > > git push origin feature > > but that is rejected, I have to do: > > git push --force-with-lease origin feature > > why is that? Why do I need to force push my feature branch to the > remote tracking branch after rebasing against the integration branch? When you perform a push to an existing branch, Git checks to make sure that the push is a fast-forward; that is, that your changes are a strict superset of the commits that are in that branch. When you rebase a branch, you rewrite the commits and their object IDs (their hashes). Since you've rewritten some of the commits that were on the version of your branch that you pushed to the server, the commits you want to push are no longer a strict superset, and Git requires a force push. This provision is in place to prevent data loss. For example, if you and a colleague are both collaborating on a branch that isn't rebased, you would want to avoid pushing changes that overwrote those that your colleague had made. Git making your push fail is its way of helping you realize that there are changes you have not included and making you decide how you want to handle them. You strictly do not need to use --force-with-lease; you could just use --force instead. But using --force-with-lease over --force when possible ensures that you are overwriting what you think you're overwriting, and not additional working changes that someone else has made, so it's a good practice. -- brian m. carlson: Houston, Texas, US OpenPGP: https://keybase.io/bk2204