【Git】--- 初识Git Git基本操作

 Welcome to 9ilk's Code World

       

(๑•́ ₃ •̀๑) 个人主页:       9ilk

(๑•́ ₃ •̀๑) 文章专栏:     Git 


本篇我们来初步认识Git企业级应用是什么,有什么用以及Git基本操作。


🏠 初始Git

提出问题

   在日常生活中,我们进行软件开发或日常文档维护,可能遇到以下问题:我们对文档进行多次修改,形成多个版本v1 v2 v3 v4... 长此以往我们的文档副本越来越多,每个版本都有各自内容,但最终只有一份会被我们采用,但我们想从不同版本汲取优点,面对这么多版本,我们是不清楚之前的每个版本的修改内容的,这并不方便我们进行维护,影响我们的开发效率。有什么解决方案吗?

解决方案

    面对上面的问题,我们急需一个能记录每次修改以及版本迭代的管理系统,这就需要引出版本控制器的概念,我们的Git就是当前主流的版本控制器。版本控制器,通俗讲就是能让你了解到一个文件的历史,以及它的发展过程的系统,即一个可以记录工程的每一次改动和版本迭代的管理系统,同时也方便多人协同作业。

    我们的主角Git是当前最主流的版本控制器,它可以控制电脑上所有格式的文件,例如doc execl dwg dgn等等。对于我们开发人员来说,Git最重要的就是可以帮助我们管理软件开发项目中的源代码文件

🏠 Git 安装

Centos:

git --version
sudo yum install git -y   

Ubuntu:

sudo apt-get remove git -y
git --version
sudo apt-get install git -y 

🏠 Git基本操作

本地仓库创建

如果想使用Git管理文件,我们必须把这些文件放在Git仓库中,仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制,就必须先创建⼀个仓库出来

先创建一个目录做测试:

mkdir gitcode

创建Git本地仓库(注意命令要在⽂件⽬录下执行):

git init

当创建成功我们可以看到以下提示:

使用ls -a 命令我们发现,我们当前目录下多了个.git的隐藏目录,它是Git用来跟踪管理仓库的不要手动修改这个目录里面的文件,不然乱改会把Git仓库给破坏了

本地仓库配置

将本地仓库创建好之后,我们最好对两个配置项email name进行配置。

git config [--global] user.name "Your Name"
git config [--global] user.email "email@example.com"
# 把 Your Name 改成你的昵称
# 把 email@example.com 改成邮箱的格式,只要格式正确即可
  • --global是一个可选项,如果使用该选项,表示这台机器上所有的Git仓库都会使用这个配置。如果你希望在不同仓库中使用不同的name或e-mail,可以不要--global选项,但注意的是,执行命令时必须要在仓库里。

查看配置

git config -l 

重置某个配置

git config [--global] --unset user.name
  • 注意对于设置了--global选项的配置项,unset时需要带上--global

认识工作区,暂存区,版本库

zhuang@VM-8-14-ubuntu:~/gitcode$ touch  ReadMe
zhuang@VM-8-14-ubuntu:~/gitcode$ ls
ReadMe

思考以下问题:当我们在gitcode下创建文件时,这个文件就会受到版本管理了吗?如果放在.git目录下呢?

答案是无论放在它们两哪个都不会受到版本管理,而且我们之前也说过不允许在.git下手动修改,误操作可能会导致整个本地仓库出错。

面对这个问题我们需要了解三个区域:

  • 工作区:是在电脑上你要写代码或文件的目录。对应我们的gitcode目录。
  • 暂存区:英文叫stage或index。一般存放在.git目录下的index文件(.git/index)中,我们
    把暂存区有时也叫作索引(index)。
  • 版本库:又名仓库,英文名repository。工作区有一个隐藏目录录.git,它不算工作区,而
    是Git的版本库
    。这个版本库里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git
    都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以"还原"。

