Re: [PATCH] Add function to checkout a branch in git.el
From: Sergei Organov <hidden>
Date: 2016-06-15 22:44:13
Karl Hasselström [off-list ref] writes:
On 2008-02-13 17:30:02 +0100, Karl Hasselström wrote:quoted
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.