如何在 Vim 里直接完成 Git 操作?

本文转自公众号“良许Linux”

点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

日日行,不怕千万里;常常做,不怕千万事。
640?wx_fmt=jpeg



Vim 是 Linux 下一款很常用的文本编辑器,虽然它对初学者而言并不友好,但通过一些插件的配合,它可以被打造成一款很强大的 IDE 。良许曾经介绍过三款很常用的插件,可点击以下链接查看:
本文再介绍一款 Vim 编辑器中的一款很强大插件—— VIM Fugitive 。这款插件可以实现你在 Vim 编辑器里直接完成 Git 操作,而无需退出 Vim 。
这个插件是开源项目,我们可以在以下地址获取源码:
 
  
https: //github.com/tpope/vim-fugitive
安装方法:
 
  
cd ~/.vim/bundle
git  clone https://github.com/tpope/vim-fugitive.git
vim -u NONE -c  "helptags vim-fugitive/doc" -c q
现在进行一些基本功能演示。假如现在有这么一段代码:
 
  
   1  package main
   2 
   3  import  "fmt"
   4 
   5  func main() {
   6     x :=  true
   7     items := [] string{ "tv""pc""tablet"}
   8 
   9      if x {
  10          for _, i :=  range items {
  11             fmt.Println(i)
  12         }
  13     }
  14 }
现在我们将第 6 行删除,再修改第 9 行,同时在 11 行后添加一行代码。现在我们想查看这些修改,按往常做法,我们是先保存文档再退出,然后执行 git status 。
但现在,我们不必退出,直接在命令模式下输入 :Gstatus ,直接就可以看到改动:
 
  
  1  # On branch master
  2  # Your branch is up to date with 'origin/master'.
  3  #
  4  # Changes not staged for commit:
  5  #   (use "git add <file>..." to update what will be committed)
  6  #   (use "git checkout -- <file>..." to discard changes in working directory)
  7  #
  8  #       modified:   vim-5plugins/examples/test1.go
  9  #
 10 no changes added to  commit ( use  "git add"  and/ or  "git commit -a")
--------------------------------------------------------------------------------------------------------
     1  package  main
     2
     3  import  "fmt"
     4 
_    5 func  main() {
     6     items := [] string{ "tv""pc""tablet"}
     7 
~    8      if  len(items) >  0 {
     9          for _, i :=  range items {
    10             fmt.Println(i)
+   11             fmt.Println( "------")
    12         }
    13     }
    14 }
如结果所示,Vim Fugitive 打开了一个有上下分屏的界面,上面一半,跟我们平常执行 git status 看到的结果一样,下面一半,就是具体发动内容,跟 git diff 类似。
在下半屏里,有三个符号: _ 表示在第 5 行与第 6 行之间有代码被删除, ~ 表示在第 8 行代码被修改过, + 表示 11 行新增了代码。
同样的,我们可以查看每行代码是谁改的,可以用 git blame ,而在这里对应的是 Gblame
 
  
e9949066 (Alvin Yan    2019 -6 -7  18: 17: 19  -0500)│     1  package main
e9949066 (Alvin Yan    2019 -6 -7  18: 17: 19  -0500)│     2 
e9949066 (Alvin Yan    2019 -6 -7  18: 17: 19  -0500)│     3  import  "fmt"
e9949066 (Alvin Yan    2019 -6 -7  18: 17: 19  -0500)│     4 
e9949066 (Alvin Yan    2019 -6 -7  18: 17: 19  -0500)│_    5  func main() {
e9949066 (Alvin Yan    2019 -6 -7  18: 17: 19  -0500)│     6     items := [] string{ "tv""pc""tablet"}
e9949066 (Alvin Yan    2019 -6 -7  18: 17: 19  -0500)│     7 
00000000 (Not Committed Yet  2019 -6 -7  18: 55: 00  -0500)│~    8      if  len(items) >  0 {
e9949066 (Alvin Yan    2019 -6 -7  18: 17: 19  -0500)│     9          for _, i :=  range items {
e9949066 (Alvin Yan    2019 -6 -7  18: 17: 19  -0500)│    10             fmt.Println(i)
00000000 (Not Committed Yet  2019 -6 -7  18: 55: 00  -0500)│+   11             fmt.Println( "------")
e9949066 (Alvin Yan    2019 -6 -7  18: 17: 19  -0500)│    12         }
e9949066 (Alvin Yan    2019 -6 -7  18: 17: 19  -0500)│    13     }
e9949066 (Alvin Yan    2019 -6 -7  18: 17: 19  -0500)│    14 }
我们同样也看到第 8 和 11 行还没有提交。
现在我们想要提交我们的改动,可以敲入 :Gcommit 命令。Vim Fugitive 将打开另外一块区域,我们可以在里面写入要提交的信息。
 
  
  1 vim-5plugins: Updated test1.go example file
  2  # Please enter the commit message for your changes. Lines starting
  3  # with '#' will be ignored, and an empty message aborts the commit.
  4  #
  5  # On branch master
  6  # Your branch is up to date with 'origin/master'.
  7  #
  8  # Changes to be committed:
  9  #       modified:   vim-5plugins/examples/test1.go
 10  #
然后我们就可以执行 :wq 结束提交。
 
  
[master c3bf80f] vim- 5plugins: Updated test1.go example  file
  1  file changed,  2 insertions(+),  2 deletions(-)
Press ENTER  or  type command  to  continue
我们同样可以继续使用 :Gstatus 来查看提交后的状态,也可以使用 :Gpush 将提交推送到远程仓库。
 
  
  1  # On branch master
  2  # Your branch is ahead of 'origin/master' by 1 commit.
  3  #   (use "git push" to publish your local commits)
  4  #
  5 nothing to  commit, working tree clean
以上这些是 Vim Fugitive 最基础的用法,如果想学习它的更高级用法,可以去它的 Github仓库查看,那里有更详细的教程。


------------------- End -------------------

往期精彩文章推荐: