Re: [PATCH] Add function to checkout a branch in git.el
- From
- Sergei Organov <osv@javad.com>
- Date
- Feb 13, 2008, 18:23 UTC
- Message-ID
- <87zlu4vhon.fsf@osv.gnss.ru>
- In-Reply-To
- <20080213164356.GA5828@diana.vm.bytemark.co.uk>
Karl Hasselström <kha@treskal.com> writes:
Show 23 quoted lines
> 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.