Subject: Re: [PATCH] Add function to checkout a branch in git.el

From: Sergei Organov <[email-masked]>
Date: Wed, 13 Feb 2008 21:23:52 +0300

Karl Hasselström <[email-masked]> writes:

> On 2008-02-13 17:30:02 +0100, Karl Hasselström wrote:
>
>> Why the prefix? Wouldn't it be easier to just have one "switch
>> branch" prompt that would tab complete existing branch names, and
>>
>>   * if the user enters the name of an existing branch, just switch to
>>     it;
>>
>>   * if the user enters a name that's not the name of an existing
>>     branch, ask for confirmation, and then create the new branch and
>>     switch to it.
>
> Reading your code a bit more carefully, I realize that my suggestion
> doesn't give you the opportunity to base the new branch on anything
> but HEAD. So change the second bullet to
>
>   * if the user enters a name that's not the name of an existing
>     branch, display a prompt like this
>
>       Creating new branch "foo". Where should it start?
>
>     Tab complete on existing tags and branches, but accept any
>     committish. Create the new branch and switch to it.

It still doesn't allow to detach HEAD at arbitrary tag/committish, as
far as I can see.

I believe the interface should be designed more carefully. Here are some
thoughts/suggestions:

1. Let `git-checkout' switch HEAD. It will never create new branches but
   will be able to detach HEAD. Use tab-completion on branch names and
   maybe tags (maybe by inserting tags/ into completion list, and
   switching completion list to tags after tags/ is enterd by user), but
   allow any commitish. Ideally, it will also revert Emacs buffers for
   which working copy files are changed during checkout.

2. Let `git-create-branch' create new branches. It will prompt for a branch
   name, then prompt for starting point with default set to HEAD, and
   create the branch. As it doesn't switch HEAD, it won't touch working
   files.

3. Let `git-branch' create new branch at HEAD and switch to it. This
   will be just a short-cut for common and simple case. Note that this
   will never change working files as newly created branch will match
   HEAD.

4. Reserve C-u prefix for ability to provide arbitrary options to
   underlying GIT commands. For example, it's useful to be able to give
   -m or -f option to "git checkout"; or --track or -f to "git branch".

The "create new branch at arbitrary point and then switch to it" will
then be a two-step operation: either "

((git-create-branch <name> <point>) (git-checkout <name>)

or

((git-checkout <point>) (git-branch <name>))

but that is IMHO reasonable trade-off for interface simplicity, though
yet another function could be defined to do it in one step.

-- Sergei.