Как настроить и работать с Magit?

Полное руководство по работе с Magit в Emacs

Сводная таблица горячих клавиш Magit

Основные команды

Комбинация Действие
C-x g Открыть Magit status
s Stage изменения
u Unstage изменения
c Commit
C Extended commit
P Push
F Pull
b Branch
m Merge
l Log
t Tag
z Stash
k Discard изменения

Навигация

Комбинация Действие
TAB Развернуть/свернуть секцию
n Следующий элемент
p Предыдущий элемент
M-n Следующая секция
M-p Предыдущая секция

Статус репозитория

Комбинация Действие
g Обновить статус
= Diff
E Ediff

Установка Magit

  1. Установите через package.el:
(use-package magit
  :ensure t)
  1. Или через MELPA: M-x package-install RET magit RET

Основной рабочий процесс

1. Открытие Magit status

Основная точка входа - окно статуса:

$$C-x g$$

2. Просмотр изменений

В окне статуса:

  • Неотслеживаемые файлы (Untracked)
  • Измененные файлы (Unstaged changes)
  • Подготовленные к коммиту изменения (Staged changes)

Используйте TAB для разворачивания секций.

3. Подготовка изменений (Stage)

  • Наведите курсор на файл и нажмите s для stage
  • Для stage конкретных изменений внутри файла:
    • Откройте diff (= на файле)
    • Перейдите к нужному блоку изменений
    • Нажмите s

4. Создание коммита

После stage изменений:

  • Нажмите c для начала коммита
  • Затем:
    • c - обычный коммит
    • C - extended commit (с дополнительными опциями)

Введите сообщение коммита и завершите C-c C-c.

5. Работа с ветками

  • b b - переключение между ветками
  • b c - создание новой ветки
  • b n - переименование ветки
  • b d - удаление ветки

6. Синхронизация с удаленным репозиторием

  • P p - push текущей ветки
  • F u - pull с rebase
  • F p - обычный pull

Продвинутые возможности

1. Интерактивный rebase

  1. Откройте log (l l)
  2. Выберите коммит, с которого начать rebase
  3. Нажмите r i для интерактивного rebase
  4. Используйте команды:
    • p - pick (оставить коммит)
    • r - reword (изменить сообщение)
    • e - edit (изменить коммит)
    • s - squash (объединить с предыдущим)
    • f - fixup (как squash, но отбросить сообщение)

2. Работа с stash

  • z s - создать stash
  • z a - применить stash
  • z p - pop stash (применить и удалить)
  • z d - удалить stash

3. Разрешение конфликтов

При возникновении конфликтов:

  1. Откройте файл с конфликтами
  2. Используйте M-x magit-ediff-resolve для интерактивного разрешения
  3. После разрешения всех конфликтов сделайте git add (s в Magit)

Кастомизация Magit

Настройка в .emacs

(setq magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1)

;; Автозавершение при вводе сообщений коммита
(add-hook 'git-commit-mode-hook 'git-commit-turn-on-flyspell)

Полезные расширения

  • magit-todos - просмотр TODO в коде
  • magit-gitflow - поддержка git-flow
  • forge - интеграция с GitHub/GitLab

Советы и рекомендации

  1. Используйте M-x magit-file-delete для удаления файлов через Magit
  2. Для частичного stage используйте s внутри diff
  3. M-x magit-blame-mode для просмотра аннотаций к строкам
  4. M-x magit-submodule для работы с подмодулями
  5. Для сложных операций используйте команды через M-x magit-*

Решение проблем

Magit работает медленно

Добавьте в конфигурацию:

(setq magit-refresh-status-buffer nil)

Проблемы с аутентификацией

Настройте:

(setq magit-git-executable "/path/to/git")
(setq magit-credential-cache-daemon-socket "~/.git-credential-cache/socket")

Magit предоставляет мощный интерфейс для работы с Git, сочетающий удобство использования с полнотой функционала. Освоение его горячих клавиш значительно ускорит ваш рабочий процесс.

Команды Magit

C-x g для отображения информации о текущем репозитории Git
Left s / u добавить файл в индекс или убрать из индекса.
C-SPC — поставить метку на файле C-n C-p отметить список файлов из отменить,потом s или u для включения или исключения.
c откроет меню для COMMIT и другие варианты, нажимаю еще раз c, ввожу комментарий commit и нажимаю C-c для выполнения commit.

Список команд
Key             Binding

TAB		magit-section-toggle
RET		magit-visit-thing
C-w		magit-copy-section-value
SPC		magit-diff-show-or-scroll-up
!		magit-run
$		magit-process-buffer
%		magit-worktree
+		magit-diff-more-context
-		magit-diff-less-context
0		magit-diff-default-context
1		magit-section-show-level-1
2		magit-section-show-level-2
3		magit-section-show-level-3
4		magit-section-show-level-4
5 .. 9		digit-argument
:		magit-git-command
<		beginning-of-buffer
>		magit-sparse-checkout
?		magit-dispatch
A		magit-cherry-pick
B		magit-bisect
C		magit-clone
D		magit-diff-refresh
E		magit-ediff
F		magit-pull
G		magit-refresh-all
H		magit-describe-section
I		magit-init
J		magit-display-repository-buffer
K		magit-file-untrack
L		magit-log-refresh
M		magit-remote
O		magit-subtree
P		magit-push
Q		magit-git-command
R		magit-file-rename
S		magit-stage-modified
T		magit-notes
U		magit-unstage-all
V		magit-revert
W		magit-patch
X		magit-reset
Y		magit-cherry
Z		magit-worktree
^		magit-section-up
a		magit-cherry-apply
b		magit-branch
c		magit-commit
d		magit-diff
e		magit-ediff-dwim
f		magit-fetch
g		magit-refresh
h		magit-dispatch
i		magit-gitignore
j		magit-status-jump
k		magit-delete-thing
l		magit-log
m		magit-merge
n		magit-section-forward
o		magit-submodule
p		magit-section-backward
q		magit-mode-bury-buffer
r		magit-rebase
s		magit-stage-file
t		magit-tag
u		magit-unstage-file
v		magit-revert-no-commit
w		magit-am
x		magit-reset-quickly
y		magit-show-refs
z		magit-stash
DEL		magit-diff-show-or-scroll-down
S-SPC		magit-diff-show-or-scroll-down
C-<return>	magit-visit-thing
C-<tab>		magit-section-cycle
M-<tab>		magit-section-cycle-diffs
<backtab>	magit-section-cycle-global

<remap> <dired-jump>	magit-dired-jump

<remap> <back-to-indentation>	magit-back-to-indentation
<remap> <evil-next-line>	evil-next-visual-line
<remap> <evil-previous-line>	evil-previous-visual-line
<remap> <next-line>		magit-next-line
<remap> <previous-line>		magit-previous-line

C-c C-c		magit-dispatch
C-c C-e		magit-edit-thing
C-c C-o		magit-browse-thing
C-c C-w		magit-copy-thing

C-M-i		magit-dired-jump
M-w		magit-copy-buffer-revision

C-c TAB		magit-section-cycle

M-1		magit-section-show-level-1-all
M-2		magit-section-show-level-2-all
M-3		magit-section-show-level-3-all
M-4		magit-section-show-level-4-all
M-n		magit-section-forward-sibling
M-p		magit-section-backward-sibling

<left-fringe> <mouse-1>	magit-mouse-toggle-section
<left-fringe> <mouse-2>	magit-mouse-toggle-section