Re: [PATCH v3] git checkout -b: unparent the new branch with -o

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Erick Mattos <erick.mattos@xxxxxxxxx> writes:

> I am just trying to make you satisfied so gitsters, I mean git users,
> will have this feature as soon as possible.

Don't try to satisfy _me_ personally.  It is not likely that I am going to
use "checkout --orphan" myself.  But I would not reject a new feature that
does make sense to some people, even if it is not something I would use.
I am here to help people like you help others (and to prevent people from
harming others).

I however am going to have to answer when people complain "why was this
senseless new feature added to the system?  what it does makes no sense
and does not help me."

"Nuke index but not working tree" is not something I think I can defend
and explain as sensible to these people, as I do not think it makes sense
myself.  So when Ispot a design that logically does not make sense to me,
I would say so and ask clarifications.  A major part of the maintainer's
job is to ask questions and say "no".

> I do prefer my first design mainly because it mimics the state of an
> initial commit.  I think that is subjectively better.

You keep saying that, but I think it is misguided.  And I do not think
there is anything subjective there.

If you are starting from scratch, you would:

    $ git init newrepo
    $ cd newrepo

and that is how the state before the initial commit begins with.  You
might then do this to prepare for the commit:

    $ tar xf ~/junk/frotz-2.43.tar.gz
    $ git add .

Or perhaps you would work the other way around:

    $ tar xf ~/junk/frotz-2.43.tar.gz
    $ cd frotz-2.43
    $ git init
    $ git add .

Whichever way you work, notice that you wouldn't have any rubbish in the
working tree unrelated to the "frotz" project, when the tool (in this
case, "git init") prepares the repository with a dangling HEAD and the
working tree "before the initial commit".  You either have emptiness (to
which you can untar into), or you already have files that you would want
to have in the branch and no other cruft.

If you did "nuke index, leaving files in the work tree around", the result
does not resemble "state before the initial commit" at all.  The leftover
files will get in the way.

The leftover worktree files will not get in the way ONLY if the user wants
to record a tree that is similar to the original branch, but even in that
case they have to do "git add ."; keeping the index intact would help them
even better.

After realizing all that, do you still think "nuke only the index" is
subjectively better?

> I did it!

Sure, I am saying that then you should advertise the result as such,
without being negative.

>> Better yet, try to advertise what you are giving your users in a positive
>> way, instead of in a way that only scares users, perhaps like this:
>>
>>    After 'checkout --orphan', your HEAD will point at an unborn branch,
>>    and the next commit will start a new history without any prior commit.
>>    To help create such a new history that has contents mostly the same as
>>    that of the original branch, the command does not touch the index nor
>>    the working tree, and "checkout --orphan" immediately followed by
>>    "commit -a" would record a tree very similar to what you had in the
>>    original branch.  This is useful when you want to ... [insert a
>>    summary of "going open source" example from my previous message if you
>>    want here].
>>
>>    If on the other hand you want to start a new branch whose contents do
>>    not resemble the original branch at all, you may want to start from an
>>    empty index and the working tree, with "git rm -rf ." immediately
>>    after running this command.
>>
>> The same comment applies to the documentation part.
>
> I was trying to be concise on my message.  I realize you want it more explained.

Concise is good.  Negative is not.

> After the 'checkout -o -b' you are in an new unborn branch ready to be
> committed.  The next commit will start a new history without any
> ancestry.  If this new branch was made to start from scratch, not
> resembling the previous one, then you should use 'git rm -rf' to get
> an empty work tree and index.  Otherwise with a 'git commit -a' you
> will have a tree exactly as in the previous branch.  So just set
> things as you want it to be and commit the new unparented branch.

I wouldn't start the description with

    if you want 'no common paths', then it would be more cumbersome than
    just this single command

if the primary workflow your chose to support with your implementation is
'mostly common paths'.

Look at the example I gave you more carefully.  The primary use case we
intend to support is described first.  Also it is written in much more
inviting tone, in order to help readers understand the motivation behind
the feature.  IOW, "Ah, that is something I may want to do in some cases,
and the new feature indeed sounds useful." is what we want to hear from
the readers (the log message for reviewers, and the documentation for the
end users) after they read the explanation.  The second paragraph then
mentions the less common use case for completeness.  To the readers who
understand why the behaviour of the command makes sense for its primary
use case (which is described first), it would be easier to accept that
they have to run an extra command (by the way, it is "'git rm -rf .' from
the top-level of the working tree; do not forget the dot at the end) to
clean up the working tree to a prestine state, because they would
understand the reason why the clearing is not done by default.

The same comment applies to the documentation part of the patch.  Don't be
negative.  Positively explain why what you added is useful, and help the
users understand why they might want to use it and in what situation.



--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]