git rebase 作用
git-rebase(认真看,分析很到位)-cengku-ChinaUnix博客
git-rebase用法总结-cengku-ChinaUnix博客
what’s is the different between git rebase and git meger. – 何锦彬 – 博客园
git rebase 解释
merge和rebase详解 — GitHub不完全装B指南 — 传送门
去看看git rebase —help的解释:
GIT-REBASE(1) Git Manual GIT-REBASE(1) NAME git-rebase – Forward-port local commits to the updated upstream head SYNOPSIS git rebase [-i | –interactive] [options] [–exec <cmd>] [–onto <newbase>] [<upstream> [<branch>]] git rebase [-i | –interactive] [options] [–exec <cmd>] [–onto <newbase>] –root [<branch>] git rebase –continue | –skip | –abort | –edit-todo DESCRIPTION If <branch> is specified, git rebase will perform an automatic git checkout <branch> before doing anything else. Otherwise it remains on the current branch. If <upstream> is not specified, the upstream configured in branch.<name>.remote and branch.<name>.merge options will be used (see git-config(1) for details) and the –fork-point option is assumed. If you are currently not on any branch or if the current branch does not have a configured upstream, the rebase will abort. All changes made by commits in the current branch but that are not in <upstream> are saved to a temporary area. This is the same set of commits that would be shown by git log <upstream>..HEAD; or by git log ‘fork_point’..HEAD, if –fork-point is active (see the description on –fork-point below); or by git log HEAD, if the –root option is specified. The current branch is reset to <upstream>, or <newbase> if the –onto option was supplied. This has the exact same effect as git reset –hard <upstream> (or <newbase>). ORIG_HEAD is set to point at the tip of the branch before the reset. The commits that were previously saved into the temporary area are then reapplied to the current branch, one by one, in order. Note that any commits in HEAD which introduce the same textual changes as a commit in HEAD..<upstream> are omitted (i.e., a patch already accepted upstream with a different commit message or timestamp will be skipped). It is possible that a merge failure will prevent this process from being completely automatic. You will have to resolve any such merge failure and run git rebase –continue. Another option is to bypass the commit that caused the merge failure with git rebase –skip. To check out the original <branch> and remove the .git/rebase-apply working files, use the command git rebase –abort instead. Assume the following history exists and the current branch is "topic": A—B—C topic / D—E—F—G master From this point, the result of either of the following commands: git rebase master git rebase master topic would be: A’–B’–C’ topic / D—E—F—G master NOTE: The latter form is just a short-hand of git checkout topic followed by git rebase master. When rebase exits topic will remain the checked-out branch. If the upstream branch already contains a change you have made (e.g., because you mailed a patch which was applied upstream), then that commit will be skipped. For example, running git rebase master on the following history (in which A’ and A introduce the same set of changes, but have different committer information): A—B—C topic / D—E—A’—F master will result in: B’—C’ topic / D—E—A’—F master 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. First let’s assume your topic is based on branch next. For example, a feature developed in topic depends on some functionality which is found in next. o—o—o—o—o master \ o—o—o—o—o next \ o—o—o topic We want to make topic forked from branch master; for example, because the functionality on which topic depends was merged into the more stable master branch. We want our tree to look 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~3 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 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 <upstream> 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 file you edit, you need to tell Git that the conflict has been resolved, typically this would be done with git add <filename> After resolving the conflict manually and updating the index with the desired resolution, you can continue the rebasing process with git rebase –continue Alternatively, you can undo the git rebase with git rebase –abort CONFIGURATION rebase.stat Whether to show a diffstat of what changed upstream since the last rebase. False by default. rebase.autoSquash If set to true enable <span style="font: 11.0px Menlo; font-variant-ligatures: no-common-ligatures; text-decoration: underline;"–<autosquash option by default. rebase.autoStash If set to true enable <span style="font-size: 11px; font-family: Menlo; text-decoration: underline;"–<autostash option by default. OPTIONS –onto <newbase> Starting point at which to create the new commits. If the –onto option is not specified, the starting point is <upstream>. May be any valid commit, and not just an existing branch name. As a special case, you may use "A…B" as a shortcut for the merge base of A and B if there is exactly one merge base. You can leave out at most one of A and B, in which case it defaults to HEAD. <upstream> Upstream branch to compare against. May be any valid commit, not just an existing branch name. Defaults to the configured upstream for the current branch. <branch> Working branch; defaults to HEAD. –continue Restart the rebasing process after having resolved a merge conflict. –abort Abort the rebase operation and reset HEAD to the original branch. If <branch> was provided when the rebase operation was started, then HEAD will be reset to <branch>. Otherwise HEAD will be reset to where it was when the rebase operation was started. –keep-empty Keep the commits that do not change anything from its parents in the result. –skip Restart the rebasing process by skipping the current patch. –edit-todo Edit the todo list during an interactive rebase. -m, –merge Use merging strategies to rebase. When the recursive (default) merge strategy is used, this allows rebase to be aware of renames on the upstream side. Note that a rebase merge works by replaying each commit from the working branch on top of the <upstream> branch. Because of this, when a merge conflict happens, the side reported as ours is the so-far rebased series, starting with <upstream>, and theirs is the working branch. In other words, the sides are swapped. -s <strategy>, –strategy=<strategy> Use the given merge strategy. If there is no -s option git merge-recursive is used instead. This implies –merge. Because git rebase replays each commit from the working branch on top of the <upstream> branch using the given strategy, using the ours strategy simply discards all patches from the <branch>, which makes little sense. -X <strategy-option>, –strategy-option=<strategy-option> Pass the <strategy-option> through to the merge strategy. This implies –merge and, if no strategy has been specified, -s recursive. Note the reversal of ours and theirs as noted above for the -m option. -S[<keyid>], –gpg-sign[=<keyid>] GPG-sign commits. -q, –quiet Be quiet. Implies –no-stat. -v, –verbose Be verbose. Implies –stat. –stat Show a diffstat of what changed upstream since the last rebase. The diffstat is also controlled by the configuration option rebase.stat. -n, –no-stat Do not show a diffstat as part of the rebase process. –no-verify This option bypasses the pre-rebase hook. See also githooks(5). –verify Allows the pre-rebase hook to run, which is the default. This option can be used to override –no-verify. See also githooks(5). -C<n> Ensure at least <n> 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. -f, –force-rebase Force a rebase even if the current branch is up-to-date and the command without –force would return without doing anything. You may find this (or –no-ff with an interactive rebase) helpful after reverting a topic branch merge, as this option recreates the topic branch with fresh commits so it can be remerged successfully without needing to "revert the reversion" (see the revert-a-faulty-merge How-To[1] for details). –fork-point, –no-fork-point Use reflog to find a better common ancestor between <upstream> and <branch> when calculating which commits have been introduced by <branch>. When –fork-point is active, fork_point will be used instead of <upstream> to calculate the set of commits to rebase, where fork_point is the result of git merge-base –fork-point <upstream> <branch> command (see git-merge-base(1)). If fork_point ends up being empty, the <upstream> will be used as a fallback. If either <upstream> or –root is given on the command line, then the default is –no-fork-point, otherwise the default is –fork-point. –ignore-whitespace, –whitespace=<option> These flag are passed to the git apply program (see git-apply(1)) that applies the patch. Incompatible with the –interactive option. –committer-date-is-author-date, –ignore-date These flags are passed to git am to easily change the dates of the rebased commits (see git- am(1)). Incompatible with the –interactive option. -i, –interactive Make a list of the commits which are about to be rebased. Let the user edit that list before rebasing. This mode can also be used to split commits (see SPLITTING COMMITS below). -p, –preserve-merges Recreate merge commits instead of flattening the history by replaying commits a merge commit introduces. Merge conflict resolutions or manual amendments to merge commits are not preserved. This uses the –interactive machinery internally, but combining it with the –interactive option explicitly is generally not a good idea unless you know what you are doing (see BUGS below). -x <cmd>, –exec <cmd> Append "exec <cmd>" after each line creating a commit in the final history. <cmd> will be interpreted as one or more shell commands. This option can only be used with the –interactive option (see INTERACTIVE MODE below). You may execute several commands by either using one instance of –exec with several commands: git rebase -i –exec "cmd1 && cmd2 && …" or by giving more than one –exec: git rebase -i –exec "cmd1" –exec "cmd2" –exec … If –autosquash is used, "exec" lines will not be appended for the intermediate commits, and will only appear at the end of each squash/fixup series. –root Rebase all commits reachable from <branch>, instead of limiting them with an <upstream>. This allows you to rebase the root commit(s) on a branch. When used with –onto, it will skip changes already contained in <newbase> (instead of <upstream>) whereas without –onto it will operate on every change. When used together with both –onto and –preserve-merges, all root commits will be rewritten to have <newbase> as parent instead. –autosquash, –no-autosquash When the commit log message begins with "squash! …" (or "fixup! …"), and there is a commit whose title begins with the same …, automatically modify the todo list of rebase -i so that the commit marked for squashing comes right after the commit to be modified, and change the action of the moved commit from pick to squash (or fixup). Ignores subsequent "fixup! " or "squash! " after the first, in case you referred to an earlier fixup/squash with git commit –fixup/–squash. This option is only valid when the <span style="font: 11.0px Menlo; font-variant-ligatures: no-common-ligatures; text-decoration: underline;"–<interactive option is used. If the <span style="font: 11.0px Menlo; font-variant-ligatures: no-common-ligatures; text-decoration: underline;"–<autosquash option is enabled by default using the configuration variable rebase.autoSquash, this option can be used to override and disable this setting. –[no-]autostash Automatically create a temporary stash before the operation begins, and apply it after the operation ends. This means that you can run rebase on a dirty worktree. However, use with care: the final stash application after a successful rebase might result in non-trivial conflicts. –no-ff With –interactive, cherry-pick all rebased commits instead of fast-forwarding over the unchanged ones. This ensures that the entire history of the rebased branch is composed of new commits. Without –interactive, this is a synonym for –force-rebase. You may find this helpful after reverting a topic branch merge, as this option recreates the topic branch with fresh commits so it can be remerged successfully without needing to "revert the reversion" (see the revert-a-faulty-merge How-To[1] for details). MERGE STRATEGIES The merge mechanism (git merge and git pull commands) allows the backend merge strategies to be chosen with -s option. Some strategies can also take their own options, which can be passed by giving -X<option> arguments to git merge and/or git pull. resolve This can only resolve two heads (i.e. the current branch and another branch you pulled from) using a 3-way merge algorithm. It tries to carefully detect criss-cross merge ambiguities and is considered generally safe and fast. recursive This can only resolve two heads using a 3-way merge algorithm. When there is more than one common ancestor that can be used for 3-way merge, it creates a merged tree of the common ancestors and uses that as the reference tree for the 3-way merge. This has been reported to result in fewer merge conflicts without causing mismerges by tests done on actual merge commits taken from Linux 2.6 kernel development history. Additionally this can detect and handle merges involving renames. This is the default merge strategy when pulling or merging one branch. The recursive strategy can take the following options: ours This option forces conflicting hunks to be auto-resolved cleanly by favoring our version. Changes from the other tree that do not conflict with our side are reflected to the merge result. For a binary file, the entire contents are taken from our side. This should not be confused with the ours merge strategy, which does not even look at what the other tree contains at all. It discards everything the other tree did, declaring our history contains all that happened in it. theirs This is the opposite of ours. patience With this option, merge-recursive spends a little extra time to avoid mismerges that sometimes occur due to unimportant matching lines (e.g., braces from distinct functions). Use this when the branches to be merged have diverged wildly. See also git-diff(1)–patience. diff-algorithm=[patience|minimal|histogram|myers] Tells merge-recursive to use a different diff algorithm, which can help avoid mismerges that 。。。。。。 |
使用git Rebase让历史变得清晰 – Ji ZHANG’s Blog
【总结】
5.1 代码合并:Merge、Rebase的选择 · geeeeeeeeek/git-recipes Wiki · GitHub
解释的相对最清楚。
其最终目的是:
把新的分支,在想要合并到主分支之前
但是由于主分支已经有更新了
用rebase实现:
把主分支的几个更新,弄到新分支上来,重新再去合并
-》使得主分支上面,就不会出现很多的分支和并入了。
抽空还是要继续学习Git,
可以先看看:
解释的比较易懂。
转载请注明:在路上 » 【整理】git的rebase的作用和用法