当前位置: 首页 > article >正文

Git的安装 + 基本操作

一、Git初识

1. 提出问题

​ 不知道你在工作或学习中,有没有遇到这样的情况:我们在创建并编写各种文档时,为了防止文档丢失,更改失误,失误后能恢复到原来的版本,不得不复制出一个一个的副本,保存了文档的各个版本,比如:

① 报告-V1版本

② 报告-V2版本

③ 报告-V3版本

④ 报告-最终版

每个版本都有不同的内容,最后只有一个版本由我们使用!


每一个版本对应着一个文件,随着版本的增多,文件也随着增多,那你还记得每一个版本修改了哪些内容吗?

显然这是做不到的。文档尚且如此,那我们的写的项目代码同样存在这个问题。

2. 如何解决 – 版本控制器

​ 为了解决这个问题,方便管理这些不同版本的文件,便有了版本控制器

所谓版本控制器,就是可以追溯一个文件的历史,以及它发展过程的系统。通俗来说就是可以记录工程的每一次改动和版本迭代的一个管理系统,同时也方便多人协同合作。

目前最主流的版本控制器是Git,这是大名鼎鼎的林纳斯・托瓦兹开发的,没错,就是那个Linux之父。托瓦兹一直都在致力于开源,伟大无需多言。

OIP-C

Git 可以控制电脑上所有格式的⽂件,例如doc、excel、dwg、dgn、rvt等等。

对于我们开发⼈员来说,Git最重要的就是可以帮助我们管理软件开发项目中的源代码文件!

3. 注意事项

​ 对于所有的版本控制器,Git也不例外,其实只能追踪文件的改动,比如TXT文件,网页,所有的程序代码等等。版本控制器可以告诉你每次的改动,比如在代码的第5行添加了 “hello world”,在第8行删除了单词 “Linux”。

​ 而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道从100KB改成了120KB,但到底该了啥,版本控制器不知道,也没法知道。

二、Git的安装

Git是开放源代码的代码托管工具,最早是在Linux下开发使用的。开始也只能应用于Linux平台,后面慢慢的被移植到Windows下,现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。

1. Linux - centos

你在centos下输入Git,看看系统有没有安装git。

$ git
-bash: git: command not found

如果出现这种情况就表示你没有安装Git,你需要使用命令安装一下Git。

sudo yum -y install git

安装好了之后查看Git的版本:

git --version

2. Linux - ubuntu

这里我使用的ubuntu的系统,因为2024年6月30日Centos官方已经宣布停止对centos进行维护了,原因是Red Hat拒绝继续投资。所以各位使用centos 7的,尽快换成ubuntu吧。

以我的ubuntu 22.04版本举例。

image-20240926182251908

这种情况就是不存在Git,我们需要使用命令来安装Git。

sudo apt-get install git -y

然后使用命令 **【git --version】**来查看Git的版本。

image-20240926182547841

看到Git版本后,说明Git是安装好了,接下来就可以使用Git管理文件版本了。

3. Windows

上面我们说的Git使用都是通过命令的方式使用,而Windows中提供了图形化界面的方式 – 小乌龟Git。

B站上的鹏哥说的很好:

参考链接:https://www.bilibili.com/video/BV1hf4y1W7yT?

p=3&vd_source=b57c3f3e8a7507d4af7322c28f05fdbc

三、Git的基本操作

1. 创建Git本地仓库

我们先创建一个目录gitcode出来,名字你随便取,然后进入该目录中。

仓库是版本控制的一个文件目录,所以我们想对文件进行版本控制,我们需要创建一个仓库出现。

而创建一个本地仓库的命令是 【git init】,注意该命令要在文件目录下执行:

image-20240926184055824

我们发现执行了git init后,gitcode目录下多了一个隐藏文件 .git

.git目录是Git来跟踪管理仓库的,不要手动修改这个目录里面的文件,不然改乱了,把Git仓库给破坏了。

使用tree命令可以查看.git文件树的结构。

