From: Junio C Hamano <gitster@pobox.com>
To: Toon Claes <toon@iotcl.com>
Cc: git@vger.kernel.org, Justin Tobler <jltobler@gmail.com>,
Siddharth Asthana <siddharthasthana31@gmail.com>,
Yee Cheng Chin <yeecheng.chin@gmail.com>
Subject: Re: [PATCH v2 3/3] replay: allow to specify a ref with option --ref
Date: Wed, 25 Mar 2026 11:44:13 -0700 [thread overview]
Message-ID: <xmqqwlyzu4ua.fsf@gitster.g> (raw)
In-Reply-To: <20260325-toon-replay-arbitrary-ref-v2-3-553038702c9c@iotcl.com> (Toon Claes's message of "Wed, 25 Mar 2026 16:59:31 +0100")
Toon Claes <toon@iotcl.com> writes:
> When option '--onto' is passed to git-replay(1), the command will update
> refs from the <revision-range> passed to the command. When using option
> '--advance' or '--revert', the argument of that option is a ref that
> will be updated.
>
> To enable users to specify which ref to update, add option '--ref'. When
> using option '--ref', the refs described above are left untouched and
> instead the argument of this option is updated instead.
>
> Signed-off-by: Toon Claes <toon@iotcl.com>
> ---
> Documentation/git-replay.adoc | 21 +++++++++++++-
> builtin/replay.c | 8 +++++-
> replay.c | 33 +++++++++++++++++-----
> replay.h | 7 +++++
> t/t3650-replay-basics.sh | 66 +++++++++++++++++++++++++++++++++++++++++++
> 5 files changed, 126 insertions(+), 9 deletions(-)
>
> diff --git a/Documentation/git-replay.adoc b/Documentation/git-replay.adoc
> index 7e749a0477..5952ecb50d 100644
> --- a/Documentation/git-replay.adoc
> +++ b/Documentation/git-replay.adoc
> @@ -10,7 +10,7 @@ SYNOPSIS
> --------
> [verse]
> (EXPERIMENTAL!) 'git replay' ([--contained] --onto=<newbase> | --advance=<branch> | --revert=<branch>)
> - [--ref-action=<mode>] <revision-range>
> + [--ref=<branch>] [--ref-action=<mode>] <revision-range>
>
> DESCRIPTION
> -----------
> @@ -66,6 +66,15 @@ incompatible with `--contained` (which is a modifier for `--onto` only).
> Update all branches that point at commits in
> <revision-range>. Requires `--onto`.
>
> +--ref=<branch>::
As this thing takes a full refname (e.g., "--ref=refsheads/mybranch"
in the example in hunk ll.197,+16), we probably want
--ref=<ref>::
instead.
In the modern documentation style, this should be `--ref=<ref>`::
but let's consistently use traditional style and leave the clean-up
until the dust settles and when the command becomes more quiescent.
> @@ -188,6 +197,16 @@ NOTE: For reverting an entire merge request as a single commit (rather than
> commit-by-commit), consider using `git merge-tree --merge-base $TIP HEAD $BASE`
> which can avoid unnecessary merge conflicts.
>
> +To replay onto a specific commit while updating a different reference:
> +
> +------------
> +$ git replay --onto=112233 --ref=refs/heads/mybranch aabbcc..ddeeff
> +------------
> +
> +This replays the range `aabbcc..ddeeff` onto commit `112233` and updates
> +`refs/heads/mybranch` to point at the result. This can be useful when you want
> +to use bare commit IDs instead of branch names.
> +
> GIT
> ---
> Part of the linkgit:git[1] suite
> diff --git a/builtin/replay.c b/builtin/replay.c
> index a5f81b67d4..876026549e 100644
> --- a/builtin/replay.c
> +++ b/builtin/replay.c
> @@ -84,7 +84,7 @@ int cmd_replay(int argc,
> const char *const replay_usage[] = {
> N_("(EXPERIMENTAL!) git replay "
> "([--contained] --onto=<newbase> | --advance=<branch> | --revert=<branch>)\n"
> - "[--ref-action=<mode>] <revision-range>"),
> + "[--ref=<branch>] [--ref-action=<mode>] <revision-range>"),
Ditto.
> NULL
> };
> struct option replay_options[] = {
> @@ -102,6 +102,10 @@ int cmd_replay(int argc,
> N_("branch"),
> N_("revert commits onto given branch"),
> PARSE_OPT_NONEG),
> + OPT_STRING_F(0, "ref", &opts.ref,
> + N_("branch"),
> + N_("reference to update with result"),
> + PARSE_OPT_NONEG),
Ditto.
> diff --git a/replay.c b/replay.c
> index 199066f6b3..63cec56d48 100644
> --- a/replay.c
> +++ b/replay.c
> @@ -348,6 +348,8 @@ int replay_revisions(struct rev_info *revs,
> bool detached_head;
> char *advance;
> char *revert;
> + const char *ref;
> + struct object_id old_oid;
> enum replay_mode mode = REPLAY_MODE_PICK;
> int ret;
>
> @@ -358,6 +360,27 @@ int replay_revisions(struct rev_info *revs,
> set_up_replay_mode(revs->repo, &revs->cmdline, opts->onto,
> &detached_head, &advance, &revert, &onto, &update_refs);
>
> + if (opts->ref) {
> + struct object_id oid;
> +
> + if (update_refs && strset_get_size(update_refs) > 1) {
> + ret = error(_("'--ref' cannot be used with multiple revision ranges"));
> + goto out;
> + }
> + if (check_refname_format(opts->ref, 0) || !starts_with(opts->ref, "refs/")) {
Can we do something about this overly long line?
> + ret = error(_("'%s' is not a valid refname"), opts->ref);
> + goto out;
> + }
> + ref = opts->ref;
> + if (!refs_read_ref(get_main_ref_store(revs->repo), opts->ref, &oid))
> + oidcpy(&old_oid, &oid);
> + else
> + oidclr(&old_oid, revs->repo->hash_algo);
> + } else {
> + ref = advance ? advance : revert;
> + oidcpy(&old_oid, &onto->object.oid);
> + }
> +
> /* FIXME: Should allow replaying commits with the first as a root commit */
>
> if (prepare_revision_walk(revs) < 0) {
> @@ -393,7 +416,7 @@ int replay_revisions(struct rev_info *revs,
> kh_value(replayed_commits, pos) = last_commit;
>
> /* Update any necessary branches */
> - if (advance || revert)
> + if (ref)
> continue;
Nice.
> @@ -427,13 +450,9 @@ int replay_revisions(struct rev_info *revs,
> goto out;
> }
>
> - /* In --advance or --revert mode, update the target ref */
> - if (advance || revert) {
> - const char *ref = advance ? advance : revert;
> - replay_result_queue_update(out, ref,
> - &onto->object.oid,
> + if (ref)
> + replay_result_queue_update(out, ref, &old_oid,
> &last_commit->object.oid);
Nice, too.
next prev parent reply other threads:[~2026-03-25 18:44 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-23 16:09 [PATCH 0/3] Add option --ref to git-replay(1) Toon Claes
2026-03-23 16:09 ` [PATCH 1/3] t3650: use option with value consistenly with equal sign Toon Claes
2026-03-23 19:17 ` Kristoffer Haugsbakk
2026-03-23 20:06 ` Junio C Hamano
2026-03-25 12:43 ` Toon Claes
2026-03-23 16:09 ` [PATCH 2/3] builtin/replay: improve documentation on options Toon Claes
2026-03-23 16:09 ` [PATCH 3/3] replay: allow to specify a ref with option --ref Toon Claes
2026-03-23 18:01 ` Tian Yuchen
2026-03-25 12:50 ` Toon Claes
2026-03-23 19:07 ` Kristoffer Haugsbakk
2026-03-25 12:49 ` Toon Claes
2026-03-25 15:59 ` [PATCH v2 0/3] Add option --ref to git-replay(1) Toon Claes
2026-03-25 15:59 ` [PATCH v2 1/3] builtin/replay: mark options as not negatable Toon Claes
2026-03-25 15:59 ` [PATCH v2 2/3] replay: use stuck form in documentation and help message Toon Claes
2026-03-25 15:59 ` [PATCH v2 3/3] replay: allow to specify a ref with option --ref Toon Claes
2026-03-25 18:44 ` Junio C Hamano [this message]
2026-03-31 7:56 ` Toon Claes
2026-03-25 18:34 ` [PATCH v2 0/3] Add option --ref to git-replay(1) Junio C Hamano
2026-03-26 21:20 ` Junio C Hamano
2026-03-31 7:55 ` Toon Claes
2026-03-31 21:42 ` Junio C Hamano
2026-04-01 20:55 ` [PATCH v3 " Toon Claes
2026-04-01 20:55 ` [PATCH v3 1/3] builtin/replay: mark options as not negatable Toon Claes
2026-04-01 20:55 ` [PATCH v3 2/3] replay: use stuck form in documentation and help message Toon Claes
2026-04-01 20:55 ` [PATCH v3 3/3] replay: allow to specify a ref with option --ref Toon Claes
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqwlyzu4ua.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=jltobler@gmail.com \
--cc=siddharthasthana31@gmail.com \
--cc=toon@iotcl.com \
--cc=yeecheng.chin@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.