git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 11/14] replay: use standard revision ranges

From
Christian Couder <christian.couder@gmail.com>
Date
Apr 7, 2023, 07:24 UTC
Message-ID
<20230407072415.1360068-12-christian.couder@gmail.com>
In-Reply-To
<20230407072415.1360068-1-christian.couder@gmail.com>
From: Elijah Newren <newren@gmail.com>

Instead of the fixed "<oldbase> <branch>" arguments, the replay command now accepts "<revision-range>..." arguments in a similar way as many other Git commands. This makes its interface more standard and more flexible.

Also as the interface of the command is now mostly finalized, we can add some documentation as well as testcases to make sure the command will continue to work as designed in the future.

Co-authored-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 Documentation/git-replay.txt             | 86 ++++++++++++++++++++++++
 builtin/replay.c                         | 21 ++----
 t/t3650-replay-basics.sh                 | 63 +++++++++++++++++
 t/t6429-merge-sequence-rename-caching.sh | 18 ++---
 4 files changed, 162 insertions(+), 26 deletions(-)
 create mode 100644 Documentation/git-replay.txt
 create mode 100755 t/t3650-replay-basics.sh
diff --git a/Documentation/git-replay.txt b/Documentation/git-replay.txt
new file mode 100644
index 0000000000..7a83f70343
--- /dev/null
+++ b/Documentation/git-replay.txt
@@ -0,0 +1,86 @@
+git-replay(1)
+=============
+
+NAME
+----
+git-replay - Replay commits on a different base, without touching working tree
+
+
+SYNOPSIS
+--------
+[verse]
+'git replay' --onto <newbase> <revision-range>...
+
+DESCRIPTION
+-----------
+
+Takes a range of commits, and replays them onto a new location.  Does
+not touch the working tree or index, and does not update any
+references.  However, the output of this command is meant to be used
+as input to `git update-ref --stdin`, which would update the relevant
+branches.
+
+OPTIONS
+-------
+
+--onto <newbase>::
+	Starting point at which to create the new commits.  May be any
+	valid commit, and not just an existing branch name.
++
+The update-ref commands in the output will update the branch(es)
+in the revision range to point at the new commits (in other
+words, this mimics a rebase operation).
+
+<revision-range>::
+	Range of commits to replay; see "Specifying Ranges" in
+	linkgit:git-rev-parse.
+
+OUTPUT
+------
+
+When there are no conflicts, the output of this command is usable as
+input to `git update-ref --stdin`.  It is basically 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 depend on the arguments passed.
+
+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}
+------------
+
+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
diff --git a/builtin/replay.c b/builtin/replay.c
index 119cfecfe7..63513ea6f1 100644
--- a/builtin/replay.c
+++ b/builtin/replay.c
@@ -12,7 +12,6 @@
 #include "parse-options.h"
 #include "refs.h"
 #include "revision.h"
