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

[PATCH 0/2] [RFC] Revert/delay performance regression in 'git checkout -b'

From
Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
Date
Aug 21, 2019, 19:18 UTC
Message-ID
<pull.317.git.gitgitgadget@gmail.com>

As we were integrating Git 2.23.0 into VFS for Git, we discovered that "git checkout -b new-branch" went from 0.3s to 10+s on the Windows OS repo. This was an intentional change when writing the "git switch" builtin. Here is the commit message for 65f099b ("switch: no worktree status unless real branch switch happens" 2019-03-29):

When we switch from one branch to another, it makes sense to show a summary of local changes since there could be conflicts, or some files left modified.... When switch is used solely for creating a new branch (and "switch" to the same commit) or detaching, we don't really need to show anything.

"git checkout" does it anyway for historical reasons. But we can start with a clean slate with switch and don't have to.

This essentially reverts fa655d8411 (checkout: optimize "git checkout -b <new_branch>" - 2018-08-16) and make it default for switch, but also for -B and --detach. Users of big repos are encouraged to move to switch.

I was considering doing a full, long-term revert of this change to get the performance back to normal, but I also saw this feedback on the list for this patch:

I like this last bit. The skip_merge_working_tree() function which this removes was ugly, difficult to maintain, and difficult to get just right (and easy to break -- even by changing parts of the system which one might not expect to impact it).

So, the goal is to reduce the complication given by skip_merge_working_tree() by recommending that users use 'git switch -c'. The only problem is: users will take a while to move, unless prompted.

This series does the following:
 1. Reverts the change that makes 'git checkout -b' slow again.
 2. Creates a warning that recommends users start using 'git switch -c'
    instead.

This allows us to strip out this performance feature after users have had time to adopt the new way of doing things.

Derrick Stolee (2):
  Revert "switch: no worktree status unless real branch switch happens"
  DEPRECATION: warn about 'git checkout -b'
 Documentation/config/checkout.txt |   8 ++
 builtin/checkout.c                | 130 +++++++++++++++++++++++++++++-
 t/t1090-sparse-checkout-scope.sh  |  14 ++++
 3 files changed, 150 insertions(+), 2 deletions(-)
base-commit: 5fa0f5238b0cd46cfe7f6fa76c3f526ea98148d9
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-317%2Fderrickstolee%2Frevert-switch-slow-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-317/derrickstolee/revert-switch-slow-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/317
-- 
gitgitgadget
Next: Derrick Stolee via GitGitGadget
Message 1 of 11 in “[RFC] Revert/delay performance regression in 'git checkout -b'”
  1. 0/2 [RFC] Revert/delay performance regression in 'git checkout -b'Derrick Stolee via GitGitGadget, Aug 21, 2019
  2. 1/2 Revert "switch: no worktree status unless real branch switch happens"Derrick Stolee via GitGitGadget, Aug 21, 2019
  3. SZEDER GáborAug 21, 2019
  4. Derrick StoleeAug 22, 2019
  5. 2/2 DEPRECATION: warn about 'git checkout -b'Derrick Stolee via GitGitGadget, Aug 21, 2019
  6. Elijah NewrenAug 22, 2019
  7. SZEDER GáborAug 21, 2019
  8. Elijah NewrenAug 22, 2019
  9. Derrick StoleeAug 22, 2019
  10. Elijah NewrenAug 22, 2019
  11. Derrick StoleeAug 22, 2019

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.