版本控制器

版本控制是我们开发软件时的必备工作,将文件的版本进行系统的管理,不仅仅可以帮助我们灵活操作文件,也能简化我们开发的流程。

不使用版本管理器的情况下,如果想要对文件的版本进行管理,需要将不同版本的文件分别存储起来,并分别命名,这样我们的文件夹就会类似这样:

随着新版本的迭代,我们的文件则越来越多,也越来越难管理。在团队开发时,如果多人同时对一个文件进行操作,则需要各自保存不同的版本,然后集中审核内容。可想而知,在改动幅度大,人数多的情况下,使用传统方式来开发简直就是噩梦。

而版本控制器就是一个解决这些痛点的神奇软件,它不仅仅可以帮助我们记录每次文件的改动,还可以让同事协同编辑,不仅仅提升了我们个人的开发效率,更简化了团队开发的难度。

版本控制器示意图

市面上曾经出现过很多版本控制器,比如SCCS, RCS, CVS, SVN, BitKeeperSCM,但是都不大好用。在2005年,大牛Linux Torvalds(Linux内核的最早作者)开发出了分布式版本控制器Git,因为它的灵活性和优越性,Git的用户成指数级上升,如今已经发展成了最受欢迎的版本控制器,奠定了版本控制领域的垄断地位。

补充说明:所有的版本控制器系统,只能跟踪文本文件的改动,比如txt文件、网页和所有的程序源代码等等。版本控制器可以追踪每次的改动,比如在第7行添加了新的单词”Git”,在第8行删除了”Max”之类的具体修改信息。但是图片、视频、微软Word这类二进制文件,虽然版本控制器也可以追踪管理,比如从50KB改成了40KB,但是具体改了什么,是没法知道的。

安装Git

使用MacOS的朋友有两种方法安装Git,第一种是先安装homebrew,然后通过homebrew安装Git,具体方法可以参观官网:https://brew.sh。第二种方法比较方便,直接下载官方安装包https://git-scm.com/download/mac,然后根据提示安装即可:

Windows的朋友也可以直接下载安装包https://git-scm.com/download/win,根据提示逐步完成。安装完成后,会创建一个git的文件夹,里面有个程序叫git bash,打开git bash就能在一个Unix环境中使用Git了。

使用Linux的小伙伴们,只要打开Terminal,输入以下的指令即可:

# Ubuntu user
$ sudo apt-get install git-all
# Fedora user
$ sudo yum install git-all

创建第一个版本库

版本库(repository)是一个Git会一直追踪的目录,这个目录中的所有文件的改动,包括各个文件的增加、删除和改动,都会被Git识别出来,以便Git可以追踪目录历史,并在将来某个时刻随时还原。

首先我们先把我们的个人信息告诉git,包括名字和邮箱,这样git就能知道我们的身份,更好地管理每个版本库的贡献者。

$ git config --global user.name "yourname"
$ git config --global user.name "[email protected]"

我们使用git config加上—global参数,来设置全局配置,这样所有的版本库都会认识我们的身份,当然也可以为特定版本库指定不同的用户名和邮箱,这里我们直接使用这种省事的方法。

创建一个版本库很简单,第一步先创建一个空目录,然后进入新创建的目录,使用git init命令:

$ mkdir new_repo
$ cd new_repo
$ git init

这样一个Git版本库就创建好了,此时当前目录中还多了一个 .git 目录,这个目录中的信息可以帮助Git来跟踪管理版本库,所以千万不能删除。(.git目录是隐藏目录,需要使用 ls -ah 命令才能看到)

要注意的是,我们不一定要使用空目录作为版本库,设定已有内容的目录为版本库也是可以的。

现在我们在new_repo目录中编写一个new_file.txt文件,内容如下:

Git is a distributed version-control system.
Git is awesome.

然后我们使用git add将新文件添加到仓库:

$ git add new_file.txt

然后我们再使用 git commit 将文件提交到仓库,并输入说明这次改动的内容:

$ git commit -m "Created a new file"

-m 之后的内容虽然可以是任意内容,但是最好是有意义的文字说明,这样才能从历史记录中方便地查找改动记录。

git commit 运行成功后,命令行中会提示1 file changed: 2 insertions,这样我们就知道有哪些具体的变动了。

成功创建了一个新文件后,我们可以继续工作,对新文件 new_file.txt 进行修改,将内容改成如下:

Git is popular.
Git is free.

然后我们运行 git status 查看结果:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   new_file.txt

no changes added to commit (use "git add" and/or "git commit -a")

git status可以帮助我们了解版本库当前的状态,上面的结果告诉我们 new_file.txt 被修改过了,但是新的修改没有被提交。我们还可以使用 git diff 来查看具体被修改的内容:

$ git diff
diff --git a/new_file.txt b/new_file.txt
index 1647185..1c140a4 100644
--- a/new_file.txt
+++ b/new_file.txt
@@ -1,2 +1,2 @@
-Git is a distributed version-control system.
-Git is awesome.
+Git is popular.
+Git is free.

确定我们要修改的内容后,我们使用 git add new_file.txt 将修改过的文件添加至版本库。这个时候再使用 git comment 查看,你会得到以下的信息:

$ git add new_file.txt 
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   new_file.txt

这告诉我们将要被提交的修改包括 new_file.txt,是时候提交了,我们还是直接使用 git commit 加上提交说明即可:

$ git commit -m "Modified the first two lines of new file"

然后我们再使用 git status 就会看到当前目录是干净的,没有需要提交的修改:

On branch master
nothing to commit, working tree clean

注意:任何没有使用git add将其加入staged状态的文件,都没法使用commit提交其修改。

操作流程图

下面图片可以帮你我们对Git的操作流程有个简单的理解

The lifecycle of the status of your files.

《一天掌握Git》教程规划

  • 版本库中的增删差改,时光穿越,版本回退(Make changes to Files Editing, Deleting, Moving,Undo changes)
  • 分支,合并,标签管理 (Branches, Merging, Stashing, Tag)
  • 远程仓库和GitHub (Remotes, GitHub)

实践练习

请大家创建一个新的文件夹,叫做new_dir,并将其变为Git版本库。然后在其中添加一个新的文件叫做file.txt,将其添加到版本库,最后提交至版本库。