当你第一次使用 tree 命令的时候,会发现没有安装,同样我们使用命令安装一下:

sudo apt-get install tree

image-20240926184551238

image-20240926190428071


2. 配置Git

安装好了Git后,首先要做的事情就是设置你的 用户名称e-mail地址,这是非常重要的。配置命令为:

git config [--global] user.name "Your Name" 
git config [--global] user.email "email@example.com" 
# 把 Your Name 改成你的昵称
# 把 email@example.com 改成邮箱的格式,只要格式正确即可。

其中 –global 是一个可选项。如果使用了该选项,表明这台机器上的所有Git仓库都会使用这个配置。注意:一个机器上不只存在一个Git仓库,你可以在不同的目录下创建很多仓库。

如果你希望不同的仓库 nameemail,可以不使用 --global选项。

查看配置情况命令:

git config -l

image-20240926191013146


3. 认识工作区、暂存区、版本库

工作区:是在电脑上你要写代码或文件的目录。

暂存区:英文叫stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,我们把暂存区有时也叫作索引(index),上面我们的截图的.git树结构还看不到index,那是我们还没有将工作区的内容add到暂存区中。

版本库:又名仓库,英文名repository。工作区有一个隐藏目录.git,它不算工作区,而是Git的版本库。

这里有一个图展示了它们三个的关系:

image-20240927084727556

• 图中左侧为⼯作区,右侧为版本库。Git的版本库里存了很多东西,其中最重要的就是暂存区,它相当于中转站。

• 在创建 Git 版本库时,Git会为我们自动创建⼀个唯一的master分支,以及指向 master 的⼀个指针叫 HEAD。(分支和HEAD的概念后面再说)

• 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区目录树的文件索引会被更新。

• 当执行提交操作 git commit 时,master 分支会做相应的更新,可以简单理解为暂存区的目录树才会被真正写到版本库中。

由上述描述我们便能得知:通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件。必须要通过使用 git addgit commit 命令才能将文件添加到仓库中进行管理!!!


3.1 添加文件

在包含 .git 的目录下新建一个文件 ReadMe文件,我们可以使用 git add 命令将文件添加到暂存区中:

git add:

  • 添加一个文件或多个文件到暂存区:git add [file1] [file2] . . .
  • 添加目录到暂存区:git add [dir]
  • 添加当前目录下所有改动的文件到暂存区:git add .

工作原理

  1. 检测工作目录中的变化git add 会扫描工作目录中的所有文件,检测哪些文件发生了变化(新增、修改或删除)。
  2. 将变化添加到暂存区:对于检测到的变化,git add 会将这些文件的快照(或者是标记)复制到暂存区。此时,暂存区中的内容就代表了下一次提交的候选内容。
  3. 保持工作目录的独立性git add 只影响暂存区,不会改变工作目录中的实际文件。这意味着你可以在添加文件后继续编辑文件,而不会影响暂存区中的内容。

image-20240927092931992

当我们 git add 到暂存区了之后,就可以查看状态,可以看到提醒这个文件需要被提交。


再使用 git commit 命令将暂存区内容提交到版本库中:

①将暂存区中的全部内容都提交到版本库中:

git commit -m "描述信息"

②将暂存区中的指定文件提交版本库中:

git commit [file1] [file2] ... commit -m "描述信息"

-m “描述信息” 绝对不要省略,这是我们自己写的,用来记录你的每一次的提交细节,这样你才能知道你写的这个代码到底是啥意思,这是给我们看的。

image-20240927094412903

可以看到我们commit提交文件到版本库后,会打印出信息,1个文件被改动(就是ReadMe文件),1行内容被插入,就是在ReadMe文件中的“hello linux”。

除了 git add 文件后立马就 git commit 。还可以多次 add 文件,然后一次性commit。

image-20240927095358102

目前我们已经把文件添加到了版本库中,使用命令 git log 可以查看提交历史记录。

image-20240927095554811

这样看着信息挺眼花缭乱的,我们可以加一个参数,让日志信息简洁一点:--pretty=oneline

image-20240927100043639

需要注意的是,每次我们看到这一大串类似 3452506…d4be30 的是每次提交的 commit id (版本号),这是一个sha1(哈希)计算出来很大的数字,是十六进制表示的,每一个提交的文件的这个哈希值都不同,这样就可以区分我们提交的文件。


3.2 查看 .git 文件

image-20240927150651373

经过我们的add和commit文件了之后,.git树形结构中添加了很多东西,完整的图应当如下:

image-20240927152259949

  1. index 就是我们的暂存区,add 后的内容都是添加到这里的。
  2. HEAD 就是我们的默认指向 master 分支的指针:

image-20240927152741101

而默认的master分支,其实就是:

image-20240927153107093

这一串数字就是最近一次提交的commit id:

image-20240927153241669

  1. objects是.git的版本库,里面创建了各种版本库对象及内容:

image-20240927153957268

查找 objects 时要将 commit id 分成2部分,其前2位是文件夹名称,后38位是文件名称。


3.3 commit提交文件后,哈希值的变化

当我们commit提交文件到了版本库了之后,会新增三种类型的哈希值。

  1. 第一个是存放的最近一次提交的信息:包括tree、parent、author、committer以及commit时的描述信息。

image-20240927154543313

其中的parent是上一次提交的信息:

image-20240927154716144

由此可以看出,每一次的新提交commit后都会有上一次提交时的提交信息,所以说,所有的提交都是像是链表串起来的一样,这样我们就可以找到所有的提交信息了。

  1. 第二个是tree信息,存放的是当前所有提交文件的commit id。

第一次提交:

image-20240927155211957

第二次提交:

image-20240927155129862

可以看出,每一次新的提交,都会更改tree存放的文件commit id。

  1. 第三个就是文件的commit id,查看该id就可以看到当前文件中的内容了。

总结⼀下,在本地的 git 仓库中,有几个文件或者目录很特殊:

index: 暂存区, git add 后会更新该内容。

HEAD: 默认指向 master 分支的⼀个指针。

refs/heads/master: 文件里保存当前 master 分支的最新 commit id 。

objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改。

当前讲解了git的一些安装与简单操作。后续还有修改文件,版本回退,撤销修改等等操作,敬请期待。


http://www.kler.cn/a/323694.html

相关文章:

  • Python_爬虫1_Requests库入门
  • 论文阅读 - Causally Regularized Learning with Agnostic Data Selection
  • gitHub常用操作
  • SOC Boot学习(三)——boot流程
  • 【WPF】Prism学习(二)
  • 一文了解Android中的AudioFlinger
  • ubuntu中库文件安装的位置以及头文件的位置
  • 123法则与2B法则
  • Linux——k8s组件
  • Qt实现自定义的文件对话框CustomFileDialog
  • 【HarmonyOS】应用权限原理和封装
  • 免费视频无损压缩工具+预览视频生成工具
  • Dubbo 如何使用 Zookeeper 作为注册中心:原理、优势与实现详解
  • 校园二手交易平台的小程序+ssm(lw+演示+源码+运行)
  • Vue ElemetUI table实现双击修改编辑某个内容
  • Leecode刷题之路从今天开始
  • 面经 | ES6
  • 时间技能物品竞品抢拍拍卖发布h5公众号小程序开源版开发
  • VueUse-----基于 Vue 3 的实用工具库,常用功能介绍及使用案例
  • 代码随想录第二十天:动态规划、斐波那契数列、爬楼梯、最小体力爬楼梯
  • Java网络编程、正则表达式、单例设计模式与Lombok
  • 南平自闭症寄宿制学校:让孩子自信绽放
  • 什么是后端开发 ?
  • 安装 Nacos 启动报错 java.lang.IllegalArgumentException: db.num is null
  • JavaWeb图书借阅系统
  • 【3D分割】Segment Anything in 3D with Radiance Fields