checkout.c 25.6 KB
Newer Older
D
Daniel Barkalow 已提交
1 2 3 4 5 6 7
#include "cache.h"
#include "builtin.h"
#include "parse-options.h"
#include "refs.h"
#include "commit.h"
#include "tree.h"
#include "tree-walk.h"
8
#include "cache-tree.h"
D
Daniel Barkalow 已提交
9 10 11 12 13 14 15
#include "unpack-trees.h"
#include "dir.h"
#include "run-command.h"
#include "merge-recursive.h"
#include "branch.h"
#include "diff.h"
#include "revision.h"
16
#include "remote.h"
17 18 19
#include "blob.h"
#include "xdiff-interface.h"
#include "ll-merge.h"
20
#include "resolve-undo.h"
21
#include "submodule.h"
D
Daniel Barkalow 已提交
22 23 24 25 26 27 28

static const char * const checkout_usage[] = {
	"git checkout [options] <branch>",
	"git checkout [options] [<branch>] -- <file>...",
	NULL,
};

29 30 31 32
struct checkout_opts {
	int quiet;
	int merge;
	int force;
33
	int writeout_stage;
34 35
	int writeout_error;

T
Tay Ray Chuan 已提交
36 37 38
	/* not set by parse_options */
	int branch_exists;

39
	const char *new_branch;
T
Tay Ray Chuan 已提交
40
	const char *new_branch_force;
41
	const char *new_orphan_branch;
42 43
	int new_branch_log;
	enum branch_track track;
44
	struct diff_options diff_options;
45 46
};

D
Daniel Barkalow 已提交
47 48 49
static int post_checkout_hook(struct commit *old, struct commit *new,
			      int changed)
{
50 51 52 53
	return run_hook(NULL, "post-checkout",
			sha1_to_hex(old ? old->object.sha1 : null_sha1),
			sha1_to_hex(new ? new->object.sha1 : null_sha1),
			changed ? "1" : "0", NULL);
54 55
	/* "new" can be NULL when checking out from the index before
	   a commit exists. */
56

D
Daniel Barkalow 已提交
57 58 59
}

static int update_some(const unsigned char *sha1, const char *base, int baselen,
60
		const char *pathname, unsigned mode, int stage, void *context)
D
Daniel Barkalow 已提交
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
{
	int len;
	struct cache_entry *ce;

	if (S_ISDIR(mode))
		return READ_TREE_RECURSIVE;

	len = baselen + strlen(pathname);
	ce = xcalloc(1, cache_entry_size(len));
	hashcpy(ce->sha1, sha1);
	memcpy(ce->name, base, baselen);
	memcpy(ce->name + baselen, pathname, len - baselen);
	ce->ce_flags = create_ce_flags(len, 0);
	ce->ce_mode = create_ce_mode(mode);
	add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE);
	return 0;
}

static int read_tree_some(struct tree *tree, const char **pathspec)
{
81
	read_tree_recursive(tree, "", 0, 0, pathspec, update_some, NULL);
D
Daniel Barkalow 已提交
82 83 84 85 86 87 88 89

	/* update the index with the given tree's info
	 * for all args, expanding wildcards, and exit
	 * with any non-zero return code.
	 */
	return 0;
}

90 91 92 93 94 95 96 97
static int skip_same_name(struct cache_entry *ce, int pos)
{
	while (++pos < active_nr &&
	       !strcmp(active_cache[pos]->name, ce->name))
		; /* skip */
	return pos;
}

98 99 100 101 102 103 104 105 106 107 108 109 110
static int check_stage(int stage, struct cache_entry *ce, int pos)
{
	while (pos < active_nr &&
	       !strcmp(active_cache[pos]->name, ce->name)) {
		if (ce_stage(active_cache[pos]) == stage)
			return 0;
		pos++;
	}
	return error("path '%s' does not have %s version",
		     ce->name,
		     (stage == 2) ? "our" : "their");
}

111 112 113 114 115 116 117 118 119 120 121 122 123
static int check_all_stages(struct cache_entry *ce, int pos)
{
	if (ce_stage(ce) != 1 ||
	    active_nr <= pos + 2 ||
	    strcmp(active_cache[pos+1]->name, ce->name) ||
	    ce_stage(active_cache[pos+1]) != 2 ||
	    strcmp(active_cache[pos+2]->name, ce->name) ||
	    ce_stage(active_cache[pos+2]) != 3)
		return error("path '%s' does not have all three versions",
			     ce->name);
	return 0;
}

