lazygit는 Git 명령어를 위한 간단한 터미널 UI 도구로, 복잡한 Git 작업을 직관적인 인터페이스로 제공한다.

Overview

lazygit는 Jesse Duffield가 개발한 오픈 소스 터미널 기반 Git 클라이언트이다. Git은 강력한 버전 관리 시스템이지만, 명령줄 인터페이스(CLI)는 복잡하고 배우기 어렵다는 비판을 받아왔다. lazygit은 이러한 문제를 해결하기 위해 터미널에서 실행되는 그래픽 사용자 인터페이스(TUI)를 제공하여, Git의 복잡한 작업을 시각적이고 직관적인 방식으로 수행할 수 있게 한다.

이 도구는 개발자가 Git 명령어를 기억하거나 긴 명령어를 입력하지 않고도, 키보드만으로 스테이징, 커밋, 브랜치 관리, 인터랙티브 리베이스, 체리픽 등 다양한 Git 작업을 빠르게 처리할 수 있도록 설계되었다. 특히 터미널 환경에 익숙한 개발자들에게 이상적이며, IDE에 종속되지 않고 일관된 Git 경험을 제공한다.

Background

전통적인 Git CLI는 강력하지만, 사용자 경험 측면에서 많은 불편함이 있다. 예를 들어, 인터랙티브 리베이스를 수행하려면 편집기에서 TODO 파일을 수동으로 편집해야 하고, 파일의 일부만 스테이징하려면 각 헝크(hunk)를 단계별로 처리하는 명령줄 프로그램을 사용해야 하며, 헝크를 더 이상 나눌 수 없는 경우 수동으로 패치 파일을 편집해야 하는 번거로움이 있다. 또한 브랜치를 전환할 때 변경 사항을 스태시(stash)했다가 다시 적용해야 하는 경우가 많아 비효율적이다. 이러한 문제들을 해결하기 위해 lazygit이 탄생했다.

lazygit는 단순한 터미널 UI로 이러한 복잡성을 추상화하여, 사용자가 Git의 강력한 기능을 더 쉽게 활용할 수 있도록 한다. 이는 tig, GitUI, GitArbor TUI와 같은 다른 터미널 기반 Git 도구들과 함께 Git 사용성을 개선하는 흐름의 일부이다.

How It Works

lazygit는 터미널에서 실행되는 대화형 인터페이스로, Git 저장소의 상태를 실시간으로 시각화한다. 주요 화면은 파일 변경 사항, 브랜치 목록, 커밋 히스토리, 스태시 등을 각각의 패널로 나누어 보여주며, 사용자는 키보드 단축키를 통해 다양한 작업을 수행할 수 있다.

주요 기능

  • 개별 라인 스테이징: 파일의 특정 라인만 선택하여 스테이징할 수 있다. 스페이스바로 라인을, v로 범위를 선택하거나 a로 현재 헝크 전체를 선택할 수 있다.
  • 인터랙티브 리베이스: i를 눌러 인터랙티브 리베이스를 시작하고, s(squash), f(fixup), d(drop), e(edit) 등의 단축키로 커밋을 조작할 수 있다. 리베이스 진행 중에는 m을 눌러 리베이스 옵션 메뉴를 열고 continue를 선택하여 계속할 수 있다.
  • 체리픽: Shift+c로 커밋을 복사하고 Shift+v로 붙여넣어 체리픽한다.
  • Bisect: 커밋 뷰에서 b를 눌러 Git bisect를 시작하고, 커밋을 good/bad로 표시하여 이분 탐색을 수행할 수 있다.
  • 작업 트리 초기화: Shift+d로 리셋 옵션 메뉴를 열고 ‘nuke’ 옵션을 선택하면 git status에 나타나는 모든 변경 사항(더티 서브모듈 포함)을 완전히 제거한다.
  • 과거 커밋 수정: Shift+a를 누르면 현재 스테이징된 변경 사항을 선택한 커밋에 반영한다(인터랙티브 리베이스 사용).
  • 필터: /를 눌러 뷰를 필터링할 수 있다. 예를 들어 브랜치 목록에서 검색어를 입력하면 일치하는 브랜치만 표시된다.
  • 사용자 정의 명령: 유연한 custom command 시스템을 통해 사용자가 직접 명령을 정의할 수 있다.
  • 워크트리: 브랜치 뷰에서 w를 눌러 선택한 브랜치로 워크트리를 생성하고 전환할 수 있다.
  • 리베이스 매직 (커스텀 패치): 오래된 커밋에서 커스텀 패치를 만들어 해당 패치를 커밋에서 제거하거나, 새 커밋으로 분리하거나, 역으로 인덱스에 적용하는 등의 작업을 수행할 수 있다.
  • 표시된 베이스 커밋으로 리베이스: Shift+b로 베이스 커밋을 표시하고, 다른 브랜치에 r을 눌러 해당 베이스 이후의 커밋만 리베이스할 수 있다.
  • 실행 취소/재실행: z로 마지막 작업을 취소하고 Shift+z로 재실행한다. reflog를 기반으로 하므로 커밋과 브랜치에만 적용되며, 작업 트리나 스태시 변경 사항은 취소할 수 없다.
  • 커밋 그래프: 화면 모드를 확장하면 커밋 그래프를 볼 수 있으며, 색상은 커밋 작성자를 나타내고 선택한 커밋의 부모 커밋이 강조 표시된다.
  • 두 커밋 비교: Shift+w로 커밋을 표시하고 다른 커밋을 선택하면 diff를 볼 수 있다. diff 방향을 반전하거나 모드를 종료할 수 있다.
  • GitHub Pull Request 표시: 브랜치 패널에서 GitHub PR 아이콘을 표시하며, Shift+G로 브라우저에서 PR을 열 수 있다. gh CLI 도구가 필요하다.

사용 방법

터미널에서 Git 저장소 디렉토리로 이동한 후 lazygit 명령어를 실행하면 된다. 종료 시 디렉토리를 자동으로 변경하는 기능도 지원한다.

Key Ideas

  • 터미널 UI 기반의 Git 클라이언트: IDE 플러그인이 아닌 독립적인 TUI 도구로, 터미널 환경에서 직접 실행된다.
  • 직관적인 인터페이스: 복잡한 Git 명령어를 시각적 패널과 키보드 단축키로 대체하여 사용자 경험을 향상시킨다.
  • 고급 Git 기능 지원: 인터랙티브 리베이스, 체리픽, bisect, 커스텀 패치 등 강력한 Git 기능을 쉽게 사용할 수 있다.
  • 키보드 중심 조작: 마우스 없이 키보드만으로 모든 작업을 수행할 수 있어 빠른 작업 속도를 제공한다.
  • 사용자 정의 가능성: Custom command 시스템을 통해 기능을 확장할 수 있다.
  • 실행 취소/재실행 지원: reflog를 활용한 안전한 작업 취소 기능을 제공한다.

Examples / Use Cases

  • 개별 라인 스테이징: 커밋 메시지에 포함되지 않아야 할 임시 코드를 제외하고 스테이징할 때 유용하다.
  • 인터랙티브 리베이스: 여러 커밋을 하나로 합치거나(squash), 순서를 변경하거나, 특정 커밋을 삭제할 때 사용한다.
  • 체리픽: 다른 브랜치의 특정 커밋만 현재 브랜치에 적용하고 싶을 때 사용한다.
  • Bisect: 버그가 처음 도입된 커밋을 찾기 위해 이분 탐색을 수행할 때 사용한다.
  • 워크트리: 여러 브랜치를 동시에 작업할 때 스태시나 WIP 커밋 없이 전환할 수 있다.
  • 리베이스 매직: 과거 커밋에서 특정 변경 사항을 제거하거나 분리할 때 사용한다.

Limitations / Considerations

  • 터미널 환경에 익숙한 개발자에게 적합하며, GUI 환경을 선호하는 사용자에게는 부적합할 수 있다.
  • 실행 취소는 reflog에 기반하므로 작업 트리 변경이나 스태시 작업은 취소할 수 없다.
  • 고급 기능(예: 사용자 정의 명령)은 일부 설정과 학습이 필요하다.
  • GitHub PR 기능은 gh CLI 도구가 설치되어 있어야 한다.

Sources