|
|
- ;;; magit-reset.el --- reset fuctionality -*- lexical-binding: t -*-
-
- ;; Copyright (C) 2010-2019 The Magit Project Contributors
- ;;
- ;; You should have received a copy of the AUTHORS.md file which
- ;; lists all contributors. If not, see http://magit.vc/authors.
-
- ;; Author: Jonas Bernoulli <jonas@bernoul.li>
- ;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
-
- ;; Magit is free software; you can redistribute it and/or modify it
- ;; under the terms of the GNU General Public License as published by
- ;; the Free Software Foundation; either version 3, or (at your option)
- ;; any later version.
- ;;
- ;; Magit is distributed in the hope that it will be useful, but WITHOUT
- ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- ;; License for more details.
- ;;
- ;; You should have received a copy of the GNU General Public License
- ;; along with Magit. If not, see http://www.gnu.org/licenses.
-
- ;;; Commentary:
-
- ;; This library implements reset commands.
-
- ;;; Code:
-
- (require 'magit)
-
- ;;;###autoload (autoload 'magit-reset "magit" nil t)
- (define-transient-command magit-reset ()
- "Reset the `HEAD', index and/or worktree to a previous state."
- :man-page "git-reset"
- ["Reset"
- ("m" "mixed (HEAD and index)" magit-reset-mixed)
- ("s" "soft (HEAD only)" magit-reset-soft)
- ("h" "hard (HEAD, index and files)" magit-reset-hard)
- ("i" "index (only)" magit-reset-index)
- ("w" "worktree (only)" magit-reset-worktree)
- ""
- ("f" "a file" magit-file-checkout)])
-
- ;;;###autoload
- (defun magit-reset-mixed (commit)
- "Reset the `HEAD' and index to COMMIT, but not the working tree.
- \n(git reset --mixed COMMIT)"
- (interactive (list (magit-reset-read-branch-or-commit "Reset %s to")))
- (magit-reset-internal "--mixed" commit))
-
- ;;;###autoload
- (defun magit-reset-soft (commit)
- "Reset the `HEAD' to COMMIT, but not the index and working tree.
- \n(git reset --soft REVISION)"
- (interactive (list (magit-reset-read-branch-or-commit "Soft reset %s to")))
- (magit-reset-internal "--soft" commit))
-
- ;;;###autoload
- (defun magit-reset-hard (commit)
- "Reset the `HEAD', index, and working tree to COMMIT.
- \n(git reset --hard REVISION)"
- (interactive (list (magit-reset-read-branch-or-commit
- (concat (magit--propertize-face "Hard" 'bold)
- " reset %s to"))))
- (magit-reset-internal "--hard" commit))
-
- ;;;###autoload
- (defun magit-reset-index (commit)
- "Reset the index to COMMIT.
- Keep the `HEAD' and working tree as-is, so if COMMIT refers to the
- head this effectively unstages all changes.
- \n(git reset COMMIT .)"
- (interactive (list (magit-read-branch-or-commit "Reset index to")))
- (magit-reset-internal nil commit "."))
-
- ;;;###autoload
- (defun magit-reset-worktree (commit)
- "Reset the worktree to COMMIT.
- Keep the `HEAD' and index as-is."
- (interactive (list (magit-read-branch-or-commit "Reset worktree to")))
- (magit-wip-commit-before-change nil " before reset")
- (magit-with-temp-index commit nil
- (magit-call-git "checkout-index" "--all" "--force"))
- (magit-wip-commit-after-apply nil " after reset")
- (magit-refresh))
-
- ;;;###autoload
- (defun magit-reset-quickly (commit &optional hard)
- "Reset the `HEAD' and index to COMMIT, and possibly the working tree.
- With a prefix argument reset the working tree otherwise don't.
- \n(git reset --mixed|--hard COMMIT)"
- (interactive (list (magit-reset-read-branch-or-commit
- (if current-prefix-arg
- (concat (magit--propertize-face "Hard" 'bold)
- " reset %s to")
- "Reset %s to"))
- current-prefix-arg))
- (magit-reset-internal (if hard "--hard" "--mixed") commit))
-
- (defun magit-reset-read-branch-or-commit (prompt)
- "Prompt for and return a ref to reset HEAD to.
-
- PROMPT is a format string, where either the current branch name
- or \"detached head\" will be substituted for %s."
- (magit-read-branch-or-commit
- (format prompt (or (magit-get-current-branch) "detached head"))))
-
- (defun magit-reset-internal (arg commit &optional path)
- (when (and (not (member arg '("--hard" nil)))
- (equal (magit-rev-parse commit)
- (magit-rev-parse "HEAD~")))
- (with-temp-buffer
- (magit-git-insert "show" "-s" "--format=%B" "HEAD")
- (when git-commit-major-mode
- (funcall git-commit-major-mode))
- (git-commit-setup-font-lock)
- (git-commit-save-message)))
- (let ((cmd (if (and (equal commit "HEAD") (not arg)) "unstage" "reset")))
- (magit-wip-commit-before-change nil (concat " before " cmd))
- (magit-run-git "reset" arg commit "--" path)
- (when (equal cmd "unstage")
- (magit-wip-commit-after-apply nil " after unstage"))))
-
- ;;; _
- (provide 'magit-reset)
- ;;; magit-reset.el ends here
|