124 125 126 127 128 129 130 131 132 133 134 135 136
static int checkout_stage(int stage, struct cache_entry *ce, int pos,
			  struct checkout *state)
{
	while (pos < active_nr &&
	       !strcmp(active_cache[pos]->name, ce->name)) {
		if (ce_stage(active_cache[pos]) == stage)
			return checkout_entry(active_cache[pos], state, NULL);
		pos++;
	}
	return error("path '%s' does not have %s version",
		     ce->name,
		     (stage == 2) ? "our" : "their");
}
137

138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
static int checkout_merged(int pos, struct checkout *state)
{
	struct cache_entry *ce = active_cache[pos];
	const char *path = ce->name;
	mmfile_t ancestor, ours, theirs;
	int status;
	unsigned char sha1[20];
	mmbuffer_t result_buf;

	if (ce_stage(ce) != 1 ||
	    active_nr <= pos + 2 ||
	    strcmp(active_cache[pos+1]->name, path) ||
	    ce_stage(active_cache[pos+1]) != 2 ||
	    strcmp(active_cache[pos+2]->name, path) ||
	    ce_stage(active_cache[pos+2]) != 3)
		return error("path '%s' does not have all 3 versions", path);

155 156 157
	read_mmblob(&ancestor, active_cache[pos]->sha1);
	read_mmblob(&ours, active_cache[pos+1]->sha1);
	read_mmblob(&theirs, active_cache[pos+2]->sha1);
158

159 160 161 162
	/*
	 * NEEDSWORK: re-create conflicts from merges with
	 * merge.renormalize set, too
	 */
163
	status = ll_merge(&result_buf, path, &ancestor, "base",
164
			  &ours, "ours", &theirs, "theirs", NULL);
165 166 167 168 169 170 171 172 173 174 175
	free(ancestor.ptr);
	free(ours.ptr);
	free(theirs.ptr);
	if (status < 0 || !result_buf.ptr) {
		free(result_buf.ptr);
		return error("path '%s': cannot merge", path);
	}

	/*
	 * NEEDSWORK:
	 * There is absolutely no reason to write this as a blob object
M
Mike Ralphson 已提交
176
	 * and create a phony cache entry just to leak.  This hack is
177 178 179 180 181 182 183 184 185 186 187 188 189 190
	 * primarily to get to the write_entry() machinery that massages
	 * the contents to work-tree format and writes out which only
	 * allows it for a cache entry.  The code in write_entry() needs
	 * to be refactored to allow us to feed a <buffer, size, mode>
	 * instead of a cache entry.  Such a refactoring would help
	 * merge_recursive as well (it also writes the merge result to the
	 * object database even when it may contain conflicts).
	 */
	if (write_sha1_file(result_buf.ptr, result_buf.size,
			    blob_type, sha1))
		die("Unable to add merge result for '%s'", path);
	ce = make_cache_entry(create_ce_mode(active_cache[pos+1]->ce_mode),
			      sha1,
			      path, 2, 0);
191 192
	if (!ce)
		die("make_cache_entry failed for path '%s'", path);
193 194 195
	status = checkout_entry(ce, state, NULL);
	return status;
}
196

197 198
static int checkout_paths(struct tree *source_tree, const char **pathspec,
			  struct checkout_opts *opts)
D
Daniel Barkalow 已提交
199 200 201 202 203 204 205
{
	int pos;
	struct checkout state;
	static char *ps_matched;
	unsigned char rev[20];
	int flag;
	struct commit *head;
206
	int errs = 0;
207
	int stage = opts->writeout_stage;
208
	int merge = opts->merge;
209 210 211 212
	int newfd;
	struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));

	newfd = hold_locked_index(lock_file, 1);
213
	if (read_cache_preload(pathspec) < 0)
214
		return error("corrupt index file");
215 216 217 218

	if (source_tree)
		read_tree_some(source_tree, pathspec);

D
Daniel Barkalow 已提交
219 220 221 222 223 224
	for (pos = 0; pathspec[pos]; pos++)
		;
	ps_matched = xcalloc(1, pos);

	for (pos = 0; pos < active_nr; pos++) {
		struct cache_entry *ce = active_cache[pos];
225
		match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
D
Daniel Barkalow 已提交
226 227 228 229 230
	}

	if (report_path_error(ps_matched, pathspec, 0))
		return 1;

231 232 233 234
	/* "checkout -m path" to recreate conflicted state */
	if (opts->merge)
		unmerge_cache(pathspec);

235 236 237
	/* Any unmerged paths? */
	for (pos = 0; pos < active_nr; pos++) {
		struct cache_entry *ce = active_cache[pos];
238
		if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
239 240
			if (!ce_stage(ce))
				continue;
241 242
			if (opts->force) {
				warning("path '%s' is unmerged", ce->name);
243 244
			} else if (stage) {
				errs |= check_stage(stage, ce, pos);
245 246
			} else if (opts->merge) {
				errs |= check_all_stages(ce, pos);
247 248 249 250
			} else {
				errs = 1;
				error("path '%s' is unmerged", ce->name);
			}
251 252 253 254 255 256
			pos = skip_same_name(ce, pos) - 1;
		}
	}
	if (errs)
		return 1;

