Commit Diff


commit - b68e64b1d55c9b06ac807e265083267f655ad65c
commit + 125ca675f07f91d5b8713dbc4ba8c2ef7bf70914
blob - f890b946e6565aa7acf7271c37921844fa902230
blob + 0f45835af753a3a6807444c2dc3b9b7127d0dda6
--- got/got.c
+++ got/got.c
@@ -5056,7 +5056,35 @@ done:
 	if (err) {
 		close(*fd);
 		*fd = -1;
+	}
+	return err;
+}
+
+static const struct got_error *
+emit_base_commit_header(FILE *f, struct got_object_id *commit_id,
+    struct got_worktree *worktree)
+{
+	const struct got_error	*err;
+	struct got_object_id	*base_commit_id;
+	char			*base_commit_idstr;
+
+	if (worktree == NULL)	/* shouldn't happen */
+		return got_error(GOT_ERR_NOT_WORKTREE);
+
+	base_commit_id = got_worktree_get_base_commit_id(worktree);
+
+	if (commit_id != NULL) {
+		if (got_object_id_cmp(commit_id, base_commit_id) != 0)
+			base_commit_id = commit_id;
 	}
+
+	err = got_object_id_str(&base_commit_idstr, base_commit_id);
+	if (err != NULL)
+		return err;
+
+	if (fprintf(f, "commit - %s\n", base_commit_idstr) < 0)
+		err = got_error_from_errno("fprintf");
+	free(base_commit_idstr);
 	return err;
 }
 
@@ -5109,10 +5137,6 @@ print_diff(void *arg, unsigned char status, unsigned c
 			err = got_error_from_errno("fprintf");
 			goto done;
 		}
-		if (fprintf(a->outfile, "commit - %s\n", a->id_str) < 0) {
-			err = got_error_from_errno("fprintf");
-			goto done;
-		}
 		if (fprintf(a->outfile, "path + %s%s\n",
 		    got_worktree_get_root_path(a->worktree),
 		    a->diff_staged ? " (staged changes)" : "") < 0) {
@@ -5121,6 +5145,10 @@ print_diff(void *arg, unsigned char status, unsigned c
 		}
 		a->header_shown = 1;
 	}
