是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?

Posted 一口Linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?相关的知识,希望对你有一定的参考价值。

版本控制是本章的重要内容之一。虽然本书选择的版本控制系统是Git,但是本章的知识也适用于其他版本控制系统。本章只提供了一节内容简略地介绍版本控制,如果读者想要更深入地了解,还需要有针对性地阅读相关材料,以精通自己需要的版本控制系统。

本章需要多次修改.vimrc文件,读者可以边阅读边修改,也可以从本书GitHub官方仓库
PacktPublishing/Mastering-Vim中找到相关的设置代码。Git的安装和配置方法也可以在这个GitHub仓库中找到。

5.2 使用版本控制

本节以Git为示例讲解版本控制系统(Version Control System,VCS)

编写本书的时候,Git是最流行的版本控制系统。本节的建议也适用于读者选择的其他版本控制系统(或者读者被迫使用的VCS)。

现代的程序开发已经离不开版本控制了,只要是程序员,都有可能用到版本控制。本节将帮助读者回顾如何使用当前流行的版本控制系统Git。本章还将介绍如何在Vim中使用Git,使Git命令更直观和交互性。

5.2.1 版本控制和Git介绍

如果读者已经熟悉Git的相关知识,可以跳过本节。

Git可用于追踪文件修改的历史记录,并缓解多个用户同时工作于同一文件时的痛苦。Git是一个分布式版本控制系统,这意味着每个开发者在自己的系统里都拥有代码库的一个完整副本。

如果读者使用的是一个Debian系的Linux发行版,则可以通过如下命令安装Git。

$ sudo apt-get install git

对于其他系统,可以在Git官方网站上找到安装包的下载地址以及安装方法。在使用之前,读者需要配置用户名和邮件地址。

$ git config --global user.name 'Your Name'$ git config --global user.email 'your@email'

Git安装成功。为了帮助用户解决问题,Git提供了相当详尽的文档(官网上还有很多教程)。查看Git文档的命令行如下。

$ git help

1.概念

Git用一系列的文件原子操作来表示文件的修改历史,这些原子操作在Git中称为提交(commit)。提交功能除了可以保存文件的变化,还包含额外添加的描述性消息,这样,读者就可以找到任意时间点的文件变动。

Git中提交的历史并不一定是线性的,它也可能是具有多个分支的图状结构,因此多个Git用户就可以独立地修改代码中的不同部分,而不用担心互相影响。比如,在下面的示例中(阅读顺序为由下向上),功能点A在主分支(master branch)中,而功能点B在一个平行的分支中,记为feature-b。

* 将功能点B合并到主分支中|\\* | 改进功能点A| * 完成功能点B| * 开始构建功能点B (feature-b分支)|/* 实现功能点A* 初始提交 (主分支)

Git是一个分布式的版本控制系统,即不存在一个中心,每个开发者都拥有仓库(repository)的完整副本。

2.新建工程

本例采用的是官方仓库Chapter05/animal_farm中的代码。读者也可以使用自己的项目。创建好一个项目之后,可以按照下列步骤设置一个Git仓库。

(1)初始化Git仓库。

$ cd animal_farm/$ git init

(2)将一个目录中的所有文件添加到暂存区(stage),为初始提交作准备。

$ git add 

(3)创建初始提交。

$ git commit -m "初始提交"

上述命令的结果如图5.1所示。

是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?

 

图5.1

现在,一个Git仓库就创建完成了。

如果读者想要将此仓库备份到其他机器上,可以考虑使用在线的Git服务,比如GitHub。在GitHub上创建一个新仓库的方法可参见GitHub官网。GitHub的仓库地址格式为https://github.com/<你的用户名>/animal-farm.git。然后,将GitHub上的这个远程仓库的地址添加到本地的仓库中去(这里的<url>换成GitHub仓库的地址)。

$ git remote add origin <url>

然后,读者将本地仓库推送(push)到远程仓库。

$ git push -u origin master

为了使两个仓库同步,每提交一次都需要重新推送,详细参见下面关于Git使用方法的介绍。

3.克隆一个已有仓库

如果读者已经在远程仓库(如GitHub)中保存有代码,那么只需要克隆(clone)一份到本地。找到远程仓库的地址,地址可能是HTTPS协议或SSH协议。执行下列命令将<url>换成仓库的地址。

$ git clone <url>

执行此命令后,本地机器上就有了以项目名称命名的目录,其中保存了仓库的内容。

本地仓库和远程仓库是相互独立的。如果读者想要在远程仓库被修改之后更新本地仓库,则可以在曾经复制过的本地仓库中执行git pull —rebase。

4.使用Git

Git的命令是相当繁杂的,但初学者只需掌握几条基本命令。本节还是以前面新创建的仓库animal_farm/为例。

(1)添加文件、提交和推送

将文件animals/lion.py添加到仓库中。文件内容如下。

"""A lion."""import animalclass Lion(animal.Animal):    def __init__(self):        self.kind = 'lion'    def get_kind(self):        return self.kind

接下来,在animal_farm.py中调用lion.py(添加粗体的部分)。

...from animals import dogfrom animals import lionfrom animals import sheep...    if kind == 'dog':        return dog.Dog()    if kind == 'lion':        return lion.Lion()    if kind == 'sheep':        return sheep.Sheep()...

修改完成之后,可以通过如下命令查看文件的状态(查看哪些修改将会被提交)。

$ git status

此处显示animal_farm.py被修改,而且添加了新的文件animals/ lion.py,如图5.2所示。

是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?

 

图5.2

若要将文件保存到Git历史记录中,则需要将文件先存放到暂存区。可以添加单个文件。

$ git add <filename>

也可以添加整个当前目录。

$ git add .

执行git status可以看到暂存区中的内容,如图5.3所示。

是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?

 

图5.3

将一个或多个文件提交到历史记录中,可执行如下命令。

$ git commit -m "<informative message describing the changes>"

图5.4中显示了修改animals/lion.py和animal_farm.py之后的提交结果。

是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?

 

图5.4

如果已经创建好远程仓库,则将修改推送到远程仓库的命令如下。

$ git push

假如有多个人使用同一个远程仓库,则与其他人保持同步的命令如下[多人协作时最好是先拉取(pull)再推送(push)]。

$ git pull --rebase

如果想查看提交历史,可执行如下命令。

$ git log

到目前为止,本节中的animal_farm仓库的git log结果如图5.5所示。

是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?

 

图5.5

图5.5中,顶部为最新的提交,底部为初始的提交。

如果读者在本地工作副本(working copy)拉取某一个特定的提交(如查看初始提交的情况),则可以执行如下命令(这里的<sha1>为提交ID,它是一个十六进制的字符串,图5.5中的初始提交的ID为
e1fec4ab2d14ee331498b6e5b2f2cca5b39daec0)。

$ git checkout <sha1>

(2)创建和合并分支

不同的分支通常对应于工作中不同的功能。一旦某个功能成熟了,该分支就可以被合并到主分支(master)。创建一个新分支的命令如下。

$ git checkout -b <branch-name>

比如,下面的命令将创建一个关于新的动物类型的分支。

$ git checkout -b feature-leopard

其结果如图5.6所示。

是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?

 

图5.6

然后,读者就可以在这个分支上正常操作了。比如,添加一个新文件animals/leopard.py,并修改animal_farm.py,如图5.7所示。

是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?

 

图5.7

一旦该功能完善了(这里的leopard),就可以将分支feature-leopard合并到主分支(master)。查看所有分支的命令如下。

$ git branch -a

当前分支前面有一个星号(*),如图5.8所示。

是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?

 

图5.8

切换到其他分支的命令如下。

$ git checkout <branch-name>

在这里,回到主分支的命令如下。

$ git checkout master

回到主分支后,就可以将之前的新分支合并到主分支,命令如下。

$ git merge feature-leopard

合并分支的结果如图5.9所示。

是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?

 

图5.9

如果读者有GitHub仓库,那么修改完成之后要执行git push命令,这样,修改内容才能同步到远程仓库。

5.2.2 Git与Vim的整合(vim-fugitive)

Tim Pope的vim-fugitive插件可以使用户在不离开Vim的情况下进行Git操作。读者在使用Vim编辑文件时,也可以同时利用版本管理系统记录编辑的位置。

如果使用vim-plug安装插件,则可以在.vimrc中添加Plug ‘tpope/vim-fugitive’,并执行命令:w | source $MYVIMRC | PlugInstall。

vim-fugitive提供的许多命令都是对外部Git命令的镜像,然而,输出通常更具交互性。以git status为例,执行如下命令。

:Gstatus

我们可以在一个分割窗口中看到熟悉的git status输出结果(显示的是修改但还未提交的情况),如图5.10所示。

是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?

 

图5.10

但和git status在命令行中的输出不同,分割窗口是可交互的。读者可以将光标移动到其中一个文件上(使用Ctrl + n组合键和Ctrl + p组合键),也可以尝试如下命令。

  • - 用于将文件移入或移出暂存区。
  • cc或:Gcommit用于提交暂存区中的文件。
  • D或:GDiff用于打开一个文件差异对比窗口。
  • g?用于显示更多命令的帮助信息。

:Glog将打开与当前打开文件相关的提交历史记录,它们被显示在一个快速恢复窗口,以便读者进一步查看,如图5.11所示。

是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?

 

图5.11

 

使用:copen可打开一个快速恢复窗口,用:cnext和:cprevious命令可以在不同快速恢复窗口之间切换,以查看不同文件的历史版本。关于快速恢复窗口,参见5.5.1节。

命令行git blame可以快速提示每一行中修改操作的时间和用户。blame的意思是责怪某个编写了问题代码的开发者(很有可能是用户自己)。:Gblame在一个垂直分割窗口中交互式显示git blame的输出,如图5.12所示。

:Gblame在文件的每一行旁边显示了相关提交的ID、作者、日期和时间,图5.12中的部分内容被隐藏了。

是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?

 

图5.12

:Gblame窗口中可使用如下命令。

  • C、A和D可调整blame窗口到指定的大小(分别对应于看到提交、作者和日期为止)。
  • Enter键用于打开所选提交的文件差异。
  • o用于在分割窗口中打开所选提交的文件差异。
  • g?用于显示更多命令的帮助信息。

:Gblame非常有用,它对于确定出错时间很有帮助。同时,它还提供了其他方便用户使用的包装器。

  • :Gread可直接在缓冲区中预览指定文件的内容。
  • :Ggrep封装了git grep(Git提供了强大的grep命令,可以用于搜索某个文件在任意时刻的状态)。
  • :Gmove用于移动文件(同时重命名相应的缓冲区)。
  • :Gdelete封装了git remove命令。

Vim帮助(如:help fugitive)中包含各个插件详细的使用方法。

 

原文:https://www.toutiao.com/i6798420247293460996/

以上是关于是程序员都可能用到版本控制,如何使用它?如何在Vim中使用Git?的主要内容,如果未能解决你的问题,请参考以下文章

工作中可能用到的——集中式版本控制系统SVN

如何避免在版本控制中存储密码?

如何对性能计数器类别进行版本控制?

如何把控制面板程序列表导出来

linux系统中vi编辑器如何使用?

如何在使用 flywaydb 时对存储过程进行版本控制?