工作区、暂存区、版本库三者的关系如下:

  • 图中左侧为工作区,右侧为版本库。Git的版本库里存了很多东西,其中最重要的是暂存区。
  • 在创建Git版本库事,Git会为我们自动创建一个唯一的master分支,以及指向master的一个指针叫HEAD。
  • 当执行git add操作时,会将工作区修改的内容保存到版本库的暂存区中,暂存区目录树的文件索引会被更新。注意:这里工作区修改的内容不仅仅指的是新增和修改,还有删除!
  • 版本库中还有一个模块,叫“对象库(objects)”,里面存储一堆git对象,维护git对象相当于维护了文件的所有版本,即进行了版本管理。
  • 当执行git commit操作时,会把暂存区的index树写到master分支下master分支会做相应的更新注意:git对象都存在objects里,因此暂存区存的是一个个git对象的索引,它是轻量级的一个区域
  • master指向的是当前分支,即最新commit,即最近的一个版本。

总结:通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是在工作区新增文件。必须通过两板斧git addgit commit才能将文件添加到仓库中进行管理。

小细节:当我们刚创建完一个新目录,还没有git add时,是查看不了暂存区的,即.git目录下的index目录。

添加文件

(1)场景一:

先在gitcode目录下创建一个文件ReadMe,给ReadMe文件添加内容:

git add : 添加内容进暂存区

git add ReadMe

当然git add我们可以灵活使用:

git add [file1] [file2].. //添加一个或多个文件到暂存区
git add [dir] //添加指定目录到暂存区,包括子目录
git add . //添加当前目录下的所有文件

git commit命令将暂存区内容添加到本地仓库:

git commit -m "ReadMe" //提交暂存区全部内容
git commit [file1] [file2]... -m "message"//当然也可以提交暂存区的指定文件
  • git commit 后面的 -m 选项,要跟上描述本次提交的message,由用户自己完成,这部分内容绝对不能省略,并要好好描述,它们用来记录你的提交细节,方便我们开放以及他人协作。

我们一次性add和commit多个文件:

zhuang@VM-8-14-ubuntu:~/gitcode$ touch file1 file2 file3
zhuang@VM-8-14-ubuntu:~/gitcode$ git add file1
zhuang@VM-8-14-ubuntu:~/gitcode$ git add file2
zhuang@VM-8-14-ubuntu:~/gitcode$ git add file3
zhuang@VM-8-14-ubuntu:~/gitcode$ git commit -m "add 3 file"
[master e42d583] add 3 file3 files changed, 0 insertions(+), 0 deletions(-)create mode 100644 file1create mode 100644 file2create mode 100644 file3

完成之后,我们可以使用git log命令显示从最近到最远的提交日志,并且可以看到我们commit时的日志消息

  • commit后跟着的一串字符串是我们每次提交的commit id(版本号),Git的commit Id是一个SHA1计算出来的一个非常大的数字,用十六进制表示。

如果嫌git log一次性输出信息太多,可以加上--pretty=oneline:

经过上面两次提交,我们查看.git目录下发生什么变化:

  • 我们发现新增了暂存区index,add后的内容就是添加到这里的。

  • HEAD指针指向的就是默认master分支

  • 我们查看master,里面保存的其实就是当前最新的一个commit ID,即一个git对象。

objects为Git的对象库,里面包含了创建的各种版本库对象以及内容,当执行git add命令时,暂存区的目录树被更新,同时工作区修改的文件内容被写入到对象库中的一个新对象中,就位于".git/objects"目录下,我们可以观察下:

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

  • 找到这个文件之后,一般不能直接看到里面是什么,该文件是经过SHA(安全哈希算法)加密过的文件,我们可以使用 git cat-file -p + commit id 来查看

  • 其中还有一行tree,我们可以使用同样方法查看

  • 在查看ReadMe对应的commit ID,我们发现我们第二次提交时对其修改的内容被git记录下来

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

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

2. HEAD:默认指向master分支的一个指针。

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

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

(2)场景2

这里我们先创建file4,再创建file5,将file4进行add存放到暂存区,这里显示只有一个文件改变了,不应是新增了两个文件吗?

