| git-merge(1) | |
| ============ | |
| NAME | |
| ---- | |
| git-merge - Join two or more development histories together | |
| SYNOPSIS | |
| -------- | |
| [synopsis] | |
| git merge [-n] [--stat] [--compact-summary] [--no-commit] [--squash] [--[no-]edit] | |
| [--no-verify] [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]] | |
| [--[no-]allow-unrelated-histories] | |
| [--[no-]rerere-autoupdate] [-m <msg>] [-F <file>] | |
| [--into-name <branch>] [<commit>...] | |
| git merge (--continue | --abort | --quit) | |
| DESCRIPTION | |
| ----------- | |
| Incorporates changes from the named commits (since the time their | |
| histories diverged from the current branch) into the current | |
| branch. This command is used by `git pull` to incorporate changes | |
| from another repository and can be used by hand to merge changes | |
| from one branch into another. | |
| Assume the following history exists and the current branch is | |
| `master`: | |
| ------------ | |
| A---B---C topic | |
| / | |
| D---E---F---G master | |
| ------------ | |
| Then `git merge topic` will replay the changes made on the | |
| `topic` branch since it diverged from `master` (i.e., `E`) until | |
| its current commit (`C`) on top of `master`, and record the result | |
| in a new commit along with the names of the two parent commits and | |
| a log message from the user describing the changes. Before the operation, | |
| `ORIG_HEAD` is set to the tip of the current branch (`G`). | |
| ------------ | |
| A---B---C topic | |
| / \ | |
| D---E---F---G---H master | |
| ------------ | |
| A merge stops if there's a conflict that cannot be resolved | |
| automatically or if `--no-commit` was provided when initiating the | |
| merge. At that point you can run `git merge --abort` or `git merge | |
| --continue`. | |
| `git merge --abort` will abort the merge process and try to reconstruct | |
| the pre-merge state. However, if there were uncommitted changes when the | |
| merge started (and especially if those changes were further modified | |
| after the merge was started), `git merge --abort` will in some cases be | |
| unable to reconstruct the original (pre-merge) changes. Therefore: | |
| WARNING: Running `git merge` with non-trivial uncommitted changes is | |
| discouraged: while possible, it may leave you in a state that is hard to | |
| back out of in the case of a conflict. | |
| OPTIONS | |
| ------- | |
| :git-merge: 1 | |
| include::merge-options.adoc[] | |
| `-m <msg>`:: | |
| Set the commit message to be used for the merge commit (in | |
| case one is created). | |
| + | |
| If `--log` is specified, a shortlog of the commits being merged | |
| will be appended to the specified message. | |
| + | |
| The `git fmt-merge-msg` command can be | |
| used to give a good default for automated `git merge` | |
| invocations. The automated message can include the branch description. | |
| `--into-name <branch>`:: | |
| Prepare the default merge message as if merging to the branch | |
| _<branch>_, instead of the name of the real branch to which | |
| the merge is made. | |
| `-F <file>`:: | |
| `--file=<file>`:: | |
| Read the commit message to be used for the merge commit (in | |
| case one is created). | |
| + | |
| If `--log` is specified, a shortlog of the commits being merged | |
| will be appended to the specified message. | |
| include::rerere-options.adoc[] | |
| `--overwrite-ignore`:: | |
| `--no-overwrite-ignore`:: | |
| Silently overwrite ignored files from the merge result. This | |
| is the default behavior. Use `--no-overwrite-ignore` to abort. | |
| `--abort`:: | |
| Abort the current conflict resolution process, and | |
| try to reconstruct the pre-merge state. If an autostash entry is | |
| present, apply it to the worktree. | |
| + | |
| If there were uncommitted worktree changes present when the merge | |
| started, `git merge --abort` will in some cases be unable to | |
| reconstruct these changes. It is therefore recommended to always | |
| commit or stash your changes before running `git merge`. | |
| + | |
| `git merge --abort` is equivalent to `git reset --merge` when | |
| `MERGE_HEAD` is present unless `MERGE_AUTOSTASH` is also present in | |
| which case `git merge --abort` applies the stash entry to the worktree | |
| whereas `git reset --merge` will save the stashed changes in the stash | |
| list. | |
| `--quit`:: | |
| Forget about the current merge in progress. Leave the index | |
| and the working tree as-is. If `MERGE_AUTOSTASH` is present, the | |
| stash entry will be saved to the stash list. | |
| `--continue`:: | |
| After a `git merge` stops due to conflicts you can conclude the | |
| merge by running `git merge --continue` (see "HOW TO RESOLVE | |
| CONFLICTS" section below). | |
| `<commit>...`:: | |
| Commits, usually other branch heads, to merge into our branch. | |
| Specifying more than one commit will create a merge with | |
| more than two parents (affectionately called an Octopus merge). | |
| + | |
| If no commit is given from the command line, merge the remote-tracking | |
| branches that the current branch is configured to use as its upstream. | |
| See also the configuration section of this manual page. | |
| + | |
| When `FETCH_HEAD` (and no other commit) is specified, the branches | |
| recorded in the `.git/FETCH_HEAD` file by the previous invocation | |
| of `git fetch` for merging are merged to the current branch. | |
| PRE-MERGE CHECKS | |
| ---------------- | |
| Before applying outside changes, you should get your own work in | |
| good shape and committed locally, so it will not be clobbered if | |
| there are conflicts. See also linkgit:git-stash[1]. | |
| `git pull` and `git merge` will stop without doing anything when | |
| local uncommitted changes overlap with files that `git pull`/`git | |
| merge` may need to update. | |
| To avoid recording unrelated changes in the merge commit, | |
| `git pull` and `git merge` will also abort if there are any changes | |
| registered in the index relative to the `HEAD` commit. (Special | |
| narrow exceptions to this rule may exist depending on which merge | |
| strategy is in use, but generally, the index must match `HEAD`.) | |
| If all named commits are already ancestors of `HEAD`, `git merge` | |
| will exit early with the message "Already up to date." | |
| FAST-FORWARD MERGE | |
| ------------------ | |
| Often the current branch head is an ancestor of the named commit. | |
| This is the most common case especially when invoked from `git | |
| pull`: you are tracking an upstream repository, you have committed | |
| no local changes, and now you want to update to a newer upstream | |
| revision. In this case, a new commit is not needed to store the | |
| combined history; instead, the `HEAD` (along with the index) is | |
| updated to point at the named commit, without creating an extra | |
| merge commit. | |
| This behavior can be suppressed with the `--no-ff` option. | |
| TRUE MERGE | |
| ---------- | |
| Except in a fast-forward merge (see above), the branches to be | |
| merged must be tied together by a merge commit that has both of them | |
| as its parents. | |
| A merged version reconciling the changes from all branches to be | |
| merged is committed, and your `HEAD`, index, and working tree are | |
| updated to it. It is possible to have modifications in the working | |
| tree as long as they do not overlap; the update will preserve them. | |
| When it is not obvious how to reconcile the changes, the following | |
| happens: | |
| 1. The `HEAD` pointer stays the same. | |
| 2. The `MERGE_HEAD` ref is set to point to the other branch head. | |
| 3. Paths that merged cleanly are updated both in the index file and | |
| in your working tree. | |
| 4. For conflicting paths, the index file records up to three | |
| versions: stage 1 stores the version from the common ancestor, | |
| stage 2 from `HEAD`, and stage 3 from `MERGE_HEAD` (you | |
| can inspect the stages with `git ls-files -u`). The working | |
| tree files contain the result of the merge operation; i.e. 3-way | |
| merge results with familiar conflict markers +<<<+ `===` +>>>+. | |
| 5. A ref named `AUTO_MERGE` is written, pointing to a tree | |
| corresponding to the current content of the working tree (including | |
| conflict markers for textual conflicts). Note that this ref is only | |
| written when the `ort` merge strategy is used (the default). | |
| 6. No other changes are made. In particular, the local | |
| modifications you had before you started merge will stay the | |
| same and the index entries for them stay as they were, | |
| i.e. matching `HEAD`. | |
| If you tried a merge which resulted in complex conflicts and | |
| want to start over, you can recover with `git merge --abort`. | |
| MERGING TAG | |
| ----------- | |
| When merging an annotated (and possibly signed) tag, Git always | |
| creates a merge commit even if a fast-forward merge is possible, and | |
| the commit message template is prepared with the tag message. | |
| Additionally, if the tag is signed, the signature check is reported | |
| as a comment in the message template. See also linkgit:git-tag[1]. | |
| When you want to just integrate with the work leading to the commit | |
| that happens to be tagged, e.g. synchronizing with an upstream | |
| release point, you may not want to make an unnecessary merge commit. | |
| In such a case, you can "unwrap" the tag yourself before feeding it | |
| to `git merge`, or pass `--ff-only` when you do not have any work on | |
| your own. e.g. | |
| ---- | |
| git fetch origin | |
| git merge v1.2.3^0 | |
| git merge --ff-only v1.2.3 | |
| ---- | |
| HOW CONFLICTS ARE PRESENTED | |
| --------------------------- | |
| During a merge, the working tree files are updated to reflect the result | |
| of the merge. Among the changes made to the common ancestor's version, | |
| non-overlapping ones (that is, you changed an area of the file while the | |
| other side left that area intact, or vice versa) are incorporated in the | |
| final result verbatim. When both sides made changes to the same area, | |
| however, Git cannot randomly pick one side over the other, and asks you to | |
| resolve it by leaving what both sides did to that area. | |
| By default, Git uses the same style as the one used by the "merge" program | |
| from the RCS suite to present such a conflicted hunk, like this: | |
| ------------ | |
| Here are lines that are either unchanged from the common | |
| ancestor, or cleanly resolved because only one side changed, | |
| or cleanly resolved because both sides changed the same way. | |
| <<<<<<< yours:sample.txt | |
| Conflict resolution is hard; | |
| let's go shopping. | |
| ======= | |
| Git makes conflict resolution easy. | |
| >>>>>>> theirs:sample.txt | |
| And here is another line that is cleanly resolved or unmodified. | |
| ------------ | |
| The area where a pair of conflicting changes happened is marked with markers | |
| +<<<<<<<+, `=======`, and +>>>>>>>+. The part before the `=======` | |
| is typically your side, and the part afterwards is typically their side. | |
| The default format does not show what the original said in the conflicting | |
| area. You cannot tell how many lines are deleted and replaced with | |
| Barbie's remark on your side. The only thing you can tell is that your | |
| side wants to say it is hard and you'd prefer to go shopping, while the | |
| other side wants to claim it is easy. | |
| An alternative style can be used by setting the `merge.conflictStyle` | |
| configuration variable to either `diff3` or `zdiff3`. In `diff3` | |
| style, the above conflict may look like this: | |
| ------------ | |
| Here are lines that are either unchanged from the common | |
| ancestor, or cleanly resolved because only one side changed, | |
| <<<<<<< yours:sample.txt | |
| or cleanly resolved because both sides changed the same way. | |
| Conflict resolution is hard; | |
| let's go shopping. | |
| ||||||| base:sample.txt | |
| or cleanly resolved because both sides changed identically. | |
| Conflict resolution is hard. | |
| ======= | |
| or cleanly resolved because both sides changed the same way. | |
| Git makes conflict resolution easy. | |
| >>>>>>> theirs:sample.txt | |
| And here is another line that is cleanly resolved or unmodified. | |
| ------------ | |
| while in `zdiff3` style, it may look like this: | |
| ------------ | |
| Here are lines that are either unchanged from the common | |
| ancestor, or cleanly resolved because only one side changed, | |
| or cleanly resolved because both sides changed the same way. | |
| <<<<<<< yours:sample.txt | |
| Conflict resolution is hard; | |
| let's go shopping. | |
| ||||||| base:sample.txt | |
| or cleanly resolved because both sides changed identically. | |
| Conflict resolution is hard. | |
| ======= | |
| Git makes conflict resolution easy. | |
| >>>>>>> theirs:sample.txt | |
| And here is another line that is cleanly resolved or unmodified. | |
| ------------ | |
| In addition to the +<<<<<<<+, `=======`, and +>>>>>>>+ markers, it uses | |
| another +|||||||+ marker that is followed by the original text. You can | |
| tell that the original just stated a fact, and your side simply gave in to | |
| that statement and gave up, while the other side tried to have a more | |
| positive attitude. You can sometimes come up with a better resolution by | |
| viewing the original. | |
| HOW TO RESOLVE CONFLICTS | |
| ------------------------ | |
| After seeing a conflict, you can do two things: | |
| * Decide not to merge. The only clean-ups you need are to reset | |
| the index file to the `HEAD` commit to reverse 2. and to clean | |
| up working tree changes made by 2. and 3.; `git merge --abort` | |
| can be used for this. | |
| * Resolve the conflicts. Git will mark the conflicts in | |
| the working tree. Edit the files into shape and | |
| `git add` them to the index. Use `git commit` or | |
| `git merge --continue` to seal the deal. The latter command | |
| checks whether there is a (interrupted) merge in progress | |
| before calling `git commit`. | |
| You can work through the conflict with a number of tools: | |
| * Use a mergetool. `git mergetool` to launch a graphical | |
| mergetool which will work through the merge with you. | |
| * Look at the diffs. `git diff` will show a three-way diff, | |
| highlighting changes from both the `HEAD` and `MERGE_HEAD` | |
| versions. `git diff AUTO_MERGE` will show what changes you've | |
| made so far to resolve textual conflicts. | |
| * Look at the diffs from each branch. `git log --merge -p <path>` | |
| will show diffs first for the `HEAD` version and then the | |
| `MERGE_HEAD` version. | |
| * Look at the originals. `git show :1:filename` shows the | |
| common ancestor, `git show :2:filename` shows the `HEAD` | |
| version, and `git show :3:filename` shows the `MERGE_HEAD` | |
| version. | |
| EXAMPLES | |
| -------- | |
| * Merge branches `fixes` and `enhancements` on top of | |
| the current branch, making an octopus merge: | |
| + | |
| ------------------------------------------------ | |
| $ git merge fixes enhancements | |
| ------------------------------------------------ | |
| * Merge branch `obsolete` into the current branch, using `ours` | |
| merge strategy: | |
| + | |
| ------------------------------------------------ | |
| $ git merge -s ours obsolete | |
| ------------------------------------------------ | |
| * Merge branch `maint` into the current branch, but do not make | |
| a new commit automatically: | |
| + | |
| ------------------------------------------------ | |
| $ git merge --no-commit maint | |
| ------------------------------------------------ | |
| + | |
| This can be used when you want to include further changes to the | |
| merge, or want to write your own merge commit message. | |
| + | |
| You should refrain from abusing this option to sneak substantial | |
| changes into a merge commit. Small fixups like bumping | |
| release/version name would be acceptable. | |
| include::merge-strategies.adoc[] | |
| CONFIGURATION | |
| ------------- | |
| `branch.<name>.mergeOptions`:: | |
| Sets default options for merging into branch _<name>_. The syntax and | |
| supported options are the same as those of `git merge`, but option | |
| values containing whitespace characters are currently not supported. | |
| include::includes/cmd-config-section-rest.adoc[] | |
| include::config/merge.adoc[] | |
| SEE ALSO | |
| -------- | |
| linkgit:git-fmt-merge-msg[1], linkgit:git-pull[1], | |
| linkgit:gitattributes[5], | |
| linkgit:git-reset[1], | |
| linkgit:git-diff[1], linkgit:git-ls-files[1], | |
| linkgit:git-add[1], linkgit:git-rm[1], | |
| linkgit:git-mergetool[1] | |
| GIT | |
| --- | |
| Part of the linkgit:git[1] suite |