257
	/* Now we are committed to check them out */
D
Daniel Barkalow 已提交
258 259 260 261 262
	memset(&state, 0, sizeof(state));
	state.force = 1;
	state.refresh_cache = 1;
	for (pos = 0; pos < active_nr; pos++) {
		struct cache_entry *ce = active_cache[pos];
263
		if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
264 265 266 267
			if (!ce_stage(ce)) {
				errs |= checkout_entry(ce, &state, NULL);
				continue;
			}
268 269
			if (stage)
				errs |= checkout_stage(stage, ce, pos, &state);
270 271
			else if (merge)
				errs |= checkout_merged(pos, &state);
272
			pos = skip_same_name(ce, pos) - 1;
D
Daniel Barkalow 已提交
273 274 275
		}
	}

276 277 278 279
	if (write_cache(newfd, active_cache, active_nr) ||
	    commit_locked_index(lock_file))
		die("unable to write new index file");

D
Daniel Barkalow 已提交
280 281 282
	resolve_ref("HEAD", rev, 0, &flag);
	head = lookup_commit_reference_gently(rev, 1);

283 284
	errs |= post_checkout_hook(head, head, 0);
	return errs;
D
Daniel Barkalow 已提交
285 286
}

287
static void show_local_changes(struct object *head, struct diff_options *opts)
D
Daniel Barkalow 已提交
288 289 290 291
{
	struct rev_info rev;
	/* I think we want full paths, even if we're in a subdirectory. */
	init_revisions(&rev, NULL);
292
	rev.diffopt.flags = opts->flags;
D
Daniel Barkalow 已提交
293
	rev.diffopt.output_format |= DIFF_FORMAT_NAME_STATUS;
294 295
	if (diff_setup_done(&rev.diffopt) < 0)
		die("diff_setup_done failed");
D
Daniel Barkalow 已提交
296 297 298 299 300 301
	add_pending_object(&rev, head, NULL);
	run_diff_index(&rev, 0);
}

static void describe_detached_head(char *msg, struct commit *commit)
{
302
	struct strbuf sb = STRBUF_INIT;
303
	struct pretty_print_context ctx = {0};
D
Daniel Barkalow 已提交
304
	parse_commit(commit);
305
	pretty_print_commit(CMIT_FMT_ONELINE, commit, &sb, &ctx);
D
Daniel Barkalow 已提交
306 307 308 309 310
	fprintf(stderr, "%s %s... %s\n", msg,
		find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV), sb.buf);
	strbuf_release(&sb);
}

311
static int reset_tree(struct tree *tree, struct checkout_opts *o, int worktree)
D
Daniel Barkalow 已提交
312 313 314
{
	struct unpack_trees_options opts;
	struct tree_desc tree_desc;
315

D
Daniel Barkalow 已提交
316 317
	memset(&opts, 0, sizeof(opts));
	opts.head_idx = -1;
318 319
	opts.update = worktree;
	opts.skip_unmerged = !worktree;
D
Daniel Barkalow 已提交
320 321 322
	opts.reset = 1;
	opts.merge = 1;
	opts.fn = oneway_merge;
323
	opts.verbose_update = !o->quiet;
324 325
	opts.src_index = &the_index;
	opts.dst_index = &the_index;
D
Daniel Barkalow 已提交
326 327
	parse_tree(tree);
	init_tree_desc(&tree_desc, tree->buffer, tree->size);
328 329 330 331 332 333 334 335 336 337 338 339
	switch (unpack_trees(1, &tree_desc, &opts)) {
	case -2:
		o->writeout_error = 1;
		/*
		 * We return 0 nevertheless, as the index is all right
		 * and more importantly we have made best efforts to
		 * update paths in the work tree, and we cannot revert
		 * them.
		 */
	case 0:
		return 0;
	default:
340
		return 128;
341
	}
D
Daniel Barkalow 已提交
342 343 344 345 346 347 348 349 350 351
}

struct branch_info {
	const char *name; /* The short name used */
	const char *path; /* The full name of a real branch */
	struct commit *commit; /* The named commit */
};

static void setup_branch_path(struct branch_info *branch)
{
352
	struct strbuf buf = STRBUF_INIT;
353

354 355
	strbuf_branchname(&buf, branch->name);
	if (strcmp(buf.buf, branch->name))
356
		branch->name = xstrdup(buf.buf);
357
	strbuf_splice(&buf, 0, 0, "refs/heads/", 11);
D
Daniel Barkalow 已提交
358 359 360 361
	branch->path = strbuf_detach(&buf, NULL);
}

