优秀的编程知识分享平台

网站首页 > 技术文章 正文

Git工作原理和常用指令_git原理详解

nanyue 2025-02-21 14:37:43 技术文章 5 ℃

序言

作为一个有追求的测试工程师,现如今敏捷起来,需要和开发人员紧密配合,像配合单元测试、集成测试,都是需要直接面对开发代码的。而且自己做的自动化测试,本身也是代码,因此代码管理其实也是现在做测试绕不过的一个技能。

而在和开发人员相爱相杀的过程中,直接冲进代码库,看看都写了什么见不得测试的勾当,也是咱们深度测试的高阶招数。

不过这里首要一关,就是跟代码库打交道。所以本文我们来了解下现在最主流的 Git 代码分支管理工具, 如何用正确的姿势操作代码库。

Git是什么?

Git的作者是大名鼎鼎的Linus Torvalds, 众所周知,著名的 Linux 之父。

Linux虽然获得了极大的成功,吸引了众多的开发者参与项目,但在早期,作为Linux项目的管理者,Linus主要还是通过手工方式来合并大家的代码。并没有借助任何代码管理工具。

倒不是说 Linus 这种方式,而是因为他对代码版本管理工具非常挑剔,商用的 clearcase,开源的 CVS、SVN等等都不符合他对代码分支管理的预期。

直到 2002 年,Linus 才相中了一款商用的分布式版本控制系统 BitKeeper,而基于Linux极大的号召力,BitKeeper也愿意让 Linux 社区免费使用。但到2005年,一位社区开发者在未经允许的情况下逆向了BitKeeper并利用了它未公开的接口,导致 BitKeeper 收回了社区的免费使用权。

回到原点的Linus这时就决定自己开发一个代码的版本控制系统,对这个系统的基本诉求是:

  • 速度
  • 设计简单
  • 允许大量并行开发的分支
  • 完全分布式
  • 有能力高效管理类似 Linux 内核一样的超大规模项目

然后,大神的效率,Linus 只用了 10 天时间就推出了 Git 的第一个版本。并且给这个版本起了一个略带嘲讽意味的名字——Git(英语俚语中表示“不愉快的人”)。

The name “git” was given by Linus Torvalds when he wrote the very first version. He described the tool as “the stupid content tracker” and the name as (depending on your way)

当然,在 Linus 推出 Git 的第一个版本后,社区中开始有其他感兴趣的成员(Junio Hamano)开始参与并逐渐接手了 Git 的日常维护,Linus 则继续将主要精力放回到了 Linux 内核的维护上。

Git vs SVN

在 Git 之前,最流行的代码版本管理用工具应该是 SVN。

不能说 SVN 有很大缺点,但 Git 和 SVN 的应用场景确实有较大区别,这里列表做个比较

特性

Git

SVN

分支

轻量级分支,创建快速

分支是代码库的完整拷贝

分支合并

快进式合并,合并快速

需要手动合并修改

分布式

是,设计为分布式

不是,不支持完全分布式

快照

保存更改的快照

保存文件的差异

速度

快,分布式设计

慢,中心化设计

权限控制

通过Git Hooks和Gitolite控制

通过钩子脚本控制

学习曲线

较高,需要理解命令和概念

较低,容易上手

标签

轻量级标签,可以后续修改

不可变的静态标签

历史记录

保留所有历史记录

只保留最近的历史记录

合并冲突

需要手动解决

自动尝试解决,有冲突时需手动介入

命令行工具

是,Git命令行强大灵活

较为简单,主要用于管理和操作仓库

总体来说,现在 Git 更为流行,围绕 Git 的生态更加健全,因此逐渐成为了目前最主流的版本控制工具

Git的工作原理

那 Git 到底是如何进行工作的呢?

git 在架构上其实是一个三层架构,

  1. 工作目录(working directory): 这是项目文件所在的实际目录。对工作目录中的文件所做的修改被认为是“未跟踪”状态,直到显式地进行 commit 操作。
  2. 暂存区(staging area):暂存区充当工作目录和 .git 目录之间的缓冲地带。暂存区域中的文件处于“暂存”状态,以便在下一次 commit 时包含。是允许选择和控制更改的手段。
  3. 本地库(local repository):也就是 .git 目录, 它是Git版本控制系统的核心容器,包含各种元数据、对象数据库和配置信息。.git 目录存储 commit 的快照,并管理项目的历史记录,接受git的各种操作指令。

而除了本地代码管理的这三层,还存在一个远程库的概念,用于不同成员间对同一个项目代码进行协作。

  1. 远程仓库(remote repository): 远程仓库是一个中心仓库,用于团队成员协作,通过push、pull、merge等方式确保代码的同步和协同。

结合上面这个架构和主要的Git操作命令,我们理解一下 git 的运作过程:

  1. 首先我们通过 git init 或者 git clone 建立起本地的git仓库,也就是会包含 .git 这个本地库目录。
  2. 本地新增或修改的代码,这时其实是处于 未跟踪(untracked) 状态
  3. 执行 git add .指令,这时相关变更会进入 暂存区, 对应的状态是 已缓存(staged) 或者 已修改(modified)
  4. 这时再执行 git commit指令, 作用是从暂存区将变更提交到本地库中,对应状态是已提交(committed)
  5. git diff 是查看变更的命令,可以看到,它其实比较的是工作目录和暂存区的区别,而 git diff HEAD 则比较本地库和工作目录
  6. git push 会将本地库中的内容,提交到远程库
  7. git fetch 用于将远程库同步到本地库
  8. 我们常用的git pull则是将远程库直接拉取到本地的工作目录下

常用 Git 命令

借用一个中文的Git cheatsheet,便于速查。

详细的命令用法这里就不再罗列了,核心命令主要也就是上面原理图中提及到的几个。

进一步学习的话,也可以利用在线的学习工具,这里推荐一个:

Learn Git Branching

最近发表
标签列表