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

[PATCH 14/18] reset: Make reset remove the sequencer state

From
Ramkumar Ramachandra <artagnon@gmail.com>
Date
Aug 4, 2011, 10:39 UTC
Message-ID
<1312454356-3070-15-git-send-email-artagnon@gmail.com>
In-Reply-To
<1312454356-3070-1-git-send-email-artagnon@gmail.com>

Years of muscle memory have trained users to use "git reset --hard" to remove the branch state after any sort operation. Make it also remove the sequencer state to facilitate this established workflow:

  $ git cherry-pick foo..bar
  ... conflict encountered ...
  $ git reset --hard # Oops, I didn't mean that
  $ git cherry-pick quux..bar
  ... cherry-pick succeeded ...

Guard against accidental removal of the sequencer state by providing one level of "undo". In the first "reset" invocation, ".git/sequencer" is moved to ".git/sequencer-old"; it is completely removed only in the second invocation.

Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 branch.c                 |    2 ++
 t/7106-reset-sequence.sh |   44 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 0 deletions(-)
 create mode 100755 t/7106-reset-sequence.sh
diff --git a/branch.c b/branch.c
index c0c865a..d06aec4 100644
--- a/branch.c
+++ b/branch.c
@@ -3,6 +3,7 @@
 #include "refs.h"
 #include "remote.h"
 #include "commit.h"
+#include "sequencer.h"
 
 struct tracking {
 	struct refspec spec;
@@ -228,4 +229,5 @@ void remove_branch_state(void)
 	unlink(git_path("MERGE_MSG"));
 	unlink(git_path("MERGE_MODE"));
 	unlink(git_path("SQUASH_MSG"));
+	remove_sequencer_state(0);
 }
diff --git a/t/7106-reset-sequence.sh b/t/7106-reset-sequence.sh
new file mode 100755
index 0000000..4956caa
--- /dev/null
+++ b/t/7106-reset-sequence.sh
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+test_description='Test interaction of reset --hard with sequencer
+
+  + anotherpick: rewrites foo to d
+  + picked: rewrites foo to c
+  + unrelatedpick: rewrites unrelated to reallyunrelated
+  + base: rewrites foo to b
+  + initial: writes foo as a, unrelated as unrelated
+'
+
+. ./test-lib.sh
+
+pristine_detach () {
+	git cherry-pick --reset &&
+	git checkout -f "$1^0" &&
+	git read-tree -u --reset HEAD &&
+	git clean -d -f -f -q -x
+}
+
+test_expect_success setup '
+	echo unrelated >unrelated &&
+	git add unrelated &&
+	test_commit initial foo a &&
+	test_commit base foo b &&
+	test_commit unrelatedpick unrelated reallyunrelated &&
+	test_commit picked foo c &&
+	test_commit anotherpick foo d &&
+	git config advice.detachedhead false
+
+'
+
+test_expect_success 'reset --hard cleans up sequencer state, providing one-level undo' '
+	pristine_detach initial &&
+	test_must_fail git cherry-pick base..anotherpick &&
+	test_path_is_dir .git/sequencer &&
+	git reset --hard &&
+	test_path_is_missing .git/sequencer &&
+	test_path_is_dir .git/sequencer-old &&
+	git reset --hard &&
+	test_path_is_missing .git/sequencer-old
+'
+
+test_done
-- 
1.7.6.351.gb35ac.dirty
Previous: Ramkumar RamachandraNext: Christian Couder
Message 15 of 25 in “Sequencer for inclusion v6”
  1. 00/18 Sequencer for inclusion v6Ramkumar Ramachandra, Aug 4, 2011
  2. 01/18 advice: Introduce error_resolve_conflictRamkumar Ramachandra, Aug 4, 2011
  3. 02/18 config: Introduce functions to write non-standard fileRamkumar Ramachandra, Aug 4, 2011
  4. 03/18 revert: Simplify and inline add_message_to_msgRamkumar Ramachandra, Aug 4, 2011
  5. 04/18 revert: Don't check lone argument in get_encodingRamkumar Ramachandra, Aug 4, 2011
  6. 05/18 revert: Rename no_replay to record_originRamkumar Ramachandra, Aug 4, 2011
  7. 06/18 revert: Eliminate global "commit" variableRamkumar Ramachandra, Aug 4, 2011
  8. 07/18 revert: Introduce struct to keep command-line optionsRamkumar Ramachandra, Aug 4, 2011
  9. 08/18 revert: Separate cmdline parsing from functional codeRamkumar Ramachandra, Aug 4, 2011
  10. 09/18 revert: Don't create invalid replay_opts in parse_argsRamkumar Ramachandra, Aug 4, 2011
  11. 10/18 revert: Save data for continuing after conflict resolutionRamkumar Ramachandra, Aug 4, 2011
  12. 11/18 revert: Save command-line options for continuing operationRamkumar Ramachandra, Aug 4, 2011
  13. 12/18 revert: Make pick_commits functionally act on a commit listRamkumar Ramachandra, Aug 4, 2011
  14. 13/18 revert: Introduce --reset to remove sequencer stateRamkumar Ramachandra, Aug 4, 2011
  15. 14/18 reset: Make reset remove the sequencer stateRamkumar Ramachandra, Aug 4, 2011
  16. Christian CouderAug 8, 2011
  17. Ramkumar RamachandraAug 8, 2011
  18. 15/18 revert: Remove sequencer state when no commits are pendingRamkumar Ramachandra, Aug 4, 2011
  19. 16/18 revert: Don't implicitly stomp pending sequencer operationRamkumar Ramachandra, Aug 4, 2011
  20. 17/18 revert: Introduce --continue to continue the operationRamkumar Ramachandra, Aug 4, 2011
  21. Christian CouderAug 8, 2011
  22. Ramkumar RamachandraAug 8, 2011
  23. Junio C HamanoAug 8, 2011
  24. Ramkumar RamachandraAug 9, 2011
  25. 18/18 revert: Propagate errors upwards from do_pick_commitRamkumar Ramachandra, Aug 4, 2011

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.