|  | git-merge(1) | 
|  | ============ | 
|  |  | 
|  | NAME | 
|  | ---- | 
|  | git-merge - Join two or more development histories together | 
|  |  | 
|  |  | 
|  | SYNOPSIS | 
|  | -------- | 
|  | [verse] | 
|  | 'git merge' [-n] [--stat] [--no-commit] [--squash] [-s <strategy>]... | 
|  | [-m <msg>] <remote> <remote>... | 
|  | 'git merge' <msg> HEAD <remote>... | 
|  |  | 
|  | DESCRIPTION | 
|  | ----------- | 
|  | This is the top-level interface to the merge machinery | 
|  | which drives multiple merge strategy scripts. | 
|  |  | 
|  | The second syntax (<msg> `HEAD` <remote>) is supported for | 
|  | historical reasons. Do not use it from the command line or in | 
|  | new scripts. It is the same as `git merge -m <msg> <remote>`. | 
|  |  | 
|  |  | 
|  | OPTIONS | 
|  | ------- | 
|  | include::merge-options.txt[] | 
|  |  | 
|  | -m <msg>:: | 
|  | The commit message to be used for the merge commit (in case | 
|  | it is created). The 'git-fmt-merge-msg' script can be used | 
|  | to give a good default for automated 'git-merge' invocations. | 
|  |  | 
|  | <remote>...:: | 
|  | Other branch heads to merge into our branch. You need at | 
|  | least one <remote>. Specifying more than one <remote> | 
|  | obviously means you are trying an Octopus. | 
|  |  | 
|  | include::merge-strategies.txt[] | 
|  |  | 
|  |  | 
|  | If you tried a merge which resulted in complex conflicts and | 
|  | want to start over, you can recover with 'git-reset'. | 
|  |  | 
|  | CONFIGURATION | 
|  | ------------- | 
|  | include::merge-config.txt[] | 
|  |  | 
|  | branch.<name>.mergeoptions:: | 
|  | Sets default options for merging into branch <name>. The syntax and | 
|  | supported options are equal to that of 'git-merge', but option values | 
|  | containing whitespace characters are currently not supported. | 
|  |  | 
|  | HOW MERGE WORKS | 
|  | --------------- | 
|  |  | 
|  | A merge is always between the current `HEAD` and one or more | 
|  | commits (usually, branch head or tag), and the index file must | 
|  | match the tree of `HEAD` commit (i.e. the contents of the last commit) | 
|  | when it starts out. In other words, `git diff --cached HEAD` must | 
|  | report no changes. (One exception is when the changed index | 
|  | entries are already in the same state that would result from | 
|  | the merge anyway.) | 
|  |  | 
|  | Three kinds of merge can happen: | 
|  |  | 
|  | * The merged commit is already contained in `HEAD`. This is the | 
|  | simplest case, called "Already up-to-date." | 
|  |  | 
|  | * `HEAD` is already contained in the merged commit. This is the | 
|  | most common case especially when invoked from 'git pull': | 
|  | you are tracking an upstream repository, have committed no local | 
|  | changes and now you want to update to a newer upstream revision. | 
|  | Your `HEAD` (and the index) is updated to point at the merged | 
|  | commit, without creating an extra merge commit. This is | 
|  | called "Fast-forward". | 
|  |  | 
|  | * Both the merged commit and `HEAD` are independent and must be | 
|  | tied together by a merge commit that has both of them as its parents. | 
|  | The rest of this section describes this "True merge" case. | 
|  |  | 
|  | The chosen merge strategy merges the two commits into a single | 
|  | new source tree. | 
|  | When things merge cleanly, this is what happens: | 
|  |  | 
|  | 1. The results are updated both in the index file and in your | 
|  | working tree; | 
|  | 2. Index file is written out as a tree; | 
|  | 3. The tree gets committed; and | 
|  | 4. The `HEAD` pointer gets advanced. | 
|  |  | 
|  | Because of 2., we require that the original state of the index | 
|  | file matches exactly the current `HEAD` commit; otherwise we | 
|  | will write out your local changes already registered in your | 
|  | index file along with the merge result, which is not good. | 
|  | Because 1. involves only those paths differing between your | 
|  | branch and the remote branch you are pulling from during the | 
|  | merge (which is typically a fraction of the whole tree), you can | 
|  | have local modifications in your working tree as long as they do | 
|  | not overlap with what the merge updates. | 
|  |  | 
|  | When there are conflicts, the following happens: | 
|  |  | 
|  | 1. `HEAD` stays the same. | 
|  |  | 
|  | 2. Cleanly merged paths are updated both in the index file and | 
|  | in your working tree. | 
|  |  | 
|  | 3. For conflicting paths, the index file records up to three | 
|  | versions; stage1 stores the version from the common ancestor, | 
|  | stage2 from `HEAD`, and stage3 from the remote branch (you | 
|  | can inspect the stages with `git ls-files -u`). The working | 
|  | tree files contain the result of the "merge" program; i.e. 3-way | 
|  | merge results with familiar conflict markers `<<< === >>>`. | 
|  |  | 
|  | 4. No other changes are done. 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`. | 
|  |  | 
|  | 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 that is used by "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. | 
|  | <<<<<<< 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 "diff3". 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 | 
|  | Conflict resolution is hard; | 
|  | let's go shopping. | 
|  | ||||||| | 
|  | 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-reset --hard' 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' to seal the deal. | 
|  |  | 
|  | You can work through the conflict with a number of tools: | 
|  |  | 
|  | * Use a mergetool. 'git mergetool' to launch a graphical | 
|  | mergetool which will work you through the merge. | 
|  |  | 
|  | * Look at the diffs. 'git diff' will show a three-way diff, | 
|  | highlighting changes from both the HEAD and remote versions. | 
|  |  | 
|  | * Look at the diffs on their own. 'git log --merge -p <path>' | 
|  | will show diffs first for the HEAD version and then the | 
|  | remote 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 remote version. | 
|  |  | 
|  | 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] | 
|  |  | 
|  | Author | 
|  | ------ | 
|  | Written by Junio C Hamano <gitster@pobox.com> | 
|  |  | 
|  |  | 
|  | Documentation | 
|  | -------------- | 
|  | Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. | 
|  |  | 
|  | GIT | 
|  | --- | 
|  | Part of the linkgit:git[1] suite |