Skip to content

Commit

Permalink
diff: support --cached on unborn branches
Browse files Browse the repository at this point in the history
"git diff --cached" (without revision) used to mean "git diff --cached
HEAD" (i.e. the user was too lazy to type HEAD). This "correctly"
failed when there was no commit yet. But was that correctness useful?

This patch changes the definition of what particular command means.
It is a request to show what _would_ be committed without further "git
add". The internal implementation is the same "git diff --cached HEAD"
when HEAD exists, but when there is no commit yet, it compares the index
with an empty tree object to achieve the desired result.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Nguyễn Thái Ngọc Duy authored and Junio C Hamano committed Feb 7, 2011
1 parent 2e9c878 commit a2b7a3b
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 2 deletions.
2 changes: 2 additions & 0 deletions Documentation/git-diff.txt
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ directories. This behavior can be forced by --no-index.
commit relative to the named <commit>. Typically you
would want comparison with the latest commit, so if you
do not give <commit>, it defaults to HEAD.
If HEAD does not exist (e.g. unborned branches) and
<commit> is not given, it shows all staged changes.
--staged is a synonym of --cached.

'git diff' [--options] <commit> [--] [<path>...]::
Expand Down
7 changes: 5 additions & 2 deletions builtin/diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -330,8 +330,11 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
else if (!strcmp(arg, "--cached") ||
!strcmp(arg, "--staged")) {
add_head_to_pending(&rev);
if (!rev.pending.nr)
die("No HEAD commit to compare with (yet)");
if (!rev.pending.nr) {
struct tree *tree;
tree = lookup_tree((const unsigned char*)EMPTY_TREE_SHA1_BIN);
add_pending_object(&rev, &tree->object, "HEAD");
}
break;
}
}
Expand Down
11 changes: 11 additions & 0 deletions t/t4013-diff-various.sh
Original file line number Diff line number Diff line change
Expand Up @@ -290,4 +290,15 @@ test_expect_success 'log -S requires an argument' '
test_must_fail git log -S
'

test_expect_success 'diff --cached on unborn branch' '
echo ref: refs/heads/unborn >.git/HEAD &&
git diff --cached >result &&
test_cmp "$TEST_DIRECTORY/t4013/diff.diff_--cached" result
'

test_expect_success 'diff --cached -- file on unborn branch' '
git diff --cached -- file0 >result &&
test_cmp "$TEST_DIRECTORY/t4013/diff.diff_--cached_--_file0" result
'

test_done
38 changes: 38 additions & 0 deletions t/t4013/diff.diff_--cached
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
diff --git a/dir/sub b/dir/sub
new file mode 100644
index 0000000..992913c
--- /dev/null
+++ b/dir/sub
@@ -0,0 +1,8 @@
+A
+B
+C
+D
+E
+F
+1
+2
diff --git a/file0 b/file0
new file mode 100644
index 0000000..10a8a9f
--- /dev/null
+++ b/file0
@@ -0,0 +1,9 @@
+1
+2
+3
+4
+5
+6
+A
+B
+C
diff --git a/file1 b/file1
new file mode 100644
index 0000000..b1e6722
--- /dev/null
+++ b/file1
@@ -0,0 +1,3 @@
+A
+B
+C
15 changes: 15 additions & 0 deletions t/t4013/diff.diff_--cached_--_file0
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
diff --git a/file0 b/file0
new file mode 100644
index 0000000..10a8a9f
--- /dev/null
+++ b/file0
@@ -0,0 +1,9 @@
+1
+2
+3
+4
+5
+6
+A
+B
+C

0 comments on commit a2b7a3b

Please sign in to comment.