Rebase
The Rebase type
Example
Rebase the current branch onto its upstream:
>>> committer = repo.default_signature
>>> rebase = repo.rebase_init(upstream=repo.branches['origin/master'])
>>> for operation in rebase:
... # If repo.index.conflicts is not None at this point, the
... # operation left conflicts in the index and conflict markers
... # in the working directory. Resolve them, stage each
... # resolution with repo.index.add(path), and only then commit.
... rebase.commit(committer=committer)
>>> rebase.finish(committer)
Use abort() instead of finish() to reset the repository and the
working directory to their state before the rebase began.
commit() returns None for a patch that turns out to be already
present upstream; like git rebase, simply move on to the next
operation.
With inmemory=True the rebase does not touch HEAD, the repository
state, or the working directory; each step’s result is available as
rebase.inmemory_index and updating the branch reference afterwards is
the caller’s responsibility.
Working with rebase operations
Iterating over a Rebase yields a RebaseOperation
describing each step. len() and indexing expose the same operations
up front, without advancing the rebase, so the plan can be inspected
before applying it:
>>> rebase = repo.rebase_init(upstream=repo.branches['origin/master'])
>>> for i in range(len(rebase)):
... print(rebase[i])
<pygit2.RebaseOperation PICK 4a3fe06...>
<pygit2.RebaseOperation PICK 8ae4a25...>
A rebase started with rebase_init() replays the non-merge commits
in upstream..branch; merge commits are skipped, linearizing the
history, just like plain git rebase (libgit2 has no equivalent of
--rebase-merges). Every operation’s type is therefore
RebaseOperationType.PICK, id names the original commit being
replayed, and exec is None. The remaining
RebaseOperationType values mirror the verbs of git’s interactive
rebase, which libgit2 does not implement (as of 1.9): they are declared
for completeness but never produced. Looking the original commit up is
useful for progress reporting or for reusing its metadata:
>>> from pygit2.enums import RebaseOperationType
>>> committer = repo.default_signature
>>> for operation in rebase:
... assert operation.type == RebaseOperationType.PICK
... original = repo[operation.id]
... step, total = rebase.current_index + 1, len(rebase)
... print(f'[{step}/{total}] picking {original.short_id}:',
... original.message.strip())
... rebase.commit(committer=committer)
[1/2] picking 4a3fe06: Add feature
[2/2] picking 8ae4a25: Fix tests
>>> rebase.finish(committer)