**********************************************************************
Merge & Cherrypick
**********************************************************************

.. contents::

.. automethod:: pygit2.Repository.merge_base
.. automethod:: pygit2.Repository.merge
.. automethod:: pygit2.Repository.merge_analysis

The merge method
=================

The method does a merge over the current working copy.
It gets an Oid object as a parameter.

As its name says, it only does the merge, does not commit nor update the
branch reference in the case of a fastforward.

For the moment, the merge does not support options, it will perform the
merge with the default ones defined in GIT_MERGE_OPTS_INIT libgit2 constant.

Example::

    >>> other_branch_tip = '5ebeeebb320790caf276b9fc8b24546d63316533'
    >>> repo.merge(other_branch_tip)

You can now inspect the index file for conflicts and get back to the
user to resolve if there are. Once there are no conflicts left, you
can create a commit with these two parents.

   >>> user = repo.default_signature
   >>> tree = repo.index.write_tree()
   >>> message = "Merging branches"
   >>> new_commit = repo.create_commit('HEAD', user, user, message, tree,
                                       [repo.head.target, other_branch_tip])


Cherrypick
===================

.. automethod:: pygit2.Repository.cherrypick

Note that after a successful cherrypick you have to run
:py:meth:`.Repository.state_cleanup` in order to get the repository out
of cherrypicking mode.


Lower-level methods
===================

These methods allow more direct control over how to perform the
merging. They do not modify the working directory and return an
in-memory Index representing the result of the merge.

.. automethod:: pygit2.Repository.merge_commits
.. automethod:: pygit2.Repository.merge_trees


N-way merges
============

The following methods perform the calculation for a base to an n-way merge.

.. automethod:: pygit2.Repository.merge_base_many
.. automethod:: pygit2.Repository.merge_base_octopus

With this base at hand one can do repeated invokations of
:py:meth:`.Repository.merge_commits` and :py:meth:`.Repository.merge_trees`
to perform the actual merge into one tree (and deal with conflicts along the
way).