我们应该弄清楚,git add只是将文件添加到暂存区,git commit是将暂存区内容添加到本地仓库中。我们并没有git add file5导致其没有在暂存区中维护,因此我们commit时只将已经在暂存区中的file4提交了,要想提交file5,只需对其再进行两板斧add commit即可。

修改文件

Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。

我们之前说过,修改不仅仅是修改内容,新增一行,删除一行也是修改,甚至在工作区新增文件也是一个修改。

我们在工作区对ReadMe文件内容进行修改:

此时仓库中的ReadMe和工作区中的ReadMe是不同的,我们可以使用git status 查看在你上次提交之后是否对文件有再次修改

git status只能查看哪个文件变化/修改,但不知道具体修改内容(对于大文件我们cat无法准确得知修改内容)

我们可以使用git diff [file] 命令显示暂存区和工作区文件的差异,显示的格式正式Unix通用的diff格式

zhuang@VM-8-14-ubuntu:~/gitcode$ git diff ReadMe
diff --git a/ReadMe b/ReadMe //a是改动前 b是改动后
index 8d0e412..05fe86c 100644
--- a/ReadMe //改动前
+++ b/ReadMe //改动后
@@ -1 +1,2 @@   //-1代表改动前第一行内容 原文件在第1行开始,并且原文件只有1行内容。hello git      //+1,2表示改动后从第一行开始,连续两行的内容  新文件从第1行开始,并且新增了1行,使得现在有2行内容。
+hello world 

也可以使用git diff HEAD -- [file]来查看版本库和工作区文件的区别

此时我们把修改的ReadMe再git add会提示在暂存区修改了:

此时再commit即可:

版本回退

我们知道Git能够管理文件的历史版本,这也是版本控制器重要的能力,如果有一天你发现之前工作的内容出现很大问题,需要在某个特定的历史版本重新开始,此时就需要版本回退。

Git中用于版本回退的命令是git reset可以指定退回某一次提交的版本

我们之前的操作使得ReadMe存在两个版本,第一个版本只有一行内容Hello git,第二个版本新增了一行内容Hello world,git reset本质是将版本库中的内容进行回退,而工作区和暂存区是否回退取决于它的三个选项:【--soft】【--mixed】【--hard】

  • --soft 参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。

  • --mixed选项:为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变

  • --hard:参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重

我们使用--hard选项演示一下:

我们发现我们的三个区域都回退了,如果我们想反悔,可以使用之前打印的commit ID复原出file1 file2 file3。但这样做的前提是commit ID没有被清除

如果commit id被清除了呢?此时我们还可以使用命令git reflog查看本地记录的每一次提交id进行reset

注:这个55604d7其实是commit ID的一部分,也可以用来进行回退

思考一个问题 : Git版本回退的速度是比较快的,为什么呢?

Git在内部有个指向当前分⽀(此处是master)的HEAD指针, refs/heads/master⽂件⾥保存当前 master 分⽀的最新 commit id 。当我们在回退版本的时候,Git仅仅是给refs/heads/master中存储⼀个特定的version

撤销修改

(1)情况一:对于工作区的代码还没add

在原来基础上我们给ReadMe新增上一行内容:

此时我们如果想撤销工作区的内容,可以使用git checkout -- 撤销的文件名:它其实就是帮我们将工作区文件回到最近一次add/commit的状态(注意加上两杠)

当工作区的代码没有add时,我们可以使用两种方式进行撤销:

1. 手动使用Vim工具撤销 --- 对于这种方式我们不推荐,如果代码写了几天但一直没有add,此时修改容易出错

2. 我们推荐使用git checkout -- [filename] 

(2)情况二:已经add,但是没有commit

我们先对ReadMe文件修改,新增一行内容,add之后使用git status查看状态:

此时我们可以使用的git reset作用更详细来说是回退到版本库的当前版本,我们可以使用--mixed选项先将暂存区回退到版本库的当前版本,再使用git checkout对工作区进行撤销:

补充:

git reset --mixed HEAD ReadMe //回退到当前版本
git reset --mixed HEAD^ //回退到上个版本 ^^是回退到上上个版本

(3)情况3:已经add,也已经commit