+
+	err = emit_base_commit_header(a->outfile, commit_id, a->worktree);
+	if (err != NULL)
+		goto done;
 
 	if (a->diff_staged) {
 		const char *label1 = NULL, *label2 = NULL;
blob - 79d34d5be8de2f8a77dd949ec12828120cf67461
blob + 1c2391cef1211e8f745596a22c4944873f497779
--- regress/cmdline/diff.sh
+++ regress/cmdline/diff.sh
@@ -34,8 +34,8 @@ test_diff_basic() {
 	(cd $testroot/wt && got add new >/dev/null)
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'alpha$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -45,6 +45,7 @@ test_diff_basic() {
 	echo '@@ -1 +1 @@' >> $testroot/stdout.expected
 	echo '-alpha' >> $testroot/stdout.expected
 	echo '+modified alpha' >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -53,6 +54,7 @@ test_diff_basic() {
 	echo '+++ /dev/null' >> $testroot/stdout.expected
 	echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
 	echo '-beta' >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + new (mode 644)' >> $testroot/stdout.expected
 	echo '--- /dev/null' >> $testroot/stdout.expected
@@ -119,8 +121,8 @@ test_diff_basic() {
 
 	# diff several paths in a work tree
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'alpha$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -130,6 +132,7 @@ test_diff_basic() {
 	echo '@@ -1 +1 @@' >> $testroot/stdout.expected
 	echo '-alpha' >> $testroot/stdout.expected
 	echo '+modified alpha' >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -138,6 +141,7 @@ test_diff_basic() {
 	echo '+++ /dev/null' >> $testroot/stdout.expected
 	echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
 	echo '-beta' >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i epsilon | grep 'zeta$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -147,6 +151,7 @@ test_diff_basic() {
 	echo '@@ -1 +1 @@' >> $testroot/stdout.expected
 	echo '-zeta' >> $testroot/stdout.expected
 	echo '+modified zeta' >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + new (mode 644)' >> $testroot/stdout.expected
 	echo '--- /dev/null' >> $testroot/stdout.expected
@@ -266,14 +271,15 @@ test_diff_basic() {
 		return 1
 	fi
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + master (mode 644)' >> $testroot/stdout.expected
 	echo '--- /dev/null' >> $testroot/stdout.expected
 	echo '+++ master' >> $testroot/stdout.expected
 	echo '@@ -0,0 +1 @@' >> $testroot/stdout.expected
 	echo '+master' >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + new (mode 644)' >> $testroot/stdout.expected
 	echo '--- /dev/null' >> $testroot/stdout.expected
@@ -308,8 +314,8 @@ test_diff_basic() {
 
 	# a single argument which can be resolved to a path is not ambiguous
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + new (mode 644)' >> $testroot/stdout.expected
 	echo '--- /dev/null' >> $testroot/stdout.expected
@@ -362,8 +368,8 @@ test_diff_basic() {
 	fi
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + new (mode 644)' >> $testroot/stdout.expected
 	echo '--- /dev/null' >> $testroot/stdout.expected
@@ -475,8 +481,8 @@ test_diff_shows_conflict() {
 	fi
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'numbers$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -665,8 +671,8 @@ test_diff_ignore_whitespace() {
 	(cd $testroot/wt && got diff -w > $testroot/stdout)
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id0" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $commit_id0" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -c $commit_id0 -i | grep 'alpha$' | \
 		cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -744,8 +750,8 @@ test_diff_symlinks_in_work_tree() {
 	(cd $testroot/wt && got diff > $testroot/stdout)
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id1" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $commit_id1" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -c $commit_id1 -i | \
 		grep 'alpha.link@ -> alpha$' | \
@@ -758,6 +764,7 @@ test_diff_symlinks_in_work_tree() {
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
 	echo '+beta' >> $testroot/stdout.expected
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
+	echo "commit - $commit_id1" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -c $commit_id1 -i | \
 		grep 'dotgotfoo.link@ -> .got/foo$' | \
@@ -770,6 +777,7 @@ test_diff_symlinks_in_work_tree() {
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
 	echo '+.got/bar' >> $testroot/stdout.expected
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
+	echo "commit - $commit_id1" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -c $commit_id1 -i epsilon | \
 		grep 'beta.link@ -> ../beta$' | \
@@ -782,6 +790,7 @@ test_diff_symlinks_in_work_tree() {
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
 	echo '+../gamma/delta' >> $testroot/stdout.expected
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
+	echo "commit - $commit_id1" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -c $commit_id1 -i | \
 		grep 'epsilon.link@ -> epsilon$' | \
@@ -794,6 +803,7 @@ test_diff_symlinks_in_work_tree() {
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
 	echo '+gamma' >> $testroot/stdout.expected
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
+	echo "commit - $commit_id1" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -c $commit_id1 -i | \
 		grep 'nonexistent.link@ -> nonexistent$' | \
@@ -804,6 +814,7 @@ test_diff_symlinks_in_work_tree() {
 	echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
 	echo '-nonexistent' >> $testroot/stdout.expected
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
+	echo "commit - $commit_id1" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + zeta.link (mode 120000)' >> $testroot/stdout.expected
 	echo '--- /dev/null' >> $testroot/stdout.expected
@@ -954,8 +965,8 @@ test_diff_binary_files() {
 	(cd $testroot/wt && got add foo >/dev/null)
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + foo (mode 644)' >> $testroot/stdout.expected
 	echo "Binary files /dev/null and foo differ" \
@@ -971,8 +982,8 @@ test_diff_binary_files() {
 	fi
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + foo (mode 644)' >> $testroot/stdout.expected
 	echo '--- /dev/null' >> $testroot/stdout.expected
@@ -996,8 +1007,8 @@ test_diff_binary_files() {
 	printf '\377\200\0\0\377\200\0\0' > $testroot/wt/foo
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'foo$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -1364,8 +1375,8 @@ test_diff_worktree_newfile_xbit() {
 	local commit_id=`git_show_head $testroot/repo`
 	cat <<EOF > $testroot/stdout.expected
 diff $testroot/wt
-commit - $commit_id
 path + $testroot/wt
+commit - $commit_id
 blob - /dev/null
 file + xfile (mode 755)
 --- /dev/null
@@ -1604,8 +1615,8 @@ diffstat $testroot/wt
 EOF
 
 	echo "diff $testroot/wt" >> $testroot/stdout.expected
-	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'alpha$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -1615,6 +1626,7 @@ EOF
 	echo '@@ -1 +1 @@' >> $testroot/stdout.expected
 	echo '-alpha' >> $testroot/stdout.expected
 	echo '+modified alpha' >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -1623,6 +1635,7 @@ EOF
 	echo '+++ /dev/null' >> $testroot/stdout.expected
 	echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
 	echo '-beta' >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + new (mode 644)' >> $testroot/stdout.expected
 	echo '--- /dev/null' >> $testroot/stdout.expected
@@ -1654,8 +1667,8 @@ EOF
 
 	# specify paths to diffstat
 	echo "diff $testroot/wt" >> $testroot/stdout.expected
-	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'alpha$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -1665,6 +1678,7 @@ EOF
 	echo '@@ -1 +1 @@' >> $testroot/stdout.expected
 	echo '-alpha' >> $testroot/stdout.expected
 	echo '+modified alpha' >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -1673,6 +1687,7 @@ EOF
 	echo '+++ /dev/null' >> $testroot/stdout.expected
 	echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
 	echo '-beta' >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i epsilon | grep 'zeta$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -1682,6 +1697,7 @@ EOF
 	echo '@@ -1 +1 @@' >> $testroot/stdout.expected
 	echo '-zeta' >> $testroot/stdout.expected
 	echo '+modified zeta' >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + new (mode 644)' >> $testroot/stdout.expected
 	echo '--- /dev/null' >> $testroot/stdout.expected
@@ -1736,14 +1752,15 @@ diffstat $testroot/wt
 EOF
 
 	echo "diff $testroot/wt" >> $testroot/stdout.expected
-	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + master (mode 644)' >> $testroot/stdout.expected
 	echo '--- /dev/null' >> $testroot/stdout.expected
 	echo '+++ master' >> $testroot/stdout.expected
 	echo '@@ -0,0 +1 @@' >> $testroot/stdout.expected
 	echo '+master' >> $testroot/stdout.expected
+	echo "commit - $head_rev" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + new (mode 644)' >> $testroot/stdout.expected
 	echo '--- /dev/null' >> $testroot/stdout.expected
@@ -2265,6 +2282,110 @@ test_diff_commit_keywords() {
 	fi
 
 	test_done "$testroot" "$ret"
+}
+
+test_diff_mixed_worktree() {
+	local testroot=$(test_init diff_mixed_worktree)
+	local baseid_beta=$(git_show_head $testroot/repo)
+
+	got checkout $testroot/repo $testroot/wt > /dev/null
+	ret=$?
+	if [ $ret -ne 0 ]; then
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	echo "'alpha" > $testroot/wt/alpha
+	(cd $testroot/wt && got commit -m "'alpha" > /dev/null)
+
+	local baseid_alpha=$(git_show_head $testroot/repo)
+
+	echo "'delta" > $testroot/wt/gamma/delta
+	(cd $testroot/wt && got commit -m "'delta" > /dev/null)
+
+	local baseid_new=$(git_show_head $testroot/repo)
+	local blobid_alpha=$(get_blob_id $testroot/repo "" alpha)
+	local blobid_beta=$(get_blob_id $testroot/repo "" beta)
+
+	echo "alpha" > $testroot/wt/alpha
+	echo "'beta" > $testroot/wt/beta
+	echo "new" > $testroot/wt/new
+
+	(cd $testroot/wt && got add new > /dev/null)
+
+	cat <<-EOF >$testroot/stdout.expected
+	diff $testroot/wt
+	path + $testroot/wt
+	commit - $baseid_alpha
+	blob - $blobid_alpha
+	file + alpha
+	--- alpha
+	+++ alpha
+	@@ -1 +1 @@
+	-'alpha
+	+alpha
+	commit - $baseid_beta
+	blob - $blobid_beta
+	file + beta
+	--- beta
+	+++ beta
+	@@ -1 +1 @@
+	-beta
+	+'beta
+	commit - $baseid_new
+	blob - /dev/null
+	file + new (mode 644)
+	--- /dev/null
+	+++ new
+	@@ -0,0 +1 @@
+	+new
+	EOF
+
+	(cd $testroot/wt && got diff > $testroot/stdout)
+	cmp -s $testroot/stdout.expected $testroot/stdout
+	ret=$?
+	if [ $ret -ne 0 ]; then
+		diff -u $testroot/stdout.expected $testroot/stdout
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	(cd $testroot/wt && got stage alpha beta > $testroot/stdout)
+
+	stageid_alpha=$(cd $testroot/wt && got stage -l alpha | cut -d' ' -f 1)
+	stageid_beta=$(cd $testroot/wt && got stage -l beta | cut -d' ' -f 1)
+
+	cat <<-EOF >$testroot/stdout.expected
+	diff -s $testroot/wt
+	path + $testroot/wt (staged changes)
+	commit - $baseid_alpha
+	blob - $blobid_alpha
+	blob + $stageid_alpha
+	--- alpha
+	+++ alpha
+	@@ -1 +1 @@
+	-'alpha
+	+alpha
+	commit - $baseid_beta
+	blob - $blobid_beta
+	blob + $stageid_beta
+	--- beta
+	+++ beta
+	@@ -1 +1 @@
+	-beta
+	+'beta
+	EOF
+
+	(cd $testroot/wt && got diff -s > $testroot/stdout)
+	cmp -s $testroot/stdout.expected $testroot/stdout
+	ret=$?
+	if [ $ret -ne 0 ]; then
+		diff -u $testroot/stdout.expected $testroot/stdout
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	test_done "$testroot" 0
 }
 
 test_parseargs "$@"
@@ -2287,3 +2408,4 @@ run_test test_diff_file_to_dir
 run_test test_diff_dir_to_file
 run_test test_diff_path_in_root_commit
 run_test test_diff_commit_keywords
+run_test test_diff_mixed_worktree
blob - 884ba874302b4e95327b6a03d633122a2757442a
blob + 66b8ac0292d449f916eeb70817e844ea1710dd4b
--- regress/cmdline/patch.sh
+++ regress/cmdline/patch.sh
@@ -1576,6 +1576,8 @@ test_patch_merge_conflict() {
 		test_done $testroot $ret
 		return 1
 	fi
+
+	local alpha_basecommit_id=`git_show_head $testroot/repo`
 
 	seq 10 > $testroot/wt/numbers
 	(cd $testroot/wt && got add numbers && got commit -m +numbers) \
@@ -1634,7 +1636,7 @@ test_patch_merge_conflict() {
 	cat <<-EOF > $testroot/wt/alpha.expected
 	<<<<<<< --- alpha
 	ALPHA
-	||||||| commit $commit_id
+	||||||| commit $alpha_basecommit_id
 	alpha
 	=======
 	a
blob - 011e20bae0544b37165ccaf2b12d702d4869e2f0
blob + cc12859f70df97800a252ad662cc906397252208
--- regress/cmdline/revert.sh
+++ regress/cmdline/revert.sh
@@ -566,8 +566,8 @@ EOF
 	fi
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i -c $commit_id \
 		| grep 'numbers$' | cut -d' ' -f 1 \
@@ -669,8 +669,8 @@ EOF
 	(cd $testroot/wt && got diff > $testroot/stdout)
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i -c $commit_id \
 		| grep 'numbers$' | cut -d' ' -f 1 \
@@ -739,8 +739,8 @@ EOF
 	(cd $testroot/wt && got diff > $testroot/stdout)
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i -c $commit_id \
 		| grep 'numbers$' | cut -d' ' -f 1 \
blob - 001262301f5016d81a6b4944240cc53a7e8a0144
blob + 1ad08eac94cab7500e0e8b85dc6c499f05700a6b
--- regress/cmdline/stage.sh
+++ regress/cmdline/stage.sh
@@ -934,8 +934,8 @@ test_stage_diff() {
 	(cd $testroot/wt && got diff > $testroot/stdout)
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l alpha) | cut -d' ' -f 1 | tr -d '\n' \
 		>> $testroot/stdout.expected
@@ -946,6 +946,7 @@ test_stage_diff() {
 	echo '@@ -1 +1 @@' >> $testroot/stdout.expected
 	echo '-modified file' >> $testroot/stdout.expected
 	echo '+modified file again' >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l foo) | cut -d' ' -f 1 | tr -d '\n' \
 		>> $testroot/stdout.expected
@@ -968,8 +969,8 @@ test_stage_diff() {
 	(cd $testroot/wt && got diff -s > $testroot/stdout)
 
 	echo "diff -s $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'alpha$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -981,6 +982,7 @@ test_stage_diff() {
 	echo '@@ -1 +1 @@' >> $testroot/stdout.expected
 	echo '-alpha' >> $testroot/stdout.expected
 	echo '+modified file' >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -989,6 +991,7 @@ test_stage_diff() {
 	echo '+++ /dev/null' >> $testroot/stdout.expected
 	echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
 	echo '-beta' >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo -n 'blob + ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l foo) | cut -d' ' -f 1 \
@@ -1595,8 +1598,8 @@ EOF
 	(cd $testroot/wt && got diff -s > $testroot/stdout)
 
 	echo "diff -s $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i -c $commit_id \
 		| grep 'numbers$' | cut -d' ' -f 1 \
@@ -1702,8 +1705,8 @@ EOF
 	(cd $testroot/wt && got diff -s > $testroot/stdout)
 
 	echo "diff -s $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i -c $commit_id \
 		| grep 'numbers$' | cut -d' ' -f 1 \
@@ -1857,8 +1860,8 @@ EOF
 	(cd $testroot/wt && got diff -s > $testroot/stdout)
 
 	echo "diff -s $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i -c $commit_id \
 		| grep 'numbers$' | cut -d' ' -f 1 \
@@ -1896,8 +1899,8 @@ EOF
 	(cd $testroot/wt && got diff > $testroot/stdout)
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l numbers) | cut -d' ' -f 1 | \
 		tr -d '\n' >> $testroot/stdout.expected
@@ -1963,8 +1966,8 @@ test_stage_patch_added() {
 	(cd $testroot/wt && got diff -s > $testroot/stdout)
 
 	echo "diff -s $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo -n 'blob + ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l epsilon/new) | cut -d' ' -f 1 \
@@ -2088,8 +2091,8 @@ test_stage_patch_removed() {
 	(cd $testroot/wt && got diff -s > $testroot/stdout)
 
 	echo "diff -s $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l beta) | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -2310,8 +2313,8 @@ EOF
 	(cd $testroot/wt && got diff -s > $testroot/stdout)
 
 	echo "diff -s $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i -c $commit_id \
 		| grep 'numbers$' | cut -d' ' -f 1 \
@@ -2507,8 +2510,8 @@ EOF
 	(cd $testroot/wt && got diff -s > $testroot/stdout)
 
 	echo "diff -s $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'alpha.link@ -> alpha$' | \
 		cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2522,6 +2525,7 @@ EOF
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
 	echo '+beta' >> $testroot/stdout.expected
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo -n 'blob + ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l dotgotbar.link) | cut -d' ' -f 1 \
@@ -2531,6 +2535,7 @@ EOF
 	echo '@@ -0,0 +1 @@' >> $testroot/stdout.expected
 	echo '+.got/bar' >> $testroot/stdout.expected
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo -n 'blob + ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l dotgotfoo.link) | cut -d' ' -f 1 \
@@ -2539,6 +2544,7 @@ EOF
 	echo '+++ dotgotfoo.link' >> $testroot/stdout.expected
 	echo '@@ -0,0 +1 @@' >> $testroot/stdout.expected
 	echo '+this is regular file foo' >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i epsilon | grep 'beta.link@ -> ../beta$' | \
 		cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2552,6 +2558,7 @@ EOF
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
 	echo '+../gamma/delta' >> $testroot/stdout.expected
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'epsilon.link@ -> epsilon$' | \
 		cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2565,6 +2572,7 @@ EOF
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
 	echo '+gamma' >> $testroot/stdout.expected
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'nonexistent.link@ -> nonexistent$' | \
 		cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2574,6 +2582,7 @@ EOF
 	echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
 	echo '-nonexistent' >> $testroot/stdout.expected
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo -n 'blob + ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l zeta.link) | cut -d' ' -f 1 \
@@ -2832,8 +2841,8 @@ EOF
 	(cd $testroot/wt && got diff -s > $testroot/stdout)
 
 	echo "diff -s $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'alpha.link@ -> alpha$' | \
 		cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2847,6 +2856,7 @@ EOF
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
 	echo '+beta' >> $testroot/stdout.expected
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo -n 'blob + ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l dotgotfoo.link) | cut -d' ' -f 1 \
@@ -2855,6 +2865,7 @@ EOF
 	echo '+++ dotgotfoo.link' >> $testroot/stdout.expected
 	echo '@@ -0,0 +1 @@' >> $testroot/stdout.expected
 	echo '+this is regular file foo' >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'epsilon.link@ -> epsilon$' | \
 		cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2868,6 +2879,7 @@ EOF
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
 	echo '+gamma' >> $testroot/stdout.expected
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'nonexistent.link@ -> nonexistent$' | \
 		cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2877,6 +2889,7 @@ EOF
 	echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
 	echo '-nonexistent' >> $testroot/stdout.expected
 	echo '\ No newline at end of file' >> $testroot/stdout.expected
+	echo "commit - $head_commit" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo -n 'blob + ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l zeta.link) | cut -d' ' -f 1 \
blob - 6bb970784b5cf067c17b918409a825a1287df1e1
blob + 1f9c74b96419ec6eda2b937ea04a8b7cae1c8e5f
--- regress/cmdline/unstage.sh
+++ regress/cmdline/unstage.sh
@@ -409,8 +409,8 @@ EOF
 	(cd $testroot/wt && got diff -s > $testroot/stdout)
 
 	echo "diff -s $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i -c $commit_id \
 		| grep 'numbers$' | cut -d' ' -f 1 \
@@ -445,8 +445,8 @@ EOF
 
 	(cd $testroot/wt && got diff > $testroot/stdout)
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l numbers) | cut -d' ' -f 1  | \
 		tr -d '\n' >> $testroot/stdout.expected
@@ -554,8 +554,8 @@ EOF
 	(cd $testroot/wt && got diff -s > $testroot/stdout)
 
 	echo "diff -s $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i -c $commit_id \
 		| grep 'numbers$' | cut -d' ' -f 1 \
@@ -590,8 +590,8 @@ EOF
 
 	(cd $testroot/wt && got diff > $testroot/stdout)
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l numbers) | cut -d' ' -f 1 | \
 		tr -d '\n' >> $testroot/stdout.expected
@@ -706,8 +706,8 @@ EOF
 	(cd $testroot/wt && got diff > $testroot/stdout)
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i -c $commit_id \
 		| grep 'numbers$' | cut -d' ' -f 1 \
@@ -799,8 +799,8 @@ test_unstage_patch_added() {
 	(cd $testroot/wt && got diff > $testroot/stdout)
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo 'blob - /dev/null' >> $testroot/stdout.expected
 	echo 'file + epsilon/new (mode 644)' >> $testroot/stdout.expected
 	echo "--- /dev/null" >> $testroot/stdout.expected
@@ -867,8 +867,8 @@ test_unstage_patch_removed() {
 	(cd $testroot/wt && got diff > $testroot/stdout)
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
@@ -972,8 +972,8 @@ EOF
 	(cd $testroot/wt && got diff > $testroot/stdout)
 
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	(cd $testroot/wt && got stage -l numbers) | cut -d' ' -f 1 | \
 		tr -d '\n' >> $testroot/stdout.expected
@@ -998,8 +998,8 @@ EOF
 
 	(cd $testroot/wt && got diff -s > $testroot/stdout)
 	echo "diff -s $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i -c $commit_id \
 		| grep 'numbers$' | cut -d' ' -f 1 \
@@ -1026,6 +1026,7 @@ EOF
 -16
 +c
 EOF
+	echo "commit - $commit_id" >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'zzz$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected
blob - 013d85e1d4cf6d156380290afdb9ab2e51598e63
blob + cd31d1db006846950774ef96be6c8beec4cc3f4e
--- regress/cmdline/update.sh
+++ regress/cmdline/update.sh
@@ -1178,8 +1178,8 @@ test_update_conflict_wt_rm_vs_repo_edit() {
 	# 'got diff' should show post-update contents of beta being deleted
 	local head_rev=`git_show_head $testroot/repo`
 	echo "diff $testroot/wt" > $testroot/stdout.expected
-	echo "commit - $head_rev"  >> $testroot/stdout.expected
 	echo "path + $testroot/wt" >> $testroot/stdout.expected
+	echo "commit - $head_rev"  >> $testroot/stdout.expected
 	echo -n 'blob - ' >> $testroot/stdout.expected
 	got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
 		>> $testroot/stdout.expected