2005-09-09 10:15:47 +02:00
|
|
|
git-merge(1)
|
|
|
|
============
|
|
|
|
|
|
|
|
NAME
|
|
|
|
----
|
2007-01-19 00:53:37 +01:00
|
|
|
git-merge - Join two or more development histories together
|
2005-09-09 10:15:47 +02:00
|
|
|
|
|
|
|
|
|
|
|
SYNOPSIS
|
|
|
|
--------
|
2006-11-20 10:06:09 +01:00
|
|
|
[verse]
|
2012-01-11 07:44:45 +01:00
|
|
|
'git merge' [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
|
2015-09-19 09:47:48 +02:00
|
|
|
[-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
|
2016-03-18 21:21:09 +01:00
|
|
|
[--[no-]allow-unrelated-histories]
|
2011-03-24 07:48:24 +01:00
|
|
|
[--[no-]rerere-autoupdate] [-m <msg>] [<commit>...]
|
2010-11-09 22:49:59 +01:00
|
|
|
'git merge' --abort
|
2016-12-14 09:37:55 +01:00
|
|
|
'git merge' --continue
|
2005-09-09 10:15:47 +02:00
|
|
|
|
|
|
|
DESCRIPTION
|
|
|
|
-----------
|
2010-01-23 10:42:46 +01:00
|
|
|
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.
|
|
|
|
|
|
|
|
------------
|
|
|
|
A---B---C topic
|
|
|
|
/ \
|
|
|
|
D---E---F---G---H master
|
|
|
|
------------
|
2005-09-09 10:15:47 +02:00
|
|
|
|
2015-03-26 06:00:48 +01:00
|
|
|
The second syntax ("`git merge --abort`") can only be run after the
|
2010-11-09 22:49:59 +01:00
|
|
|
merge has resulted in conflicts. '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:
|
|
|
|
|
2013-06-18 10:42:55 +02:00
|
|
|
*Warning*: Running 'git merge' with non-trivial uncommitted changes is
|
|
|
|
discouraged: while possible, it may leave you in a state that is hard to
|
2010-01-07 17:42:27 +01:00
|
|
|
back out of in the case of a conflict.
|
2007-10-30 19:54:11 +01:00
|
|
|
|
2018-06-14 03:33:34 +02:00
|
|
|
The third syntax ("`git merge --continue`") can only be run after the
|
2016-12-14 09:37:55 +01:00
|
|
|
merge has resulted in conflicts.
|
2005-09-09 10:15:47 +02:00
|
|
|
|
|
|
|
OPTIONS
|
|
|
|
-------
|
2005-11-07 06:30:56 +01:00
|
|
|
include::merge-options.txt[]
|
2005-09-09 10:15:47 +02:00
|
|
|
|
2007-10-30 19:54:11 +01:00
|
|
|
-m <msg>::
|
2009-10-09 12:16:15 +02:00
|
|
|
Set the commit message to be used for the merge commit (in
|
2010-05-10 19:17:52 +02:00
|
|
|
case one is created).
|
2010-10-29 17:33:54 +02:00
|
|
|
+
|
|
|
|
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'
|
2015-09-14 16:10:53 +02:00
|
|
|
invocations. The automated message can include the branch description.
|
2005-11-01 21:45:55 +01:00
|
|
|
|
2013-05-09 03:16:55 +02:00
|
|
|
--[no-]rerere-autoupdate::
|
2009-12-04 09:20:48 +01:00
|
|
|
Allow the rerere mechanism to update the index with the
|
|
|
|
result of auto-conflict resolution if possible.
|
|
|
|
|
2010-11-09 22:49:59 +01:00
|
|
|
--abort::
|
|
|
|
Abort the current conflict resolution process, and
|
|
|
|
try to reconstruct the pre-merge state.
|
|
|
|
+
|
|
|
|
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.
|
|
|
|
|
2016-12-14 09:37:55 +01:00
|
|
|
--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).
|
|
|
|
|
2010-01-07 17:32:19 +01:00
|
|
|
<commit>...::
|
|
|
|
Commits, usually other branch heads, to merge into our branch.
|
2011-03-24 07:48:24 +01:00
|
|
|
Specifying more than one commit will create a merge with
|
|
|
|
more than two parents (affectionately called an Octopus merge).
|
|
|
|
+
|
2014-04-21 02:17:33 +02:00
|
|
|
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.
|
2011-03-24 07:48:24 +01:00
|
|
|
See also the configuration section of this manual page.
|
merge: handle FETCH_HEAD internally
The collect_parents() function now is responsible for
1. parsing the commits given on the command line into a list of
commits to be merged;
2. filtering these parents into independent ones; and
3. optionally calling fmt_merge_msg() via prepare_merge_message()
to prepare an auto-generated merge log message, using fake
contents that FETCH_HEAD would have had if these commits were
fetched from the current repository with "git pull . $args..."
Make "git merge FETCH_HEAD" to be the same as the traditional
git merge "$(git fmt-merge-msg <.git/FETCH_HEAD)" $commits
invocation of the command in "git pull", where $commits are the ones
that appear in FETCH_HEAD that are not marked as not-for-merge, by
making it do a bit more, specifically:
- noticing "FETCH_HEAD" is the only "commit" on the command line
and picking the commits that are not marked as not-for-merge as
the list of commits to be merged (substitute for step #1 above);
- letting the resulting list fed to step #2 above;
- doing the step #3 above, using the contents of the FETCH_HEAD
instead of fake contents crafted from the list of commits parsed
in the step #1 above.
Note that this changes the semantics. "git merge FETCH_HEAD" has
always behaved as if the first commit in the FETCH_HEAD file were
directly specified on the command line, creating a two-way merge
whose auto-generated merge log said "merge commit xyz". With this
change, if the previous fetch was to grab multiple branches (e.g.
"git fetch $there topic-a topic-b"), the new world order is to
create an octopus, behaving as if "git pull $there topic-a topic-b"
were run. This is a deliberate change to make that happen, and
can be seen in the changes to t3033 tests.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2015-04-26 03:47:21 +02:00
|
|
|
+
|
|
|
|
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.
|
2005-09-09 10:15:47 +02:00
|
|
|
|
2005-11-06 17:26:07 +01:00
|
|
|
|
2010-01-23 10:44:17 +01:00
|
|
|
PRE-MERGE CHECKS
|
|
|
|
----------------
|
2005-09-09 10:15:47 +02:00
|
|
|
|
2010-01-23 10:44:17 +01:00
|
|
|
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.
|
2005-12-17 03:23:33 +01:00
|
|
|
|
2010-01-23 10:44:17 +01:00
|
|
|
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. (One
|
|
|
|
exception is when the changed index entries are in the state that
|
|
|
|
would result from the merge already.)
|
2007-07-13 01:54:06 +02:00
|
|
|
|
2010-01-23 10:44:17 +01:00
|
|
|
If all named commits are already ancestors of `HEAD`, 'git merge'
|
2017-08-23 19:49:35 +02:00
|
|
|
will exit early with the message "Already up to date."
|
2005-12-17 03:23:33 +01:00
|
|
|
|
2010-01-23 10:45:33 +01:00
|
|
|
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.
|
2005-11-29 07:54:30 +01:00
|
|
|
|
2010-01-23 10:48:42 +01:00
|
|
|
TRUE MERGE
|
|
|
|
----------
|
2008-07-19 20:17:22 +02:00
|
|
|
|
2010-01-23 10:45:33 +01:00
|
|
|
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.
|
2005-11-29 07:54:30 +01:00
|
|
|
|
2010-01-23 10:48:42 +01:00
|
|
|
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.
|
2005-11-29 07:54:30 +01:00
|
|
|
|
2010-01-23 10:48:42 +01:00
|
|
|
When it is not obvious how to reconcile the changes, the following
|
|
|
|
happens:
|
2005-11-29 07:54:30 +01:00
|
|
|
|
2010-01-23 10:48:42 +01:00
|
|
|
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
|
2005-11-29 07:54:30 +01:00
|
|
|
in your working tree.
|
2010-01-23 10:48:42 +01:00
|
|
|
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
|
2008-06-30 08:09:04 +02:00
|
|
|
can inspect the stages with `git ls-files -u`). The working
|
2008-12-09 07:23:51 +01:00
|
|
|
tree files contain the result of the "merge" program; i.e. 3-way
|
2010-01-23 10:48:42 +01:00
|
|
|
merge results with familiar conflict markers `<<<` `===` `>>>`.
|
|
|
|
5. No other changes are made. In particular, the local
|
2005-11-29 07:54:30 +01:00
|
|
|
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`.
|
|
|
|
|
2010-01-23 10:31:19 +01:00
|
|
|
If you tried a merge which resulted in complex conflicts and
|
2010-11-09 22:49:59 +01:00
|
|
|
want to start over, you can recover with `git merge --abort`.
|
2010-01-23 10:31:19 +01:00
|
|
|
|
2013-03-21 22:57:48 +01:00
|
|
|
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.
|
|
|
|
|
2013-09-05 17:12:45 +02:00
|
|
|
----
|
2013-03-21 22:57:48 +01:00
|
|
|
git fetch origin
|
|
|
|
git merge v1.2.3^0
|
|
|
|
git merge --ff-only v1.2.3
|
2013-09-05 17:12:45 +02:00
|
|
|
----
|
2013-03-21 22:57:48 +01:00
|
|
|
|
|
|
|
|
2008-09-01 05:36:32 +02:00
|
|
|
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,
|
2013-01-21 20:17:53 +01:00
|
|
|
however, Git cannot randomly pick one side over the other, and asks you to
|
2008-09-01 05:36:32 +02:00
|
|
|
resolve it by leaving what both sides did to that area.
|
|
|
|
|
2013-01-21 20:17:53 +01:00
|
|
|
By default, Git uses the same style as the one used by the "merge" program
|
2008-09-01 05:36:32 +02:00
|
|
|
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.
|
|
|
|
------------
|
|
|
|
|
2008-12-09 07:23:51 +01:00
|
|
|
The area where a pair of conflicting changes happened is marked with markers
|
2009-03-15 12:30:52 +01:00
|
|
|
`<<<<<<<`, `=======`, and `>>>>>>>`. The part before the `=======`
|
2008-12-09 07:23:51 +01:00
|
|
|
is typically your side, and the part afterwards is typically their side.
|
2008-09-01 05:36:32 +02:00
|
|
|
|
2008-12-09 07:23:51 +01:00
|
|
|
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
|
2008-09-01 05:36:32 +02:00
|
|
|
side wants to say it is hard and you'd prefer to go shopping, while the
|
|
|
|
other side wants to claim it is easy.
|
|
|
|
|
2015-03-11 21:32:45 +01:00
|
|
|
An alternative style can be used by setting the "merge.conflictStyle"
|
2008-09-01 05:36:32 +02:00
|
|
|
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.
|
|
|
|
------------
|
|
|
|
|
2009-03-15 12:30:52 +01:00
|
|
|
In addition to the `<<<<<<<`, `=======`, and `>>>>>>>` markers, it uses
|
|
|
|
another `|||||||` marker that is followed by the original text. You can
|
2008-09-01 05:36:32 +02:00
|
|
|
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
|
|
|
|
------------------------
|
|
|
|
|
2005-11-29 07:54:30 +01:00
|
|
|
After seeing a conflict, you can do two things:
|
|
|
|
|
2008-12-09 07:23:51 +01:00
|
|
|
* Decide not to merge. The only clean-ups you need are to reset
|
2005-11-29 07:54:30 +01:00
|
|
|
the index file to the `HEAD` commit to reverse 2. and to clean
|
2010-11-09 22:49:59 +01:00
|
|
|
up working tree changes made by 2. and 3.; `git merge --abort`
|
|
|
|
can be used for this.
|
2005-11-29 07:54:30 +01:00
|
|
|
|
2008-08-22 05:32:00 +02:00
|
|
|
* Resolve the conflicts. Git will mark the conflicts in
|
|
|
|
the working tree. Edit the files into shape and
|
2017-08-21 14:53:14 +02:00
|
|
|
'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'.
|
2005-11-29 07:54:30 +01:00
|
|
|
|
2008-08-22 05:32:00 +02:00
|
|
|
You can work through the conflict with a number of tools:
|
|
|
|
|
2010-01-07 17:49:12 +01:00
|
|
|
* Use a mergetool. `git mergetool` to launch a graphical
|
2008-08-22 05:32:00 +02:00
|
|
|
mergetool which will work you through the merge.
|
|
|
|
|
2010-01-07 17:49:12 +01:00
|
|
|
* Look at the diffs. `git diff` will show a three-way diff,
|
2010-01-23 23:48:40 +01:00
|
|
|
highlighting changes from both the `HEAD` and `MERGE_HEAD`
|
|
|
|
versions.
|
2008-08-22 05:32:00 +02:00
|
|
|
|
2010-01-23 23:48:40 +01:00
|
|
|
* 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.
|
2008-08-22 05:32:00 +02:00
|
|
|
|
2010-01-07 17:49:12 +01:00
|
|
|
* Look at the originals. `git show :1:filename` shows the
|
2010-01-23 23:48:40 +01:00
|
|
|
common ancestor, `git show :2:filename` shows the `HEAD`
|
|
|
|
version, and `git show :3:filename` shows the `MERGE_HEAD`
|
|
|
|
version.
|
2005-11-29 07:54:30 +01:00
|
|
|
|
2009-10-21 19:21:23 +02:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
2010-01-23 10:33:37 +01:00
|
|
|
include::merge-strategies.txt[]
|
|
|
|
|
2010-01-23 10:26:57 +01:00
|
|
|
CONFIGURATION
|
|
|
|
-------------
|
|
|
|
include::merge-config.txt[]
|
|
|
|
|
2015-03-11 21:32:45 +01:00
|
|
|
branch.<name>.mergeOptions::
|
2010-01-23 10:26:57 +01:00
|
|
|
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.
|
|
|
|
|
2005-11-01 21:45:55 +01:00
|
|
|
SEE ALSO
|
|
|
|
--------
|
2007-12-29 07:20:38 +01:00
|
|
|
linkgit:git-fmt-merge-msg[1], linkgit:git-pull[1],
|
2008-06-30 20:56:34 +02:00
|
|
|
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]
|
2005-11-01 21:45:55 +01:00
|
|
|
|
2005-09-09 10:15:47 +02:00
|
|
|
GIT
|
|
|
|
---
|
2008-06-06 09:07:32 +02:00
|
|
|
Part of the linkgit:git[1] suite
|