此时版本库是最新版本,此时可以使用git rest的--hard选项将三个区域都回退,但是前提commit之后,没有push,撤销才有效。(实际公司开放跑的代码都是围绕远程仓库的,所以撤销主要目的是不影响远程仓库),Push操作是将版本从版本库->远程仓库。

演示:

准备工作

撤销

删除文件

rm是删除工作区的文件,但对于本地仓库并没有删掉,实际应该怎么删除呢?

此时就完成一个文件在工作区 暂存区 版本库的修改,我们总结一下删除文件的步骤:

1. rm --- 删除工作区内容

2. git add --- 提交工作区的变动

3. git commit --- 更新到版本库

git rm + 要删除文件 : 该命令帮我们删除工作区文件同时帮我们add,我们只需要commit即可


总结一下:

1. Git是一个版本控制器,跟踪的是版本的修改。

2. git init 创建本地仓库

3. git三板斧 : git add -> 工作目录放到暂存区 git commit 暂存区->版本库master git push 本地仓库->远程仓库

4. 版本回退:git reset,存在三个选项--soft --mixed --hard

5. 查看相关命令:git log 查看commit id , git status 查看仓库状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据治理下半场:如何用文化变革撬动企业数字化转型?

数据治理下半场:如何用文化变革撬动企业数字化转型? 一、打破认知茧房:从"数据恐惧症"到"数据生产力"二、重构协作生态:从"部门墙"到"数据共同体"三、建立责任体系:从"无人认领"到"终身责任制"​四、点燃创新…

Chat-Driven Business:灵活交互的新范式

1. 引言 一次偶然的机会,读到了CSDN上的一篇文章,自定义markdown的展示(很遗憾,时间有点久,找不到具体的链接了),当时我觉得这很有启发意义,因为我做的cli_assistant就是以markdown的形式返回的…

嵌入式裸机设计--MCU常用裸机架构有哪些?

为什么是裸机设计 792125321入群学习更高效! 在MCU(微控制器单元)裸机开发中,我们常见的架构设计主要围绕如何高效管理资源和任务调度。认识这些开发方式,对我们开发一个小型项目来说及有好处! 下面介绍…

python内置函数sum的用法

知识点 - sum 函数 基本语法 sum(iterable[, start]) iterable 是一个可迭代对象,例如列表、元组、集合等,其中的元素通常是数字类型(整数或浮点数)。 start 是一个可选参数,表示累加的起始值,默认为 0。…

编程语言的几种常见的分类方法

一、 按照编程范式分类 命令式编程语言 强调通过语句来改变程序状态,如 C、Pascal、Fortran 等。 面向对象编程语言 基于对象和类的概念,支持封装、继承和多态,如 Java、C、Python、Ruby 等。 函数式编程语言 注重不可变性和纯函数&#xf…

基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战

一、引言 当前,工业仿真领域正经历着前所未有的「智能焦虑」——当自动驾驶算法已能理解城市路网,当大模型开始设计蛋白质结构,这个驱动大国重器研发的核心领域,却仍在与千万级方程组成的庞杂模型艰难博弈。传统仿真降阶如同在数…

配置单区域OSPF实验和报文抓包和分析

一、配置单区域OSPF概念: (1)配置单区域OSPF(Open Shortest Path First)是一种常见的动态路由协议配置方式,主要用于在同一区域内实现路由信息的交换和路由表的更新。 (2)OSPF是一…

巴耶赫利专业俄语外贸网站建设

巴耶赫利是专业俄语外贸网站建设与俄语搜索引擎Yandex SEO优化服务商。巴耶赫利致力于帮助中国品牌出海俄罗斯,打开俄罗斯市场,提升品牌在俄罗斯的知名度和美誉度。 以下是对巴耶赫利相关服务的详细介绍: 一、巴耶赫利专业俄语外贸网站建设…

Netty基础—6.Netty实现RPC服务三

大纲 1.RPC的相关概念 2.RPC服务调用端动态代理实现 3.Netty客户端之RPC远程调用过程分析 4.RPC网络通信中的编码解码器 5.Netty服务端之RPC服务提供端的处理 6.RPC服务调用端实现超时功能 5.Netty服务端之RPC服务提供端的处理 (1)RPC服务提供端NettyServer (2)基于反射…

