Magit

2021년 12월 30일 수정

It's Magit! A Git Porcelain inside Emacs

Magit은 EmacsGit 프론트엔드/클라이언트 확장이다. 개인적으로는 Emacs킬러 애플리케이션 중 하나로 꼽는다.

참고로 이 글은 순수 magit이 아닌 Doom EmacsSpacemacs용으로 커스터마이징 된 단축키를 위주로 정리한다.

magit-status

Magit을 시작한다. 정확하게 말해서 현재 상태를 표시하는 UI를 띄우는 함수다. 마치 git status 명령과 비슷하다. 개인적으로 magit 을 시작하는 가장 좋은 방법으로 사용한다.

인터랙티브 함수이므로 M-x 명령으로 실행시킬 수도 있다. Doom Emacs에서는 SPC g g, Spacemacs에서는 SPC g s 단축키가 기본 바인딩 되어 있다.

아래의 단축키들은 모두 이 화면에서 시작된다.

Status 갱신

magit-status 화면의 내용을 갱신(refresh)하기 위해서는 g r 을 입력하면 된다.

스테이지(Stage)

수정된 파일을 선택하고 s 를 누르면 스테이지가 된다. 각 수정 내역에서 TAB 을 누르면 간단한 diff를 볼 수 있는데 여기서 선택 영역을 지정하고 s 를 누르면 선택 영역만 따로 스테이지 된다.

타이틀 부분을 선택하고 s 를 누르면 해당 분류의 파일들이 모두 스테이지 된다.

커밋(Commit)

c c 를 누르면 커밋 모드로 바뀐다. 스테이지 된 파일들의 간략한 변경점을 볼 수 있으며 커밋 메시지를 작성할 수 있다.

커밋 메시지를 작성한 이후 커밋을 진행하는데, Doom Emacs의 경우 :wq 로 vim 을 종료하듯이 하면 커밋이 진행된다. Spacemacs의 경우 ,c 와 같은 별도의 단축키가 배정되어 있으며 이 부분은 에디터 안에 주석으로 도움말이 적혀있으니 참고하자.

로그 보기(Log)

l l 을 이용하면 로그를 볼 수 있다.

각 커밋에서 RET 를 누르면 해당 커밋의 변경 내역을 볼 수도 있다.

원격에 푸시하기(Push)

p p 를 이용하면 원격에 현재 브랜치 이름으로 푸시(push) 된다.

원격에서 받아오기(Pull or Fetch)

F u 를 이용하면 origin 에서 현재 브랜치로 풀(pull)이 된다.

만약 pull이 아닌 fetch를 원한다면 f u 를 눌러보자. origin에서 모든 내용이 fetch 된다.

fetch 시 로컬과 origin 원격의 브랜치를 동기화 하고 싶다면 - 즉 원격에서 사라진 브랜치를 지우고 싶다면 - f 화면에서 -d 를 차례대로 입력해서 prune 옵션을 활성시킨 후 u 를 눌러보자.

브랜치(Branch)

b c
브랜치 생성. 출발점이 되는 브랜치를 먼저 입력 받고 그 이후에 생성할 브랜치 이름을 입력한다.
b b
브랜치 전환
b x
브랜치 삭제

변경 사항 되돌리기

magit-status 상에서 원하는 변경점을 선택한 후 x 를 누르면 해당 변경 사항을 취소하고 원래대로(HEAD) 돌린다. 수정한 내용을 그대로 잃어버리니 사용에 주의하자.

특정 커밋 시점으로 전환하기(switch commit)

magit-status 에서 l l 을 통해 원하는 커밋을 선택한 후 RET 를 누른다. 그러면 해당 커밋의 자세한 내용이 나타나는데 그 상태에서 b b 를 누르면 브랜치 전환 인터페이스가 나타나면서 제일 상단에 선택한 로그의 커밋 해시가 나타난다. 그러면 간단히 RET 를 누르면 원하는 시점으로 이동할 수 있다.

임시 저장(Stash) 및 복원

Git의 stash 기능을 이용해 현재 작업 중이던 사항을 임시로 보관해놓고 변화 내역을 날려버릴 수 있다. 물론 복구도 가능하다.

Z z
현재 브랜치의 모든 수정 중이던 사항을 Stash로 보관한다. 실행 시 메모를 남길 수 있다.
Z p
선택된 Stash의 수정 사항을 반영하고 Stash를 삭제한다. (pop)
Z a
선택된 Stash의 수정 사항을 반영(apply)한다. 원래의 Stash는 계속 남는다.
Z k
선택된 Stash를 날려버린다. (drop)

기타

  • magit-status 에서 $ 키를 누르면 실제로 사용되는 커맨드 및 응답 등의 로그를 볼 수 있다.