Skip to content

Files

Latest commit

 

History

History
127 lines (98 loc) · 4.29 KB

git-replay.adoc

File metadata and controls

127 lines (98 loc) · 4.29 KB

git-replay(1)

NAME

git-replay - EXPERIMENTAL: Replay commits on a new base, works with bare repos too

SYNOPSIS

(EXPERIMENTAL!) git replay ([--contained] --onto <newbase> | --advance <branch>) <revision-range>…​

DESCRIPTION

Takes ranges of commits and replays them onto a new location. Leaves the working tree and the index untouched, and updates no references. The output of this command is meant to be used as input to git update-ref --stdin, which would update the relevant branches (see the OUTPUT section below).

THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.

OPTIONS

--onto <newbase>

Starting point at which to create the new commits. May be any valid commit, and not just an existing branch name.

When --onto is specified, the update-ref command(s) in the output will update the branch(es) in the revision range to point at the new commits, similar to the way how git rebase --update-refs updates multiple branches in the affected range.

--advance <branch>

Starting point at which to create the new commits; must be a branch name.

When --advance is specified, the update-ref command(s) in the output will update the branch passed as an argument to --advance to point at the new commits (in other words, this mimics a cherry-pick operation).

<revision-range>

Range of commits to replay. More than one <revision-range> can be passed, but in --advance <branch> mode, they should have a single tip, so that it’s clear where <branch> should point to. See "Specifying Ranges" in linkgit:git-rev-parse[1] and the "Commit Limiting" options below.

OUTPUT

When there are no conflicts, the output of this command is usable as input to git update-ref --stdin. It is of the form:

update refs/heads/branch1 ${NEW_branch1_HASH} ${OLD_branch1_HASH}
update refs/heads/branch2 ${NEW_branch2_HASH} ${OLD_branch2_HASH}
update refs/heads/branch3 ${NEW_branch3_HASH} ${OLD_branch3_HASH}

where the number of refs updated depends on the arguments passed and the shape of the history being replayed. When using --advance, the number of refs updated is always one, but for --onto, it can be one or more (rebasing multiple branches simultaneously is supported).

EXIT STATUS

For a successful, non-conflicted replay, the exit status is 0. When the replay has conflicts, the exit status is 1. If the replay is not able to complete (or start) due to some kind of error, the exit status is something other than 0 or 1.

EXAMPLES

To simply rebase mybranch onto target:

$ git replay --onto target origin/main..mybranch
update refs/heads/mybranch ${NEW_mybranch_HASH} ${OLD_mybranch_HASH}

To cherry-pick the commits from mybranch onto target:

$ git replay --advance target origin/main..mybranch
update refs/heads/target ${NEW_target_HASH} ${OLD_target_HASH}

Note that the first two examples replay the exact same commits and on top of the exact same new base, they only differ in that the first provides instructions to make mybranch point at the new commits and the second provides instructions to make target point at them.

What if you have a stack of branches, one depending upon another, and you’d really like to rebase the whole set?

$ git replay --contained --onto origin/main origin/main..tipbranch
update refs/heads/branch1 ${NEW_branch1_HASH} ${OLD_branch1_HASH}
update refs/heads/branch2 ${NEW_branch2_HASH} ${OLD_branch2_HASH}
update refs/heads/tipbranch ${NEW_tipbranch_HASH} ${OLD_tipbranch_HASH}

When calling git replay, one does not need to specify a range of commits to replay using the syntax A..B; any range expression will do:

$ git replay --onto origin/main ^base branch1 branch2 branch3
update refs/heads/branch1 ${NEW_branch1_HASH} ${OLD_branch1_HASH}
update refs/heads/branch2 ${NEW_branch2_HASH} ${OLD_branch2_HASH}
update refs/heads/branch3 ${NEW_branch3_HASH} ${OLD_branch3_HASH}

This will simultaneously rebase branch1, branch2, and branch3, all commits they have since base, playing them on top of origin/main. These three branches may have commits on top of base that they have in common, but that does not need to be the case.

GIT

Part of the linkgit:git[1] suite