路由器与防火墙配置命令

路由器与防火墙配置命令 小明啊,你不是学计算机的嘛,叔叔家的路由器坏了,可以过来帮叔叔看看吗 命令可以用缩写,造就一堆容易造成歧义的缩写,比如add是address的缩写,sh是shutdown的缩写。 默认为Cisco路…

Go语言进化之旅:从1.18到1.24的语法变革

文章目录 里程碑变革:泛型支持Go 1.18:泛型的引入Go 1.19-1.21:泛型的完善Go 1.24:泛型类型别名全面支持 循环与迭代的进化Go 1.22:循环变量作用域变化与整数遍历Go 1.23:迭代器函数的支持Go 1.24&#xff…

发现一个GoVCL的问题

之前用govcl写了一个服务端的界面程序,用来控制服务的开启和关闭。 由于这个服务程序运行的时间比较长,经常是挂着在服务器上24小时不间断运行。 后来经过调试发现,govcl的界面按钮控件,在程序长时间运行后,会出现无法…

34个适合机械工程及自动化专业【论文选题】

论文选题具有极其重要的意义,它直接关系到论文的质量、价值以及研究的可行性和顺利程度。选题明确了研究的具体领域和核心问题,就像给研究旅程设定了方向和目的地。例如,选择 “人工智能在医疗影像诊断中的应用” 这一选题,就确定…

电脑实用小工具--VMware常用功能简介

一、创建、编辑虚拟机 1.1 创建新的虚拟机 详见文章新创建虚拟机流程 1.2 编辑虚拟机 创建完成后,点击编辑虚拟机设置,可对虚拟机内存、处理器、硬盘等各再次进行编辑设置。 二、虚拟机开关机 2.1 打开虚拟机 虚拟机创建成功后,点击…

双指针算法专题之——有效三角形的个数

文章目录 题目介绍思路分析AC代码 题目介绍 链接: 611. 有效三角形的个数 思路分析 如果判断三个数能否构成一个三角形,相信大家都知道: 只要任意两边之和大于第三边即可。 比如三条边长度为a,b,c 那只要满足 ab>c ac>b b…

Linux内核实时机制27 - RT调度器10 - RT throttling 带宽控制下

文章目录 1、初始化带宽 init_rt_bandwidth1.1、init_rt_bandwidth2、定时器处理2.1、sched_rt_period_timer2.2、do_sched_rt_period_timer3、总结1、初始化带宽 init_rt_bandwidth rt_runtime : 一个时间周期内的运行时间,超过则限流,默认值为0.95ms 1、init_rt_bandwidth…

1.5[hardware][day5]

Link类跳转指令可以拆分为两个部分,一个是跳转,即下一个PC的生成,如果将分支条件的比较放到译码级来进行,则这部分只涉及取值级和译码级流水;另一个是Link操作,简单来说就是写寄存器,这部则主要…

Tomcat 与 Java 环境变量配置简明教程

Tomcat 与 Java 环境变量配置简明教程 一、Tomcat 环境变量配置 1. 确认安装路径 假设 Tomcat 安装在:D:\Tomcat\apache-tomcat-9.0.70 2. 设置 CATALINA_HOME 步骤: 右键点击「此电脑」→「属性」点击「高级系统设置」→「环境变量」在「系统变量…

3.16学习总结

学习了Java的知识点 基本数据类型 byte占1字节,储存范围-128~127 short占2字节,储存范围-32768~32767 int占4字节,储存范围-2147483648~2147483647 long占8字节,储存范围是-9223372036854775808~9223372036854775807 float占…

Android手机中各类安全相关知识总结

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Android 安全威胁2. Android 安全防护措施3. Android 安全建议和最佳实践4. Android 安全工具推荐5. Android 安全常见问题5.1 如何检测设备是否感染恶意软件?5.2 如何防止应用滥用权限?5.3 如何保护设备免受网络攻…