Merge & Cherrypick

  • Repository.mergebase(_oid, oid) → Oid
  • Find as good common ancestors as possible for a merge.Returns None if there is no merge base between the commits

  • Repository.merge(id)

  • Merges the given id into HEAD.

Merges the given commit(s) into HEAD, writing the results into theworking directory. Any changes are staged for commit and any conflictsare written to the index. Callers should inspect the repository’sindex after this completes, resolve any conflicts and prepare acommit.

  • Repository.mergeanalysis(_their_head, our_ref='HEAD') -> (Integer, Integer)
  • Analyzes the given branch and determines the opportunities formerging it into a reference (defaults to HEAD).

Parameters:

  • our_ref
  • The reference name (String) to perform the analysis from
  • their_head
  • Head (commit Oid) to merge into
    The first returned value is a mixture of the GIT_MERGE_ANALYSIS_NONE, _NORMAL,_UP_TO_DATE, _FASTFORWARD and _UNBORN flags.The second value is the user’s preference from ‘merge.ff’

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 thebranch reference in the case of a fastforward.

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

Example:

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

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

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

Cherrypick

  • Repository.cherrypick(id)
  • Cherry-pick the given oid, producing changes in the index and working directory.

Merges the given commit into HEAD as a cherrypick, writing the results into theworking directory. Any changes are staged for commit and any conflictsare written to the index. Callers should inspect the repository’sindex after this completes, resolve any conflicts and prepare acommit.

Note that after a successful cherrypick you have to runRepository.state_cleanup() in order to get the repository outof cherrypicking mode.

Lower-level methods

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

  • Repository.mergecommits(_ours, theirs, favor='normal')
  • Merge two arbitrary commits.

Returns: an index with the result of the merge.

Parameters:

  • ours
  • The commit to take as “ours” or base.
  • theirs
  • The commit which will be merged into “ours”
  • favor
  • How to deal with file-level conflicts. Can be one of

    • normal (default). Conflicts will be preserved.
    • ours. The “ours” side of the conflict region is used.
    • theirs. The “theirs” side of the conflict region is used.
    • union. Unique lines from each side will be used.
      For all but NORMAL, the index will not record a conflict.

Both “ours” and “theirs” can be any object which peels to a commit or the id(string or Oid) of an object which peels to a commit.

  • Repository.mergetrees(_ancestor, ours, theirs, favor='normal')
  • Merge two trees.

Returns: an Index that reflects the result of the merge.

Parameters:

  • ancestor
  • The tree which is the common ancestor between ‘ours’ and ‘theirs’.
  • ours
  • The commit to take as “ours” or base.
  • theirs
  • The commit which will be merged into “ours”.
  • favor
  • How to deal with file-level conflicts. Can be one of:

    • normal (default). Conflicts will be preserved.
    • ours. The “ours” side of the conflict region is used.
    • theirs. The “theirs” side of the conflict region is used.
    • union. Unique lines from each side will be used.
      For all but NORMAL, the index will not record a conflict.