static int merge_working_tree(struct checkout_opts *opts,
362
			      struct branch_info *old, struct branch_info *new)
D
Daniel Barkalow 已提交
363 364 365 366
{
	int ret;
	struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
	int newfd = hold_locked_index(lock_file, 1);
367

368
	if (read_cache_preload(NULL) < 0)
369
		return error("corrupt index file");
D
Daniel Barkalow 已提交
370

371
	resolve_undo_clear();
D
Daniel Barkalow 已提交
372
	if (opts->force) {
373
		ret = reset_tree(new->commit->tree, opts, 1);
D
Daniel Barkalow 已提交
374 375 376 377 378 379
		if (ret)
			return ret;
	} else {
		struct tree_desc trees[2];
		struct tree *tree;
		struct unpack_trees_options topts;
380

D
Daniel Barkalow 已提交
381 382
		memset(&topts, 0, sizeof(topts));
		topts.head_idx = -1;
383 384
		topts.src_index = &the_index;
		topts.dst_index = &the_index;
D
Daniel Barkalow 已提交
385

386
		setup_unpack_trees_porcelain(&topts, "checkout");
387

D
Daniel Barkalow 已提交
388 389 390
		refresh_cache(REFRESH_QUIET);

		if (unmerged_cache()) {
391 392
			error("you need to resolve your current index first");
			return 1;
D
Daniel Barkalow 已提交
393
		}
394 395

		/* 2-way merge to the new branch */
396
		topts.initial_checkout = is_cache_unborn();
397 398
		topts.update = 1;
		topts.merge = 1;
399
		topts.gently = opts->merge && old->commit;
400 401 402
		topts.verbose_update = !opts->quiet;
		topts.fn = twoway_merge;
		topts.dir = xcalloc(1, sizeof(*topts.dir));
403
		topts.dir->flags |= DIR_SHOW_IGNORED;
404
		topts.dir->exclude_per_dir = ".gitignore";
405 406
		tree = parse_tree_indirect(old->commit ?
					   old->commit->object.sha1 :
407
					   EMPTY_TREE_SHA1_BIN);
408 409 410 411
		init_tree_desc(&trees[0], tree->buffer, tree->size);
		tree = parse_tree_indirect(new->commit->object.sha1);
		init_tree_desc(&trees[1], tree->buffer, tree->size);

412
		ret = unpack_trees(2, trees, &topts);
413
		if (ret == -1) {
D
Daniel Barkalow 已提交
414 415 416 417 418 419 420
			/*
			 * Unpack couldn't do a trivial merge; either
			 * give up or do a real merge, depending on
			 * whether the merge flag was used.
			 */
			struct tree *result;
			struct tree *work;
421
			struct merge_options o;
D
Daniel Barkalow 已提交
422 423
			if (!opts->merge)
				return 1;
424 425 426 427 428 429 430

			/*
			 * Without old->commit, the below is the same as
			 * the two-tree unpack we already tried and failed.
			 */
			if (!old->commit)
				return 1;
D
Daniel Barkalow 已提交
431 432 433 434 435 436 437 438 439 440 441 442 443 444

			/* Do more real merge */

			/*
			 * We update the index fully, then write the
			 * tree from the index, then merge the new
			 * branch with the current tree, with the old
			 * branch as the base. Then we reset the index
			 * (but not the working tree) to the new
			 * branch, leaving the working tree as the
			 * merged version, but skipping unmerged
			 * entries in the index.
			 */

445
			add_files_to_cache(NULL, NULL, 0);
J
Jonathan Nieder 已提交
446 447 448 449 450 451 452
			/*
			 * NEEDSWORK: carrying over local changes
			 * when branches have different end-of-line
			 * normalization (or clean+smudge rules) is
			 * a pain; plumb in an option to set
			 * o.renormalize?
			 */
453 454 455
			init_merge_options(&o);
			o.verbosity = 0;
			work = write_tree_from_memory(&o);
D
Daniel Barkalow 已提交
456

457
			ret = reset_tree(new->commit->tree, opts, 1);
D
Daniel Barkalow 已提交
458 459
			if (ret)
				return ret;
460
			o.ancestor = old->name;
461 462 463 464
			o.branch1 = new->name;
			o.branch2 = "local";
			merge_trees(&o, new->commit->tree, work,
				old->commit->tree, &result);
465
			ret = reset_tree(new->commit->tree, opts, 0);
466 467
			if (ret)
				return ret;
D
Daniel Barkalow 已提交
468 469 470 471 472 473 474
		}
	}

	if (write_cache(newfd, active_cache, active_nr) ||
	    commit_locked_index(lock_file))
		die("unable to write new index file");

475
	if (!opts->force && !opts->quiet)
476
		show_local_changes(&new->commit->object, &opts->diff_options);
D
Daniel Barkalow 已提交
477 478 479 480

	return 0;
}

