Karl Hasselström <kha@xxxxxxxxxxx> 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. - 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