-Xours
tells Git to protect the new base. By bringing in only the additions that the incoming commits have made, it protects what is already in the new base.
Recap: A rebase moves a series of commits from one base to another base.
What does the --strategy
do? When a rebase hits a conflict, git attempts to resolve it with one of these merge-strategies:
resolve
recursive
(default)ours
theirs
patience
ignore-space-change
ignore-all-space
ignore-space-at-eol
renormalize
no-renames
find-renames[=<n>]
subtree=<path>
octopus
ours
subtree
recursive
with ours
is one of our favorite strategies. To use it, choose --strategy recursive
and pass the ours
sub-option using the -X<sub-option>
syntax.
// e.g. 1
git rebase --onto <the-new-base> <exclusive-start-ref> <inclusive-end-ref> --strategy recursive -Xours
// e.g. 2
git rebase --onto master topic-branch~5 topic-branch --strategy recursive -Xours
In the second example, Git takes the last four commits from topic-branch
and plays them back onto master
. If Git finds a conflicting hunk, it chooses the content of master
; otherwise, Git adds the content of topic-branch
. In other words, Git brings in to master only the additions that the topic branch has made.
We used -Xours
recently to bring in deployment scripts from a long-lived experimental branch. We were only interested in the deployment scripts that experiemental-branch
had added to the code base. If we had done a normal rebase, we would have had to deal with the conflicts that the experimental work had introduced to the existing code. Using -Xours
instead told Git, "Just bring in the stuff that experimental-branch
added." Those additions turned out to be the deployment scripts. Done. If there had been other additions, though, we could have easily detected and deleted them.
See also: