Cách dễ nhất để chuyển đổi chi nhánh git


21

Ngay bây giờ tôi đang sử dụng fugitive để quản lý hầu hết mọi thứ liên quan đến git, nhưng tôi không thể tìm thấy một quy trình công việc tốt để nhanh chóng hình dung và chuyển đổi giữa các chi nhánh có sẵn.

Tôi có thể làm được :Git checkout <branch-name>, vấn đề là nó tự động hoàn thành cả tên tệp và nhánh và tôi thích một danh sách nhánh.

Câu trả lời:


12

Để đạt đến đỉnh điểm các câu trả lời ở đây là những cách để thực hiện điều này:

Vanilla Terminal Vim

Nhấn CTRL- Zở chế độ bình thường sẽ thả bạn trở lại vỏ và tạm dừng Vim. Sau khi thực hiện git checkout [branchname]kiểu của bạn , fglệnh quay trở lại Vim bị treo, điều này cũng sẽ buộc Vim làm mới.

Vim GUI Vim

Một số triển khai gvim sẽ có :shellhỗ trợ sẽ mở một lớp vỏ bên trong Vim bằng cách sử dụng một thiết bị đầu cuối câm. Tuy nhiên, có thể dễ dàng hơn chỉ cần gõ:

:!git checkout [branchname]

Điều này sẽ thực thi lệnh mà không cần phải mở một dấu nhắc shell mới. (Tùy chọn này cũng có thể sử dụng được trong thiết bị đầu cuối Vim).

vim-chạy trốn

vim-fugitive là một plugin cho phép bạn sử dụng Git từ bên trong Vim. Lệnh sẽ là:

:Git checkout [branchname]

hợp nhất vim

vim-merginal là một plugin sử dụng vim-fugitive và cung cấp giao diện thân thiện với người dùng.

  1. Loại :Merginal.
  2. Di chuyển con trỏ đến nhánh bạn muốn.
  3. ccđể kiểm tra chi nhánh đó.

1
Đó là fugitive, không fugative, và đó là những gì OP đang sử dụng.
muru

1
Câu trả lời tuyệt vời. vim-merginallà những gì tôi đang tìm kiếm.
Sergio D. Márquez

1
Tôi thích ctrl-zvì nó tự động tải các tập tin. Đồng nghiệp muốn có một cửa sổ tmux cho dòng lệnh và một cho vim nhưng khi họ kiểm tra hoặc hợp nhất khi họ quay lại vim, họ phải đi đến từng tệp đang mở và :e!mỗi lần. ( :bufdo e) đó là một nỗi đau để nhớ. Thay vào đó, dễ dàng hơn ctrl-zkhi fgxảy ra, Vim thực hiện :etự động một cách kỳ diệu.
Sukima

Tôi Một tiện ích mở rộng chạy trốn tuyệt vời khác mà bạn có thể thêm vào danh sách: github.com/sodapopcan/vim-twiggy
Sergio D. Márquez

Trong trường hợp kiểm tra git đã được thực hiện, :checktimecó ích để tải lại tất cả các bộ đệm đã mở.
LEI

12

Sử dụng plugin vim-merginal ( phần mở rộng fugitive ). Nó cung cấp TUI tương tác cho:

  • Xem danh sách các chi nhánh
  • Kiểm tra các chi nhánh từ danh sách đó
  • Tạo chi nhánh mới
  • Xóa chi nhánh
  • Sáp nhập chi nhánh
  • Chi nhánh nổi loạn
  • Giải quyết xung đột hợp nhất
  • Tương tác với điều khiển từ xa (kéo, đẩy, tìm nạp, theo dõi)
  • Khác biệt với các chi nhánh khác
  • Đổi tên chi nhánh
  • Xem lịch sử git cho các chi nhánh

nhập mô tả hình ảnh ở đây


7

Bạn nên nắm lấy thiết bị đầu cuối của bạn. Nếu bạn sử dụng CTRL-Z, nó sẽ chạy nền Vim (hoặc bất kỳ quá trình nào bạn đang chạy), sau đó bạn có thể chạy bất kỳ lệnh nào bạn muốn, fgđể đưa quy trình trở lại nền trước:

<CTRL-Z>
git checkout <tab>
fg

3
... Và khi sử dụng GVim?
muru

2
:shelllà cách để đi hoặc thay thế thẻ vào trình giả lập thiết bị đầu cuối yêu thích khác của bạn
65-e9-7e-17

2
Tôi luôn luôn thích!git checkout [branchname]
bronzehedwick

5

Kẻ chạy trốn Git checkout <branch>có một nhược điểm là nó không tự động hoàn thành tên chi nhánh. Sử dụng fzf.vim Tôi đã tạo lệnh này:

function! s:changebranch(branch) 
    execute 'Git checkout' . a:branch
    call feedkeys("i")
endfunction

command! -bang Gbranch call fzf#run({
            \ 'source': 'git branch -a --no-color | grep -v "^\* " ', 
            \ 'sink': function('s:changebranch')
            \ })

Hi vọng bạn tìm được thứ hữu dụng


1

Câu trả lời được cung cấp bởi @ kubek2k rất phi thường. Giải pháp đó tốt hơn tôi có thể tưởng tượng và thực hiện trong ít dòng mã mà tôi có thể bắt chước. Nó mở ra cánh cửa giúp tôi hiểu cách sử dụng cá nhân hóa mạnh mẽ của 'fzf'.

Tôi đã sửa đổi một chút để cung cấp thêm:

  1. Làm cho việc sử dụng fugitive để nhận các ref thay vì dòng lệnh, (hỗ trợ tốt hơn cho các cửa sổ)
  2. Liệt kê các thẻ cùng với các nhánh

Đây là sửa đổi nhỏ:

function! s:gitCheckoutRef(ref) 
    execute('Git checkout ' . a:ref)
    " call feedkeys("i")
endfunction
function! s:gitListRefs()
   let l:refs = execute("Git for-each-ref --format='\\%(refname:short)'")
   return split(l:refs,'\r\n*')[1:] "jump past the first line which is the git command
endfunction
command! -bang Gbranch call fzf#run({ 'source': s:gitListRefs(), 'sink': function('s:gitCheckoutRef'), 'dir':expand('%:p:h') })
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.