第 1 章 可爱的 git 勾搭上高富帅 vscode

0.317字数 4053阅读 84

本章导航:

  • 介绍 Git 与 vscode 的安装步骤
  • 叙述 Git 的基础知识

本章仅仅考虑在 Windows10 系统的电脑上配置软件。可爱而又秀气的 Git 作为分布式版本控制的大姐头,搭配上高富帅 vscode 将会擦出什么样的火花?本章内容将带您感受其魅力。

1.1 安装 Git 与 vscode

您需要获取下载链接:

软件名称 下载链接 版本选择
Git https://git-scm.com/download/win 64-bit Git for Windows Setup
vscode https://code.visualstudio.com/Download System Installer-64 bit

下载 Git 与 vscode 之后,需要先安装 vscode(直接按照提示进行安装即可)。为了方便使用,在安装其进行到图 1.1 的界面时请全选:

图1.1 vscode 安装注意

您安装的 vscode 的界面语言默认是英文的,如果想要使用中文界面请添加中文语言包

图1.2 安装中文语言扩展包

接着,安装 Git,也是安装提示安装即可。不过,需要注意其安装进行到图1.3 的界面时,请选择图中打对勾的部分,即使用 vscode 作为 Git 的编辑器。

图1.3 安装 Git 注意

至此,您便完成了软件的安装部分。

提高工作效率的小技巧

在 vscode 中有一个不错的设定,将您想要使用的文件夹均保存在一个工作区之中,避免繁琐的切换目录。该功能的实现,很简单,仅仅需要两步:

  1. 打开 VSCode ==> ctrl + shift + o (打开文件夹,比如 study);
  2. 选择 文件 ==> 将工作区另存为。选择保存位置,并取名为 study,则会生成一个名为 study.code-workspace 的文件。
图1.4 配置 vscode 的工作区

现在该工作区仅仅保存了 study 目录的信息,双击 study.code-workspace 文件,vsocde 将自动打开 study 目录。为了令工作效率更高,您可以向该工作区添加更多的目录,这些目录可以来自电脑的任意位置。最终,您仅仅需要打开此工作区,便可以管理工作区的任意文件夹了。

1.2 学习 Git 基础理论

Git 是目前世界上最先进的分布式版本控制系统(没有之一,👍高端大气上档次!)。

1.2.1 使用 Git 让工作更轻松

场景1.1:如果您使用 Microsoft Word 写过长篇大论,那么,您想要想删除某些内容,又怕将来想恢复找不回来怎么办?对于不了解版本控制的您,也许会把当前文件“另存为……”一个新的 Word 文件,再接着改,改到一定程度,再“另存为……”一个新文件,如此循环往复,最后您的 Word 文档变成了这样:

图1.5 保存不同的修改版本

过了一周、一个月甚至更长时间,想找回您的不同版本之间你具体做出了什么改动,只好一个一个文件去找,真麻烦。看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。更要命的是,有些部分需要你的财务同事帮助填写,于是你把文件 Copy 到 U 盘里给她(也可能通过 Email 发送一份给她),然后,你继续修改 Word 文件。一天后,同事再把 Word 文件传给你,此时,你必须想想,发给她之后到你收到她的文件期间,你作了哪些改动,得把你的改动和她的部分合并,真困难。

如果有一个软件,不但能自动帮您记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里查找即可,岂不是很方便?这个软件用起来就应该像这个样子,能记录每次文件的改动:

版本 文件名 用户 说明 日期
1 财务报表软件开发.docx 张三 发起项目 10/11 14:00
2 财务报表软件开发.docx 李四 编写项目自述文档 10/12 10:00
3 财务报表软件开发.docx 杰克 新增软件功能1 10/13 9:00
4 财务报表软件开发.docx 张三 新增软件功能2 10/13 16:00
5 财务报表软件开发.docx 张吴 合并版本3与4 10/14 15:00

这样,您就结束了手动管理多个“版本”的史前时代,进入到版本控制的大时代。使用 Git 将极大的缓解您的工作压力,提高您的工作效率。

1.2.2 配置 git 的设置

