* file deletion in index lost after checkout -b
@ 2008-09-01 3:44 Jing Xue
2008-09-05 6:12 ` Junio C Hamano
0 siblings, 1 reply; 6+ messages in thread
From: Jing Xue @ 2008-09-01 3:44 UTC (permalink / raw)
To: git
In Git 1.6.0 the following sequence:
$ git init
$ echo 'abcdefgh' >1.txt
$ echo '12345678' >2.txt
$ git add 1.txt 2.txt
$ git commit -m 'init'
$ git rm 2.txt
$ echo 'qwertyuiop' >>1.txt
$ git add 1.txt
$ echo 'asdfghjkl;' >3.txt
$ git add 3.txt
$ git status
$ git checkout -b foo
$ git status
produces this output:
Initialized empty Git repository in /home/jingxue/workspace/sandboxes/test.git/.git/
Created initial commit 918f3c6: init
2 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 1.txt
create mode 100644 2.txt
rm '2.txt'
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: 1.txt
# deleted: 2.txt
# new file: 3.txt
#
M 1.txt
A 3.txt
Switched to a new branch "foo"
# On branch foo
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: 1.txt
# new file: 3.txt
#
The deletion of 2.txt appears lost during 'checkout -b foo', while the
modification and addition were both brought over. Is it a bug?
Cheers.
--
Jing Xue
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: file deletion in index lost after checkout -b
2008-09-01 3:44 file deletion in index lost after checkout -b Jing Xue
@ 2008-09-05 6:12 ` Junio C Hamano
2008-09-06 17:11 ` Jing Xue
2008-09-08 2:49 ` Re* " Junio C Hamano
0 siblings, 2 replies; 6+ messages in thread
From: Junio C Hamano @ 2008-09-05 6:12 UTC (permalink / raw)
To: Jing Xue; +Cc: git
Jing Xue <jingxue@digizenstudio.com> writes:
[jc: please redirect an answer _meant for you_ off to the list with M-F-T header]
> In Git 1.6.0 the following sequence:
> ...
> The deletion of 2.txt appears lost during 'checkout -b foo', while the
> modification and addition were both brought over. Is it a bug?
This behaviour is unchanged since early June 2005.
http://thread.gmane.org/gmane.comp.version-control.git/4641/focus=4646
This is exactly the case marked as *0*, which both Linus and I said "it
feels somewhat wrong but otherwise we cannot start from an empty index".
We may want to do better this time around, though.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: file deletion in index lost after checkout -b
2008-09-05 6:12 ` Junio C Hamano
@ 2008-09-06 17:11 ` Jing Xue
2008-09-06 18:10 ` Junio C Hamano
2008-09-08 2:49 ` Re* " Junio C Hamano
1 sibling, 1 reply; 6+ messages in thread
From: Jing Xue @ 2008-09-06 17:11 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
On Thu, Sep 04, 2008 at 11:12:26PM -0700, Junio C Hamano wrote:
> [jc: please redirect an answer _meant for you_ off to the list with M-F-T header]
I changed mutt to not use M-F-T with the git list at all. Hope this one
turns out better.
> > The deletion of 2.txt appears lost during 'checkout -b foo', while the
> > modification and addition were both brought over. Is it a bug?
>
> This behaviour is unchanged since early June 2005.
>
> http://thread.gmane.org/gmane.comp.version-control.git/4641/focus=4646
>
> This is exactly the case marked as *0*, which both Linus and I said "it
> feels somewhat wrong but otherwise we cannot start from an empty index".
>
> We may want to do better this time around, though.
I have since found out that:
1. file deletions in the working directory but not in index would not be forgotten. That
makes "file deletions in index" case rather a corner one.
2. "checkout -b -m" would do the right thing.
Cheers.
--
Jing
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: file deletion in index lost after checkout -b
2008-09-06 17:11 ` Jing Xue
@ 2008-09-06 18:10 ` Junio C Hamano
0 siblings, 0 replies; 6+ messages in thread
From: Junio C Hamano @ 2008-09-06 18:10 UTC (permalink / raw)
To: Jing Xue; +Cc: git
Jing Xue <jingxue@digizenstudio.com> writes:
> On Thu, Sep 04, 2008 at 11:12:26PM -0700, Junio C Hamano wrote:
>> [jc: please redirect an answer _meant for you_ off to the list with M-F-T header]
>
> I changed mutt to not use M-F-T with the git list at all. Hope this one
> turns out better.
Thanks; I meant to say "please do not redirect", but you got what I wanted
to say correctly.
>> > The deletion of 2.txt appears lost during 'checkout -b foo', while the
>> > modification and addition were both brought over. Is it a bug?
>>
>> This behaviour is unchanged since early June 2005.
>>
>> http://thread.gmane.org/gmane.comp.version-control.git/4641/focus=4646
>>
>> This is exactly the case marked as *0*, which both Linus and I said "it
>> feels somewhat wrong but otherwise we cannot start from an empty index".
>>
>> We may want to do better this time around, though.
>
> I have since found out that:
>
> 1. file deletions in the working directory but not in index would not be forgotten. That
> makes "file deletions in index" case rather a corner one.
>
> 2. "checkout -b -m" would do the right thing.
Both correct. 1. does not involve case *0*; 2. does not do two-tree
switch but internally uses three-tree switch and uses different codepath.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re* file deletion in index lost after checkout -b
2008-09-05 6:12 ` Junio C Hamano
2008-09-06 17:11 ` Jing Xue
@ 2008-09-08 2:49 ` Junio C Hamano
2008-09-09 2:06 ` Jing Xue
1 sibling, 1 reply; 6+ messages in thread
From: Junio C Hamano @ 2008-09-08 2:49 UTC (permalink / raw)
To: Jing Xue; +Cc: git
Junio C Hamano <gitster@pobox.com> writes:
> Jing Xue <jingxue@digizenstudio.com> writes:
> ...
>> In Git 1.6.0 the following sequence:
>> ...
>> The deletion of 2.txt appears lost during 'checkout -b foo', while the
>> modification and addition were both brought over. Is it a bug?
>
> This behaviour is unchanged since early June 2005.
>
> http://thread.gmane.org/gmane.comp.version-control.git/4641/focus=4646
>
> This is exactly the case marked as *0*, which both Linus and I said "it
> feels somewhat wrong but otherwise we cannot start from an empty index".
>
> We may want to do better this time around, though.
Try this patch.
Documentation/git-read-tree.txt | 11 ++++++++++-
builtin-checkout.c | 1 +
builtin-read-tree.c | 1 +
unpack-trees.c | 11 ++++++++++-
unpack-trees.h | 1 +
5 files changed, 23 insertions(+), 2 deletions(-)
diff --git c/Documentation/git-read-tree.txt i/Documentation/git-read-tree.txt
index 6f4b9b0..24155ab 100644
--- c/Documentation/git-read-tree.txt
+++ i/Documentation/git-read-tree.txt
@@ -160,7 +160,10 @@ Here are the "carry forward" rules:
0 nothing nothing nothing (does not happen)
1 nothing nothing exists use M
2 nothing exists nothing remove path from index
- 3 nothing exists exists use M
+ 3 nothing exists exists, use M if index is empty
+ H == M keep index otherwise
+ exists fail
+ H != M
clean I==H I==M
------------------
@@ -207,6 +210,12 @@ you picked it up via e-mail in a patch form), `git diff-index
merge, but it would not show in `git diff-index --cached $M`
output after two-tree merge.
+Case #3 is slightly tricky and needs explanation. The result from this
+rule logically should be to remove the path if the user staged the removal
+of the path and then swiching to a new branch. That however will prevent
+the initial checkout from happening, so the rule is modified to use M (new
+tree) only when the contents of the index is empty. Otherwise the removal
+of the path is kept as long as $H and $M are the same.
3-Way Merge
~~~~~~~~~~~
diff --git c/builtin-checkout.c i/builtin-checkout.c
index efdb1e0..c73a815 100644
--- c/builtin-checkout.c
+++ i/builtin-checkout.c
@@ -242,6 +242,7 @@ static int merge_working_tree(struct checkout_opts *opts,
}
/* 2-way merge to the new branch */
+ topts.index_was_empty = !active_nr;
topts.update = 1;
topts.merge = 1;
topts.gently = opts->merge;
diff --git c/builtin-read-tree.c i/builtin-read-tree.c
index dddc304..41ece57 100644
--- c/builtin-read-tree.c
+++ i/builtin-read-tree.c
@@ -160,6 +160,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
die("you need to resolve your current index first");
stage = 1;
opts.merge = 1;
+ opts.index_was_empty = !active_nr;
continue;
}
diff --git c/unpack-trees.c i/unpack-trees.c
index ef21c62..43ff477 100644
--- c/unpack-trees.c
+++ i/unpack-trees.c
@@ -941,8 +941,17 @@ int twoway_merge(struct cache_entry **src, struct unpack_trees_options *o)
return -1;
}
}
- else if (newtree)
+ else if (newtree) {
+ if (oldtree && !o->index_was_empty) {
+ /*
+ * deletion of the path was staged;
+ */
+ if (same(oldtree, newtree))
+ return 1;
+ return reject_merge(oldtree, o);
+ }
return merged_entry(newtree, current, o);
+ }
return deleted_entry(oldtree, current, o);
}
diff --git c/unpack-trees.h i/unpack-trees.h
index 94e5672..61d82ce 100644
--- c/unpack-trees.h
+++ i/unpack-trees.h
@@ -26,6 +26,7 @@ struct unpack_trees_options {
verbose_update:1,
aggressive:1,
skip_unmerged:1,
+ index_was_empty:1,
gently:1;
const char *prefix;
int pos;
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: Re* file deletion in index lost after checkout -b
2008-09-08 2:49 ` Re* " Junio C Hamano
@ 2008-09-09 2:06 ` Jing Xue
0 siblings, 0 replies; 6+ messages in thread
From: Jing Xue @ 2008-09-09 2:06 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
On Sun, Sep 07, 2008 at 07:49:25PM -0700, Junio C Hamano wrote:
> Try this patch.
Works well. It doesn't give the fatal warning from "checkout -m" either.
"make test" shows it doesn't break any existing tests.
Thanks.
--
Jing
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2008-09-09 2:14 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-01 3:44 file deletion in index lost after checkout -b Jing Xue
2008-09-05 6:12 ` Junio C Hamano
2008-09-06 17:11 ` Jing Xue
2008-09-06 18:10 ` Junio C Hamano
2008-09-08 2:49 ` Re* " Junio C Hamano
2008-09-09 2:06 ` Jing Xue
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).