481
static void report_tracking(struct branch_info *new)
482
{
483
	struct strbuf sb = STRBUF_INIT;
484
	struct branch *branch = branch_get(new->name);
485

486
	if (!format_tracking_info(branch, &sb))
487
		return;
488 489
	fputs(sb.buf, stdout);
	strbuf_release(&sb);
490
}
491

492 493 494 495 496 497 498 499 500 501 502 503 504 505
static void detach_advice(const char *old_path, const char *new_name)
{
	const char fmt[] =
	"Note: checking out '%s'.\n\n"
	"You are in 'detached HEAD' state. You can look around, make experimental\n"
	"changes and commit them, and you can discard any commits you make in this\n"
	"state without impacting any branches by performing another checkout.\n\n"
	"If you want to create a new branch to retain commits you create, you may\n"
	"do so (now or later) by using -b with the checkout command again. Example:\n\n"
	"  git checkout -b new_branch_name\n\n";

	fprintf(stderr, fmt, new_name);
}

D
Daniel Barkalow 已提交
506 507 508 509
static void update_refs_for_switch(struct checkout_opts *opts,
				   struct branch_info *old,
				   struct branch_info *new)
{
510
	struct strbuf msg = STRBUF_INIT;
D
Daniel Barkalow 已提交
511 512
	const char *old_desc;
	if (opts->new_branch) {
513 514 515
		if (opts->new_orphan_branch) {
			if (opts->new_branch_log && !log_all_ref_updates) {
				int temp;
516
				char log_file[PATH_MAX];
517 518 519 520
				char *ref_name = mkpath("refs/heads/%s", opts->new_orphan_branch);

				temp = log_all_ref_updates;
				log_all_ref_updates = 1;
521
				if (log_ref_setup(ref_name, log_file, sizeof(log_file))) {
522 523 524 525 526 527 528 529 530
					fprintf(stderr, "Can not do reflog for '%s'\n",
					    opts->new_orphan_branch);
					log_all_ref_updates = temp;
					return;
				}
				log_all_ref_updates = temp;
			}
		}
		else
T
Tay Ray Chuan 已提交
531 532
			create_branch(old->name, opts->new_branch, new->name,
				      opts->new_branch_force ? 1 : 0,
533
				      opts->new_branch_log, opts->track);
D
Daniel Barkalow 已提交
534 535 536 537 538
		new->name = opts->new_branch;
		setup_branch_path(new);
	}

	old_desc = old->name;
539
	if (!old_desc && old->commit)
D
Daniel Barkalow 已提交
540 541
		old_desc = sha1_to_hex(old->commit->object.sha1);
	strbuf_addf(&msg, "checkout: moving from %s to %s",
542
		    old_desc ? old_desc : "(invalid)", new->name);
D
Daniel Barkalow 已提交
543 544 545 546 547

	if (new->path) {
		create_symref("HEAD", new->path, msg.buf);
		if (!opts->quiet) {
			if (old->path && !strcmp(new->path, old->path))
548
				fprintf(stderr, "Already on '%s'\n",
D
Daniel Barkalow 已提交
549
					new->name);
550
			else if (opts->new_branch)
551
				fprintf(stderr, "Switched to%s branch '%s'\n",
T
Tay Ray Chuan 已提交
552
					opts->branch_exists ? " and reset" : " a new",
D
Daniel Barkalow 已提交
553
					new->name);
554 555 556
			else
				fprintf(stderr, "Switched to branch '%s'\n",
					new->name);
D
Daniel Barkalow 已提交
557
		}
558 559 560 561 562 563 564 565
		if (old->path && old->name) {
			char log_file[PATH_MAX], ref_file[PATH_MAX];

			git_snpath(log_file, sizeof(log_file), "logs/%s", old->path);
			git_snpath(ref_file, sizeof(ref_file), "%s", old->path);
			if (!file_exists(ref_file) && file_exists(log_file))
				remove_path(log_file);
		}
D
Daniel Barkalow 已提交
566 567 568 569
	} else if (strcmp(new->name, "HEAD")) {
		update_ref(msg.buf, "HEAD", new->commit->object.sha1, NULL,
			   REF_NODEREF, DIE_ON_ERR);
		if (!opts->quiet) {
570 571
			if (old->path && advice_detached_head)
				detach_advice(old->path, new->name);
D
Daniel Barkalow 已提交
572 573 574 575 576
			describe_detached_head("HEAD is now at", new->commit);
		}
	}
	remove_branch_state();
	strbuf_release(&msg);
577
	if (!opts->quiet && (new->path || !strcmp(new->name, "HEAD")))
578
		report_tracking(new);
D
Daniel Barkalow 已提交
579 580
}

