Re: [PATCH v6 15/27] switch: add --discard-changes
- From
- Phillip Wood <phillip.wood123@gmail.com>
- Date
- Apr 25, 2019, 10:02 UTC
- Message-ID
- <17402ee1-68c1-e51f-dc32-0795e0b63bc8@gmail.com>
- In-Reply-To
- <20190329103919.15642-16-pclouds@gmail.com>
On 29/03/2019 10:39, Nguyễn Thái Ngọc Duy wrote:
> --discard-changes is a better name than --force for this option since > it's what really happens.
I didn't realize when I suggested the name that --force overwrites untracked files as well as discarding changes from tracked files. I think we should document that. It would be nice if read-tree --reset -u took an optional argument so read-tree --reset=tracked -u would not overwrite untracked files. Then we could have --discard-changes just discard the changes and not overwrite untracked files. I had a quick look at unpack trees and it looks like a fairly straight forward change (famous last words) - perhaps I'll have a go at it next week.
Best Wishes
Phillip
Show 72 quoted lines
> --force is turned to an alias for
> --discard-changes. But it's meant to be an alias for potentially more
> force options in the future.
>
> Side note. It's not obvious from the patch but --discard-changes also
> affects submodules if --recurse-submodules is used. The knob to force
> updating submodules is hidden behind unpack-trees.c
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> ---
> builtin/checkout.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/builtin/checkout.c b/builtin/checkout.c
> index 319ba372e3..6d0b2ef565 100644
> --- a/builtin/checkout.c
> +++ b/builtin/checkout.c
> @@ -53,6 +53,7 @@ struct checkout_opts {
> int count_checkout_paths;
> int overlay_mode;
> int no_dwim_new_local_branch;
> + int discard_changes;
>
> /*
> * If new checkout options are added, skip_merge_working_tree
> @@ -680,7 +681,7 @@ static int merge_working_tree(const struct checkout_opts *opts,
> return error(_("index file corrupt"));
>
> resolve_undo_clear();
> - if (opts->force) {
> + if (opts->discard_changes) {
> ret = reset_tree(get_commit_tree(new_branch_info->commit),
> opts, 1, writeout_error);
> if (ret)
> @@ -802,7 +803,7 @@ static int merge_working_tree(const struct checkout_opts *opts,
> if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
> die(_("unable to write new index file"));
>
> - if (!opts->force && !opts->quiet)
> + if (!opts->discard_changes && !opts->quiet)
> show_local_changes(&new_branch_info->commit->object, &opts->diff_options);
>
> return 0;
> @@ -1309,6 +1310,9 @@ static int checkout_branch(struct checkout_opts *opts,
> if (opts->force && opts->merge)
> die(_("'%s' cannot be used with '%s'"), "-f", "-m");
>
> + if (opts->discard_changes && opts->merge)
> + die(_("'%s' cannot be used with '%s'"), "--discard-changes", "--merge");
> +
> if (opts->force_detach && opts->new_branch)
> die(_("'%s' cannot be used with '%s'"),
> "--detach", "-b/-B/--orphan");
> @@ -1445,6 +1449,8 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
> opts->merge = 1; /* implied */
> git_xmerge_config("merge.conflictstyle", opts->conflict_style, NULL);
> }
> + if (opts->force)
> + opts->discard_changes = 1;
>
> if ((!!opts->new_branch + !!opts->new_branch_force + !!opts->new_orphan_branch) > 1)
> die(_("-b, -B and --orphan are mutually exclusive"));
> @@ -1600,6 +1606,8 @@ int cmd_switch(int argc, const char **argv, const char *prefix)
> N_("create and switch to a new branch")),
> OPT_STRING('C', "force-create", &opts.new_branch_force, N_("branch"),
> N_("create/reset and switch to a branch")),
> + OPT_BOOL(0, "discard-changes", &opts.discard_changes,
> + N_("throw away local modifications")),
> OPT_END()
> };
> int ret;
>