What is the difference between these two git commands when force pushing changes?
git push -f origin branch
and git push origin +branch
git push -f is short for git push --force . It forces a push when otherwise git would reject your git push because you changed your repo history in your pushing repository. (EDIT: But that is only half the story. Forced pushes also let you overwrite someone else's commits which have been pushed after your last pull.)
You want to force push Warning: force pushing will overwrite the remote branch with the state of the branch that you're pushing. Make sure that this is what you really want to do before you use it, otherwise you may overwrite commits that you actually want to keep.
git push --force overwrites the remote branch, while git push --force-with-lease only overwrites the remote branch if your local copy is aware of all of the commits on the remote branch. This difference makes it significantly more difficult to destroy someone else's changes on the project.
In order to push your branch to another remote branch, use the “git push” command and specify the remote name, the name of your local branch as the name of the remote branch. As an example, let's say that you have created a local branch named “my-feature”.
If you're only pushing one branch, there is no difference.
git push -f origin branch
and
git push origin +branch
are exact equivalents. The difference arises when you're pushing more than one branch with a single git push
.
In a nutshell, the optional +
gives you finer control than -f
does: if you're pushing more than one ref at a time, the +
allows you to specify which of the pushed refs get force-pushed, whereas --force
(or -f
) applies to all the refs that are getting pushed.
git-push
man page tells youThe most basic form of git push
that involve one or more refspec(s) is
git push <repository> <refspec>...
The form that the <refspec>...
argument must satisfy is described in the git-push
man page thus:
<refspec>...
Specify what destination ref to update with what source object. The format of a `<refspec>` parameter is an optional plus `+`, followed by the source object `<src>`, followed by a colon `:`, followed by the destination ref `<dst>`.
So, just to be clear, the syntax for <refspec>
is
[+]<src>[:<dest>]
If :<dst>
is omitted, the same ref as <src>
will be updated... unless the remote.<repository>.push
entry (if any) in your Git config says otherwise.
Further down in the git-push
man page, you find
By having the optional leading
+
, you can tell Git to update the<dst>
ref even if it is not allowed by default (e.g., it is not a fast-forward.) This does not attempt to merge<src>
into<dst>
.
And still further down:
Note that
--force
applies to all the refs that are pushed, hence using it withpush.default
set tomatching
or with multiple push destinations configured withremote.*.push
may overwrite refs other than the current branch (including local refs that are strictly behind their remote counterpart). To force a push to only one branch, use a+
in front of the refspec to push (e.ggit push origin +master
to force a push to themaster
branch).
Consider a local repo with two branches, master
and develop
, which you want to push (with a single git push
command) to an origin
remote.
git push origin master develop
will push both branches, but neither will get force-pushed.
git push origin +master develop
will push both branches, but only master
will get force-pushed.
git push origin master +develop
, conversely, will push both branches, but only develop
will get force-pushed.
git push origin +master +develop
will force-push both branches. It's an exact equivalent to git push -f origin master develop
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With