blob: 8f3300c683a7bf8ee34792eab1732dc21cec991a [file] [log] [blame]
Junio C Hamano25047112023-12-18 22:51:211git-replay(1)
2=============
3
4NAME
5----
6git-replay - EXPERIMENTAL: Replay commits on a new base, works with bare repos too
7
8
9SYNOPSIS
10--------
11[verse]
12(EXPERIMENTAL!) 'git replay' ([--contained] --onto <newbase> | --advance <branch>) <revision-range>...
13
14DESCRIPTION
15-----------
16
17Takes ranges of commits and replays them onto a new location. Leaves
18the working tree and the index untouched, and updates no references.
19The output of this command is meant to be used as input to
20`git update-ref --stdin`, which would update the relevant branches
21(see the OUTPUT section below).
22
23THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.
24
25OPTIONS
26-------
27
28--onto <newbase>::
29Starting point at which to create the new commits. May be any
30valid commit, and not just an existing branch name.
31+
32When `--onto` is specified, the update-ref command(s) in the output will
33update the branch(es) in the revision range to point at the new
34commits, similar to the way how `git rebase --update-refs` updates
35multiple branches in the affected range.
36
37--advance <branch>::
38Starting point at which to create the new commits; must be a
39branch name.
40+
41When `--advance` is specified, the update-ref command(s) in the output
42will update the branch passed as an argument to `--advance` to point at
43the new commits (in other words, this mimics a cherry-pick operation).
44
45<revision-range>::
46Range of commits to replay. More than one <revision-range> can
47be passed, but in `--advance <branch>` mode, they should have
48a single tip, so that it's clear where <branch> should point
Junio C Hamano80a8cdd2024-04-23 21:41:3549to. See "Specifying Ranges" in linkgit:git-rev-parse[1] and the
Junio C Hamano25047112023-12-18 22:51:2150"Commit Limiting" options below.
51
52include::rev-list-options.txt[]
53
54OUTPUT
55------
56
57When there are no conflicts, the output of this command is usable as
58input to `git update-ref --stdin`. It is of the form:
59
60update refs/heads/branch1 ${NEW_branch1_HASH} ${OLD_branch1_HASH}
61update refs/heads/branch2 ${NEW_branch2_HASH} ${OLD_branch2_HASH}
62update refs/heads/branch3 ${NEW_branch3_HASH} ${OLD_branch3_HASH}
63
64where the number of refs updated depends on the arguments passed and
65the shape of the history being replayed. When using `--advance`, the
66number of refs updated is always one, but for `--onto`, it can be one
67or more (rebasing multiple branches simultaneously is supported).
68
69EXIT STATUS
70-----------
71
72For a successful, non-conflicted replay, the exit status is 0. When
73the replay has conflicts, the exit status is 1. If the replay is not
74able to complete (or start) due to some kind of error, the exit status
75is something other than 0 or 1.
76
77EXAMPLES
78--------
79
80To simply rebase `mybranch` onto `target`:
81
82------------
83$ git replay --onto target origin/main..mybranch
84update refs/heads/mybranch ${NEW_mybranch_HASH} ${OLD_mybranch_HASH}
85------------
86
87To cherry-pick the commits from mybranch onto target:
88
89------------
90$ git replay --advance target origin/main..mybranch
91update refs/heads/target ${NEW_target_HASH} ${OLD_target_HASH}
92------------
93
94Note that the first two examples replay the exact same commits and on
95top of the exact same new base, they only differ in that the first
96provides instructions to make mybranch point at the new commits and
97the second provides instructions to make target point at them.
98
99What if you have a stack of branches, one depending upon another, and
100you'd really like to rebase the whole set?
101
102------------
103$ git replay --contained --onto origin/main origin/main..tipbranch
104update refs/heads/branch1 ${NEW_branch1_HASH} ${OLD_branch1_HASH}
105update refs/heads/branch2 ${NEW_branch2_HASH} ${OLD_branch2_HASH}
106update refs/heads/tipbranch ${NEW_tipbranch_HASH} ${OLD_tipbranch_HASH}
107------------
108
109When calling `git replay`, one does not need to specify a range of
110commits to replay using the syntax `A..B`; any range expression will
111do:
112
113------------
114$ git replay --onto origin/main ^base branch1 branch2 branch3
115update refs/heads/branch1 ${NEW_branch1_HASH} ${OLD_branch1_HASH}
116update refs/heads/branch2 ${NEW_branch2_HASH} ${OLD_branch2_HASH}
117update refs/heads/branch3 ${NEW_branch3_HASH} ${OLD_branch3_HASH}
118------------
119
120This will simultaneously rebase `branch1`, `branch2`, and `branch3`,
121all commits they have since `base`, playing them on top of
122`origin/main`. These three branches may have commits on top of `base`
123that they have in common, but that does not need to be the case.
124
125GIT
126---
127Part of the linkgit:git[1] suite