Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Rebasing.

  • Loading branch information...
commit 22ee4f768511ec74750a2cbb27b7a6d743ed0c26 1 parent 14b1153
Marius Vollmer authored
Showing with 49 additions and 7 deletions.
  1. +36 −1 magit.el
  2. +13 −6 magit.texi
37 magit.el
View
@@ -17,7 +17,7 @@
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
-;;; Introduction
+;;; Commentary
;; Invoking the magit-status function will show a buffer with the
;; current status of the current git repository and its checkout.
@@ -223,6 +223,7 @@
(define-key map (kbd "B") 'magit-create-branch)
(define-key map (kbd "m") 'magit-manual-merge)
(define-key map (kbd "M") 'magit-automatic-merge)
+ (define-key map (kbd "R") 'magit-rebase-step)
(define-key map (kbd "U") 'magit-pull)
(define-key map (kbd "P") 'magit-push)
(define-key map (kbd "c") 'magit-log-edit)
@@ -423,6 +424,9 @@ pushed.
(magit-concat-with-delim
", "
(mapcar 'magit-name-rev merge-heads))))))
+ (let ((rebase (magit-rebase-info)))
+ (if rebase
+ (insert (apply 'format "Rebasing: %s (%s of %s)\n" rebase))))
(insert "\n")
(magit-insert-section 'untracked
"Untracked files:" 'magit-wash-other-files
@@ -590,6 +594,37 @@ pushed.
(interactive (list (magit-read-rev "Merge from branch: ")))
(magit-run "git" "merge" branch))
+;;; Rebasing
+
+(defun magit-rebase-info ()
+ (cond ((file-exists-p ".dotest")
+ (list (magit-name-rev (car (magit-file-lines ".dotest/onto")))
+ (car (magit-file-lines ".dotest/next"))
+ (car (magit-file-lines ".dotest/last"))))
+ ((file-exists-p ".git/.dotest-merge")
+ (list (car (magit-file-lines ".git/.dotest-merge/onto_name"))
+ (car (magit-file-lines ".git/.dotest-merge/msgnum"))
+ (car (magit-file-lines ".git/.dotest-merge/end"))))
+ (t
+ nil)))
+
+(defun magit-rebase-step ()
+ (interactive)
+ (let ((info (magit-rebase-info)))
+ (if (not info)
+ (magit-run "git" "rebase" (magit-read-rev "Rebase against: "))
+ (let ((cursor-in-echo-area t)
+ (message-log-max nil))
+ (message "Rebase in progress. Abort, Skip, or Continue? ")
+ (let ((reply (read-event)))
+ (case reply
+ ((?A ?a)
+ (magit-run "git" "rebase" "--abort"))
+ ((?S ?s)
+ (magit-run "git" "rebase" "--skip"))
+ ((?C ?c)
+ (magit-run "git" "rebase" "--continue"))))))))
+
;;; Resetting
(defun magit-reset-soft (target)
19 magit.texi
View
@@ -194,8 +194,8 @@ You can also mark the current commit by typing @kbd{.}. Once you have
marked a commit, you can show the differences between it and the
current commit by typing @kbd{=}.
-@node Rewriting History
-@chapter Rewriting History
+@node Resetting
+@chapter Resetting
Once you have added a commit to your local repository, you can not
change it anymore in any way. But you can reset your current head to
@@ -224,9 +224,6 @@ current head, but it will reset your working tree and staging area
back to the last comitted state. You can do this to abort a manual
merge, for example.
-Rebasing is a more powerful way to rewrite history. It is so
-powerful, it has its own chapter. See @ref{Rebasing}.
-
@node Branching and Merging
@chapter Branching and Merging
@@ -269,7 +266,17 @@ from a merge, you should abort it.
@node Rebasing
@chapter Rebasing
-not yet implemented.
+Typing @kbd{R} in the status buffer will initiate a rebase or, if one
+is already in progress, ask you how to continue.
+
+When a rebase is stopped in the middle because of a conflict, the
+header of the status buffer will indicate what you are rebasing your
+current branch onto and how far along you are in the series of commits
+that are being replayed.
+
+Of course, you can initiate a rebase in any number of ways, by
+configuring @code{git pull} to rebase instead of merge, for example.
+Such a rebase can be finished with Magit as well.
@node Pushing and Pulling
@chapter Pushing and Pulling
Please sign in to comment.
Something went wrong with that request. Please try again.