X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=Documentation%2Fgit-rebase.txt;h=2f417a8f856094b3664eeff2ff3f0ce761c89503;hb=923642fe1bdf010a1f2bef1507e17b9ee97cbf87;hp=9d7bcaa38cc5c13e29c00ddd18c64202e98cb5f8;hpb=57be46fd213b448f66b1470187109e7d6ad6f475;p=git.git diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index 9d7bcaa38..2f417a8f8 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -3,21 +3,30 @@ git-rebase(1) NAME ---- -git-rebase - Rebase local commits to a new head +git-rebase - Forward-port local commits to the updated upstream head SYNOPSIS -------- -'git-rebase' [--merge] [--onto ] [] +'git-rebase' [-v] [--merge] [-C] [--onto ] [] 'git-rebase' --continue | --skip | --abort DESCRIPTION ----------- -git-rebase replaces with a new branch of the same name. When -the --onto option is provided the new branch starts out with a HEAD equal -to , otherwise it is equal to . It then attempts to -create a new commit for each commit from the original that does -not exist in the branch. +If is specified, git-rebase will perform an automatic +`git checkout ` before doing anything else. Otherwise +it remains on the current branch. + +All changes made by commits in the current branch but that are not +in are saved to a temporary area. This is the same set +of commits that would be shown by `git log ..HEAD`. + +The current branch is reset to , or if the +--onto option was supplied. This has the exact same effect as +`git reset --hard ` (or ). + +The commits that were previously saved into the temporary area are +then reapplied to the current branch, one by one, in order. It is possible that a merge failure will prevent this process from being completely automatic. You will have to resolve any such merge failure @@ -26,9 +35,6 @@ that caused the merge failure with `git rebase --skip`. To restore the original and remove the .dotest working files, use the command `git rebase --abort` instead. -Note that if is not specified on the command line, the currently -checked out branch is used. - Assume the following history exists and the current branch is "topic": ------------ @@ -51,20 +57,90 @@ would be: D---E---F---G master ------------ -While, starting from the same point, the result of either of the following -commands: +The latter form is just a short-hand of `git checkout topic` +followed by `git rebase master`. - git-rebase --onto master~1 master - git-rebase --onto master~1 master topic +Here is how you would transplant a topic branch based on one +branch to another, to pretend that you forked the topic branch +from the latter branch, using `rebase --onto`. -would be: +First let's assume your 'topic' is based on branch 'next'. +For example feature developed in 'topic' depends on some +functionality which is found in 'next'. ------------ - A'--B'--C' topic - / - D---E---F---G master + o---o---o---o---o master + \ + o---o---o---o---o next + \ + o---o---o topic +------------ + +We would want to make 'topic' forked from branch 'master', +for example because the functionality 'topic' branch depend on +got merged into more stable 'master' branch, like this: + +------------ + o---o---o---o---o master + | \ + | o'--o'--o' topic + \ + o---o---o---o---o next +------------ + +We can get this using the following command: + + git-rebase --onto master next topic + + +Another example of --onto option is to rebase part of a +branch. If we have the following situation: + +------------ + H---I---J topicB + / + E---F---G topicA + / + A---B---C---D master +------------ + +then the command + + git-rebase --onto master topicA topicB + +would result in: + +------------ + H'--I'--J' topicB + / + | E---F---G topicA + |/ + A---B---C---D master +------------ + +This is useful when topicB does not depend on topicA. + +A range of commits could also be removed with rebase. If we have +the following situation: + +------------ + E---F---G---H---I---J topicA ------------ +then the command + + git-rebase --onto topicA~5 topicA~2 topicA + +would result in the removal of commits F and G: + +------------ + E---H'---I'---J' topicA +------------ + +This is useful if F and G were flawed in some way, or should not be +part of topicA. Note that the argument to --onto and the +parameter can be any valid commit-ish. + In case of conflict, git-rebase will stop at the first problematic commit and leave conflict markers in the tree. You can use git diff to locate the markers (<<<<<<) and make edits to resolve the conflict. For each @@ -72,7 +148,7 @@ file you edit, you need to tell git that the conflict has been resolved, typically this would be done with - git update-index + git add After resolving the conflict manually and updating the index with the @@ -92,10 +168,12 @@ OPTIONS :: Starting point at which to create the new commits. If the --onto option is not specified, the starting point is - . + . May be any valid commit, and not just an + existing branch name. :: - Upstream branch to compare against. + Upstream branch to compare against. May be any valid commit, + not just an existing branch name. :: Working branch; defaults to HEAD. @@ -121,6 +199,15 @@ OPTIONS is used instead (`git-merge-recursive` when merging a single head, `git-merge-octopus` otherwise). This implies --merge. +-v, \--verbose:: + Display a diffstat of what changed upstream since the last rebase. + +-C:: + Ensure at least lines of surrounding context match before + and after each change. When fewer lines of surrounding + context exist they all must match. By default no context is + ever ignored. + include::merge-strategies.txt[] NOTES