M-x git-change-branch checkout branch, and ask for confirmation if a new one is to be created One could also use a new submenu in the Git menu for this. --- 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 I didn't think of the other way, that seem simpler. Here is a corrected patch > * 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. Mmm seem cool, but I have no time for now. Patch are welcome, otherwise I might look at it this weekend or next week. Also one might want to do detached head checkout, it wont work for now, but should not be very hard to do. -- Rémi Vanicat contrib/emacs/git.el | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 45 insertions(+), 0 deletions(-) diff --git a/contrib/emacs/git.el b/contrib/emacs/git.el index a8bf0ef..bf0601d 100644 --- a/contrib/emacs/git.el +++ b/contrib/emacs/git.el @@ -1138,6 +1138,50 @@ Return the list of files that haven't been handled." (when (eq (window-buffer) (current-buffer)) (shrink-window-if-larger-than-buffer))) +(defun git-list-branch () + "Return a list of available branch" + ;; should I check if I'm in a git repository ? + (let ((branchs ())) + (with-temp-buffer + (git-run-command-buffer (current-buffer) "branch") + (goto-char (point-min)) + (while (re-search-forward "^\\([ *]\\) \\([^\n]*\\)$" () t) + (push (list (match-string 2) + (string= (match-string 1) "*")) + branchs))) + (nreverse branchs))) + +(defun git-change-branch (branch &optional new) + "Switch to another branch + +if new is non-nil, creating it if needed +otherwise just checkout it" + (interactive + (let ((branch (completing-read "Branch: " (git-list-branch)))) + (list branch + (and (not (assoc branch (git-list-branch))) + (or (y-or-n-p "create a new branch? ") + (error "branch does not exist")))))) + (with-temp-buffer + (if new + (git-call-process-display-error "checkout" "-b" branch) + (git-call-process-display-error "checkout" branch "--")) + (goto-char (point-min)))) + +(defun git-change-new-branch-menu (branch) + "Switch to new branch" + (interactive "MBranch: ") + (git-change-branch branch 't)) + +(defun git-change-branch-menu-filter (rest) + "define the change branch menu" + (append + (mapcar + (lambda (branch) + `[,(car branch) (git-change-branch ,(car branch)) t]) + (git-list-branch)) + (list ["change to new" git-change-new-branch-menu t]))) + (defun git-diff-file () "Diff the marked file(s) against HEAD." (interactive) @@ -1486,6 +1530,7 @@ amended version of it." ["Diff Against Merge Head" git-diff-file-merge-head t] ["Diff Against Mine" git-diff-file-mine t] ["Diff Against Other" git-diff-file-other t]) + ("Change branch" :filter git-change-branch-menu-filter) "--------" ["Add File" git-add-file t] ["Revert File" git-revert-file t] -- 1.5.4.1.101.gacba - 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