1#define USE_THE_INDEX_COMPATIBILITY_MACROS 2#include"builtin.h" 3#include"advice.h" 4#include"blob.h" 5#include"branch.h" 6#include"cache-tree.h" 7#include"checkout.h" 8#include"commit.h" 9#include"config.h" 10#include"diff.h" 11#include"dir.h" 12#include"ll-merge.h" 13#include"lockfile.h" 14#include"merge-recursive.h" 15#include"object-store.h" 16#include"parse-options.h" 17#include"refs.h" 18#include"remote.h" 19#include"resolve-undo.h" 20#include"revision.h" 21#include"run-command.h" 22#include"submodule.h" 23#include"submodule-config.h" 24#include"tree.h" 25#include"tree-walk.h" 26#include"unpack-trees.h" 27#include"xdiff-interface.h" 28 29static int checkout_optimize_new_branch; 30 31static const char*const checkout_usage[] = { 32N_("git checkout [<options>] <branch>"), 33N_("git checkout [<options>] [<branch>] -- <file>..."), 34 NULL, 35}; 36 37struct checkout_opts { 38int patch_mode; 39int quiet; 40int merge; 41int force; 42int force_detach; 43int writeout_stage; 44int overwrite_ignore; 45int ignore_skipworktree; 46int ignore_other_worktrees; 47int show_progress; 48int count_checkout_paths; 49int overlay_mode; 50int no_dwim_new_local_branch; 51 52/* 53 * If new checkout options are added, skip_merge_working_tree 54 * should be updated accordingly. 55 */ 56 57const char*new_branch; 58const char*new_branch_force; 59const char*new_orphan_branch; 60int new_branch_log; 61enum branch_track track; 62struct diff_options diff_options; 63char*conflict_style; 64 65int branch_exists; 66const char*prefix; 67struct pathspec pathspec; 68struct tree *source_tree; 69}; 70 71static intpost_checkout_hook(struct commit *old_commit,struct commit *new_commit, 72int changed) 73{ 74returnrun_hook_le(NULL,"post-checkout", 75oid_to_hex(old_commit ? &old_commit->object.oid : &null_oid), 76oid_to_hex(new_commit ? &new_commit->object.oid : &null_oid), 77 changed ?"1":"0", NULL); 78/* "new_commit" can be NULL when checking out from the index before 79 a commit exists. */ 80 81} 82 83static intupdate_some(const struct object_id *oid,struct strbuf *base, 84const char*pathname,unsigned mode,int stage,void*context) 85{ 86int len; 87struct cache_entry *ce; 88int pos; 89 90if(S_ISDIR(mode)) 91return READ_TREE_RECURSIVE; 92 93 len = base->len +strlen(pathname); 94 ce =make_empty_cache_entry(&the_index, len); 95oidcpy(&ce->oid, oid); 96memcpy(ce->name, base->buf, base->len); 97memcpy(ce->name + base->len, pathname, len - base->len); 98 ce->ce_flags =create_ce_flags(0) | CE_UPDATE; 99 ce->ce_namelen = len; 100 ce->ce_mode =create_ce_mode(mode); 101 102/* 103 * If the entry is the same as the current index, we can leave the old 104 * entry in place. Whether it is UPTODATE or not, checkout_entry will 105 * do the right thing. 106 */ 107 pos =cache_name_pos(ce->name, ce->ce_namelen); 108if(pos >=0) { 109struct cache_entry *old = active_cache[pos]; 110if(ce->ce_mode == old->ce_mode && 111oideq(&ce->oid, &old->oid)) { 112 old->ce_flags |= CE_UPDATE; 113discard_cache_entry(ce); 114return0; 115} 116} 117 118add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE); 119return0; 120} 121 122static intread_tree_some(struct tree *tree,const struct pathspec *pathspec) 123{ 124read_tree_recursive(the_repository, tree,"",0,0, 125 pathspec, update_some, NULL); 126 127/* update the index with the given tree's info 128 * for all args, expanding wildcards, and exit 129 * with any non-zero return code. 130 */ 131return0; 132} 133 134static intskip_same_name(const struct cache_entry *ce,int pos) 135{ 136while(++pos < active_nr && 137!strcmp(active_cache[pos]->name, ce->name)) 138;/* skip */ 139return pos; 140} 141 142static intcheck_stage(int stage,const struct cache_entry *ce,int pos, 143int overlay_mode) 144{ 145while(pos < active_nr && 146!strcmp(active_cache[pos]->name, ce->name)) { 147if(ce_stage(active_cache[pos]) == stage) 148return0; 149 pos++; 150} 151if(!overlay_mode) 152return0; 153if(stage ==2) 154returnerror(_("path '%s' does not have our version"), ce->name); 155else 156returnerror(_("path '%s' does not have their version"), ce->name); 157} 158 159static intcheck_stages(unsigned stages,const struct cache_entry *ce,int pos) 160{ 161unsigned seen =0; 162const char*name = ce->name; 163 164while(pos < active_nr) { 165 ce = active_cache[pos]; 166if(strcmp(name, ce->name)) 167break; 168 seen |= (1<<ce_stage(ce)); 169 pos++; 170} 171if((stages & seen) != stages) 172returnerror(_("path '%s' does not have all necessary versions"), 173 name); 174return0; 175} 176 177static intcheckout_stage(int stage,const struct cache_entry *ce,int pos, 178const struct checkout *state,int*nr_checkouts, 179int overlay_mode) 180{ 181while(pos < active_nr && 182!strcmp(active_cache[pos]->name, ce->name)) { 183if(ce_stage(active_cache[pos]) == stage) 184returncheckout_entry(active_cache[pos], state, 185 NULL, nr_checkouts); 186 pos++; 187} 188if(!overlay_mode) { 189unlink_entry(ce); 190return0; 191} 192if(stage ==2) 193returnerror(_("path '%s' does not have our version"), ce->name); 194else 195returnerror(_("path '%s' does not have their version"), ce->name); 196} 197 198static intcheckout_merged(int pos,const struct checkout *state,int*nr_checkouts) 199{ 200struct cache_entry *ce = active_cache[pos]; 201const char*path = ce->name; 202 mmfile_t ancestor, ours, theirs; 203int status; 204struct object_id oid; 205 mmbuffer_t result_buf; 206struct object_id threeway[3]; 207unsigned mode =0; 208 209memset(threeway,0,sizeof(threeway)); 210while(pos < active_nr) { 211int stage; 212 stage =ce_stage(ce); 213if(!stage ||strcmp(path, ce->name)) 214break; 215oidcpy(&threeway[stage -1], &ce->oid); 216if(stage ==2) 217 mode =create_ce_mode(ce->ce_mode); 218 pos++; 219 ce = active_cache[pos]; 220} 221if(is_null_oid(&threeway[1]) ||is_null_oid(&threeway[2])) 222returnerror(_("path '%s' does not have necessary versions"), path); 223 224read_mmblob(&ancestor, &threeway[0]); 225read_mmblob(&ours, &threeway[1]); 226read_mmblob(&theirs, &threeway[2]); 227 228/* 229 * NEEDSWORK: re-create conflicts from merges with 230 * merge.renormalize set, too 231 */ 232 status =ll_merge(&result_buf, path, &ancestor,"base", 233&ours,"ours", &theirs,"theirs", 234 state->istate, NULL); 235free(ancestor.ptr); 236free(ours.ptr); 237free(theirs.ptr); 238if(status <0|| !result_buf.ptr) { 239free(result_buf.ptr); 240returnerror(_("path '%s': cannot merge"), path); 241} 242 243/* 244 * NEEDSWORK: 245 * There is absolutely no reason to write this as a blob object 246 * and create a phony cache entry. This hack is primarily to get 247 * to the write_entry() machinery that massages the contents to 248 * work-tree format and writes out which only allows it for a 249 * cache entry. The code in write_entry() needs to be refactored 250 * to allow us to feed a <buffer, size, mode> instead of a cache 251 * entry. Such a refactoring would help merge_recursive as well 252 * (it also writes the merge result to the object database even 253 * when it may contain conflicts). 254 */ 255if(write_object_file(result_buf.ptr, result_buf.size, blob_type, &oid)) 256die(_("Unable to add merge result for '%s'"), path); 257free(result_buf.ptr); 258 ce =make_transient_cache_entry(mode, &oid, path,2); 259if(!ce) 260die(_("make_cache_entry failed for path '%s'"), path); 261 status =checkout_entry(ce, state, NULL, nr_checkouts); 262discard_cache_entry(ce); 263return status; 264} 265 266static voidmark_ce_for_checkout_overlay(struct cache_entry *ce, 267char*ps_matched, 268const struct checkout_opts *opts) 269{ 270 ce->ce_flags &= ~CE_MATCHED; 271if(!opts->ignore_skipworktree &&ce_skip_worktree(ce)) 272return; 273if(opts->source_tree && !(ce->ce_flags & CE_UPDATE)) 274/* 275 * "git checkout tree-ish -- path", but this entry 276 * is in the original index but is not in tree-ish 277 * or does not match the pathspec; it will not be 278 * checked out to the working tree. We will not do 279 * anything to this entry at all. 280 */ 281return; 282/* 283 * Either this entry came from the tree-ish we are 284 * checking the paths out of, or we are checking out 285 * of the index. 286 * 287 * If it comes from the tree-ish, we already know it 288 * matches the pathspec and could just stamp 289 * CE_MATCHED to it from update_some(). But we still 290 * need ps_matched and read_tree_recursive (and 291 * eventually tree_entry_interesting) cannot fill 292 * ps_matched yet. Once it can, we can avoid calling 293 * match_pathspec() for _all_ entries when 294 * opts->source_tree != NULL. 295 */ 296if(ce_path_match(&the_index, ce, &opts->pathspec, ps_matched)) 297 ce->ce_flags |= CE_MATCHED; 298} 299 300static voidmark_ce_for_checkout_no_overlay(struct cache_entry *ce, 301char*ps_matched, 302const struct checkout_opts *opts) 303{ 304 ce->ce_flags &= ~CE_MATCHED; 305if(!opts->ignore_skipworktree &&ce_skip_worktree(ce)) 306return; 307if(ce_path_match(&the_index, ce, &opts->pathspec, ps_matched)) { 308 ce->ce_flags |= CE_MATCHED; 309if(opts->source_tree && !(ce->ce_flags & CE_UPDATE)) 310/* 311 * In overlay mode, but the path is not in 312 * tree-ish, which means we should remove it 313 * from the index and the working tree. 314 */ 315 ce->ce_flags |= CE_REMOVE | CE_WT_REMOVE; 316} 317} 318 319static intcheckout_paths(const struct checkout_opts *opts, 320const char*revision) 321{ 322int pos; 323struct checkout state = CHECKOUT_INIT; 324static char*ps_matched; 325struct object_id rev; 326struct commit *head; 327int errs =0; 328struct lock_file lock_file = LOCK_INIT; 329int nr_checkouts =0, nr_unmerged =0; 330 331trace2_cmd_mode(opts->patch_mode ?"patch":"path"); 332 333if(opts->track != BRANCH_TRACK_UNSPECIFIED) 334die(_("'%s' cannot be used with updating paths"),"--track"); 335 336if(opts->new_branch_log) 337die(_("'%s' cannot be used with updating paths"),"-l"); 338 339if(opts->force && opts->patch_mode) 340die(_("'%s' cannot be used with updating paths"),"-f"); 341 342if(opts->force_detach) 343die(_("'%s' cannot be used with updating paths"),"--detach"); 344 345if(opts->merge && opts->patch_mode) 346die(_("'%s' cannot be used with%s"),"--merge","--patch"); 347 348if(opts->force && opts->merge) 349die(_("'%s' cannot be used with%s"),"-f","-m"); 350 351if(opts->new_branch) 352die(_("Cannot update paths and switch to branch '%s' at the same time."), 353 opts->new_branch); 354 355if(opts->patch_mode) 356returnrun_add_interactive(revision,"--patch=checkout", 357&opts->pathspec); 358 359repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR); 360if(read_cache_preload(&opts->pathspec) <0) 361returnerror(_("index file corrupt")); 362 363if(opts->source_tree) 364read_tree_some(opts->source_tree, &opts->pathspec); 365 366 ps_matched =xcalloc(opts->pathspec.nr,1); 367 368/* 369 * Make sure all pathspecs participated in locating the paths 370 * to be checked out. 371 */ 372for(pos =0; pos < active_nr; pos++) 373if(opts->overlay_mode) 374mark_ce_for_checkout_overlay(active_cache[pos], 375 ps_matched, 376 opts); 377else 378mark_ce_for_checkout_no_overlay(active_cache[pos], 379 ps_matched, 380 opts); 381 382if(report_path_error(ps_matched, &opts->pathspec, opts->prefix)) { 383free(ps_matched); 384return1; 385} 386free(ps_matched); 387 388/* "checkout -m path" to recreate conflicted state */ 389if(opts->merge) 390unmerge_marked_index(&the_index); 391 392/* Any unmerged paths? */ 393for(pos =0; pos < active_nr; pos++) { 394const struct cache_entry *ce = active_cache[pos]; 395if(ce->ce_flags & CE_MATCHED) { 396if(!ce_stage(ce)) 397continue; 398if(opts->force) { 399warning(_("path '%s' is unmerged"), ce->name); 400}else if(opts->writeout_stage) { 401 errs |=check_stage(opts->writeout_stage, ce, pos, opts->overlay_mode); 402}else if(opts->merge) { 403 errs |=check_stages((1<<2) | (1<<3), ce, pos); 404}else{ 405 errs =1; 406error(_("path '%s' is unmerged"), ce->name); 407} 408 pos =skip_same_name(ce, pos) -1; 409} 410} 411if(errs) 412return1; 413 414/* Now we are committed to check them out */ 415 state.force =1; 416 state.refresh_cache =1; 417 state.istate = &the_index; 418 419enable_delayed_checkout(&state); 420for(pos =0; pos < active_nr; pos++) { 421struct cache_entry *ce = active_cache[pos]; 422if(ce->ce_flags & CE_MATCHED) { 423if(!ce_stage(ce)) { 424 errs |=checkout_entry(ce, &state, 425 NULL, &nr_checkouts); 426continue; 427} 428if(opts->writeout_stage) 429 errs |=checkout_stage(opts->writeout_stage, 430 ce, pos, 431&state, 432&nr_checkouts, opts->overlay_mode); 433else if(opts->merge) 434 errs |=checkout_merged(pos, &state, 435&nr_unmerged); 436 pos =skip_same_name(ce, pos) -1; 437} 438} 439remove_marked_cache_entries(&the_index,1); 440remove_scheduled_dirs(); 441 errs |=finish_delayed_checkout(&state, &nr_checkouts); 442 443if(opts->count_checkout_paths) { 444if(nr_unmerged) 445fprintf_ln(stderr,Q_("Recreated%dmerge conflict", 446"Recreated%dmerge conflicts", 447 nr_unmerged), 448 nr_unmerged); 449if(opts->source_tree) 450fprintf_ln(stderr,Q_("Updated%dpath from%s", 451"Updated%dpaths from%s", 452 nr_checkouts), 453 nr_checkouts, 454find_unique_abbrev(&opts->source_tree->object.oid, 455 DEFAULT_ABBREV)); 456else if(!nr_unmerged || nr_checkouts) 457fprintf_ln(stderr,Q_("Updated%dpath from the index", 458"Updated%dpaths from the index", 459 nr_checkouts), 460 nr_checkouts); 461} 462 463if(write_locked_index(&the_index, &lock_file, COMMIT_LOCK)) 464die(_("unable to write new index file")); 465 466read_ref_full("HEAD",0, &rev, NULL); 467 head =lookup_commit_reference_gently(the_repository, &rev,1); 468 469 errs |=post_checkout_hook(head, head,0); 470return errs; 471} 472 473static voidshow_local_changes(struct object *head, 474const struct diff_options *opts) 475{ 476struct rev_info rev; 477/* I think we want full paths, even if we're in a subdirectory. */ 478repo_init_revisions(the_repository, &rev, NULL); 479 rev.diffopt.flags = opts->flags; 480 rev.diffopt.output_format |= DIFF_FORMAT_NAME_STATUS; 481diff_setup_done(&rev.diffopt); 482add_pending_object(&rev, head, NULL); 483run_diff_index(&rev,0); 484} 485 486static voiddescribe_detached_head(const char*msg,struct commit *commit) 487{ 488struct strbuf sb = STRBUF_INIT; 489 490if(!parse_commit(commit)) 491pp_commit_easy(CMIT_FMT_ONELINE, commit, &sb); 492if(print_sha1_ellipsis()) { 493fprintf(stderr,"%s %s...%s\n", msg, 494find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV), sb.buf); 495}else{ 496fprintf(stderr,"%s %s %s\n", msg, 497find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV), sb.buf); 498} 499strbuf_release(&sb); 500} 501 502static intreset_tree(struct tree *tree,const struct checkout_opts *o, 503int worktree,int*writeout_error) 504{ 505struct unpack_trees_options opts; 506struct tree_desc tree_desc; 507 508memset(&opts,0,sizeof(opts)); 509 opts.head_idx = -1; 510 opts.update = worktree; 511 opts.skip_unmerged = !worktree; 512 opts.reset =1; 513 opts.merge =1; 514 opts.fn = oneway_merge; 515 opts.verbose_update = o->show_progress; 516 opts.src_index = &the_index; 517 opts.dst_index = &the_index; 518parse_tree(tree); 519init_tree_desc(&tree_desc, tree->buffer, tree->size); 520switch(unpack_trees(1, &tree_desc, &opts)) { 521case-2: 522*writeout_error =1; 523/* 524 * We return 0 nevertheless, as the index is all right 525 * and more importantly we have made best efforts to 526 * update paths in the work tree, and we cannot revert 527 * them. 528 */ 529/* fallthrough */ 530case0: 531return0; 532default: 533return128; 534} 535} 536 537struct branch_info { 538const char*name;/* The short name used */ 539const char*path;/* The full name of a real branch */ 540struct commit *commit;/* The named commit */ 541/* 542 * if not null the branch is detached because it's already 543 * checked out in this checkout 544 */ 545char*checkout; 546}; 547 548static voidsetup_branch_path(struct branch_info *branch) 549{ 550struct strbuf buf = STRBUF_INIT; 551 552strbuf_branchname(&buf, branch->name, INTERPRET_BRANCH_LOCAL); 553if(strcmp(buf.buf, branch->name)) 554 branch->name =xstrdup(buf.buf); 555strbuf_splice(&buf,0,0,"refs/heads/",11); 556 branch->path =strbuf_detach(&buf, NULL); 557} 558 559/* 560 * Skip merging the trees, updating the index and working directory if and 561 * only if we are creating a new branch via "git checkout -b <new_branch>." 562 */ 563static intskip_merge_working_tree(const struct checkout_opts *opts, 564const struct branch_info *old_branch_info, 565const struct branch_info *new_branch_info) 566{ 567/* 568 * Do the merge if sparse checkout is on and the user has not opted in 569 * to the optimized behavior 570 */ 571if(core_apply_sparse_checkout && !checkout_optimize_new_branch) 572return0; 573 574/* 575 * We must do the merge if we are actually moving to a new commit. 576 */ 577if(!old_branch_info->commit || !new_branch_info->commit || 578!oideq(&old_branch_info->commit->object.oid, 579&new_branch_info->commit->object.oid)) 580return0; 581 582/* 583 * opts->patch_mode cannot be used with switching branches so is 584 * not tested here 585 */ 586 587/* 588 * opts->quiet only impacts output so doesn't require a merge 589 */ 590 591/* 592 * Honor the explicit request for a three-way merge or to throw away 593 * local changes 594 */ 595if(opts->merge || opts->force) 596return0; 597 598/* 599 * --detach is documented as "updating the index and the files in the 600 * working tree" but this optimization skips those steps so fall through 601 * to the regular code path. 602 */ 603if(opts->force_detach) 604return0; 605 606/* 607 * opts->writeout_stage cannot be used with switching branches so is 608 * not tested here 609 */ 610 611/* 612 * Honor the explicit ignore requests 613 */ 614if(!opts->overwrite_ignore || opts->ignore_skipworktree || 615 opts->ignore_other_worktrees) 616return0; 617 618/* 619 * opts->show_progress only impacts output so doesn't require a merge 620 */ 621 622/* 623 * opts->overlay_mode cannot be used with switching branches so is 624 * not tested here 625 */ 626 627/* 628 * If we aren't creating a new branch any changes or updates will 629 * happen in the existing branch. Since that could only be updating 630 * the index and working directory, we don't want to skip those steps 631 * or we've defeated any purpose in running the command. 632 */ 633if(!opts->new_branch) 634return0; 635 636/* 637 * new_branch_force is defined to "create/reset and checkout a branch" 638 * so needs to go through the merge to do the reset 639 */ 640if(opts->new_branch_force) 641return0; 642 643/* 644 * A new orphaned branch requrires the index and the working tree to be 645 * adjusted to <start_point> 646 */ 647if(opts->new_orphan_branch) 648return0; 649 650/* 651 * Remaining variables are not checkout options but used to track state 652 */ 653 654/* 655 * Do the merge if this is the initial checkout. We cannot use 656 * is_cache_unborn() here because the index hasn't been loaded yet 657 * so cache_nr and timestamp.sec are always zero. 658 */ 659if(!file_exists(get_index_file())) 660return0; 661 662return1; 663} 664 665static intmerge_working_tree(const struct checkout_opts *opts, 666struct branch_info *old_branch_info, 667struct branch_info *new_branch_info, 668int*writeout_error) 669{ 670int ret; 671struct lock_file lock_file = LOCK_INIT; 672 673hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR); 674if(read_cache_preload(NULL) <0) 675returnerror(_("index file corrupt")); 676 677resolve_undo_clear(); 678if(opts->force) { 679 ret =reset_tree(get_commit_tree(new_branch_info->commit), 680 opts,1, writeout_error); 681if(ret) 682return ret; 683}else{ 684struct tree_desc trees[2]; 685struct tree *tree; 686struct unpack_trees_options topts; 687 688memset(&topts,0,sizeof(topts)); 689 topts.head_idx = -1; 690 topts.src_index = &the_index; 691 topts.dst_index = &the_index; 692 693setup_unpack_trees_porcelain(&topts,"checkout"); 694 695refresh_cache(REFRESH_QUIET); 696 697if(unmerged_cache()) { 698error(_("you need to resolve your current index first")); 699return1; 700} 701 702/* 2-way merge to the new branch */ 703 topts.initial_checkout =is_cache_unborn(); 704 topts.update =1; 705 topts.merge =1; 706 topts.gently = opts->merge && old_branch_info->commit; 707 topts.verbose_update = opts->show_progress; 708 topts.fn = twoway_merge; 709if(opts->overwrite_ignore) { 710 topts.dir =xcalloc(1,sizeof(*topts.dir)); 711 topts.dir->flags |= DIR_SHOW_IGNORED; 712setup_standard_excludes(topts.dir); 713} 714 tree =parse_tree_indirect(old_branch_info->commit ? 715&old_branch_info->commit->object.oid : 716 the_hash_algo->empty_tree); 717init_tree_desc(&trees[0], tree->buffer, tree->size); 718 tree =parse_tree_indirect(&new_branch_info->commit->object.oid); 719init_tree_desc(&trees[1], tree->buffer, tree->size); 720 721 ret =unpack_trees(2, trees, &topts); 722clear_unpack_trees_porcelain(&topts); 723if(ret == -1) { 724/* 725 * Unpack couldn't do a trivial merge; either 726 * give up or do a real merge, depending on 727 * whether the merge flag was used. 728 */ 729struct tree *result; 730struct tree *work; 731struct merge_options o; 732if(!opts->merge) 733return1; 734 735/* 736 * Without old_branch_info->commit, the below is the same as 737 * the two-tree unpack we already tried and failed. 738 */ 739if(!old_branch_info->commit) 740return1; 741 742/* Do more real merge */ 743 744/* 745 * We update the index fully, then write the 746 * tree from the index, then merge the new 747 * branch with the current tree, with the old 748 * branch as the base. Then we reset the index 749 * (but not the working tree) to the new 750 * branch, leaving the working tree as the 751 * merged version, but skipping unmerged 752 * entries in the index. 753 */ 754 755add_files_to_cache(NULL, NULL,0); 756/* 757 * NEEDSWORK: carrying over local changes 758 * when branches have different end-of-line 759 * normalization (or clean+smudge rules) is 760 * a pain; plumb in an option to set 761 * o.renormalize? 762 */ 763init_merge_options(&o, the_repository); 764 o.verbosity =0; 765 work =write_tree_from_memory(&o); 766 767 ret =reset_tree(get_commit_tree(new_branch_info->commit), 768 opts,1, 769 writeout_error); 770if(ret) 771return ret; 772 o.ancestor = old_branch_info->name; 773 o.branch1 = new_branch_info->name; 774 o.branch2 ="local"; 775 ret =merge_trees(&o, 776get_commit_tree(new_branch_info->commit), 777 work, 778get_commit_tree(old_branch_info->commit), 779&result); 780if(ret <0) 781exit(128); 782 ret =reset_tree(get_commit_tree(new_branch_info->commit), 783 opts,0, 784 writeout_error); 785strbuf_release(&o.obuf); 786if(ret) 787return ret; 788} 789} 790 791if(!active_cache_tree) 792 active_cache_tree =cache_tree(); 793 794if(!cache_tree_fully_valid(active_cache_tree)) 795cache_tree_update(&the_index, WRITE_TREE_SILENT | WRITE_TREE_REPAIR); 796 797if(write_locked_index(&the_index, &lock_file, COMMIT_LOCK)) 798die(_("unable to write new index file")); 799 800if(!opts->force && !opts->quiet) 801show_local_changes(&new_branch_info->commit->object, &opts->diff_options); 802 803return0; 804} 805 806static voidreport_tracking(struct branch_info *new_branch_info) 807{ 808struct strbuf sb = STRBUF_INIT; 809struct branch *branch =branch_get(new_branch_info->name); 810 811if(!format_tracking_info(branch, &sb, AHEAD_BEHIND_FULL)) 812return; 813fputs(sb.buf, stdout); 814strbuf_release(&sb); 815} 816 817static voidupdate_refs_for_switch(const struct checkout_opts *opts, 818struct branch_info *old_branch_info, 819struct branch_info *new_branch_info) 820{ 821struct strbuf msg = STRBUF_INIT; 822const char*old_desc, *reflog_msg; 823if(opts->new_branch) { 824if(opts->new_orphan_branch) { 825char*refname; 826 827 refname =mkpathdup("refs/heads/%s", opts->new_orphan_branch); 828if(opts->new_branch_log && 829!should_autocreate_reflog(refname)) { 830int ret; 831struct strbuf err = STRBUF_INIT; 832 833 ret =safe_create_reflog(refname,1, &err); 834if(ret) { 835fprintf(stderr,_("Can not do reflog for '%s':%s\n"), 836 opts->new_orphan_branch, err.buf); 837strbuf_release(&err); 838free(refname); 839return; 840} 841strbuf_release(&err); 842} 843free(refname); 844} 845else 846create_branch(the_repository, 847 opts->new_branch, new_branch_info->name, 848 opts->new_branch_force ?1:0, 849 opts->new_branch_force ?1:0, 850 opts->new_branch_log, 851 opts->quiet, 852 opts->track); 853 new_branch_info->name = opts->new_branch; 854setup_branch_path(new_branch_info); 855} 856 857 old_desc = old_branch_info->name; 858if(!old_desc && old_branch_info->commit) 859 old_desc =oid_to_hex(&old_branch_info->commit->object.oid); 860 861 reflog_msg =getenv("GIT_REFLOG_ACTION"); 862if(!reflog_msg) 863strbuf_addf(&msg,"checkout: moving from%sto%s", 864 old_desc ? old_desc :"(invalid)", new_branch_info->name); 865else 866strbuf_insert(&msg,0, reflog_msg,strlen(reflog_msg)); 867 868if(!strcmp(new_branch_info->name,"HEAD") && !new_branch_info->path && !opts->force_detach) { 869/* Nothing to do. */ 870}else if(opts->force_detach || !new_branch_info->path) {/* No longer on any branch. */ 871update_ref(msg.buf,"HEAD", &new_branch_info->commit->object.oid, NULL, 872 REF_NO_DEREF, UPDATE_REFS_DIE_ON_ERR); 873if(!opts->quiet) { 874if(old_branch_info->path && 875 advice_detached_head && !opts->force_detach) 876detach_advice(new_branch_info->name); 877describe_detached_head(_("HEAD is now at"), new_branch_info->commit); 878} 879}else if(new_branch_info->path) {/* Switch branches. */ 880if(create_symref("HEAD", new_branch_info->path, msg.buf) <0) 881die(_("unable to update HEAD")); 882if(!opts->quiet) { 883if(old_branch_info->path && !strcmp(new_branch_info->path, old_branch_info->path)) { 884if(opts->new_branch_force) 885fprintf(stderr,_("Reset branch '%s'\n"), 886 new_branch_info->name); 887else 888fprintf(stderr,_("Already on '%s'\n"), 889 new_branch_info->name); 890}else if(opts->new_branch) { 891if(opts->branch_exists) 892fprintf(stderr,_("Switched to and reset branch '%s'\n"), new_branch_info->name); 893else 894fprintf(stderr,_("Switched to a new branch '%s'\n"), new_branch_info->name); 895}else{ 896fprintf(stderr,_("Switched to branch '%s'\n"), 897 new_branch_info->name); 898} 899} 900if(old_branch_info->path && old_branch_info->name) { 901if(!ref_exists(old_branch_info->path) &&reflog_exists(old_branch_info->path)) 902delete_reflog(old_branch_info->path); 903} 904} 905remove_branch_state(the_repository, !opts->quiet); 906strbuf_release(&msg); 907if(!opts->quiet && 908(new_branch_info->path || (!opts->force_detach && !strcmp(new_branch_info->name,"HEAD")))) 909report_tracking(new_branch_info); 910} 911 912static intadd_pending_uninteresting_ref(const char*refname, 913const struct object_id *oid, 914int flags,void*cb_data) 915{ 916add_pending_oid(cb_data, refname, oid, UNINTERESTING); 917return0; 918} 919 920static voiddescribe_one_orphan(struct strbuf *sb,struct commit *commit) 921{ 922strbuf_addstr(sb," "); 923strbuf_add_unique_abbrev(sb, &commit->object.oid, DEFAULT_ABBREV); 924strbuf_addch(sb,' '); 925if(!parse_commit(commit)) 926pp_commit_easy(CMIT_FMT_ONELINE, commit, sb); 927strbuf_addch(sb,'\n'); 928} 929 930#define ORPHAN_CUTOFF 4 931static voidsuggest_reattach(struct commit *commit,struct rev_info *revs) 932{ 933struct commit *c, *last = NULL; 934struct strbuf sb = STRBUF_INIT; 935int lost =0; 936while((c =get_revision(revs)) != NULL) { 937if(lost < ORPHAN_CUTOFF) 938describe_one_orphan(&sb, c); 939 last = c; 940 lost++; 941} 942if(ORPHAN_CUTOFF < lost) { 943int more = lost - ORPHAN_CUTOFF; 944if(more ==1) 945describe_one_orphan(&sb, last); 946else 947strbuf_addf(&sb,_(" ... and%dmore.\n"), more); 948} 949 950fprintf(stderr, 951Q_( 952/* The singular version */ 953"Warning: you are leaving%dcommit behind, " 954"not connected to\n" 955"any of your branches:\n\n" 956"%s\n", 957/* The plural version */ 958"Warning: you are leaving%dcommits behind, " 959"not connected to\n" 960"any of your branches:\n\n" 961"%s\n", 962/* Give ngettext() the count */ 963 lost), 964 lost, 965 sb.buf); 966strbuf_release(&sb); 967 968if(advice_detached_head) 969fprintf(stderr, 970Q_( 971/* The singular version */ 972"If you want to keep it by creating a new branch, " 973"this may be a good time\nto do so with:\n\n" 974" git branch <new-branch-name>%s\n\n", 975/* The plural version */ 976"If you want to keep them by creating a new branch, " 977"this may be a good time\nto do so with:\n\n" 978" git branch <new-branch-name>%s\n\n", 979/* Give ngettext() the count */ 980 lost), 981find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV)); 982} 983 984/* 985 * We are about to leave commit that was at the tip of a detached 986 * HEAD. If it is not reachable from any ref, this is the last chance 987 * for the user to do so without resorting to reflog. 988 */ 989static voidorphaned_commit_warning(struct commit *old_commit,struct commit *new_commit) 990{ 991struct rev_info revs; 992struct object *object = &old_commit->object; 993 994repo_init_revisions(the_repository, &revs, NULL); 995setup_revisions(0, NULL, &revs, NULL); 996 997 object->flags &= ~UNINTERESTING; 998add_pending_object(&revs, object,oid_to_hex(&object->oid)); 9991000for_each_ref(add_pending_uninteresting_ref, &revs);1001add_pending_oid(&revs,"HEAD", &new_commit->object.oid, UNINTERESTING);10021003if(prepare_revision_walk(&revs))1004die(_("internal error in revision walk"));1005if(!(old_commit->object.flags & UNINTERESTING))1006suggest_reattach(old_commit, &revs);1007else1008describe_detached_head(_("Previous HEAD position was"), old_commit);10091010/* Clean up objects used, as they will be reused. */1011clear_commit_marks_all(ALL_REV_FLAGS);1012}10131014static intswitch_branches(const struct checkout_opts *opts,1015struct branch_info *new_branch_info)1016{1017int ret =0;1018struct branch_info old_branch_info;1019void*path_to_free;1020struct object_id rev;1021int flag, writeout_error =0;10221023trace2_cmd_mode("branch");10241025memset(&old_branch_info,0,sizeof(old_branch_info));1026 old_branch_info.path = path_to_free =resolve_refdup("HEAD",0, &rev, &flag);1027if(old_branch_info.path)1028 old_branch_info.commit =lookup_commit_reference_gently(the_repository, &rev,1);1029if(!(flag & REF_ISSYMREF))1030 old_branch_info.path = NULL;10311032if(old_branch_info.path)1033skip_prefix(old_branch_info.path,"refs/heads/", &old_branch_info.name);10341035if(!new_branch_info->name) {1036 new_branch_info->name ="HEAD";1037 new_branch_info->commit = old_branch_info.commit;1038if(!new_branch_info->commit)1039die(_("You are on a branch yet to be born"));1040parse_commit_or_die(new_branch_info->commit);1041}10421043/* optimize the "checkout -b <new_branch> path */1044if(skip_merge_working_tree(opts, &old_branch_info, new_branch_info)) {1045if(!checkout_optimize_new_branch && !opts->quiet) {1046if(read_cache_preload(NULL) <0)1047returnerror(_("index file corrupt"));1048show_local_changes(&new_branch_info->commit->object, &opts->diff_options);1049}1050}else{1051 ret =merge_working_tree(opts, &old_branch_info, new_branch_info, &writeout_error);1052if(ret) {1053free(path_to_free);1054return ret;1055}1056}10571058if(!opts->quiet && !old_branch_info.path && old_branch_info.commit && new_branch_info->commit != old_branch_info.commit)1059orphaned_commit_warning(old_branch_info.commit, new_branch_info->commit);10601061update_refs_for_switch(opts, &old_branch_info, new_branch_info);10621063 ret =post_checkout_hook(old_branch_info.commit, new_branch_info->commit,1);1064free(path_to_free);1065return ret || writeout_error;1066}10671068static intgit_checkout_config(const char*var,const char*value,void*cb)1069{1070if(!strcmp(var,"checkout.optimizenewbranch")) {1071 checkout_optimize_new_branch =git_config_bool(var, value);1072return0;1073}10741075if(!strcmp(var,"diff.ignoresubmodules")) {1076struct checkout_opts *opts = cb;1077handle_ignore_submodules_arg(&opts->diff_options, value);1078return0;1079}10801081if(starts_with(var,"submodule."))1082returngit_default_submodule_config(var, value, NULL);10831084returngit_xmerge_config(var, value, NULL);1085}10861087static voidsetup_new_branch_info_and_source_tree(1088struct branch_info *new_branch_info,1089struct checkout_opts *opts,1090struct object_id *rev,1091const char*arg)1092{1093struct tree **source_tree = &opts->source_tree;1094struct object_id branch_rev;10951096 new_branch_info->name = arg;1097setup_branch_path(new_branch_info);10981099if(!check_refname_format(new_branch_info->path,0) &&1100!read_ref(new_branch_info->path, &branch_rev))1101oidcpy(rev, &branch_rev);1102else1103 new_branch_info->path = NULL;/* not an existing branch */11041105 new_branch_info->commit =lookup_commit_reference_gently(the_repository, rev,1);1106if(!new_branch_info->commit) {1107/* not a commit */1108*source_tree =parse_tree_indirect(rev);1109}else{1110parse_commit_or_die(new_branch_info->commit);1111*source_tree =get_commit_tree(new_branch_info->commit);1112}1113}11141115static intparse_branchname_arg(int argc,const char**argv,1116int dwim_new_local_branch_ok,1117struct branch_info *new_branch_info,1118struct checkout_opts *opts,1119struct object_id *rev,1120int*dwim_remotes_matched)1121{1122const char**new_branch = &opts->new_branch;1123int argcount =0;1124const char*arg;1125int dash_dash_pos;1126int has_dash_dash =0;1127int i;11281129/*1130 * case 1: git checkout <ref> -- [<paths>]1131 *1132 * <ref> must be a valid tree, everything after the '--' must be1133 * a path.1134 *1135 * case 2: git checkout -- [<paths>]1136 *1137 * everything after the '--' must be paths.1138 *1139 * case 3: git checkout <something> [--]1140 *1141 * (a) If <something> is a commit, that is to1142 * switch to the branch or detach HEAD at it. As a special case,1143 * if <something> is A...B (missing A or B means HEAD but you can1144 * omit at most one side), and if there is a unique merge base1145 * between A and B, A...B names that merge base.1146 *1147 * (b) If <something> is _not_ a commit, either "--" is present1148 * or <something> is not a path, no -t or -b was given, and1149 * and there is a tracking branch whose name is <something>1150 * in one and only one remote (or if the branch exists on the1151 * remote named in checkout.defaultRemote), then this is a1152 * short-hand to fork local <something> from that1153 * remote-tracking branch.1154 *1155 * (c) Otherwise, if "--" is present, treat it like case (1).1156 *1157 * (d) Otherwise :1158 * - if it's a reference, treat it like case (1)1159 * - else if it's a path, treat it like case (2)1160 * - else: fail.1161 *1162 * case 4: git checkout <something> <paths>1163 *1164 * The first argument must not be ambiguous.1165 * - If it's *only* a reference, treat it like case (1).1166 * - If it's only a path, treat it like case (2).1167 * - else: fail.1168 *1169 */1170if(!argc)1171return0;11721173 arg = argv[0];1174 dash_dash_pos = -1;1175for(i =0; i < argc; i++) {1176if(!strcmp(argv[i],"--")) {1177 dash_dash_pos = i;1178break;1179}1180}1181if(dash_dash_pos ==0)1182return1;/* case (2) */1183else if(dash_dash_pos ==1)1184 has_dash_dash =1;/* case (3) or (1) */1185else if(dash_dash_pos >=2)1186die(_("only one reference expected,%dgiven."), dash_dash_pos);1187 opts->count_checkout_paths = !opts->quiet && !has_dash_dash;11881189if(!strcmp(arg,"-"))1190 arg ="@{-1}";11911192if(get_oid_mb(arg, rev)) {1193/*1194 * Either case (3) or (4), with <something> not being1195 * a commit, or an attempt to use case (1) with an1196 * invalid ref.1197 *1198 * It's likely an error, but we need to find out if1199 * we should auto-create the branch, case (3).(b).1200 */1201int recover_with_dwim = dwim_new_local_branch_ok;12021203int could_be_checkout_paths = !has_dash_dash &&1204check_filename(opts->prefix, arg);12051206if(!has_dash_dash && !no_wildcard(arg))1207 recover_with_dwim =0;12081209/*1210 * Accept "git checkout foo" and "git checkout foo --"1211 * as candidates for dwim.1212 */1213if(!(argc ==1&& !has_dash_dash) &&1214!(argc ==2&& has_dash_dash))1215 recover_with_dwim =0;12161217if(recover_with_dwim) {1218const char*remote =unique_tracking_name(arg, rev,1219 dwim_remotes_matched);1220if(remote) {1221if(could_be_checkout_paths)1222die(_("'%s' could be both a local file and a tracking branch.\n"1223"Please use -- (and optionally --no-guess) to disambiguate"),1224 arg);1225*new_branch = arg;1226 arg = remote;1227/* DWIMmed to create local branch, case (3).(b) */1228}else{1229 recover_with_dwim =0;1230}1231}12321233if(!recover_with_dwim) {1234if(has_dash_dash)1235die(_("invalid reference:%s"), arg);1236return argcount;1237}1238}12391240/* we can't end up being in (2) anymore, eat the argument */1241 argcount++;1242 argv++;1243 argc--;12441245setup_new_branch_info_and_source_tree(new_branch_info, opts, rev, arg);12461247if(!opts->source_tree)/* case (1): want a tree */1248die(_("reference is not a tree:%s"), arg);12491250if(!has_dash_dash) {/* case (3).(d) -> (1) */1251/*1252 * Do not complain the most common case1253 * git checkout branch1254 * even if there happen to be a file called 'branch';1255 * it would be extremely annoying.1256 */1257if(argc)1258verify_non_filename(opts->prefix, arg);1259}else{1260 argcount++;1261 argv++;1262 argc--;1263}12641265return argcount;1266}12671268static intswitch_unborn_to_new_branch(const struct checkout_opts *opts)1269{1270int status;1271struct strbuf branch_ref = STRBUF_INIT;12721273trace2_cmd_mode("unborn");12741275if(!opts->new_branch)1276die(_("You are on a branch yet to be born"));1277strbuf_addf(&branch_ref,"refs/heads/%s", opts->new_branch);1278 status =create_symref("HEAD", branch_ref.buf,"checkout -b");1279strbuf_release(&branch_ref);1280if(!opts->quiet)1281fprintf(stderr,_("Switched to a new branch '%s'\n"),1282 opts->new_branch);1283return status;1284}12851286static intcheckout_branch(struct checkout_opts *opts,1287struct branch_info *new_branch_info)1288{1289if(opts->pathspec.nr)1290die(_("paths cannot be used with switching branches"));12911292if(opts->patch_mode)1293die(_("'%s' cannot be used with switching branches"),1294"--patch");12951296if(!opts->overlay_mode)1297die(_("'%s' cannot be used with switching branches"),1298"--no-overlay");12991300if(opts->writeout_stage)1301die(_("'%s' cannot be used with switching branches"),1302"--ours/--theirs");13031304if(opts->force && opts->merge)1305die(_("'%s' cannot be used with '%s'"),"-f","-m");13061307if(opts->force_detach && opts->new_branch)1308die(_("'%s' cannot be used with '%s'"),1309"--detach","-b/-B/--orphan");13101311if(opts->new_orphan_branch) {1312if(opts->track != BRANCH_TRACK_UNSPECIFIED)1313die(_("'%s' cannot be used with '%s'"),"--orphan","-t");1314}else if(opts->force_detach) {1315if(opts->track != BRANCH_TRACK_UNSPECIFIED)1316die(_("'%s' cannot be used with '%s'"),"--detach","-t");1317}else if(opts->track == BRANCH_TRACK_UNSPECIFIED)1318 opts->track = git_branch_track;13191320if(new_branch_info->name && !new_branch_info->commit)1321die(_("Cannot switch branch to a non-commit '%s'"),1322 new_branch_info->name);13231324if(new_branch_info->path && !opts->force_detach && !opts->new_branch &&1325!opts->ignore_other_worktrees) {1326int flag;1327char*head_ref =resolve_refdup("HEAD",0, NULL, &flag);1328if(head_ref &&1329(!(flag & REF_ISSYMREF) ||strcmp(head_ref, new_branch_info->path)))1330die_if_checked_out(new_branch_info->path,1);1331free(head_ref);1332}13331334if(!new_branch_info->commit && opts->new_branch) {1335struct object_id rev;1336int flag;13371338if(!read_ref_full("HEAD",0, &rev, &flag) &&1339(flag & REF_ISSYMREF) &&is_null_oid(&rev))1340returnswitch_unborn_to_new_branch(opts);1341}1342returnswitch_branches(opts, new_branch_info);1343}13441345intcmd_checkout(int argc,const char**argv,const char*prefix)1346{1347struct checkout_opts real_opts;1348struct checkout_opts *opts = &real_opts;1349struct branch_info new_branch_info;1350int dwim_new_local_branch;1351int dwim_remotes_matched =0;1352struct option options[] = {1353OPT__QUIET(&opts->quiet,N_("suppress progress reporting")),1354OPT_STRING('b', NULL, &opts->new_branch,N_("branch"),1355N_("create and checkout a new branch")),1356OPT_STRING('B', NULL, &opts->new_branch_force,N_("branch"),1357N_("create/reset and checkout a branch")),1358OPT_BOOL('l', NULL, &opts->new_branch_log,N_("create reflog for new branch")),1359OPT_BOOL(0,"detach", &opts->force_detach,N_("detach HEAD at named commit")),1360OPT_SET_INT('t',"track", &opts->track,N_("set upstream info for new branch"),1361 BRANCH_TRACK_EXPLICIT),1362OPT_STRING(0,"orphan", &opts->new_orphan_branch,N_("new-branch"),N_("new unparented branch")),1363OPT_SET_INT_F('2',"ours", &opts->writeout_stage,1364N_("checkout our version for unmerged files"),13652, PARSE_OPT_NONEG),1366OPT_SET_INT_F('3',"theirs", &opts->writeout_stage,1367N_("checkout their version for unmerged files"),13683, PARSE_OPT_NONEG),1369OPT__FORCE(&opts->force,N_("force checkout (throw away local modifications)"),1370 PARSE_OPT_NOCOMPLETE),1371OPT_BOOL('m',"merge", &opts->merge,N_("perform a 3-way merge with the new branch")),1372OPT_BOOL_F(0,"overwrite-ignore", &opts->overwrite_ignore,1373N_("update ignored files (default)"),1374 PARSE_OPT_NOCOMPLETE),1375OPT_STRING(0,"conflict", &opts->conflict_style,N_("style"),1376N_("conflict style (merge or diff3)")),1377OPT_BOOL('p',"patch", &opts->patch_mode,N_("select hunks interactively")),1378OPT_BOOL(0,"ignore-skip-worktree-bits", &opts->ignore_skipworktree,1379N_("do not limit pathspecs to sparse entries only")),1380OPT_BOOL(0,"no-guess", &opts->no_dwim_new_local_branch,1381N_("do not second guess 'git checkout <no-such-branch>'")),1382OPT_BOOL(0,"ignore-other-worktrees", &opts->ignore_other_worktrees,1383N_("do not check if another worktree is holding the given ref")),1384{ OPTION_CALLBACK,0,"recurse-submodules", NULL,1385"checkout","control recursive updating of submodules",1386 PARSE_OPT_OPTARG, option_parse_recurse_submodules_worktree_updater },1387OPT_BOOL(0,"progress", &opts->show_progress,N_("force progress reporting")),1388OPT_BOOL(0,"overlay", &opts->overlay_mode,N_("use overlay mode (default)")),1389OPT_END(),1390};13911392memset(opts,0,sizeof(*opts));1393memset(&new_branch_info,0,sizeof(new_branch_info));1394 opts->overwrite_ignore =1;1395 opts->prefix = prefix;1396 opts->show_progress = -1;1397 opts->overlay_mode = -1;1398 opts->no_dwim_new_local_branch =0;13991400git_config(git_checkout_config, opts);14011402 opts->track = BRANCH_TRACK_UNSPECIFIED;14031404 argc =parse_options(argc, argv, prefix, options, checkout_usage,1405 PARSE_OPT_KEEP_DASHDASH);14061407 dwim_new_local_branch = !opts->no_dwim_new_local_branch;1408if(opts->show_progress <0) {1409if(opts->quiet)1410 opts->show_progress =0;1411else1412 opts->show_progress =isatty(2);1413}14141415if(opts->conflict_style) {1416 opts->merge =1;/* implied */1417git_xmerge_config("merge.conflictstyle", opts->conflict_style, NULL);1418}14191420if((!!opts->new_branch + !!opts->new_branch_force + !!opts->new_orphan_branch) >1)1421die(_("-b, -B and --orphan are mutually exclusive"));14221423if(opts->overlay_mode ==1&& opts->patch_mode)1424die(_("-p and --overlay are mutually exclusive"));14251426/*1427 * From here on, new_branch will contain the branch to be checked out,1428 * and new_branch_force and new_orphan_branch will tell us which one of1429 * -b/-B/--orphan is being used.1430 */1431if(opts->new_branch_force)1432 opts->new_branch = opts->new_branch_force;14331434if(opts->new_orphan_branch)1435 opts->new_branch = opts->new_orphan_branch;14361437/* --track without -b/-B/--orphan should DWIM */1438if(opts->track != BRANCH_TRACK_UNSPECIFIED && !opts->new_branch) {1439const char*argv0 = argv[0];1440if(!argc || !strcmp(argv0,"--"))1441die(_("--track needs a branch name"));1442skip_prefix(argv0,"refs/", &argv0);1443skip_prefix(argv0,"remotes/", &argv0);1444 argv0 =strchr(argv0,'/');1445if(!argv0 || !argv0[1])1446die(_("missing branch name; try -b"));1447 opts->new_branch = argv0 +1;1448}14491450/*1451 * Extract branch name from command line arguments, so1452 * all that is left is pathspecs.1453 *1454 * Handle1455 *1456 * 1) git checkout <tree> -- [<paths>]1457 * 2) git checkout -- [<paths>]1458 * 3) git checkout <something> [<paths>]1459 *1460 * including "last branch" syntax and DWIM-ery for names of1461 * remote branches, erroring out for invalid or ambiguous cases.1462 */1463if(argc) {1464struct object_id rev;1465int dwim_ok =1466!opts->patch_mode &&1467 dwim_new_local_branch &&1468 opts->track == BRANCH_TRACK_UNSPECIFIED &&1469!opts->new_branch;1470int n =parse_branchname_arg(argc, argv, dwim_ok,1471&new_branch_info, opts, &rev,1472&dwim_remotes_matched);1473 argv += n;1474 argc -= n;1475}14761477if(argc) {1478parse_pathspec(&opts->pathspec,0,1479 opts->patch_mode ? PATHSPEC_PREFIX_ORIGIN :0,1480 prefix, argv);14811482if(!opts->pathspec.nr)1483die(_("invalid path specification"));14841485/*1486 * Try to give more helpful suggestion.1487 * new_branch && argc > 1 will be caught later.1488 */1489if(opts->new_branch && argc ==1)1490die(_("'%s' is not a commit and a branch '%s' cannot be created from it"),1491 argv[0], opts->new_branch);14921493if(opts->force_detach)1494die(_("git checkout: --detach does not take a path argument '%s'"),1495 argv[0]);14961497if(1< !!opts->writeout_stage + !!opts->force + !!opts->merge)1498die(_("git checkout: --ours/--theirs, --force and --merge are incompatible when\n"1499"checking out of the index."));1500}15011502if(opts->new_branch) {1503struct strbuf buf = STRBUF_INIT;15041505if(opts->new_branch_force)1506 opts->branch_exists =validate_branchname(opts->new_branch, &buf);1507else1508 opts->branch_exists =1509validate_new_branchname(opts->new_branch, &buf,0);1510strbuf_release(&buf);1511}15121513UNLEAK(opts);1514if(opts->patch_mode || opts->pathspec.nr) {1515int ret =checkout_paths(opts, new_branch_info.name);1516if(ret && dwim_remotes_matched >1&&1517 advice_checkout_ambiguous_remote_branch_name)1518advise(_("'%s' matched more than one remote tracking branch.\n"1519"We found%dremotes with a reference that matched. So we fell back\n"1520"on trying to resolve the argument as a path, but failed there too!\n"1521"\n"1522"If you meant to check out a remote tracking branch on, e.g. 'origin',\n"1523"you can do so by fully qualifying the name with the --track option:\n"1524"\n"1525" git checkout --track origin/<name>\n"1526"\n"1527"If you'd like to always have checkouts of an ambiguous <name> prefer\n"1528"one remote, e.g. the 'origin' remote, consider setting\n"1529"checkout.defaultRemote=origin in your config."),1530 argv[0],1531 dwim_remotes_matched);1532return ret;1533}else{1534returncheckout_branch(opts, &new_branch_info);1535}1536}