切换git分支的最简单方法


21

现在,我正在使用逃犯来管理几乎所有与git相关的事情,但是我找不到能快速可视化并在可用分支之间进行切换的良好工作流程。

我可以做:Git checkout <branch-name>,问题是它会自动完成文件名和分支,并且我希望分支列表。

Answers:


12

总结答案的方法如下:

香草终端病毒

正常模式下按CTRL- 将使您回到Shell并挂起Vim。执行完键入命令后,返回到挂起的Vim,这也将强制Vim刷新。Zgit checkout [branchname]fg

香草GUI Vim

某些gvim实现将获得:shell支持,该支持将使用哑终端在Vim内部打开外壳。但是,键入以下内容可能会更容易:

:!git checkout [branchname]

这将执行命令,而无需打开新的shell提示符。(该选项在Vim终端中也可用)。

逃逸的

vim-fugitive是一个插件,允许您从Vim内部使用Git。该命令将是:

:Git checkout [branchname]

边缘的

vim-merginal是使用vim逃犯并提供用户友好的界面的插件。

  1. 输入:Merginal
  2. 将光标移动到所需的分支。
  3. 输入cc以检出该分支。

1
fugitive,不是fugative,这就是OP已经在使用的东西。
muru

1
很棒的答案。vim-merginal是我一直在寻找的东西。
塞尔吉奥·马尔克斯

1
我喜欢,ctrl-z因为它会自动加载文件。同事们喜欢为命令行提供一个tmux窗口,为vim提供一个tmux窗口,但是当他们执行签出操作或返回vim时合并时,他们必须每次都访问每个打开的文件:e!。(:bufdo e)这是要记住的痛苦。取而代之的是,Vim会ctrl-zfg发生时:e自动执行魔术。
Sukima

我可以添加到列表中的另一个很好的逃犯扩展名:github.com/sodapopcan/vim-twiggy
Sergio

如果git checkout已经完成,:checktime可以方便地重新加载所有打开的缓冲区。
LEI

12

使用vim-merginal插件(逃犯扩展名)。它提供用于以下方面的交互式TUI:

  • 查看分支机构列表
  • 从该列表中签出分支
  • 创建新分支
  • 删除分支
  • 合并分支
  • 重新分支机构
  • 解决合并冲突
  • 与遥控器交互(拉,推,取,跟踪)
  • 与其他分支机构的差异
  • 重命名分支
  • 查看分支的git历史记录

在此处输入图片说明


7

您应该拥抱您的终端。如果使用CTRL-Z,它将在Vim(或当前正在运行的任何进程)的背景下运行,那么您可以运行所需的任何命令,fg以使该进程回到前台:

<CTRL-Z>
git checkout <tab>
fg

3
...以及何时使用GVim?
muru 2015年

2
:shell是您进入或替代进入其他喜爱的终端仿真器的方法
65-e9-7e-17 2015年

2
我一直都很喜欢!git checkout [branchname]
orangehedwick

5

逃犯Git checkout <branch>有一个缺点,就是不能自动完成分支名称。使用fzf.vim,我创建了以下命令:

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')
            \ })

希望你觉得它有用


1

@ kubek2k提供的答案是如此惊人。该解决方案比我想象的要好,并且用更少的代码行就能实现。它为帮助我理解'fzf'的强大个性化使用打开了大门。

我对其进行了少许修改以额外提供:

  1. 利用逃犯获取参考而不是命令行,(更好地支持Windows)
  2. 列出标签以及分支

这是稍作修改:

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') })
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.