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

[PATCH 1/2] restore: require --source when combining --worktree and --staged

From
Eric Sunshine <sunshine@sunshineco.com>
Date
May 1, 2020, 08:27 UTC
Message-ID
<20200501082746.23943-2-sunshine@sunshineco.com>
In-Reply-To
<20200501082746.23943-1-sunshine@sunshineco.com>

The default restore source for --worktree is the index, and the default source for --staged is HEAD. When combining --worktree and --staged in the same invocation, the restore source is ambiguous ("should it restore from the index or from HEAD?"). To avoid such ambiguity, the git-restore documentation has always stated that --source must be used when combining --worktree and --staged. However, this restriction is not actually enforced. Address this deficiency by making the implementation match the documented behavior (to wit, error out if --source is not specified when combining --worktree and --staged).

While at it, enhance the documentation to mention the --source requirement prominently in the "Description" section (rather than only in the description of the --source option itself).

Reported-by: Harri Mehtälä <harri.mehtala@finago.com>
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
---
 Documentation/git-restore.txt | 3 ++-
 builtin/checkout.c            | 3 +++
 t/t2070-restore.sh            | 5 +++++
 3 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/Documentation/git-restore.txt b/Documentation/git-restore.txt
index 8e3b339802..8906499637 100644
--- a/Documentation/git-restore.txt
+++ b/Documentation/git-restore.txt
@@ -24,7 +24,8 @@ The command can also be used to restore the content in the index with
 
 By default, the restore sources for working tree and the index are the
 index and `HEAD` respectively. `--source` could be used to specify a
-commit as the restore source.
+commit as the restore source; it is required when combining `--staged`
+and `--worktree`.
 
 See "Reset, restore and revert" in linkgit:git[1] for the differences
 between the three commands.
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 8bc94d392b..7a01d00f53 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -1604,6 +1604,9 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
 	}
 	if (opts->checkout_index < 0 || opts->checkout_worktree < 0)
 		BUG("these flags should be non-negative by now");
+	if (opts->checkout_index > 0 && opts->checkout_worktree > 0 &&
+	    !opts->from_treeish)
+		die(_("--source required when using --worktree and --staged"));
 	/*
 	 * convenient shortcut: "git restore --staged" equals
 	 * "git restore --staged --source HEAD"
diff --git a/t/t2070-restore.sh b/t/t2070-restore.sh
index 076d0df7fc..19efa21fdb 100755
--- a/t/t2070-restore.sh
+++ b/t/t2070-restore.sh
@@ -69,6 +69,11 @@ test_expect_success 'restore --staged uses HEAD as source' '
 	test_cmp expected actual
 '
 
+test_expect_success 'restore --worktree --staged requires --source' '
+	test_must_fail git restore --worktree --staged first.t 2>err &&
+	test_i18ngrep "source required when using --worktree and --staged" err
+'
+
 test_expect_success 'restore --ignore-unmerged ignores unmerged entries' '
 	git init unmerged &&
 	(
-- 
2.26.2.526.g744177e7f7
Previous: Eric SunshineNext: Eric Sunshine
Message 2 of 10 in “enhance "git restore --worktree --staged" behavior”
  1. 0/2 enhance "git restore --worktree --staged" behaviorEric Sunshine, May 1, 2020
  2. 1/2 restore: require --source when combining --worktree and --stagedEric Sunshine, May 1, 2020
  3. Eric SunshineMay 1, 2020
  4. Taylor BlauMay 1, 2020
  5. 2/2 restore: default to HEAD when combining --worktree and --stagedEric Sunshine, May 1, 2020
  6. Junio C HamanoMay 1, 2020
  7. Eric SunshineMay 5, 2020
  8. Taylor BlauMay 1, 2020
  9. Eric SunshineMay 5, 2020
  10. Taylor BlauMay 5, 2020

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.