From: Phillip Wood <phillip.wood123@gmail.com>
To: Harald Nordgren via GitGitGadget <gitgitgadget@gmail.com>,
git@vger.kernel.org
Cc: Chris Torek <chris.torek@gmail.com>, Jeff King <peff@peff.net>,
Harald Nordgren <haraldnordgren@gmail.com>
Subject: Re: [PATCH v15 0/5] checkout: 'autostash' for branch switching
Date: Tue, 28 Apr 2026 10:35:34 +0100 [thread overview]
Message-ID: <df5bf999-c545-4cb4-94da-b9062b026421@gmail.com> (raw)
In-Reply-To: <pull.2234.v15.git.git.1777065012.gitgitgadget@gmail.com>
Hi Harald
On 24/04/2026 22:10, Harald Nordgren via GitGitGadget wrote:
> * When the initial merge fails, the caller now knows for sure it was a
> conflict (not some unrelated error) before kicking off the autostash.
>
> * If the second attempt also fails, the user now actually sees why.
> Previously errors like "would be overwritten by checkout" were being
> swallowed.
>
> * The stash is reapplied right after the second attempt, so it won't get
> left behind if something else goes wrong later in the checkout.
>
> * A couple of clean-up steps only run when we actually stashed, so regular
> checkouts aren't paying for work they don't need.
>
> * Added a small header "The following paths have local changes:" before the
> list of changed files, so it doesn't look like part of the conflict
> advice above it.
>
> * Reworded the conflict advice into a single paragraph. Feels less shouty
> and doesn't say "local changes" three times.
>
> * Trimmed and consolidated tests in t7201. A bunch of the old ones couldn't
> actually fail, or were really testing other things; the conflict-path
> tests are now a single test that checks the stash entry directly.
Thanks for the summary, that all looks good. I've left some comments on
Patches 1 and 3 but they can be future work and don't need to hold this
series up. There are a few small issues that need addressing on Patch 5
but hopefully the next iteration will be the last.
Thanks
Phillip
> Harald Nordgren (5):
> stash: add --label-ours, --label-theirs, --label-base for apply
> sequencer: allow create_autostash to run silently
> sequencer: teach autostash apply to take optional conflict marker
> labels
> checkout: rollback lock on early returns in merge_working_tree
> checkout -m: autostash when switching branches
>
> Documentation/git-checkout.adoc | 58 +++++------
> Documentation/git-stash.adoc | 11 ++-
> Documentation/git-switch.adoc | 33 +++----
> builtin/checkout.c | 165 +++++++++++++++-----------------
> builtin/commit.c | 3 +-
> builtin/merge.c | 15 ++-
> builtin/stash.c | 28 ++++--
> sequencer.c | 69 +++++++++----
> sequencer.h | 7 +-
> t/t3420-rebase-autostash.sh | 16 ++--
> t/t3903-stash.sh | 24 +++++
> t/t7201-co.sh | 61 +++++++++++-
> t/t7600-merge.sh | 3 +-
> xdiff-interface.c | 12 +++
> xdiff-interface.h | 1 +
> xdiff/xmerge.c | 6 +-
> 16 files changed, 335 insertions(+), 177 deletions(-)
>
>
> base-commit: 94f057755b7941b321fd11fec1b2e3ca5313a4e0
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2234%2FHaraldNordgren%2Fcheckout_autostash-v15
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2234/HaraldNordgren/checkout_autostash-v15
> Pull-Request: https://github.com/git/git/pull/2234
>
> Range-diff vs v14:
>
> 1: e18c25599a = 1: aba8e6a9dc stash: add --label-ours, --label-theirs, --label-base for apply
> 2: ce29b10264 = 2: 89e0bfa803 sequencer: allow create_autostash to run silently
> 3: 73051d1762 = 3: a428ce7328 sequencer: teach autostash apply to take optional conflict marker labels
> 4: 191058d8e3 = 4: f358424085 checkout: rollback lock on early returns in merge_working_tree
> 5: 86f33df1eb ! 5: 96b14db827 checkout -m: autostash when switching branches
> @@ builtin/checkout.c
> #include "setup.h"
> #include "submodule.h"
> #include "symlinks.h"
> +@@ builtin/checkout.c: struct checkout_opts {
> + .auto_advance = 1, \
> + }
> +
> ++#define MERGE_WORKING_TREE_UNPACK_FAILED (-2)
> ++
> + struct branch_info {
> + char *name; /* The short name used */
> + char *path; /* The full name of a real branch */
> +@@ builtin/checkout.c: static void setup_branch_path(struct branch_info *branch)
> +
> + static void init_topts(struct unpack_trees_options *topts, int merge,
> + int show_progress, int overwrite_ignore,
> +- struct commit *old_commit)
> ++ struct commit *old_commit, bool show_unpack_errors)
> + {
> + memset(topts, 0, sizeof(*topts));
> + topts->head_idx = -1;
> +@@ builtin/checkout.c: static void init_topts(struct unpack_trees_options *topts, int merge,
> + topts->initial_checkout = is_index_unborn(the_repository->index);
> + topts->update = 1;
> + topts->merge = 1;
> +- topts->quiet = merge && old_commit;
> ++ topts->quiet = merge && old_commit && !show_unpack_errors;
> + topts->verbose_update = show_progress;
> + topts->fn = twoway_merge;
> + topts->preserve_ignored = !overwrite_ignore;
> +@@ builtin/checkout.c: static void init_topts(struct unpack_trees_options *topts, int merge,
> + static int merge_working_tree(const struct checkout_opts *opts,
> + struct branch_info *old_branch_info,
> + struct branch_info *new_branch_info,
> +- int *writeout_error)
> ++ int *writeout_error,
> ++ bool show_unpack_errors)
> + {
> + int ret;
> + struct lock_file lock_file = LOCK_INIT;
> +@@ builtin/checkout.c: static int merge_working_tree(const struct checkout_opts *opts,
> +
> + /* 2-way merge to the new branch */
> + init_topts(&topts, opts->merge, opts->show_progress,
> +- opts->overwrite_ignore, old_branch_info->commit);
> ++ opts->overwrite_ignore, old_branch_info->commit,
> ++ show_unpack_errors);
> + init_checkout_metadata(&topts.meta, new_branch_info->refname,
> + new_branch_info->commit ?
> + &new_branch_info->commit->object.oid :
> @@ builtin/checkout.c: static int merge_working_tree(const struct checkout_opts *opts,
> ret = unpack_trees(2, trees, &topts);
> clear_unpack_trees_porcelain(&topts);
> @@ builtin/checkout.c: static int merge_working_tree(const struct checkout_opts *op
> - return ret;
> - }
> + rollback_lock_file(&lock_file);
> -+ return ret;
> ++ return MERGE_WORKING_TREE_UNPACK_FAILED;
> }
> }
>
> @@ builtin/checkout.c: static int switch_branches(const struct checkout_opts *opts,
> do_merge = 0;
> }
>
> -+ if (old_branch_info.name)
> ++ if (old_branch_info.name) {
> + stash_label_base = old_branch_info.name;
> -+ else if (old_branch_info.commit) {
> ++ } else if (old_branch_info.commit) {
> + strbuf_add_unique_abbrev(&old_commit_shortname,
> + &old_branch_info.commit->object.oid,
> + DEFAULT_ABBREV);
> @@ builtin/checkout.c: static int switch_branches(const struct checkout_opts *opts,
> + }
> +
> if (do_merge) {
> - ret = merge_working_tree(opts, &old_branch_info, new_branch_info, &writeout_error);
> -+ if (ret == -1 && opts->merge) {
> +- ret = merge_working_tree(opts, &old_branch_info, new_branch_info, &writeout_error);
> ++ ret = merge_working_tree(opts, &old_branch_info, new_branch_info,
> ++ &writeout_error, false);
> ++ if (ret == MERGE_WORKING_TREE_UNPACK_FAILED && opts->merge) {
> + strbuf_addf(&autostash_msg,
> + "autostash while switching to '%s'",
> + new_branch_info->name);
> @@ builtin/checkout.c: static int switch_branches(const struct checkout_opts *opts,
> + "CHECKOUT_AUTOSTASH_HEAD",
> + autostash_msg.buf, true);
> + created_autostash = 1;
> -+ ret = merge_working_tree(opts, &old_branch_info, new_branch_info, &writeout_error);
> ++ ret = merge_working_tree(opts, &old_branch_info, new_branch_info,
> ++ &writeout_error, true);
> ++ }
> ++ if (created_autostash) {
> ++ if (opts->conflict_style >= 0) {
> ++ struct strbuf cfg = STRBUF_INIT;
> ++ strbuf_addf(&cfg, "merge.conflictStyle=%s",
> ++ conflict_style_name(opts->conflict_style));
> ++ git_config_push_parameter(cfg.buf);
> ++ strbuf_release(&cfg);
> ++ }
> ++ apply_autostash_ref(the_repository,
> ++ "CHECKOUT_AUTOSTASH_HEAD",
> ++ new_branch_info->name,
> ++ "local",
> ++ stash_label_base,
> ++ autostash_msg.buf);
> + }
> if (ret) {
> -+ if (created_autostash)
> -+ apply_autostash_ref(the_repository,
> -+ "CHECKOUT_AUTOSTASH_HEAD",
> -+ new_branch_info->name,
> -+ "local",
> -+ stash_label_base,
> -+ autostash_msg.buf);
> branch_info_release(&old_branch_info);
> - return ret;
> + strbuf_release(&old_commit_shortname);
> @@ builtin/checkout.c: static int switch_branches(const struct checkout_opts *opts,
>
> update_refs_for_switch(opts, &old_branch_info, new_branch_info);
>
> -+ if (opts->conflict_style >= 0) {
> -+ struct strbuf cfg = STRBUF_INIT;
> -+ strbuf_addf(&cfg, "merge.conflictStyle=%s",
> -+ conflict_style_name(opts->conflict_style));
> -+ git_config_push_parameter(cfg.buf);
> -+ strbuf_release(&cfg);
> ++ if (created_autostash) {
> ++ discard_index(the_repository->index);
> ++ if (repo_read_index(the_repository) < 0)
> ++ die(_("index file corrupt"));
> ++
> ++ if (!opts->quiet && new_branch_info->commit) {
> ++ printf(_("The following paths have local changes:\n"));
> ++ show_local_changes(&new_branch_info->commit->object,
> ++ &opts->diff_options);
> ++ }
> + }
> -+ apply_autostash_ref(the_repository, "CHECKOUT_AUTOSTASH_HEAD",
> -+ new_branch_info->name, "local",
> -+ stash_label_base,
> -+ autostash_msg.buf);
> -+
> -+ discard_index(the_repository->index);
> -+ if (repo_read_index(the_repository) < 0)
> -+ die(_("index file corrupt"));
> -+
> -+ if (created_autostash && !opts->quiet && new_branch_info->commit)
> -+ show_local_changes(&new_branch_info->commit->object,
> -+ &opts->diff_options);
> +
> ret = post_checkout_hook(old_branch_info.commit, new_branch_info->commit, 1);
> branch_info_release(&old_branch_info);
> @@ sequencer.c: static int apply_save_autostash_oid(const char *stash_oid, int atte
> ret = error(_("cannot store %s"), stash_oid);
> + else if (attempt_apply)
> + fprintf(stderr,
> -+ _("Your local changes are stashed, however, applying it to carry\n"
> -+ "forward your local changes resulted in conflicts:\n"
> -+ "\n"
> -+ " - You can try resolving them now. If you resolved them\n"
> -+ " successfully, discard the stash entry with \"git stash drop\".\n"
> -+ "\n"
> -+ " - Alternatively you can \"git reset --hard\" if you do not want\n"
> -+ " to deal with them right now, and later \"git stash pop\" to\n"
> -+ " recover your local changes.\n"));
> ++ _("Your local changes are stashed, however applying them\n"
> ++ "resulted in conflicts. You can either resolve the conflicts\n"
> ++ "and then discard the stash with \"git stash drop\", or, if you\n"
> ++ "do not want to resolve them now, run \"git reset --hard\" and\n"
> ++ "apply the local changes later by running \"git stash pop\".\n"));
> else
> fprintf(stderr,
> - _("%s\n"
> @@ t/t3420-rebase-autostash.sh: create_expected_failure_apply () {
> - Applying autostash resulted in conflicts.
> - Your changes are safe in the stash.
> - You can run "git stash pop" or "git stash drop" at any time.
> -+ Your local changes are stashed, however, applying it to carry
> -+ forward your local changes resulted in conflicts:
> -+
> -+ - You can try resolving them now. If you resolved them
> -+ successfully, discard the stash entry with "git stash drop".
> -+
> -+ - Alternatively you can "git reset --hard" if you do not want
> -+ to deal with them right now, and later "git stash pop" to
> -+ recover your local changes.
> ++ Your local changes are stashed, however applying them
> ++ resulted in conflicts. You can either resolve the conflicts
> ++ and then discard the stash with "git stash drop", or, if you
> ++ do not want to resolve them now, run "git reset --hard" and
> ++ apply the local changes later by running "git stash pop".
> EOF
> }
>
> @@ t/t3420-rebase-autostash.sh: create_expected_failure_apply () {
> - Applying autostash resulted in conflicts.
> - Your changes are safe in the stash.
> - You can run "git stash pop" or "git stash drop" at any time.
> -+ Your local changes are stashed, however, applying it to carry
> -+ forward your local changes resulted in conflicts:
> -+
> -+ - You can try resolving them now. If you resolved them
> -+ successfully, discard the stash entry with "git stash drop".
> -+
> -+ - Alternatively you can "git reset --hard" if you do not want
> -+ to deal with them right now, and later "git stash pop" to
> -+ recover your local changes.
> ++ Your local changes are stashed, however applying them
> ++ resulted in conflicts. You can either resolve the conflicts
> ++ and then discard the stash with "git stash drop", or, if you
> ++ do not want to resolve them now, run "git reset --hard" and
> ++ apply the local changes later by running "git stash pop".
> Successfully rebased and updated refs/heads/rebased-feature-branch.
> EOF
> }
>
> ## t/t7201-co.sh ##
> +@@ t/t7201-co.sh: test_expect_success 'checkout -m with dirty tree' '
> +
> + test "$(git symbolic-ref HEAD)" = "refs/heads/side" &&
> +
> +- printf "M\t%s\n" one >expect.messages &&
> ++ printf "The following paths have local changes:\nM\t%s\n" one >expect.messages &&
> + test_cmp expect.messages messages &&
> +
> + fill "M one" "A three" "D two" >expect.main &&
> @@ t/t7201-co.sh: test_expect_success 'checkout --merge --conflict=diff3 <branch>' '
> test_cmp expect two
> '
>
> -+test_expect_success 'checkout --merge --conflict=zdiff3 <branch>' '
> -+ git checkout -f main &&
> -+ git reset --hard &&
> -+ git clean -f &&
> -+
> -+ fill a b X d e >two &&
> -+ git checkout --merge --conflict=zdiff3 simple &&
> -+
> -+ cat <<-EOF >expect &&
> -+ a
> -+ <<<<<<< simple
> -+ c
> -+ ||||||| main
> -+ b
> -+ c
> -+ d
> -+ =======
> -+ b
> -+ X
> -+ d
> -+ >>>>>>> local
> -+ e
> -+ EOF
> -+ test_cmp expect two
> -+'
> -+
> -+test_expect_success 'checkout -m respects merge.conflictStyle config' '
> -+ git checkout -f main &&
> -+ git reset --hard &&
> -+ git clean -f &&
> -+
> -+ test_config merge.conflictStyle diff3 &&
> -+ fill b d >two &&
> -+ git checkout -m simple &&
> -+
> -+ cat <<-EOF >expect &&
> -+ <<<<<<< simple
> -+ a
> -+ c
> -+ e
> -+ ||||||| main
> -+ a
> -+ b
> -+ c
> -+ d
> -+ e
> -+ =======
> -+ b
> -+ d
> -+ >>>>>>> local
> -+ EOF
> -+ test_cmp expect two
> -+'
> -+
> -+test_expect_success 'checkout -m skips stash when no conflict' '
> -+ git checkout -f main &&
> -+ git clean -f &&
> -+
> -+ fill 0 x y z >same &&
> -+ git stash list >stash-before &&
> -+ git checkout -m side >actual 2>&1 &&
> -+ test_grep ! "Created autostash" actual &&
> -+ git stash list >stash-after &&
> -+ test_cmp stash-before stash-after &&
> -+ fill 0 x y z >expect &&
> -+ test_cmp expect same
> -+'
> -+
> -+test_expect_success 'checkout -m skips stash with non-conflicting dirty index' '
> -+ git checkout -f main &&
> -+ git clean -f &&
> -+
> -+ fill 0 x y z >same &&
> -+ git add same &&
> -+ git checkout -m side >actual 2>&1 &&
> -+ test_grep ! "Created autostash" actual &&
> -+ fill 0 x y z >expect &&
> -+ test_cmp expect same
> -+'
> -+
> -+test_expect_success 'checkout -m stashes and applies on conflicting changes' '
> -+ git checkout -f main &&
> -+ git clean -f &&
> -+
> -+ fill 1 2 3 4 5 6 7 >one &&
> -+ git checkout -m side >actual 2>&1 &&
> -+ test_grep ! "Created autostash" actual &&
> -+ test_grep "Applied autostash" actual &&
> -+ fill 1 2 3 4 5 6 7 >expect &&
> -+ test_cmp expect one
> -+'
> -+
> +test_expect_success 'checkout -m with mixed staged and unstaged changes' '
> + git checkout -f main &&
> + git clean -f &&
> @@ t/t7201-co.sh: test_expect_success 'checkout --merge --conflict=diff3 <branch>'
> + git add same &&
> + fill 1 2 3 4 5 6 7 >one &&
> + git checkout -m side >actual 2>&1 &&
> -+ test_grep ! "Created autostash" actual &&
> + test_grep "Applied autostash" actual &&
> + fill 0 x y z >expect &&
> + test_cmp expect same &&
> @@ t/t7201-co.sh: test_expect_success 'checkout --merge --conflict=diff3 <branch>'
> + test_cmp expect one
> +'
> +
> -+test_expect_success 'checkout -m stashes on truly conflicting changes' '
> ++test_expect_success 'checkout -m creates a recoverable stash on conflict' '
> + git checkout -f main &&
> + git clean -f &&
> +
> @@ t/t7201-co.sh: test_expect_success 'checkout --merge --conflict=diff3 <branch>'
> + test_must_fail git checkout side 2>stderr &&
> + test_grep "Your local changes" stderr &&
> + git checkout -m side >actual 2>&1 &&
> -+ test_grep ! "Created autostash" actual &&
> + test_grep "resulted in conflicts" actual &&
> + test_grep "git stash drop" actual &&
> ++ test_grep "git stash pop" actual &&
> ++ test_grep "The following paths have local changes" actual &&
> ++ git show --format=%B --diff-merges=1 refs/stash >actual &&
> ++ sed /^index/d actual >actual.trimmed &&
> ++ cat >expect <<-EOF &&
> ++ On main: autostash while switching to ${SQ}side${SQ}
> ++
> ++ diff --git a/one b/one
> ++ --- a/one
> ++ +++ b/one
> ++ @@ -3,6 +3,3 @@
> ++ 3
> ++ 4
> ++ 5
> ++ -6
> ++ -7
> ++ -8
> ++ EOF
> ++ test_cmp expect actual.trimmed &&
> + git stash drop &&
> + git reset --hard
> +'
> +
> -+test_expect_success 'checkout -m produces usable stash on conflict' '
> -+ git checkout -f main &&
> -+ git clean -f &&
> -+
> ++test_expect_success 'checkout -m which would overwrite untracked file' '
> ++ git checkout -f --detach main &&
> ++ test_commit another-file &&
> ++ git checkout HEAD^ &&
> ++ >another-file.t &&
> + fill 1 2 3 4 5 >one &&
> -+ git checkout -m side >actual 2>&1 &&
> -+ test_grep "recover your local changes" actual &&
> -+ git checkout -f main &&
> -+ git stash pop &&
> -+ fill 1 2 3 4 5 >expect &&
> -+ test_cmp expect one
> -+'
> -+
> -+test_expect_success 'checkout -m autostash message includes target branch' '
> -+ git checkout -f main &&
> -+ git clean -f &&
> -+
> -+ fill 1 2 3 4 5 >one &&
> -+ git checkout -m side >actual 2>&1 &&
> -+ git stash list >stash-list &&
> -+ test_grep "autostash while switching to .side." stash-list &&
> -+ git stash drop &&
> -+ git checkout -f main &&
> -+ git reset --hard
> -+'
> -+
> -+test_expect_success 'checkout -m stashes on staged conflicting changes' '
> -+ git checkout -f main &&
> -+ git clean -f &&
> -+
> -+ fill 1 2 3 4 5 >one &&
> -+ git add one &&
> -+ git checkout -m side >actual 2>&1 &&
> -+ test_grep ! "Created autostash" actual &&
> -+ test_grep "resulted in conflicts" actual &&
> -+ test_grep "git stash drop" actual &&
> -+ git stash drop &&
> -+ git reset --hard
> -+'
> -+
> -+test_expect_success 'checkout -m applies stash cleanly with non-overlapping changes in same file' '
> -+ git checkout -f main &&
> -+ git reset --hard &&
> -+ git clean -f &&
> -+
> -+ git checkout -b nonoverlap_base &&
> -+ fill a b c d >file &&
> -+ git add file &&
> -+ git commit -m "add file" &&
> -+
> -+ git checkout -b nonoverlap_child &&
> -+ fill a b c INSERTED d >file &&
> -+ git commit -a -m "insert line near end of file" &&
> -+
> -+ fill DIRTY a b c INSERTED d >file &&
> -+
> -+ git stash list >stash-before &&
> -+ git checkout -m nonoverlap_base 2>stderr &&
> -+ test_grep "Applied autostash" stderr &&
> -+ test_grep ! "resulted in conflicts" stderr &&
> -+
> -+ git stash list >stash-after &&
> -+ test_cmp stash-before stash-after &&
> -+
> -+ fill DIRTY a b c d >expect &&
> -+ test_cmp expect file &&
> -+
> -+ git checkout -f main &&
> -+ git branch -D nonoverlap_base &&
> -+ git branch -D nonoverlap_child
> -+'
> -+
> -+test_expect_success 'checkout -m -b skips stash with dirty tree' '
> -+ git checkout -f main &&
> -+ git clean -f &&
> -+
> -+ fill 0 x y z >same &&
> -+ git checkout -m -b newbranch >actual 2>&1 &&
> -+ test_grep ! "Created autostash" actual &&
> -+ fill 0 x y z >expect &&
> -+ test_cmp expect same &&
> -+ git checkout main &&
> -+ git branch -D newbranch
> ++ test_must_fail git checkout -m @{-1} 2>err &&
> ++ test_grep "would be overwritten by checkout" err &&
> ++ test_grep "another-file.t" err
> +'
> +
> test_expect_success 'switch to another branch while carrying a deletion' '
> @@ t/t7600-merge.sh: test_expect_success 'merge with conflicted --autostash changes
> test_when_finished "test_might_fail git stash drop" &&
> git merge --autostash c3 2>err &&
> - test_grep "Applying autostash resulted in conflicts." err &&
> -+ test_grep "your local changes resulted in conflicts" err &&
> ++ test_grep "applying them" err &&
> ++ test_grep "resulted in conflicts" err &&
> git show HEAD:file >merge-result &&
> test_cmp result.1-9 merge-result &&
> git stash show -p >actual &&
>
next prev parent reply other threads:[~2026-04-28 9:35 UTC|newest]
Thread overview: 164+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-12 13:26 [PATCH] checkout: add --autostash option for branch switching Harald Nordgren via GitGitGadget
2026-03-12 14:40 ` Junio C Hamano
2026-03-12 19:33 ` [PATCH v31 0/2] status: add status.compareBranches config for multiple branch comparisons Harald Nordgren
2026-03-13 14:29 ` [PATCH] checkout: add --autostash option for branch switching Phillip Wood
2026-03-14 17:17 ` Junio C Hamano
2026-03-16 16:36 ` Phillip Wood
2026-03-16 20:04 ` Junio C Hamano
2026-03-17 9:47 ` Harald Nordgren
2026-03-19 8:25 ` Harald Nordgren
2026-03-19 16:48 ` Junio C Hamano
2026-03-31 12:16 ` Harald Nordgren
2026-04-09 11:50 ` Harald Nordgren
2026-04-09 12:06 ` Harald Nordgren
2026-04-09 18:35 ` Junio C Hamano
2026-04-09 21:29 ` Harald Nordgren
2026-04-09 12:12 ` Harald Nordgren
2026-03-12 19:33 ` [PATCH v2] " Harald Nordgren via GitGitGadget
2026-03-12 19:50 ` Junio C Hamano
2026-03-13 9:22 ` [PATCH] " Harald Nordgren
2026-03-13 9:23 ` [PATCH v3] " Harald Nordgren via GitGitGadget
2026-03-13 17:16 ` Junio C Hamano
2026-03-13 19:33 ` [PATCH] " Harald Nordgren
2026-03-13 20:30 ` Junio C Hamano
2026-03-14 9:59 ` [PATCH v4] checkout: -m (--merge) uses autostash when switching branches Harald Nordgren via GitGitGadget
2026-03-15 2:25 ` Junio C Hamano
2026-03-15 11:19 ` [PATCH v5 0/4] checkout: 'autostash' for branch switching Harald Nordgren via GitGitGadget
2026-03-15 11:19 ` [PATCH v5 1/4] stash: add --ours-label, --theirs-label, --base-label for apply Harald Nordgren via GitGitGadget
2026-03-15 11:19 ` [PATCH v5 2/4] sequencer: allow create_autostash to run silently Harald Nordgren via GitGitGadget
2026-03-15 11:19 ` [PATCH v5 3/4] sequencer: teach autostash apply to take optional conflict marker labels Harald Nordgren via GitGitGadget
2026-03-15 11:19 ` [PATCH v5 4/4] checkout: -m (--merge) uses autostash when switching branches Harald Nordgren via GitGitGadget
2026-03-17 9:35 ` [PATCH v6 0/4] checkout: 'autostash' for branch switching Harald Nordgren via GitGitGadget
2026-03-17 9:35 ` [PATCH v6 1/4] stash: add --ours-label, --theirs-label, --base-label for apply Harald Nordgren via GitGitGadget
2026-03-17 9:35 ` [PATCH v6 2/4] sequencer: allow create_autostash to run silently Harald Nordgren via GitGitGadget
2026-03-17 9:35 ` [PATCH v6 3/4] sequencer: teach autostash apply to take optional conflict marker labels Harald Nordgren via GitGitGadget
2026-03-17 9:35 ` [PATCH v6 4/4] checkout: -m (--merge) uses autostash when switching branches Harald Nordgren via GitGitGadget
2026-04-09 13:27 ` [PATCH v7 0/4] checkout: 'autostash' for branch switching Harald Nordgren via GitGitGadget
2026-04-09 13:27 ` [PATCH v7 1/4] stash: add --ours-label, --theirs-label, --base-label for apply Harald Nordgren via GitGitGadget
2026-04-09 17:25 ` Junio C Hamano
2026-04-09 20:31 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-09 13:27 ` [PATCH v7 2/4] sequencer: allow create_autostash to run silently Harald Nordgren via GitGitGadget
2026-04-09 13:27 ` [PATCH v7 3/4] sequencer: teach autostash apply to take optional conflict marker labels Harald Nordgren via GitGitGadget
2026-04-09 17:32 ` Junio C Hamano
2026-04-09 21:20 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-09 13:27 ` [PATCH v7 4/4] checkout: -m (--merge) uses autostash when switching branches Harald Nordgren via GitGitGadget
2026-04-09 17:55 ` Junio C Hamano
2026-04-09 20:32 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-09 17:00 ` [PATCH v7 0/4] checkout: 'autostash' " Junio C Hamano
2026-04-09 21:23 ` [PATCH] checkout: add --autostash option " Harald Nordgren
2026-04-09 19:17 ` [PATCH v8 0/4] checkout: 'autostash' " Harald Nordgren via GitGitGadget
2026-04-09 19:17 ` [PATCH v8 1/4] stash: add --ours-label, --theirs-label, --base-label for apply Harald Nordgren via GitGitGadget
2026-04-10 15:39 ` Phillip Wood
2026-04-10 16:15 ` Junio C Hamano
2026-04-10 19:18 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-09 19:17 ` [PATCH v8 2/4] sequencer: allow create_autostash to run silently Harald Nordgren via GitGitGadget
2026-04-10 15:39 ` Phillip Wood
2026-04-10 16:16 ` Junio C Hamano
2026-04-10 18:53 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-09 19:17 ` [PATCH v8 3/4] sequencer: teach autostash apply to take optional conflict marker labels Harald Nordgren via GitGitGadget
2026-04-10 15:39 ` Phillip Wood
2026-04-10 16:34 ` Junio C Hamano
2026-04-10 18:48 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-09 19:17 ` [PATCH v8 4/4] checkout: -m (--merge) uses autostash when switching branches Harald Nordgren via GitGitGadget
2026-04-09 23:49 ` Chris Torek
2026-04-10 14:38 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-10 21:01 ` [PATCH v9 0/4] checkout: 'autostash' " Harald Nordgren via GitGitGadget
2026-04-10 21:01 ` [PATCH v9 1/4] stash: add --label-ours, --label-theirs, --label-base for apply Harald Nordgren via GitGitGadget
2026-04-10 21:01 ` [PATCH v9 2/4] sequencer: allow create_autostash to run silently Harald Nordgren via GitGitGadget
2026-04-10 21:01 ` [PATCH v9 3/4] sequencer: teach autostash apply to take optional conflict marker labels Harald Nordgren via GitGitGadget
2026-04-10 21:01 ` [PATCH v9 4/4] checkout: -m (--merge) uses autostash when switching branches Harald Nordgren via GitGitGadget
2026-04-11 18:38 ` Jeff King
2026-04-11 18:51 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-11 19:11 ` Jeff King
2026-04-11 19:07 ` [PATCH v9 4/4] checkout: -m (--merge) uses autostash when switching branches Jeff King
2026-04-10 21:53 ` [PATCH v9 0/4] checkout: 'autostash' for branch switching Junio C Hamano
2026-04-12 11:51 ` [PATCH v10 " Harald Nordgren via GitGitGadget
2026-04-12 11:51 ` [PATCH v10 1/4] stash: add --label-ours, --label-theirs, --label-base for apply Harald Nordgren via GitGitGadget
2026-04-12 11:51 ` [PATCH v10 2/4] sequencer: allow create_autostash to run silently Harald Nordgren via GitGitGadget
2026-04-12 11:51 ` [PATCH v10 3/4] sequencer: teach autostash apply to take optional conflict marker labels Harald Nordgren via GitGitGadget
2026-04-12 11:51 ` [PATCH v10 4/4] checkout: -m (--merge) uses autostash when switching branches Harald Nordgren via GitGitGadget
2026-04-12 20:01 ` [PATCH v10 0/4] checkout: 'autostash' for branch switching Jeff King
2026-04-13 22:45 ` Junio C Hamano
2026-04-14 7:29 ` [PATCH] checkout: add --autostash option " Harald Nordgren
2026-04-14 13:29 ` Junio C Hamano
2026-04-14 14:14 ` Junio C Hamano
2026-04-14 17:42 ` Junio C Hamano
2026-04-14 10:50 ` [PATCH v11 0/4] checkout: 'autostash' " Harald Nordgren via GitGitGadget
2026-04-14 10:50 ` [PATCH v11 1/4] stash: add --label-ours, --label-theirs, --label-base for apply Harald Nordgren via GitGitGadget
2026-04-14 10:50 ` [PATCH v11 2/4] sequencer: allow create_autostash to run silently Harald Nordgren via GitGitGadget
2026-04-14 10:50 ` [PATCH v11 3/4] sequencer: teach autostash apply to take optional conflict marker labels Harald Nordgren via GitGitGadget
2026-04-14 10:50 ` [PATCH v11 4/4] checkout: -m (--merge) uses autostash when switching branches Harald Nordgren via GitGitGadget
2026-04-14 12:59 ` [PATCH v12 0/4] checkout: 'autostash' for branch switching Harald Nordgren via GitGitGadget
2026-04-14 12:59 ` [PATCH v12 1/4] stash: add --label-ours, --label-theirs, --label-base for apply Harald Nordgren via GitGitGadget
2026-04-14 14:05 ` Phillip Wood
2026-04-14 16:23 ` Junio C Hamano
2026-04-14 18:56 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-14 20:08 ` Harald Nordgren
2026-04-15 9:34 ` Phillip Wood
2026-04-15 15:34 ` Harald Nordgren
2026-04-14 12:59 ` [PATCH v12 2/4] sequencer: allow create_autostash to run silently Harald Nordgren via GitGitGadget
2026-04-14 14:06 ` Phillip Wood
2026-04-14 18:35 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-14 12:59 ` [PATCH v12 3/4] sequencer: teach autostash apply to take optional conflict marker labels Harald Nordgren via GitGitGadget
2026-04-14 14:06 ` Phillip Wood
2026-04-14 18:44 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-14 12:59 ` [PATCH v12 4/4] checkout: -m (--merge) uses autostash when switching branches Harald Nordgren via GitGitGadget
2026-04-14 14:07 ` Phillip Wood
2026-04-14 16:39 ` Junio C Hamano
2026-04-14 20:06 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-15 9:35 ` Phillip Wood
2026-04-14 20:13 ` Harald Nordgren
2026-04-15 8:19 ` Harald Nordgren
2026-04-15 9:34 ` Phillip Wood
2026-04-15 8:16 ` Harald Nordgren
2026-04-15 9:36 ` Phillip Wood
2026-04-14 15:56 ` [PATCH v12 0/4] checkout: 'autostash' " Junio C Hamano
2026-04-14 20:16 ` [PATCH] checkout: add --autostash option " Harald Nordgren
2026-04-14 20:56 ` Junio C Hamano
2026-04-16 10:05 ` Harald Nordgren
2026-04-16 14:45 ` Junio C Hamano
2026-04-16 17:53 ` Harald Nordgren
2026-04-15 11:11 ` [PATCH v13 0/5] checkout: 'autostash' " Harald Nordgren via GitGitGadget
2026-04-15 11:11 ` [PATCH v13 1/5] stash: add --label-ours, --label-theirs, --label-base for apply Harald Nordgren via GitGitGadget
2026-04-15 11:11 ` [PATCH v13 2/5] sequencer: allow create_autostash to run silently Harald Nordgren via GitGitGadget
2026-04-15 11:11 ` [PATCH v13 3/5] sequencer: teach autostash apply to take optional conflict marker labels Harald Nordgren via GitGitGadget
2026-04-15 11:11 ` [PATCH v13 4/5] checkout: rollback lock on early returns in merge_working_tree Harald Nordgren via GitGitGadget
2026-04-15 11:11 ` [PATCH v13 5/5] checkout -m: autostash when switching branches Harald Nordgren via GitGitGadget
2026-04-15 16:24 ` [PATCH v14 0/5] checkout: 'autostash' for branch switching Harald Nordgren via GitGitGadget
2026-04-15 16:24 ` [PATCH v14 1/5] stash: add --label-ours, --label-theirs, --label-base for apply Harald Nordgren via GitGitGadget
2026-04-15 16:24 ` [PATCH v14 2/5] sequencer: allow create_autostash to run silently Harald Nordgren via GitGitGadget
2026-04-15 16:24 ` [PATCH v14 3/5] sequencer: teach autostash apply to take optional conflict marker labels Harald Nordgren via GitGitGadget
2026-04-15 16:24 ` [PATCH v14 4/5] checkout: rollback lock on early returns in merge_working_tree Harald Nordgren via GitGitGadget
2026-04-15 16:24 ` [PATCH v14 5/5] checkout -m: autostash when switching branches Harald Nordgren via GitGitGadget
2026-04-24 15:47 ` Phillip Wood
2026-04-24 20:52 ` Comments on Phillip's review Harald Nordgren
2026-04-21 7:53 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-21 9:34 ` Phillip Wood
2026-04-22 17:58 ` Harald Nordgren
2026-04-24 15:52 ` [PATCH v14 0/5] checkout: 'autostash' " Phillip Wood
2026-04-24 21:10 ` [PATCH v15 " Harald Nordgren via GitGitGadget
2026-04-24 21:10 ` [PATCH v15 1/5] stash: add --label-ours, --label-theirs, --label-base for apply Harald Nordgren via GitGitGadget
2026-04-28 9:32 ` Phillip Wood
2026-04-28 15:16 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-24 21:10 ` [PATCH v15 2/5] sequencer: allow create_autostash to run silently Harald Nordgren via GitGitGadget
2026-04-28 9:32 ` Phillip Wood
2026-04-24 21:10 ` [PATCH v15 3/5] sequencer: teach autostash apply to take optional conflict marker labels Harald Nordgren via GitGitGadget
2026-04-28 9:33 ` Phillip Wood
2026-04-28 15:21 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-24 21:10 ` [PATCH v15 4/5] checkout: rollback lock on early returns in merge_working_tree Harald Nordgren via GitGitGadget
2026-04-28 9:33 ` Phillip Wood
2026-04-24 21:10 ` [PATCH v15 5/5] checkout -m: autostash when switching branches Harald Nordgren via GitGitGadget
2026-04-28 9:35 ` Phillip Wood
2026-04-28 18:08 ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-04-28 9:35 ` Phillip Wood [this message]
2026-04-28 18:39 ` [PATCH v16 0/5] checkout: 'autostash' " Harald Nordgren via GitGitGadget
2026-04-28 18:39 ` [PATCH v16 1/5] stash: add --label-ours, --label-theirs, --label-base for apply Harald Nordgren via GitGitGadget
2026-04-28 18:39 ` [PATCH v16 2/5] sequencer: allow create_autostash to run silently Harald Nordgren via GitGitGadget
2026-04-28 18:39 ` [PATCH v16 3/5] sequencer: teach autostash apply to take optional conflict marker labels Harald Nordgren via GitGitGadget
2026-04-28 18:39 ` [PATCH v16 4/5] checkout: rollback lock on early returns in merge_working_tree Harald Nordgren via GitGitGadget
2026-04-28 18:39 ` [PATCH v16 5/5] checkout -m: autostash when switching branches Harald Nordgren via GitGitGadget
2026-04-29 10:02 ` Phillip Wood
2026-04-29 10:02 ` [PATCH v16 0/5] checkout: 'autostash' for branch switching Phillip Wood
2026-04-29 11:11 ` [PATCH] checkout: add --autostash option " Harald Nordgren
2026-05-07 20:11 ` [PATCH v16 0/5] checkout: 'autostash' " Harald Nordgren
2026-05-08 13:02 ` Phillip Wood
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=df5bf999-c545-4cb4-94da-b9062b026421@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=chris.torek@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=haraldnordgren@gmail.com \
--cc=peff@peff.net \
--cc=phillip.wood@dunelm.org.uk \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox