본문 바로가기
C.W.K.
Stream
Lesson 03 of 04 · published

Git 통합과 파일 관리

~11 min · neovim, git, files, oil

Level 0갇힌 자
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

Neovim 안에서 git은 두 층으로 나뉘어

트랙 7에서 코드 옆에 바로 보여주는 gitsigns.nvim을 소개했지. 여기에 브랜치 작업을 맡을 더 묵직한 git 클라이언트를 하나 붙이면 필요한 범위가 다 덮여.

  • gitsigns.nvim — 코드 옆에 붙는 층이야. gutter에 바뀐 hunk를 표시하고, stage 하고 되돌리고 미리 보고, 줄 단위 blame까지 해줘. 편집하는 흐름 안에서는 이게 최고야.
  • vim-fugitive — 깊이 들어가는 층이야. :Git이 모든 git 작업을 Vim 명령으로 받아줘. :Git blame은 오갈 수 있는 blame 화면을 열고, :Git log, :Git diff, :Git rebase -i도 다 돌아가. 묵직한 작업에는 이쪽이 낫고.
  • 아니면 둘 다 건너뛰고 옆 tmux pane의 lazygit으로 브랜치 작업을 해도 돼. 트랙 7에서 본 패턴이야.

대부분은 gitsigns에 lazygit을 붙여서 써. fugitive는 뭐든 Vim 안에서 끝내고 싶은 사람들 몫이야.

oil.nvim — 파일시스템을 buffer처럼 고치기

oil.nvim은 다들 한 번 써보면 빠지는 plugin이야. 지금 디렉토리를 평범한 Vim buffer로 여는데, 그러면 파일시스템이 곧 buffer가 돼. 줄 하나가 파일 이름이고, 평소 쓰던 Vim motion으로 고치고, :w로 저장하면 Vim이 그대로 이름을 바꾸고 옮기고 만들고 지워. 캡처 그룹 regex로 파일 다섯 개 이름을 한 번에 바꾸고 싶어? :%s/old/new/ 하고 :w면 끝이야.

파일 탐색기의 다른 학파

VS Code처럼 옆에 트리를 두는 쪽이 좋으면 neo-tree나 nvim-tree가 있어. 잘 돌아가고 익숙하지만, 파일시스템을 buffer로 고치는 힘은 못 줘. 옆 트리로 가기 전에 oil을 일주일만 써봐.

최소 설정

아래 블록이 gitsigns, fugitive (:Git을 부르기 전까지는 안 켜지니까 부담이 작아), oil을 넣어줘. 지연 로딩을 걸어놨으니 시작이 느려지지 않고, oil은 -를 누르는 순간 바로 열려.

파일시스템을 buffer처럼 고치는 게 진짜 결정타야. GUI 트리에서 끌어다 이름 바꾸는 건 파일 하나엔 괜찮아. 한 번에 열 개를 다뤄야 하면 oil에 파일 이름을 블록으로 고치고 :w 하는 쪽이 이겨. buffer 모델은 개수가 늘어도 버티고, 트리 화면은 못 버텨.

Code

gitsigns.nvim — 트랙 7에서 한 번 더·lua
{
  "lewis6991/gitsigns.nvim",
  event = { "BufReadPost", "BufNewFile" },
  opts = {
    on_attach = function(bufnr)
      local gs = package.loaded.gitsigns
      local map = function(mode, lhs, rhs, desc)
        vim.keymap.set(mode, lhs, rhs, { buffer = bufnr, desc = desc })
      end
      map("n", "]c", gs.next_hunk,            "Next hunk")
      map("n", "[c", gs.prev_hunk,            "Prev hunk")
      map("n", "<leader>hs", gs.stage_hunk,   "Stage hunk")
      map("n", "<leader>hr", gs.reset_hunk,   "Reset hunk")
      map("n", "<leader>hp", gs.preview_hunk, "Preview hunk")
      map("n", "<leader>hb", function() gs.blame_line({ full = true }) end, "Blame")
    end,
  },
}
vim-fugitive — Vim 명령으로 깊은 git·lua
{
  "tpope/vim-fugitive",
  cmd = { "Git", "G", "Gdiffsplit", "Gblame", "Glog" },
  keys = {
    { "<leader>gs", "<cmd>Git<CR>",         desc = "Git status" },
    { "<leader>gd", "<cmd>Gdiffsplit<CR>",  desc = "Git diff (split)" },
    { "<leader>gb", "<cmd>Git blame<CR>",   desc = "Git blame" },
    { "<leader>gl", "<cmd>Git log --oneline<CR>", desc = "Git log" },
  },
}
oil.nvim — buffer로 파일시스템·lua
{
  "stevearc/oil.nvim",
  cmd = "Oil",
  keys = {
    { "-", "<cmd>Oil<CR>", desc = "Open parent directory" },
  },
  opts = {
    default_file_explorer = true,
    delete_to_trash = true,
    skip_confirm_for_simple_edits = true,
    view_options = { show_hidden = true },
  },
}
neo-tree 대안 — 사이드바 트리 (둘 중 하나만)·lua
{
  "nvim-neo-tree/neo-tree.nvim",
  cmd = "Neotree",
  dependencies = { "nvim-lua/plenary.nvim", "MunifTanjim/nui.nvim" },
  keys = {
    { "<leader>e", "<cmd>Neotree toggle<CR>", desc = "File tree" },
  },
  opts = { window = { width = 32 } },
}

External links

Exercise

oil.nvim을 넣어. 아무 buffer에서나 -를 눌러 지금 디렉토리를 열어봐. 줄에 cw를 걸고 저장해서 파일 이름을 바꿔보고, 줄을 하나 더해 저장해서 새 파일도 만들어봐. 그다음 tmux pane에서 ls로 파일시스템을 확인해 — 편집이 진짜로 적용됐을 거야. gitsigns랑 fugitive도 같이 넣었다면, commit 안 한 변경이 있는 파일을 열고 ]c / [c로 hunk 사이를 오간 다음 <leader>hs로 하나를 stage 하고, :Git으로 fugitive의 status 화면에서 stage된 내용을 확인해봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.