一般地,一个工具使用之前都需要做一些准备工作来提高您使用该工具的效率。下面将展开说明如何在 vscode 中使用 Git。

1.2.2.1 创建一个 终端

虽然网上存在许多 Git 的客户端,但是,客户端它们不能将 Git 的全部功能完美的集成极大地限制了 Git 的使用。想要更好的掌握 Git,您需要学习如何使用终端

如果您从未使用过终端,不用担心,跟着本书进行操作,慢慢学习就行。

图1.6 使用 vscode 创建终端

从图1.6 可以看出,终端的创建很简单,同时也支持使用快捷键 Ctrl+Shift+` 创建。

1.2.2.2 初识 Git

👀到底 Git 是什么?是不是很懵?下面我们将揭开 Git 的神秘面纱。

Git = [底层]内容寻址文件系统(content-addressable filesystem)+ [顶层]分布式 VCS 用户界面

其中 VCS 是版本控制系统(Version Control System)的缩写。简言之,Git 就是一个简单的键值对数据库(key-value datastore)。Git 更像是一个小型的文件系统,提供了许多以此为基础构建的超强工具,而不只是一个简单的 VCS。

您可以将 Git 简单的看作是由“底层(plumbing,更适合作为新命令和自定义脚本的组成部分)命令” + “高层(porcelain,更加友好的面向用户)命令”组成的工具集(文件系统的一组快照(Snapshots))。本章仅仅介绍一些常用的命令,更多命令请👁Git 参考[1]

1.2.2.3 初始化仓库

在 Git 中,运行命令 git init 会生成目录 .git,该目录包含了 Git 存储和操作的几乎所有对象。在 Git 中称目录 .git仓库 或者版本库,英文名 repository。可以将仓库简单理解成一个可以被 Git 管理的目录,在这个目录里面的所有文件的每次修改、删除等操作 都能被 Git 跟踪。

实例:创建并切换到 GitStudy 文件夹下,同时使用 git init 命令初始化该文件夹:

图1.7 初始化:git init

接着,在 GitStudy 目录下便会出现 .git 目录:

图1.8 .git 目录一览

如若您想备份或复制一个版本库,只需把这个目录拷贝至另一处即可。

实际上,Git 仓库中保存的信息都是以文件内容的哈希值(SHA-1 散列,校验和)来索引的,而不是文件名。

1.2.2.4 配置 Git

因为 Git 是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和 Email 地址:

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

其中,--global 参数表示你这台机器上所有的 Git 仓库都会使用这个配置。如果您不想对全局进行设置,仅仅需要将 --global 参数去掉即可。

有时,您需要一个文本编辑器用来处理一些复杂的任务,本书使用 vscode 作为编辑器。您可以这样设置:

$ git config --global core.editor "code --wait"

1.2.3 管理仓库

前面我们已经学会如何创建仓库 GitStudy,下面我们将要向该仓库中添加“东西”。前文提到的 .git 文件默认是隐藏的,直接使用 ls 是不能看到的,需要改为:ls -ah

图1.9 使用终端查看 .git 目录

现在我们在仓库中编写一个 README.md 文件,内容如下:

Git 是一个开源的版本控制系统。
  1. 用命令 git add 告诉 Git,把文件修改添加到暂存区
$ git add .\README.md
  1. 用命令 git commit 告诉 Git,把暂存区内容提交到仓库:
$ git commit -m "wrote a README file"
图1.10 Git 的基本操作

为什么 Git 添加文件需要 addcommit 一共两步呢?这是因为 commit 可以一次提交很多文件,所以你可以多次 add 不同的文件,比如:

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

下面考虑对文件进行修改,比如:修改 README.md 为:

Git 是一个开源的分布式版本控制系统。

现在,运行 git status 命令看看结果:

图1.11 查看工作目录的状态

git status 命令可以让我们时刻掌握仓库当前的状态,图1.11 告诉我们, README.md 被修改过了,但还没有准备提交。为了比较与修改之前的不同,可以通过 git diff 查看你是如何修改的:

图1.12 git diff

提交修改的命令和添加文件到仓库的命令是一样的:



图1.13 再次提交修改并查看状态

Git 告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。

在 Git 中,我们用 git log 命令查看版本控制系统的历史记录:

git log

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数:

图1.14 查看版本控制系统的历史记录

1.2.4 切换不同版本

在 Git 中,用 HEAD 表示当前版本,也就是最新的提交。上一个版本就是 HEAD^,上上一个版本就是 HEAD^^,当然往上 100 个版本写 100 个 ^ 比较容易数不过来,所以写成 HEAD~100

这样就可以使用 git reset 命令回退到上一个版本:

图1.15 git reset

此时再查看 git log

图1.16 回到过去

此时 03b671a8a41eacfa1947d5d96817e8d8ccdb0434 版本找不到了,如果要回到“未来”,可以如下操作:

图1.17 回到未来

版本号没必要写全,前几位就可以了,Git 会自动去找。切换不同版本,commit id 很重要,如果你忘记了,你可以这样做:

图1.18 git reflog

命令 git reflog 记录了你的每一次命令,以便确定要回到未来的哪个版本。

1.2.5 Git 的四个工作区域

在1.2.3 与 1.2.4 中出现了许多专业名称,本小结将逐一解释。

  • 工作区GitStudy/,你工作的位置。
  • 仓库GitStudy/.git/,用来保存项目的元数据和对象数据库。
  • 暂存区GitStudy/.git/index,保存了下次将提交的文件列表信息。
  • 远程仓库:保存项目的元数据和对象数据库的地方(托管代码的服务器);克隆仓库时,即拷贝此部分的数据。
图1.18 git 的结构

Git 的仓库里存了很多东西,其中最重要的就是称为 stage(或者叫 index)的暂存区,还有 Git 为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEAD。

1.2.6 其他常用命令

  • git checkout -- filename:可以丢弃工作区的修改
  • git checkout -b dev:创建并切换 dev 分支,相当于以下两条命令:
    • git branch dev:创建分支 dev
    • git checkout dev:切换到 dev 分支
  • git branch:查看当前分支(git branch 命令会列出所有分支,当前分支前面会标一个 * 号。)
  • git merge:命令用于合并指定分支到当前分支,例如 git merge dev,合并完成后,就可以放心地删除dev 分支了:
    • git branch -d dev
  • git reset HEAD filename:把暂存区的修改撤销掉(unstage),重新放回工作区
  • 命令 git rm 用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

1.3 GitHub

  • 要关联一个远程库,使用命令 git remote add origin git@server-name:path/repo-name.git
  • 关联后,使用命令 git push -u origin master(实际上是把当前分支 master 推送到远程 origin) 第一次推送 master 分支的所有内容;
    此后,每次本地提交后,只要有必要,就可以使用命令 git push origin master 推送最新修改。
  • 要克隆一个仓库,首先必须知道仓库的地址,然后使用 git clone 命令克隆。
    Git 支持多种协议,包括 https,但通过 ssh 支持的原生 git 协议速度最快。

1.4 分支管理

假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了 50\% 的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

1.4.1 创建与合并分支

你已经知道,每次提交,Git 都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在 Git 里,这个分支叫主分支,即 master 分支。HEAD 严格来说不是指向提交,而是指向master,master 才是指向提交的,所以,HEAD 指向的就是当前分支。详细内容见 创建与合并分支

因为创建、合并和删除分支非常快,所以 Git 鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在 master 分支上工作效果是一样的,但过程更安全。

1.4.2 解决冲突

如果不同分支之间存在冲突,这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,Git 会用 <<<<<<<=======>>>>>>> 标记出不同分支的内容,修改之后再提交便可以解决冲突问题,详细内容见:解决冲突

一般可以使用如下命令查看各个分支的合并情况:

git log --graph --pretty=oneline --abbrev-commit

1.5 Git 服务器搭建

一个团队,如果不想将他们的项目进行开源,但又想要使用 Git 这一强大的分布式版本控制工具,那么搭建 Git 本地服务器便是一个很不错的选择!为了区分,本文将用来团队共享的机器称之为服务端,而团队内部每个人的工作机器被称为客户端。

其他参考资料

1.6 进一步的学习资料


  1. https://git-scm.com/docs

推荐阅读更多精彩内容