3 test_description
='checkout into detached HEAD state'
7 test_must_fail git symbolic-ref
-q HEAD
>/dev
/null
10 check_not_detached
() {
11 git symbolic-ref
-q HEAD
>/dev
/null
14 PREV_HEAD_DESC
='Previous HEAD position was'
15 check_orphan_warning
() {
16 test_i18ngrep
"you are leaving $2 behind" "$1" &&
17 test_i18ngrep
! "$PREV_HEAD_DESC" "$1"
19 check_no_orphan_warning
() {
20 test_i18ngrep
! "you are leaving .* commit.*behind" "$1" &&
21 test_i18ngrep
"$PREV_HEAD_DESC" "$1"
25 git checkout master
&&
29 test_expect_success
'setup' '
32 test_commit three && git tag -d three &&
33 test_commit four && git tag -d four &&
38 test_expect_success
'checkout branch does not detach' '
40 git checkout branch &&
44 test_expect_success
'checkout tag detaches' '
50 test_expect_success
'checkout branch by full name detaches' '
52 git checkout refs/heads/branch &&
56 test_expect_success
'checkout non-ref detaches' '
58 git checkout branch^ &&
62 test_expect_success
'checkout ref^0 detaches' '
64 git checkout branch^0 &&
68 test_expect_success
'checkout --detach detaches' '
70 git checkout --detach branch &&
74 test_expect_success
'checkout --detach without branch name' '
76 git checkout --detach &&
80 test_expect_success
'checkout --detach errors out for non-commit' '
82 test_must_fail git checkout --detach one^{tree} &&
86 test_expect_success
'checkout --detach errors out for extra argument' '
88 git checkout master &&
89 test_must_fail git checkout --detach tag one.t &&
93 test_expect_success
'checkout --detached and -b are incompatible' '
95 test_must_fail git checkout --detach -b newbranch tag &&
99 test_expect_success
'checkout --detach moves HEAD' '
102 git checkout --detach two &&
103 git diff --exit-code HEAD &&
104 git diff --exit-code two
107 test_expect_success
'checkout warns on orphan commits' '
109 git checkout --detach two &&
110 echo content >orphan &&
112 git commit -a -m orphan1 &&
113 echo new content >orphan &&
114 git commit -a -m orphan2 &&
115 orphan2=$(git rev-parse HEAD) &&
116 git checkout master 2>stderr
119 test_expect_success
'checkout warns on orphan commits: output' '
120 check_orphan_warning stderr "2 commits"
123 test_expect_success
'checkout warns orphaning 1 of 2 commits' '
124 git checkout "$orphan2" &&
125 git checkout HEAD^ 2>stderr
128 test_expect_success
'checkout warns orphaning 1 of 2 commits: output' '
129 check_orphan_warning stderr "1 commit"
132 test_expect_success
'checkout does not warn leaving ref tip' '
134 git checkout --detach two &&
135 git checkout master 2>stderr
138 test_expect_success
'checkout does not warn leaving ref tip' '
139 check_no_orphan_warning stderr
142 test_expect_success
'checkout does not warn leaving reachable commit' '
144 git checkout --detach HEAD^ &&
145 git checkout master 2>stderr
148 test_expect_success
'checkout does not warn leaving reachable commit' '
149 check_no_orphan_warning stderr
153 Your branch is behind 'master' by 1 commit, and can be fast-forwarded.
154 (use "git pull" to update your local branch)
156 test_expect_success
'tracking count is accurate after orphan check' '
158 git branch child master^ &&
159 git config branch.child.remote . &&
160 git config branch.child.merge refs/heads/master &&
161 git checkout child^ &&
162 git checkout child >stdout &&
163 test_i18ncmp expect stdout
166 test_expect_success
'no advice given for explicit detached head state' '
168 test_config advice.detachedHead true &&
169 git checkout child && git checkout HEAD^0 >expect.advice 2>&1 &&
170 test_config advice.detachedHead false &&
171 git checkout child && git checkout HEAD^0 >expect.no-advice 2>&1 &&
172 test_unconfig advice.detachedHead &&
173 # without configuration, the advice.* variables default to true
174 git checkout child && git checkout HEAD^0 >actual 2>&1 &&
175 test_cmp expect.advice actual &&
177 # with explicit --detach
179 test_unconfig advice.detachedHead &&
180 git checkout child && git checkout --detach HEAD^0 >actual 2>&1 &&
181 test_cmp expect.no-advice actual &&
183 # explicitly decline advice
184 test_config advice.detachedHead false &&
185 git checkout child && git checkout --detach HEAD^0 >actual 2>&1 &&
186 test_cmp expect.no-advice actual