581
static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
D
Daniel Barkalow 已提交
582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
{
	int ret = 0;
	struct branch_info old;
	unsigned char rev[20];
	int flag;
	memset(&old, 0, sizeof(old));
	old.path = resolve_ref("HEAD", rev, 0, &flag);
	old.commit = lookup_commit_reference_gently(rev, 1);
	if (!(flag & REF_ISSYMREF))
		old.path = NULL;

	if (old.path && !prefixcmp(old.path, "refs/heads/"))
		old.name = old.path + strlen("refs/heads/");

	if (!new->name) {
		new->name = "HEAD";
		new->commit = old.commit;
		if (!new->commit)
			die("You are on a branch yet to be born");
		parse_commit(new->commit);
	}

604
	ret = merge_working_tree(opts, &old, new);
D
Daniel Barkalow 已提交
605 606 607
	if (ret)
		return ret;

608 609 610 611 612 613 614 615
	/*
	 * If we were on a detached HEAD, but have now moved to
	 * a new commit, we want to mention the old commit once more
	 * to remind the user that it might be lost.
	 */
	if (!opts->quiet && !old.path && old.commit && new->commit != old.commit)
		describe_detached_head("Previous HEAD position was", old.commit);

D
Daniel Barkalow 已提交
616 617
	update_refs_for_switch(opts, &old, new);

618 619
	ret = post_checkout_hook(old.commit, new->commit, 1);
	return ret || opts->writeout_error;
D
Daniel Barkalow 已提交
620 621
}

622 623
static int git_checkout_config(const char *var, const char *value, void *cb)
{
624 625 626 627 628
	if (!strcmp(var, "diff.ignoresubmodules")) {
		struct checkout_opts *opts = cb;
		handle_ignore_submodules_arg(&opts->diff_options, value);
		return 0;
	}
629 630 631 632

	if (!prefixcmp(var, "submodule."))
		return parse_submodule_config_option(var, value);

633
	return git_xmerge_config(var, value, NULL);
634 635
}

T
Thomas Rast 已提交
636 637 638 639 640 641
static int interactive_checkout(const char *revision, const char **pathspec,
				struct checkout_opts *opts)
{
	return run_add_interactive(revision, "--patch=checkout", pathspec);
}

642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668
struct tracking_name_data {
	const char *name;
	char *remote;
	int unique;
};

static int check_tracking_name(const char *refname, const unsigned char *sha1,
			       int flags, void *cb_data)
{
	struct tracking_name_data *cb = cb_data;
	const char *slash;

	if (prefixcmp(refname, "refs/remotes/"))
		return 0;
	slash = strchr(refname + 13, '/');
	if (!slash || strcmp(slash + 1, cb->name))
		return 0;
	if (cb->remote) {
		cb->unique = 0;
		return 0;
	}
	cb->remote = xstrdup(refname);
	return 0;
}

static const char *unique_tracking_name(const char *name)
{
669 670
	struct tracking_name_data cb_data = { NULL, NULL, 1 };
	cb_data.name = name;
671 672 673 674 675 676
	for_each_ref(check_tracking_name, &cb_data);
	if (cb_data.unique)
		return cb_data.remote;
	free(cb_data.remote);
	return NULL;
}
T
Thomas Rast 已提交
677

