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]
|
2019-08-07 20:57:06 +02:00
|
|
|
[--no-verify] [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
|
2016-03-18 21:21:09 +01:00
|
|
|
[--[no-]allow-unrelated-histories]
|
merge: allow to pretend a merge is made into a different branch
When a series of patches for a topic-B depends on having topic-A,
the workflow to prepare the topic-B branch would look like this:
$ git checkout -b topic-B main
$ git merge --no-ff --no-edit topic-A
$ git am <mbox-for-topic-B
When topic-A gets updated, recreating the first merge and rebasing
the rest of the topic-B, all on detached HEAD, is a useful
technique. After updating topic-A with its new round of patches:
$ git checkout topic-B
$ prev=$(git rev-parse 'HEAD^{/^Merge branch .topic-A. into}')
$ git checkout --detach $prev^1
$ git merge --no-ff --no-edit topic-A
$ git rebase --onto HEAD $prev @{-1}^0
$ git checkout -B @{-1}
This will
(0) check out the current topic-B.
(1) find the previous merge of topic-A into topic-B.
(2) detach the HEAD to the parent of the previous merge.
(3) merge the updated topic-A to it.
(4) reapply the patches to rebuild the rest of topic-B.
(5) update topic-B with the result.
without contaminating the reflog of topic-B too much. topic-B@{1}
is the "logically previous" state before topic-A got updated, for
example. At (4), comparison (e.g. range-diff) between HEAD and
@{-1} is a meaningful way to sanity check the result, and the same
can be done at (5) by comparing topic-B and topic-B@{1}.
But there is one glitch. The merge into the detached HEAD done in
the step (3) above gives us "Merge branch 'topic-A' into HEAD", and
does not say "into topic-B".
Teach the "--into-name=<branch>" option to "git merge" and its
underlying "git fmt-merge-message", to pretend as if we were merging
into <branch>, no matter what branch we are actually merging into,
when they prepare the merge message. The pretend name honors the
usual "into <target>" suppression mechanism, which can be seen in
the tests added here.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-12-20 23:53:43 +01:00
|
|
|
[--[no-]rerere-autoupdate] [-m <msg>] [-F <file>]
|
|
|
|
[--into-name <branch>] [<commit>...]
|
2019-06-17 11:17:09 +02:00
|
|
|
'git merge' (--continue | --abort | --quit)
|
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
|
|
|
|
-------
|
2021-07-22 07:04:49 +02:00
|
|
|
:git-merge: 1
|
|
|
|
|
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
|
|
|
|
merge: allow to pretend a merge is made into a different branch
When a series of patches for a topic-B depends on having topic-A,
the workflow to prepare the topic-B branch would look like this:
$ git checkout -b topic-B main
$ git merge --no-ff --no-edit topic-A
$ git am <mbox-for-topic-B
When topic-A gets updated, recreating the first merge and rebasing
the rest of the topic-B, all on detached HEAD, is a useful
technique. After updating topic-A with its new round of patches:
$ git checkout topic-B
$ prev=$(git rev-parse 'HEAD^{/^Merge branch .topic-A. into}')
$ git checkout --detach $prev^1
$ git merge --no-ff --no-edit topic-A
$ git rebase --onto HEAD $prev @{-1}^0
$ git checkout -B @{-1}
This will
(0) check out the current topic-B.
(1) find the previous merge of topic-A into topic-B.
(2) detach the HEAD to the parent of the previous merge.
(3) merge the updated topic-A to it.
(4) reapply the patches to rebuild the rest of topic-B.
(5) update topic-B with the result.
without contaminating the reflog of topic-B too much. topic-B@{1}
is the "logically previous" state before topic-A got updated, for
example. At (4), comparison (e.g. range-diff) between HEAD and
@{-1} is a meaningful way to sanity check the result, and the same
can be done at (5) by comparing topic-B and topic-B@{1}.
But there is one glitch. The merge into the detached HEAD done in
the step (3) above gives us "Merge branch 'topic-A' into HEAD", and
does not say "into topic-B".
Teach the "--into-name=<branch>" option to "git merge" and its
underlying "git fmt-merge-message", to pretend as if we were merging
into <branch>, no matter what branch we are actually merging into,
when they prepare the merge message. The pretend name honors the
usual "into <target>" suppression mechanism, which can be seen in
the tests added here.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-12-20 23:53:43 +01:00
|
|
|
--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.
|
|
|
|
|
2017-12-22 15:10:02 +01:00
|
|
|
-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.
|
|
|
|
|
2022-07-15 23:32:18 +02:00
|
|
|
include::rerere-options.txt[]
|
2009-12-04 09:20:48 +01:00
|
|
|
|
2019-03-29 11:38:55 +01:00
|
|
|
--overwrite-ignore::
|
|
|
|
--no-overwrite-ignore::
|
|
|
|
Silently overwrite ignored files from the merge result. This
|
|
|
|
is the default behavior. Use `--no-overwrite-ignore` to abort.
|
|
|
|
|
2010-11-09 22:49:59 +01:00
|
|
|
--abort::
|
|
|
|
Abort the current conflict resolution process, and
|
2020-04-07 16:28:07 +02:00
|
|
|
try to reconstruct the pre-merge state. If an autostash entry is
|
|
|
|
present, apply it to the worktree.
|
2010-11-09 22:49:59 +01:00
|
|
|
+
|
|
|
|
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
|
2020-04-07 16:28:07 +02:00
|
|
|
`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
|
2020-05-05 15:00:59 +02:00
|
|
|
list.
|
2010-11-09 22:49:59 +01:00
|
|
|
|
merge: add --quit
This allows to cancel the current merge without resetting worktree/index,
which is what --abort is for. Like other --quit(s), this is often used
when you forgot that you're in the middle of a merge and already
switched away, doing different things. By the time you've realized, you
can't even continue the merge anymore.
This also makes all in-progress commands, am, merge, rebase, revert and
cherry-pick, take all three --abort, --continue and --quit (bisect has a
different UI).
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-05-18 13:30:43 +02:00
|
|
|
--quit::
|
|
|
|
Forget about the current merge in progress. Leave the index
|
2020-04-07 16:28:07 +02:00
|
|
|
and the working tree as-is. If `MERGE_AUTOSTASH` is present, the
|
2020-05-05 15:00:59 +02:00
|
|
|
stash entry will be saved to the stash list.
|
merge: add --quit
This allows to cancel the current merge without resetting worktree/index,
which is what --abort is for. Like other --quit(s), this is often used
when you forgot that you're in the middle of a merge and already
switched away, doing different things. By the time you've realized, you
can't even continue the merge anymore.
This also makes all in-progress commands, am, merge, rebase, revert and
cherry-pick, take all three --abort, --continue and --quit (bisect has a
different UI).
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-05-18 13:30:43 +02:00
|
|
|
|
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
|
merge: fix misleading pre-merge check documentation
builtin/merge.c contains this important requirement for merge strategies:
...the index must be in sync with the head commit. The strategies are
responsible to ensure this.
However, Documentation/git-merge.txt says:
...[merge will] 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.)
Interestingly, prior to commit c0be8aa06b85 ("Documentation/git-merge.txt:
Partial rewrite of How Merge Works", 2008-07-19),
Documentation/git-merge.txt said much more:
...the index file must match the tree of `HEAD` commit...
[NOTE]
This is a bit of a lie. In certain special cases [explained
in detail]...
Otherwise, merge will refuse to do any harm to your repository
(that is...your working tree...and index are left intact).
So, this suggests that the exceptions existed because there were special
cases where it would case no harm, and potentially be slightly more
convenient for the user. While the current text in git-merge.txt does
list a condition under which it would be safe to proceed despite the index
not matching HEAD, it does not match what is actually implemented, in
three different ways:
* The exception is written to describe what unpack-trees allows. Not
all merge strategies allow such an exception, though, making this
description misleading. 'ours' and 'octopus' merges have strictly
enforced index==HEAD for a while, and the commit previous to this
one made 'recursive' do so as well.
* If someone did a three-way content merge on a specific file using
versions from the relevant commits and staged it prior to running
merge, then that path would technically satisfy the exception listed
in git-merge.txt. unpack-trees.c would still error out on the path,
though, because it defers the three-way content merge logic to other
parts of the code (resolve, octopus, or recursive) and has no way of
checking whether the index entry from before the merge will match
the end result of the merge.
* The exception as implemented in unpack-trees actually only checked
that the index matched the MERGE_HEAD version of the file and that
HEAD matched the merge base. Assuming no renames, that would indeed
provide cases where the index matches the end result we'd get from a
merge. But renames means unpack-trees is checking that it instead
matches something other than what the final result will be, risking
either erroring out when we shouldn't need to, or not erroring out
when we should and overwriting the user's staged changes.
In addition to the wording behind this exception being misleading, it is
also somewhat surprising to see how many times the code for the special
cases were wrong or the check to make sure the index matched head was
forgotten altogether:
* Prior to commit ee6566e8d70d ("[PATCH] Rewrite read-tree", 2005-09-05),
there were many cases where an unclean index entry was allowed (look for
merged_entry_allow_dirty()); it appears that in those cases, the merge
would have simply overwritten staged changes with the result of the
merge. Thus, the merge result would have been correct, but the user's
uncommitted changes could be thrown away without warning.
* Prior to commit 160252f81626 ("git-merge-ours: make sure our index
matches HEAD", 2005-11-03), the 'ours' merge strategy did not check
whether the index matched HEAD. If it didn't, the resulting merge
would include all the staged changes, and thus wasn't really an 'ours'
strategy.
* Prior to commit 3ec62ad9ffba ("merge-octopus: abort if index does not
match HEAD", 2016-04-09), 'octopus' merges did not check whether the
index matched HEAD, also resulting in any staged changes from before
the commit silently being folded into the resulting merge. commit
a6ee883b8eb5 ("t6044: new merge testcases for when index doesn't match
HEAD", 2016-04-09) was also added at the same time to try to test to
make sure all strategies did the necessary checking for the requirement
that the index match HEAD. Sadly, it didn't catch all the cases, as
evidenced by the remainder of this list...
* Prior to commit 65170c07d466 ("merge-recursive: avoid incorporating
uncommitted changes in a merge", 2017-12-21), merge-recursive simply
relied on unpack_trees() to do the necessary check, but in one special
case it avoided calling unpack_trees() entirely and accidentally ended
up silently including any staged changes from before the merge in the
resulting merge commit.
* The commit immediately before this one in this series noted that the
exceptions were written in a way that assumed no renames, making it
unsafe for merge-recursive to use. merge-recursive was modified to
use its own check to enforce that index==HEAD.
This history makes it very tempting to go into builtin/merge.c and replace
the comment that strategies must enforce that index matches HEAD with code
that just enforces it. At this point, that would only affect the
'resolve' strategy; all other strategies have each been modified to
manually enforce it. (However, note that index==HEAD is not strictly
enforced for fast-forward merges, as those are not considered a merge
strategy and they trigger in builtin/merge.c before the section in the
code where the relevant comment is found.)
But, even if we don't take the step of just fixing these problems by
enforcing index==HEAD for all strategies, we at least need to update this
misleading documentation in git-merge.txt. For now, just modify the claim
in Documentation/git-merge.txt to fix the error. The precise details
around combination of merges strategies and special cases probably is not
relevant to most users, so simply state that exceptions may exist but are
narrow and vary depending upon which merge strategy is in use.
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-07-01 03:25:03 +02:00
|
|
|
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.)
|
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
|
2021-12-01 01:05:07 +01:00
|
|
|
ancestor, or cleanly resolved because only one side changed,
|
|
|
|
or cleanly resolved because both sides changed the same way.
|
2008-09-01 05:36:32 +02:00
|
|
|
<<<<<<< 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"
|
2021-12-01 01:05:07 +01:00
|
|
|
configuration variable to either "diff3" or "zdiff3". In "diff3"
|
|
|
|
style, the above conflict may look like this:
|
2008-09-01 05:36:32 +02:00
|
|
|
|
|
|
|
------------
|
|
|
|
Here are lines that are either unchanged from the common
|
2021-12-01 01:05:07 +01:00
|
|
|
ancestor, or cleanly resolved because only one side changed,
|
2008-09-01 05:36:32 +02:00
|
|
|
<<<<<<< yours:sample.txt
|
2021-12-01 01:05:07 +01:00
|
|
|
or cleanly resolved because both sides changed the same way.
|
2008-09-01 05:36:32 +02:00
|
|
|
Conflict resolution is hard;
|
|
|
|
let's go shopping.
|
2021-12-01 01:05:07 +01:00
|
|
|
||||||| 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.
|
2008-09-01 05:36:32 +02:00
|
|
|
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
|
|
|
|
-------------
|
|
|
|
|
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.
|
|
|
|
|
2022-09-07 10:26:57 +02:00
|
|
|
include::includes/cmd-config-section-rest.txt[]
|
|
|
|
|
|
|
|
include::config/merge.txt[]
|
|
|
|
|
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
|