# git-cherry-pick

The convenient way to cherry-pick a commit is to use `Repository.cherrypick()`. It is limited to cherry-picking with a working copy and on-disk index.

    $> cd /path/to/repo
    $> git checkout basket
    $> git cherry-pick 9e044d03c

    repo = pygit2.Repository('/path/to/repo')
    repo.checkout('basket')

    cherry_id = pygit2.Oid('9e044d03c')
    repo.cherrypick(cherry_id)

    if repo.index.conflicts is None:
        tree_id = repo.index.write_tree()

        cherry    = repo.get(cherry_id)
        committer = pygit2.Signature('Archimedes', 'archy@jpl-classics.org')

        repo.create_commit(basket.name, cherry.author, committer,
                           cherry.message, tree_id, [basket.target])
        del basket # outdated, prevent from accidentally using it

        repo.state_cleanup()

## Cherry-picking a commit without a working copy

This way of cherry-picking gives you more control over the process and works on bare repositories as well as repositories with a working copy. `merge_trees()` can also be used for other tasks, for example three-argument rebases.

    repo = pygit2.Repository('/path/to/repo')

    cherry = repo.revparse_single('9e044d03c')
    basket = repo.lookup_branch('basket')

    base      = repo.merge_base(cherry.oid, basket.target)
    base_tree = cherry.parents[0].tree

    index = repo.merge_trees(base_tree, basket, cherry)
    tree_id = index.write_tree(repo)

    author    = cherry.author
    committer = pygit2.Signature('Archimedes', 'archy@jpl-classics.org')

    repo.create_commit(basket.name, author, committer, cherry.message,
                       tree_id, [basket.target])
    del None # outdated, prevent from accidentally using it

## References

- git-cherry-pick.