D
Daniel Barkalow 已提交
678 679 680 681 682 683 684
int cmd_checkout(int argc, const char **argv, const char *prefix)
{
	struct checkout_opts opts;
	unsigned char rev[20];
	const char *arg;
	struct branch_info new;
	struct tree *source_tree = NULL;
685
	char *conflict_style = NULL;
T
Thomas Rast 已提交
686
	int patch_mode = 0;
J
Junio C Hamano 已提交
687
	int dwim_new_local_branch = 1;
D
Daniel Barkalow 已提交
688
	struct option options[] = {
689
		OPT__QUIET(&opts.quiet, "suppress progress reporting"),
690 691
		OPT_STRING('b', NULL, &opts.new_branch, "branch",
			   "create and checkout a new branch"),
T
Tay Ray Chuan 已提交
692 693
		OPT_STRING('B', NULL, &opts.new_branch_force, "branch",
			   "create/reset and checkout a branch"),
694 695
		OPT_BOOLEAN('l', NULL, &opts.new_branch_log, "create reflog for new branch"),
		OPT_SET_INT('t', "track",  &opts.track, "set upstream info for new branch",
696
			BRANCH_TRACK_EXPLICIT),
697
		OPT_STRING(0, "orphan", &opts.new_orphan_branch, "new branch", "new unparented branch"),
698
		OPT_SET_INT('2', "ours", &opts.writeout_stage, "checkout our version for unmerged files",
699
			    2),
700
		OPT_SET_INT('3', "theirs", &opts.writeout_stage, "checkout their version for unmerged files",
701
			    3),
R
René Scharfe 已提交
702
		OPT__FORCE(&opts.force, "force checkout (throw away local modifications)"),
703
		OPT_BOOLEAN('m', "merge", &opts.merge, "perform a 3-way merge with the new branch"),
704 705
		OPT_STRING(0, "conflict", &conflict_style, "style",
			   "conflict style (merge or diff3)"),
T
Thomas Rast 已提交
706
		OPT_BOOLEAN('p', "patch", &patch_mode, "select hunks interactively"),
J
Junio C Hamano 已提交
707 708 709
		{ OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL,
		  "second guess 'git checkout no-such-branch'",
		  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
710
		OPT_END(),
D
Daniel Barkalow 已提交
711
	};
712
	int has_dash_dash;
D
Daniel Barkalow 已提交
713 714 715 716

	memset(&opts, 0, sizeof(opts));
	memset(&new, 0, sizeof(new));

717
	gitmodules_config();
718
	git_config(git_checkout_config, &opts);
D
Daniel Barkalow 已提交
719

720
	opts.track = BRANCH_TRACK_UNSPECIFIED;
D
Daniel Barkalow 已提交
721

722
	argc = parse_options(argc, argv, prefix, options, checkout_usage,
723
			     PARSE_OPT_KEEP_DASHDASH);
724

T
Tay Ray Chuan 已提交
725 726 727 728 729 730 731 732
	/* we can assume from now on new_branch = !new_branch_force */
	if (opts.new_branch && opts.new_branch_force)
		die("-B cannot be used with -b");

	/* copy -B over to -b, so that we can just check the latter */
	if (opts.new_branch_force)
		opts.new_branch = opts.new_branch_force;

T
Thomas Rast 已提交
733 734 735 736
	if (patch_mode && (opts.track > 0 || opts.new_branch
			   || opts.new_branch_log || opts.merge || opts.force))
		die ("--patch is incompatible with all other options");

737
	/* --track without -b should DWIM */
738 739 740
	if (0 < opts.track && !opts.new_branch) {
		const char *argv0 = argv[0];
		if (!argc || !strcmp(argv0, "--"))
741
			die ("--track needs a branch name");
742 743 744 745 746 747
		if (!prefixcmp(argv0, "refs/"))
			argv0 += 5;
		if (!prefixcmp(argv0, "remotes/"))
			argv0 += 8;
		argv0 = strchr(argv0, '/');
		if (!argv0 || !argv0[1])
748
			die ("Missing branch name; try -b");
749
		opts.new_branch = argv0 + 1;
750 751
	}

752 753
	if (opts.new_orphan_branch) {
		if (opts.new_branch)
T
Tay Ray Chuan 已提交
754
			die("--orphan and -b|-B are mutually exclusive");
755 756
		if (opts.track > 0)
			die("--orphan cannot be used with -t");
757 758 759
		opts.new_branch = opts.new_orphan_branch;
	}

760 761 762 763 764
	if (conflict_style) {
		opts.merge = 1; /* implied */
		git_xmerge_config("merge.conflictstyle", conflict_style, NULL);
	}

765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780
	if (opts.force && opts.merge)
		die("git checkout: -f and -m are incompatible");

	/*
	 * case 1: git checkout <ref> -- [<paths>]
	 *
	 *   <ref> must be a valid tree, everything after the '--' must be
	 *   a path.
	 *
	 * case 2: git checkout -- [<paths>]
	 *
	 *   everything after the '--' must be paths.
	 *
	 * case 3: git checkout <something> [<paths>]
	 *
	 *   With no paths, if <something> is a commit, that is to
781 782 783 784
	 *   switch to the branch or detach HEAD at it.  As a special case,
	 *   if <something> is A...B (missing A or B means HEAD but you can
	 *   omit at most one side), and if there is a unique merge base
	 *   between A and B, A...B names that merge base.
785
	 *
786
	 *   With no paths, if <something> is _not_ a commit, no -t nor -b
787
	 *   was given, and there is a remote-tracking branch whose name is
788
	 *   <something> in one and only one remote, then this is a short-hand
789
	 *   to fork local <something> from that remote-tracking branch.
790
	 *
791 792 793 794 795 796
	 *   Otherwise <something> shall not be ambiguous.
	 *   - If it's *only* a reference, treat it like case (1).
	 *   - If it's only a path, treat it like case (2).
	 *   - else: fail.
	 *
	 */
D
Daniel Barkalow 已提交
797
	if (argc) {
798 799 800 801 802 803
		if (!strcmp(argv[0], "--")) {       /* case (2) */
			argv++;
			argc--;
			goto no_reference;
		}

D
Daniel Barkalow 已提交
804
		arg = argv[0];
805 806
		has_dash_dash = (argc > 1) && !strcmp(argv[1], "--");

807 808 809
		if (!strcmp(arg, "-"))
			arg = "@{-1}";

810
		if (get_sha1_mb(arg, rev)) {
811 812
			if (has_dash_dash)          /* case (1) */
				die("invalid reference: %s", arg);
813
			if (!patch_mode &&
J
Junio C Hamano 已提交
814
			    dwim_new_local_branch &&
815 816 817 818 819 820 821 822 823 824 825 826 827
			    opts.track == BRANCH_TRACK_UNSPECIFIED &&
			    !opts.new_branch &&
			    !check_filename(NULL, arg) &&
			    argc == 1) {
				const char *remote = unique_tracking_name(arg);
				if (!remote || get_sha1(remote, rev))
					goto no_reference;
				opts.new_branch = arg;
				arg = remote;
				/* DWIMmed to create local branch */
			}
			else
				goto no_reference;
828 829 830 831 832 833
		}

		/* we can't end up being in (2) anymore, eat the argument */
		argv++;
		argc--;

834
		new.name = arg;
835
		if ((new.commit = lookup_commit_reference_gently(rev, 1))) {
D
Daniel Barkalow 已提交
836
			setup_branch_path(&new);
837 838 839 840

			if ((check_ref_format(new.path) == CHECK_REF_FORMAT_OK) &&
			    resolve_ref(new.path, rev, 1, NULL))
				;
D
Daniel Barkalow 已提交
841 842 843 844
			else
				new.path = NULL;
			parse_commit(new.commit);
			source_tree = new.commit->tree;
845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860
		} else
			source_tree = parse_tree_indirect(rev);

		if (!source_tree)                   /* case (1): want a tree */
			die("reference is not a tree: %s", arg);
		if (!has_dash_dash) {/* case (3 -> 1) */
			/*
			 * Do not complain the most common case
			 *	git checkout branch
			 * even if there happen to be a file called 'branch';
			 * it would be extremely annoying.
			 */
			if (argc)
				verify_non_filename(NULL, arg);
		}
		else {
D
Daniel Barkalow 已提交
861 862 863 864 865
			argv++;
			argc--;
		}
	}

866
no_reference:
867 868 869 870

	if (opts.track == BRANCH_TRACK_UNSPECIFIED)
		opts.track = git_branch_track;

D
Daniel Barkalow 已提交
871 872
	if (argc) {
		const char **pathspec = get_pathspec(prefix, argv);
873 874 875 876

		if (!pathspec)
			die("invalid path specification");

T
Thomas Rast 已提交
877 878 879
		if (patch_mode)
			return interactive_checkout(new.name, pathspec, &opts);

D
Daniel Barkalow 已提交
880
		/* Checkout paths */
881
		if (opts.new_branch) {
D
Daniel Barkalow 已提交
882
			if (argc == 1) {
883
				die("git checkout: updating paths is incompatible with switching branches.\nDid you intend to checkout '%s' which can not be resolved as commit?", argv[0]);
D
Daniel Barkalow 已提交
884
			} else {
885
				die("git checkout: updating paths is incompatible with switching branches.");
D
Daniel Barkalow 已提交
886 887 888
			}
		}

889 890 891
		if (1 < !!opts.writeout_stage + !!opts.force + !!opts.merge)
			die("git checkout: --ours/--theirs, --force and --merge are incompatible when\nchecking out of the index.");

892
		return checkout_paths(source_tree, pathspec, &opts);
D
Daniel Barkalow 已提交
893 894
	}

T
Thomas Rast 已提交
895 896 897
	if (patch_mode)
		return interactive_checkout(new.name, NULL, &opts);

898
	if (opts.new_branch) {
899
		struct strbuf buf = STRBUF_INIT;
900 901 902
		if (strbuf_check_branch_ref(&buf, opts.new_branch))
			die("git checkout: we do not like '%s' as a branch name.",
			    opts.new_branch);
T
Tay Ray Chuan 已提交
903 904 905 906 907 908
		if (!get_sha1(buf.buf, rev)) {
			opts.branch_exists = 1;
			if (!opts.new_branch_force)
				die("git checkout: branch %s already exists",
				    opts.new_branch);
		}
909 910 911
		strbuf_release(&buf);
	}

D
Daniel Barkalow 已提交
912 913 914
	if (new.name && !new.commit) {
		die("Cannot switch branch to a non-commit.");
	}
915 916
	if (opts.writeout_stage)
		die("--ours/--theirs is incompatible with switching branches.");
D
Daniel Barkalow 已提交
917

918
	return switch_branches(&opts, &new);
D
Daniel Barkalow 已提交
919
}