git checkout: create unparented branch by --orphan
Similar to -b, --orphan creates a new branch, but it starts without any commit. After running "git checkout --orphan newbranch", you are on a new branch "newbranch", and the first commit you create from this state will start a new history without any ancestry. "git checkout --orphan" keeps the index and the working tree files intact in order to make it convenient for creating a new history whose trees resemble the ones from the original branch. When creating a branch whose trees have no resemblance to the ones from the original branch, it may be easier to start work on the new branch by untracking and removing all working tree files that came from the original branch, by running a 'git rm -rf .' immediately after running "checkout --orphan". Signed-off-by: Erick Mattos <erick.mattos@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
f1ba1c90e1
commit
9db5ebf402
@ -33,6 +33,7 @@ struct checkout_opts {
|
||||
int writeout_error;
|
||||
|
||||
const char *new_branch;
|
||||
const char *new_orphan_branch;
|
||||
int new_branch_log;
|
||||
enum branch_track track;
|
||||
};
|
||||
@ -491,8 +492,9 @@ static void update_refs_for_switch(struct checkout_opts *opts,
|
||||
struct strbuf msg = STRBUF_INIT;
|
||||
const char *old_desc;
|
||||
if (opts->new_branch) {
|
||||
create_branch(old->name, opts->new_branch, new->name, 0,
|
||||
opts->new_branch_log, opts->track);
|
||||
if (!opts->new_orphan_branch)
|
||||
create_branch(old->name, opts->new_branch, new->name, 0,
|
||||
opts->new_branch_log, opts->track);
|
||||
new->name = opts->new_branch;
|
||||
setup_branch_path(new);
|
||||
}
|
||||
@ -632,6 +634,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
|
||||
OPT_BOOLEAN('l', NULL, &opts.new_branch_log, "log for new branch"),
|
||||
OPT_SET_INT('t', "track", &opts.track, "track",
|
||||
BRANCH_TRACK_EXPLICIT),
|
||||
OPT_STRING(0, "orphan", &opts.new_orphan_branch, "new branch", "new unparented branch"),
|
||||
OPT_SET_INT('2', "ours", &opts.writeout_stage, "stage",
|
||||
2),
|
||||
OPT_SET_INT('3', "theirs", &opts.writeout_stage, "stage",
|
||||
@ -677,6 +680,14 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
|
||||
opts.new_branch = argv0 + 1;
|
||||
}
|
||||
|
||||
if (opts.new_orphan_branch) {
|
||||
if (opts.new_branch)
|
||||
die("--orphan and -b are mutually exclusive");
|
||||
if (opts.track > 0 || opts.new_branch_log)
|
||||
die("--orphan cannot be used with -t or -l");
|
||||
opts.new_branch = opts.new_orphan_branch;
|
||||
}
|
||||
|
||||
if (conflict_style) {
|
||||
opts.merge = 1; /* implied */
|
||||
git_xmerge_config("merge.conflictstyle", conflict_style, NULL);
|
||||
|
Reference in New Issue
Block a user