-#include "strvec.h"
 
 static const char *short_commit_name(struct commit *commit)
 {
@@ -111,16 +110,14 @@ int cmd_replay(int argc, const char **argv, const char *prefix)
 	struct commit *onto;
 	const char *onto_name = NULL;
 	struct commit *last_commit = NULL;
-	struct strvec rev_walk_args = STRVEC_INIT;
 	struct rev_info revs;
 	struct commit *commit;
 	struct merge_options merge_opt;
 	struct merge_result result;
-	struct strbuf branch_name = STRBUF_INIT;
 	int ret = 0;
 
 	const char * const replay_usage[] = {
-		N_("git replay --onto <newbase> <oldbase> <branch>"),
+		N_("git replay --onto <newbase> <revision-range>..."),
 		NULL
 	};
 	struct option replay_options[] = {
@@ -138,20 +135,13 @@ int cmd_replay(int argc, const char **argv, const char *prefix)
 		usage_with_options(replay_usage, replay_options);
 	}
 
-	if (argc != 3) {
-		error(_("bad number of arguments"));
-		usage_with_options(replay_usage, replay_options);
-	}
-
 	onto = peel_committish(onto_name);
-	strbuf_addf(&branch_name, "refs/heads/%s", argv[2]);
 
 	repo_init_revisions(the_repository, &revs, prefix);
 
-	strvec_pushl(&rev_walk_args, "", argv[2], "--not", argv[1], NULL);
-
-	if (setup_revisions(rev_walk_args.nr, rev_walk_args.v, &revs, NULL) > 1) {
-		ret = error(_("unhandled options"));
+	argc = setup_revisions(argc, argv, &revs, NULL);
+	if (argc > 1) {
+		ret = error(_("unrecognized argument: %s"), argv[1]);
 		goto cleanup;
 	}
 
@@ -161,8 +151,6 @@ int cmd_replay(int argc, const char **argv, const char *prefix)
 	revs.topo_order = 1;
 	revs.simplify_history = 0;
 
-	strvec_clear(&rev_walk_args);
-
 	if (prepare_revision_walk(&revs) < 0) {
 		ret = error(_("error preparing revisions"));
 		goto cleanup;
@@ -228,7 +216,6 @@ int cmd_replay(int argc, const char **argv, const char *prefix)
 	ret = result.clean;
 
 cleanup:
-	strbuf_release(&branch_name);
 	release_revisions(&revs);
 
 	/* Return */
diff --git a/t/t3650-replay-basics.sh b/t/t3650-replay-basics.sh
new file mode 100755
index 0000000000..f55b71763a
--- /dev/null
+++ b/t/t3650-replay-basics.sh
@@ -0,0 +1,63 @@
+#!/bin/sh
+
+test_description='basic git replay tests'
+
+GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
+export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
+
+. ./test-lib.sh
+
+GIT_AUTHOR_NAME=author@name
+GIT_AUTHOR_EMAIL=bogus@email@address
+export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL
+
+test_expect_success 'setup' '
+	test_commit A &&
+	test_commit B &&
+
+	git switch -c topic1 &&
+	test_commit C &&
+	git switch -c topic2 &&
+	test_commit D &&
+	test_commit E &&
+	git switch topic1 &&
+	test_commit F &&
+	git switch -c topic3 &&
+	test_commit G &&
+	test_commit H &&
+	git switch -c topic4 main &&
+	test_commit I &&
+	test_commit J &&
+
+	git switch -c next main &&
+	test_commit K &&
+	git merge -m "Merge topic1" topic1 &&
+	git merge -m "Merge topic2" topic2 &&
+	git merge -m "Merge topic3" topic3 &&
+	>evil &&
+	git add evil &&
+	git commit --amend &&
+	git merge -m "Merge topic4" topic4 &&
+
+	git switch main &&
+	test_commit L &&
+	test_commit M
+'
+
+test_expect_success 'using replay to rebase two branches, one on top of other' '
+	git replay --onto main topic1..topic2 >result &&
+
+	test_line_count = 1 result &&
+
+	git log --format=%s $(cut -f 3 -d " " result) >actual &&
+	test_write_lines E D M L B A >expect &&
+	test_cmp expect actual &&
+
+	printf "update refs/heads/topic2 " >expect &&
+	printf "%s " $(cut -f 3 -d " " result) >>expect &&
+	git rev-parse topic2 >>expect &&
+
+	test_cmp expect result
+'
+
+test_done
diff --git a/t/t6429-merge-sequence-rename-caching.sh b/t/t6429-merge-sequence-rename-caching.sh
index bfdf7f30b3..8f3c394f0e 100755
--- a/t/t6429-merge-sequence-rename-caching.sh
+++ b/t/t6429-merge-sequence-rename-caching.sh
@@ -71,7 +71,7 @@ test_expect_success 'caching renames does not preclude finding new ones' '
 
 		git switch upstream &&
 
-		git replay --onto HEAD upstream~1 topic >out &&
+		git replay --onto HEAD upstream~1..topic >out &&
 		git update-ref --stdin <out &&
 		git checkout topic &&
 
@@ -141,7 +141,7 @@ test_expect_success 'cherry-pick both a commit and its immediate revert' '
 		GIT_TRACE2_PERF="$(pwd)/trace.output" &&
 		export GIT_TRACE2_PERF &&
 
-		git replay --onto HEAD upstream~1 topic >out &&
+		git replay --onto HEAD upstream~1..topic >out &&
 		git update-ref --stdin <out &&
 		git checkout topic &&
 
@@ -201,7 +201,7 @@ test_expect_success 'rename same file identically, then reintroduce it' '
 		GIT_TRACE2_PERF="$(pwd)/trace.output" &&
 		export GIT_TRACE2_PERF &&
 
-		git replay --onto HEAD upstream~1 topic >out &&
+		git replay --onto HEAD upstream~1..topic >out &&
 		git update-ref --stdin <out &&
 		git checkout topic &&
 
@@ -279,7 +279,7 @@ test_expect_success 'rename same file identically, then add file to old dir' '
 		GIT_TRACE2_PERF="$(pwd)/trace.output" &&
 		export GIT_TRACE2_PERF &&
 
-		git replay --onto HEAD upstream~1 topic >out &&
+		git replay --onto HEAD upstream~1..topic >out &&
 		git update-ref --stdin <out &&
 		git checkout topic &&
 
@@ -357,7 +357,7 @@ test_expect_success 'cached dir rename does not prevent noticing later conflict'
 		GIT_TRACE2_PERF="$(pwd)/trace.output" &&
 		export GIT_TRACE2_PERF &&
 
-		test_must_fail git replay --onto HEAD upstream~1 topic >output &&
+		test_must_fail git replay --onto HEAD upstream~1..topic >output &&
 
 		grep CONFLICT..rename/rename output &&
 
@@ -458,7 +458,7 @@ test_expect_success 'dir rename unneeded, then add new file to old dir' '
 		GIT_TRACE2_PERF="$(pwd)/trace.output" &&
 		export GIT_TRACE2_PERF &&
 
-		git replay --onto HEAD upstream~1 topic >out &&
+		git replay --onto HEAD upstream~1..topic >out &&
 		git update-ref --stdin <out &&
 		git checkout topic &&
 
@@ -525,7 +525,7 @@ test_expect_success 'dir rename unneeded, then rename existing file into old dir
 		GIT_TRACE2_PERF="$(pwd)/trace.output" &&
 		export GIT_TRACE2_PERF &&
 
-		git replay --onto HEAD upstream~1 topic >out &&
+		git replay --onto HEAD upstream~1..topic >out &&
 		git update-ref --stdin <out &&
 		git checkout topic &&
 
@@ -628,7 +628,7 @@ test_expect_success 'caching renames only on upstream side, part 1' '
 		GIT_TRACE2_PERF="$(pwd)/trace.output" &&
 		export GIT_TRACE2_PERF &&
 
-		git replay --onto HEAD upstream~1 topic >out &&
+		git replay --onto HEAD upstream~1..topic >out &&
 		git update-ref --stdin <out &&
 		git checkout topic &&
 
@@ -687,7 +687,7 @@ test_expect_success 'caching renames only on upstream side, part 2' '
 		GIT_TRACE2_PERF="$(pwd)/trace.output" &&
 		export GIT_TRACE2_PERF &&
 
-		git replay --onto HEAD upstream~1 topic >out &&
+		git replay --onto HEAD upstream~1..topic >out &&
 		git update-ref --stdin <out &&
 		git checkout topic &&
 
-- 
2.40.0.228.gb2eb5bb98e
Previous: Christian CouderNext: Derrick Stolee
Message 14 of 208 in “Introduce new `git replay` command”
  1. 00/14 Introduce new `git replay` commandChristian Couder, Apr 7, 2023
  2. 02/14 replay: start using parse_options APIChristian Couder, Apr 7, 2023
  3. 01/14 replay: introduce new builtinChristian Couder, Apr 7, 2023
  4. 03/14 replay: die() instead of failing assert()Christian Couder, Apr 7, 2023
  5. 06/14 replay: add an important FIXME comment about gpg signingChristian Couder, Apr 7, 2023
  6. 04/14 replay: introduce pick_regular_commit()Christian Couder, Apr 7, 2023
  7. 05/14 replay: don't simplify historyChristian Couder, Apr 7, 2023
  8. 08/14 replay: remove HEAD related sanity checkChristian Couder, Apr 7, 2023
  9. 07/14 replay: remove progress and info outputChristian Couder, Apr 7, 2023
  10. 09/14 replay: very coarse worktree updatingChristian Couder, Apr 7, 2023
  11. 12/14 replay: introduce guess_new_base()Christian Couder, Apr 7, 2023
  12. 10/14 replay: make it a minimal server side commandChristian Couder, Apr 7, 2023
  13. 14/14 replay: stop assuming replayed branches do not divergeChristian Couder, Apr 7, 2023
  14. 11/14 replay: use standard revision rangesChristian Couder, Apr 7, 2023
  15. Derrick StoleeApr 14, 2023
  16. Derrick StoleeApr 14, 2023
  17. Elijah NewrenApr 15, 2023
  18. Elijah NewrenApr 16, 2023
  19. Derrick StoleeApr 17, 2023
  20. Elijah NewrenApr 18, 2023
  21. Derrick StoleeApr 18, 2023
  22. Elijah NewrenApr 20, 2023
  23. Derrick StoleeApr 20, 2023
  24. Elijah NewrenApr 23, 2023
  25. Derrick StoleeApr 24, 2023
  26. Elijah NewrenApr 30, 2023
  27. Johannes SchindelinSep 3, 2023
  28. Christian CouderSep 7, 2023
  29. Johannes SchindelinSep 7, 2023
  30. Junio C HamanoApr 17, 2023
  31. Elijah NewrenApr 18, 2023
  32. Elijah NewrenApr 18, 2023
  33. Elijah NewrenApr 15, 2023
  34. 13/14 replay: add different modesChristian Couder, Apr 7, 2023
  35. Phillip WoodApr 14, 2023
  36. Elijah NewrenApr 15, 2023
  37. Felipe ContrerasApr 14, 2023
  38. Elijah NewrenApr 15, 2023
  39. 00/15 Introduce new `git replay` commandChristian Couder, May 9, 2023
  40. 01/15 t6429: remove switching aspects of fast-rebaseChristian Couder, May 9, 2023
  41. 02/15 replay: introduce new builtinChristian Couder, May 9, 2023
  42. 04/15 replay: die() instead of failing assert()Christian Couder, May 9, 2023
  43. 03/15 replay: start using parse_options APIChristian Couder, May 9, 2023
  44. 05/15 replay: introduce pick_regular_commit()Christian Couder, May 9, 2023
  45. 06/15 replay: don't simplify historyChristian Couder, May 9, 2023
  46. 07/15 replay: add an important FIXME comment about gpg signingChristian Couder, May 9, 2023
  47. 08/15 replay: remove progress and info outputChristian Couder, May 9, 2023
  48. 09/15 replay: remove HEAD related sanity checkChristian Couder, May 9, 2023
  49. 10/15 replay: make it a minimal server side commandChristian Couder, May 9, 2023
  50. 11/15 replay: use standard revision rangesChristian Couder, May 9, 2023
  51. 12/15 replay: disallow revision specific options and pathspecsChristian Couder, May 9, 2023
  52. Elijah NewrenMay 16, 2023
  53. 13/15 replay: add --advance or 'cherry-pick' modeChristian Couder, May 9, 2023
  54. 14/15 replay: add --contained to rebase contained branchesChristian Couder, May 9, 2023
  55. Elijah NewrenMay 16, 2023
  56. 15/15 replay: stop assuming replayed branches do not divergeChristian Couder, May 9, 2023
  57. Elijah NewrenMay 16, 2023
  58. Junio C HamanoMay 9, 2023
  59. Christian CouderMay 10, 2023
  60. Elijah NewrenMay 16, 2023
  61. 00/15 Introduce new `git replay` commandChristian Couder, Jun 2, 2023
  62. 01/15 t6429: remove switching aspects of fast-rebaseChristian Couder, Jun 2, 2023
  63. 02/15 replay: introduce new builtinChristian Couder, Jun 2, 2023
  64. 04/15 replay: die() instead of failing assert()Christian Couder, Jun 2, 2023
  65. 05/15 replay: introduce pick_regular_commit()Christian Couder, Jun 2, 2023
  66. 03/15 replay: start using parse_options APIChristian Couder, Jun 2, 2023
  67. 06/15 replay: don't simplify historyChristian Couder, Jun 2, 2023
  68. 07/15 replay: add an important FIXME comment about gpg signingChristian Couder, Jun 2, 2023
  69. 08/15 replay: remove progress and info outputChristian Couder, Jun 2, 2023
  70. 09/15 replay: remove HEAD related sanity checkChristian Couder, Jun 2, 2023
  71. 10/15 replay: make it a minimal server side commandChristian Couder, Jun 2, 2023
  72. Toon ClaesJun 22, 2023
  73. Christian CouderSep 7, 2023
  74. 11/15 replay: use standard revision rangesChristian Couder, Jun 2, 2023
  75. Toon ClaesJun 22, 2023
  76. Christian CouderSep 7, 2023
  77. Dragan SimicSep 7, 2023
  78. Christian CouderOct 10, 2023
  79. Dragan SimicOct 10, 2023
  80. 12/15 replay: disallow revision specific options and pathspecsChristian Couder, Jun 2, 2023
  81. Junio C HamanoJul 25, 2023
  82. Christian CouderSep 7, 2023
  83. 13/15 replay: add --advance or 'cherry-pick' modeChristian Couder, Jun 2, 2023
  84. Toon ClaesJun 22, 2023
  85. Christian CouderSep 7, 2023
  86. Junio C HamanoJul 25, 2023
  87. Christian CouderSep 7, 2023
  88. 15/15 replay: stop assuming replayed branches do not divergeChristian Couder, Jun 2, 2023
  89. 14/15 replay: add --contained to rebase contained branchesChristian Couder, Jun 2, 2023
  90. Toon ClaesJun 22, 2023
  91. Christian CouderSep 7, 2023
  92. Junio C HamanoJun 3, 2023
  93. Christian CouderJun 5, 2023
  94. 00/15 Introduce new `git replay` commandChristian Couder, Sep 7, 2023
  95. 06/15 replay: don't simplify historyChristian Couder, Sep 7, 2023
  96. Johannes SchindelinSep 7, 2023
  97. Christian CouderOct 10, 2023
  98. 07/15 replay: add an important FIXME comment about gpg signingChristian Couder, Sep 7, 2023
  99. 04/15 replay: die() instead of failing assert()Christian Couder, Sep 7, 2023
  100. 10/15 replay: make it a minimal server side commandChristian Couder, Sep 7, 2023
  101. 14/15 replay: add --contained to rebase contained branchesChristian Couder, Sep 7, 2023
  102. 01/15 t6429: remove switching aspects of fast-rebaseChristian Couder, Sep 7, 2023
  103. 12/15 replay: disallow revision specific options and pathspecsChristian Couder, Sep 7, 2023
  104. Johannes SchindelinSep 7, 2023
  105. Christian CouderOct 10, 2023
  106. 13/15 replay: add --advance or 'cherry-pick' modeChristian Couder, Sep 7, 2023
  107. 11/15 replay: use standard revision rangesChristian Couder, Sep 7, 2023
  108. Johannes SchindelinSep 7, 2023
  109. Christian CouderOct 10, 2023
  110. Linus ArverSep 8, 2023
  111. Linus ArverSep 10, 2023
  112. Christian CouderOct 10, 2023
  113. Christian CouderOct 10, 2023
  114. Linus ArverOct 19, 2023
  115. 08/15 replay: remove progress and info outputChristian Couder, Sep 7, 2023
  116. 03/15 replay: start using parse_options APIChristian Couder, Sep 7, 2023
  117. 09/15 replay: remove HEAD related sanity checkChristian Couder, Sep 7, 2023
  118. Johannes SchindelinSep 7, 2023
  119. Christian CouderOct 10, 2023
  120. 05/15 replay: introduce pick_regular_commit()Christian Couder, Sep 7, 2023
  121. 02/15 replay: introduce new builtinChristian Couder, Sep 7, 2023
  122. Johannes SchindelinSep 7, 2023
  123. Christian CouderOct 10, 2023
  124. 15/15 replay: stop assuming replayed branches do not divergeChristian Couder, Sep 7, 2023
  125. 00/14 Introduce new `git replay` commandChristian Couder, Oct 10, 2023
  126. 01/14 t6429: remove switching aspects of fast-rebaseChristian Couder, Oct 10, 2023
  127. 03/14 replay: start using parse_options APIChristian Couder, Oct 10, 2023
  128. 02/14 replay: introduce new builtinChristian Couder, Oct 10, 2023
  129. 04/14 replay: die() instead of failing assert()Christian Couder, Oct 10, 2023
  130. 05/14 replay: introduce pick_regular_commit()Christian Couder, Oct 10, 2023
  131. 07/14 replay: add an important FIXME comment about gpg signingChristian Couder, Oct 10, 2023
  132. 06/14 replay: change rev walking optionsChristian Couder, Oct 10, 2023
  133. 10/14 replay: make it a minimal server side commandChristian Couder, Oct 10, 2023
  134. 08/14 replay: remove progress and info outputChristian Couder, Oct 10, 2023
  135. 09/14 replay: remove HEAD related sanity checkChristian Couder, Oct 10, 2023
  136. 11/14 replay: use standard revision rangesChristian Couder, Oct 10, 2023
  137. Linus ArverOct 19, 2023
  138. 12/14 replay: add --advance or 'cherry-pick' modeChristian Couder, Oct 10, 2023
  139. 13/14 replay: add --contained to rebase contained branchesChristian Couder, Oct 10, 2023
  140. 14/14 replay: stop assuming replayed branches do not divergeChristian Couder, Oct 10, 2023
  141. Johannes SchindelinOct 26, 2023
  142. Elijah NewrenOct 29, 2023
  143. Christian CouderNov 2, 2023
  144. Johannes SchindelinNov 8, 2023
  145. Christian CouderNov 2, 2023
  146. Johannes SchindelinNov 8, 2023
  147. Elijah NewrenOct 29, 2023
  148. Johannes SchindelinOct 29, 2023
  149. Elijah NewrenOct 30, 2023
  150. Christian CouderNov 2, 2023
  151. Christian CouderNov 2, 2023
  152. 00/14 Introduce new `git replay` commandChristian Couder, Nov 2, 2023
  153. 01/14 t6429: remove switching aspects of fast-rebaseChristian Couder, Nov 2, 2023
  154. 03/14 replay: start using parse_options APIChristian Couder, Nov 2, 2023
  155. 04/14 replay: die() instead of failing assert()Christian Couder, Nov 2, 2023
  156. 05/14 replay: introduce pick_regular_commit()Christian Couder, Nov 2, 2023
  157. 02/14 replay: introduce new builtinChristian Couder, Nov 2, 2023
  158. 07/14 replay: add an important FIXME comment about gpg signingChristian Couder, Nov 2, 2023
  159. 06/14 replay: change rev walking optionsChristian Couder, Nov 2, 2023
  160. 08/14 replay: remove progress and info outputChristian Couder, Nov 2, 2023
  161. 09/14 replay: remove HEAD related sanity checkChristian Couder, Nov 2, 2023
  162. 10/14 replay: make it a minimal server side commandChristian Couder, Nov 2, 2023
  163. 11/14 replay: use standard revision rangesChristian Couder, Nov 2, 2023
  164. 12/14 replay: add --advance or 'cherry-pick' modeChristian Couder, Nov 2, 2023
  165. 13/14 replay: add --contained to rebase contained branchesChristian Couder, Nov 2, 2023
  166. 14/14 replay: stop assuming replayed branches do not divergeChristian Couder, Nov 2, 2023
  167. Elijah NewrenNov 7, 2023
  168. Christian CouderNov 7, 2023
  169. Christian CouderNov 15, 2023
  170. Johannes SchindelinNov 8, 2023
  171. Johannes SchindelinNov 8, 2023
  172. Christian CouderNov 15, 2023
  173. Johannes SchindelinNov 16, 2023
  174. Christian CouderNov 16, 2023
  175. 00/14 Introduce new `git replay` commandChristian Couder, Nov 15, 2023
  176. 01/14 t6429: remove switching aspects of fast-rebaseChristian Couder, Nov 15, 2023
  177. 02/14 replay: introduce new builtinChristian Couder, Nov 15, 2023
  178. 03/14 replay: start using parse_options APIChristian Couder, Nov 15, 2023
  179. 04/14 replay: die() instead of failing assert()Christian Couder, Nov 15, 2023
  180. 05/14 replay: introduce pick_regular_commit()Christian Couder, Nov 15, 2023
  181. 06/14 replay: change rev walking optionsChristian Couder, Nov 15, 2023
  182. 07/14 replay: add an important FIXME comment about gpg signingChristian Couder, Nov 15, 2023
  183. 08/14 replay: remove progress and info outputChristian Couder, Nov 15, 2023
  184. 09/14 replay: remove HEAD related sanity checkChristian Couder, Nov 15, 2023
  185. 10/14 replay: make it a minimal server side commandChristian Couder, Nov 15, 2023
  186. 11/14 replay: use standard revision rangesChristian Couder, Nov 15, 2023
  187. 12/14 replay: add --advance or 'cherry-pick' modeChristian Couder, Nov 15, 2023
  188. 13/14 replay: add --contained to rebase contained branchesChristian Couder, Nov 15, 2023
  189. 14/14 replay: stop assuming replayed branches do not divergeChristian Couder, Nov 15, 2023
  190. Johannes SchindelinNov 16, 2023
  191. Elijah NewrenNov 23, 2023
  192. Junio C HamanoNov 24, 2023
  193. 00/14 Introduce new `git replay` commandChristian Couder, Nov 24, 2023
  194. 01/14 t6429: remove switching aspects of fast-rebaseChristian Couder, Nov 24, 2023
  195. 02/14 replay: introduce new builtinChristian Couder, Nov 24, 2023
  196. 03/14 replay: start using parse_options APIChristian Couder, Nov 24, 2023
  197. 04/14 replay: die() instead of failing assert()Christian Couder, Nov 24, 2023
  198. 05/14 replay: introduce pick_regular_commit()Christian Couder, Nov 24, 2023
  199. 06/14 replay: change rev walking optionsChristian Couder, Nov 24, 2023
  200. 07/14 replay: add an important FIXME comment about gpg signingChristian Couder, Nov 24, 2023
  201. 08/14 replay: remove progress and info outputChristian Couder, Nov 24, 2023
  202. 09/14 replay: remove HEAD related sanity checkChristian Couder, Nov 24, 2023
  203. 10/14 replay: make it a minimal server side commandChristian Couder, Nov 24, 2023
  204. 11/14 replay: use standard revision rangesChristian Couder, Nov 24, 2023
  205. 12/14 replay: add --advance or 'cherry-pick' modeChristian Couder, Nov 24, 2023
  206. 13/14 replay: add --contained to rebase contained branchesChristian Couder, Nov 24, 2023
  207. 14/14 replay: stop assuming replayed branches do not divergeChristian Couder, Nov 24, 2023
  208. Johannes SchindelinNov 25, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.