初识git · 基本操作

news2024/11/27 0:34:56

目录

前言:

基本操作

检查是否存在git

初始化仓库

认识三个区域

添加文件

查看.git文件

修改文件

版本回退

撤销操作

删除文件


我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2n55ocfzqhogk

前言:

Git 是一个开源的分布式版本控制系统,最初由林纳斯·托瓦兹(Linus Torvalds)于2005年开发,目的是为了更好地管理Linux内核的开发过程。与传统的集中式版本控制系统(如SVN)不同,Git允许开发者在本地进行完整的版本控制操作,包括提交、分支和合并,而无需依赖网络连接到中央服务器。

Git的核心概念包括仓库(Repository)、工作目录(Working Directory)、暂存区(Staging Area)和提交(Commit)。开发者在本地仓库中工作,修改文件后可以将这些变更添加到暂存区,然后通过提交操作将这些变更记录到仓库的历史记录中。

Git还支持分支和合并操作,使开发者能够在不影响主分支稳定性的情况下进行新功能开发或实验性修改。分支操作是轻量级的,几乎可以瞬间创建和切换,这极大地提高了开发效率和灵活性。

此外,Git还具有强大的网络功能,支持通过HTTP、SSH等协议进行仓库的克隆、推送和拉取操作,使得多个开发者可以协同工作,共享代码变更。

总之,Git以其分布式的设计、高效的分支和合并操作以及强大的网络功能,成为了现代软件开发中不可或缺的版本控制工具。


基本操作

由前言的介绍,我们知道git强大的地方来源于版本控制,那么除了版本控制,我们要学习的基本操作有:

认识三个区域->添加文件->修改文件->版本回退->撤销修改的三种情况->删除文件

这是本文的目标。

检查是否存在git

开始之前,我们应该先检查自己的机器里面是否存在git这个工具:

命令:git --version,可以查看git的版本,

ubuntu的系统下,删除git的命令是:sudo apt remove git -y,此时查看:

那么ubuntu重新安装git的命令为:sudo apt install git。

初始化仓库

那么有了git这个工具,我们应该新建一个仓库,并且要对仓库初始化,在图形化界面中,我们新建仓库的时候往往也是需要初始化的:

使用的命令是git init,此时初始化了仓库之后,在当前目录下就会创建本地仓库,标志是.git。

此时.git创建好了之后,比较重要的是我们最好配置名字,以及邮箱等:

通过命令git config user.name 等,初始化自己的信息。

那么我们如何看对应的配置信息呢?输入命令:git config -l即可:

此时对应的配置信息就打印出来了。

那么我们既然已经创建了.git,我们不妨使用tree看一下这究竟是个什么玩意儿:

这就是对应git的树状图,当然,里面有很多东西我们目前都不知道,不用急,咱也就先看看而已。

初始化配置的时候,我们还可以使用--global参数,表示全局的,也就是这台机器上的所有仓库都可以使用这个配置:

那么为了测试,我们再创建一个仓库:

验证成功。

那么删除对应的配置也很简单,使用unset即可:

但是不能一次性删除多个,只能一个一个删除:

仓库的初始化配置就到这里。

认识三个区域

git中的三个区域:

在git中,这三个区域,分别是工作区,暂存区,版本库,三个区域的取名还是比较生动形象的。

工作区,也就是平时我们存储代码的地方,暂存区,也就是经过一次add操作之后,代码的临时改动被存储到了暂存区,版本库,代码的更改都会放在这里面,并且是永久存储的。

其中,工作区到暂存区,需要Add,暂存区到版本库,需要commit,但是我们平常使用图形化界面的时候,上传到远端仓库还需要一个操作是push,目前我们学习的操作都没有涉及push,都是在add和commit。

对于暂存区,也有一种说法叫做索引,并且在暂存区和版本库里面还有一种区域,叫做objects,没错,就是这个:

objects也就是对象的意思,这实际上是个对象库,修改的工作区的内容会写入其中的git对象.

添加文件

我们添加文件有两种方式,一种是git add 修改的文件名 ,一种是git add . ,这个.就是当前目录的所有意思,也就是当前目录的所有修改都要加上,add之后,通常伴有git commit ,但是commit通常需要选项-m,-m的意思是提交日志,也就是:

这里需要注意的是,-m之后的描述是比较重要的,比如boss让你写了500个版本,如果每次commit的日志都是1,那么是很难进行版本回退的,因为都是1,没有描述具体添加还是删除了哪些功能,版本控制就变得麻烦起来了。

commit之后,有对应的介绍,1file changed ,一个文件改动了,0 insertions,代表没有行数增加,0 deletions代表没有行数减少。

我们也可以一次性,多添加多个文件:

这里需要再介绍一个命令,叫做git log,一般的软件都是有日志的,可以理解为日记的意思,它会记录该软件发生的所有事:

其中HEAD -> master是什么我们暂时不用管,前面的很大的16进制的数字是根据某种规则生成的,我们知道即可。

后面有对应的Author,Email,以及对应的日期,最后的就是提交的描述的。如果我们嫌打印出来的东西太多了,我们可以输入git log --pretty=oneline:

也就是将每次的提及以一行的方式打印。

那么在add commit操作里面我们看到了极其庞大的式子,还有HEAD -> master,我们可以通过查看.git文件来了解它们。

查看.git文件

根据最开始的git图:

我们现在不妨对比一下已经commit两次之后的git:

为什么暂存区还有一个名字叫做索引,就是因为我们commit之后,git之后新增了一个index,也就是暂存区的索引。

关于HEAD指针的问题,我们可以打印HEAD出来看看:

可以发现HEAD指针指向的就是master,那么master里面又有什么呢?再看看:

是一串很大的16进制的数字,那么这串数字又是啥?我们可以使用指令来查看:

指令git cat-file -p [数字]:

出现了我们熟悉的信息,第一个是tree,不管先,parent是我们上次提交对应的commit id,author等就不用介绍了,那么tree对应的是什么呢?我们使用指令再看看:

这些就是对应提交过的文件了,那么里面的数字又是什么意思呢?实际上是我们add之后,在文件里面进行了修改的内容,因为博主add的时候没有加东西,所以各位同学可以自行演示哦。

在git里面,对象库里面存在的13的是对应的对象。

修改文件

这里的修改文件并不是我们在git里面修改文件,我们查看修改文件之后git对应的状态,我们现在在file1新增内容:

此时使用指令git status:

此时file1文件变红,图形化界面也会有一个红色提示符,此时,nothing added to commit ...也就是说暂存区没有内容需要commit的,那么此时我们使用指令git diff:

其中index索引后面的我们不管,a/file1表示改动前的fie1,b就是改动后的。

---也是改动前,那么-0,0, +1是代表的行数变化,后面打印出来了对应的行增加了什么。

0,+1代表从改动后的0行开始新增1行。

这是修改文件。

这就是看的在暂存区和工作区之间的内容区别,当然也有暂存区和版本库的,各位同学可以自己试试哦。

版本回退

版本回退作为git最重要的一个功能,现在就揭开对应的荧幕,那么我们新造一个场景,重新提交一下文件,从file1到 file5 ,修改file1为Hello git ,到加上Hello world:

为了进行版本回退,使用的函数是reset,对应的选项有 --soft --mixed --hard,默认使用指令reset的时候选项是mixed,从soft到mixed到hard的,回退的情况是由轻到重的:

使用soft只会修改版本库的内容,mixed会修改暂存区和版本库的内容,hard会修改三个区的内容,所以hard一定是要慎用的。因为可能别人正在工作区写代码呢,你一个hard,框的一下给人代码全部干没有了,这就是一件很悲催的事儿。

那么我们现在演示一下hard,其他两个自然也就会了:

表示现在在当前版本。

我们也可以直接用HEAD指针,HEAD^表示上个版本,^^代表上上个,也可以使用~ + 数字表示,~ + 1代表上一个版本:

当我们成功回退到了上个版本,我们看看修改的file1的内容是怎么样的:

此时只有Hello git了,那么我们可以吃后悔药不呢?可以的,我们如果系统还没有退出来,可以看到对应的commit id,就可以:

此时:

那么如果我们的系统已经退出来了,看不到对应的id怎么办?我们可以:

此时有个缩短的commit id,也可以直接用的,我们可以利用该commit id直接回退,那么为什么git的版本回退那么快呢?

这是因为:

每次commit之后,返回的commit id实际上是不同的git对象,master指针只需要改变一下指向即可。

撤销操作

撤销操作分为三种,新增的代码还没有add,新增的代码已经add了但是没有commit,新增的代码不仅add了还commit了,对应只有这三种情况。

第一种情况:

如果我们还没有add,并且新增的代码并不是很多的情况下,我们不妨手动删除,但是在企业中,代码量都是比较多的,我们不能保证我们可以手动删除完全正确,我们希望代码回到最近一次add的时候,所以我们可以使用指令git checkout -- [filename]:

第二种情况:

已经add了,但是还没有commit,那么我们需要修改的就是暂存区,这就有意思了,我们可以直接使用版本回退的指令,mixed,修改暂存区的内容,但是不修改工作区的内容,此时就变成了如何修改工作区的内容,这不就回到了情况一了吗?

第三种情况:

那就更简单了,直接hard指令即可,只能说庆幸没有push到远程仓库吧,push了可就真的麻烦了,这里就相当于版本回退的操作,就不做实例了。

删除文件

删除文件就简单多了,我们对于普通的文件可以直接rm -rf,但是git里面,我们可以直接git rm filename:

这样可以在工作区删除对应的文件。如果直接rm,代表的只是本地删除了而已,仓库没有删除,

此时git的状态也会发生变化。

那么仓库删除了之后,commit一下:

此时,就干净了许多。 


感谢阅读!

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

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

相关文章

Qt-多线程

1. Qt 多线程概述 Qt 默认只有一个主线程,该线程既要处理窗口移动,又要处理各种运算。 当要处理的运算比较复杂时,窗口就无法移动,所以在处理程序时在很多情况下都需要使用多线程来完成。 示例:移动窗口和复杂循环 …

八股面试2(自用)

mysql存储引擎 存储引擎:定义数据的存储方式,以及数据读取的实现逻辑 在以前数据库5.5默认MyISAM引擎,之后默认InnoDB引擎 MyISAM引擎的数据和索引是分开存储的,InnoDb将索引和文件存储在同一个文件。 MyISAM不支持事务&#…

SPOOLing技术详解,结合实际场景让你了解什么是假脱机技术。

SPOOLing技术 ​ 在手工操作阶段,主机直接从I/O设备获取数据,但是由于设备速度很慢,主机速度很快。人机速度矛盾明显,主机需要浪费很多时间来等待设备。 什么是脱机技术,脱机技术可以解决什么问题? 所谓脱…

大数据测试:Charles修改响应数据

上一篇大数据测试:Fiddler修改响应数据-CSDN博客 ,有同学反馈有没有Charles的方式修改响应数据,本篇就是Charles修改数据操作步骤,相比较fiddler,Charles相对简单,便捷,我很喜欢 1、背景&…

【笔记】【YOLOv10图像识别】自动识别图片、视频、摄像头、电脑桌面中的花朵学习踩坑

(一)启动 创建环境python3.9 打开此环境终端 (后面的语句操作几乎都在这个终端执行) 输入up主提供的语句:pip install -r requirements.txt 1.下载pytorch网络连接超时 pytorch网址: Start Locally | P…

java -jar 命令自动重启 Java 项目

一、java -jar 方式运行项目 重启Java项目通常意味着你需要先停止当前运行的Java进程,然后再次启动它。下面是在CentOS上执行这些步骤的一种常见方法: 停止Java进程 找到Java进程的PID: 使用ps命令配合grep来查找运行中的Java进程的PID&#…

【Java SE 】封装 的特性 和 static 详解

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 封装的概念 1.1 一个例子 2. 访问权限控制符 3. 包的概念 3.1 import 导入 3.2 常见的包 4. static 静态成员 4.1 static 使用情况 4.2 static 修…

> Invalid revision: 3.22.1-g37088a8-dirty

Android项目使用cmake 3.22.1,编译时报错: > Invalid revision: 3.22.1-g37088a8-dirty解决方法一: 升级Gradle版本和AGP的版本; 建议使用AS推荐的版本: 目前可运行的版本配置: AS:Jel…

champ模型部署指南

一、介绍 champ是由阿里巴巴、复旦大学和南京大学的研究人员共同提出的一种基于3D的将人物图片转换为视频动画的模型,该方法结合了3D参数化模型(特别是SMPL模型)和潜在扩散模型,能够精确地捕捉和再现人体的3D形状和动态,同时保持动画的时间一…

读书读到NOBEL

最近在读陈逸鹤的《程序员的自我修养》这本书,里面有这么一段话: “远古时代的人们只能创造出用于猎捕的长矛,而今天借助来自各行各业人 们的智慧,我们可以制造出高铁、大型飞机,并探索宇宙。但要更进一步解决人类所面…

2024_E_100_连续字母长度

连续字母长度 题目描述 给定一个字符串&#xff0c;只包含大写字母&#xff0c;求在包含同一字母的子串中&#xff0c;长度第 k 长的子串的长度&#xff0c;相同字母只取最长的那个子串。 输入描述 第一行有一个子串(1<长度<100)&#xff0c;只包含大写字母。 第二行为…

GPT-4o canvas不是对cursor的颠覆,而是人与AI交互的新探索

谈一下Openai新发布的canvas。 关于这个产品的介绍不多说了&#xff0c;网上已经有很多&#xff0c;主要谈下我对它以及相似竞品的比较&#xff0c;以及我的一些看法。 1、vs Claude Artifacts&#xff1a;是chatbot编程方面直接竞品&#xff0c;不过现阶段还是有很大的区别。…

二百六十八、Kettle——同步ClickHouse清洗数据到Hive的DWD层静态分区表中(每天一次)

一、目的 实时数仓用的是ClickHouse&#xff0c;为了避免Hive还要清洗数据&#xff0c;因此就直接把ClickHouse中清洗数据同步到Hive中就行 二、所需工具 ClickHouse&#xff1a;clickhouse-client-21.9.5.16 Kettle&#xff1a;kettle9.2 Hadoop&#xff1a;hadoop-3.1.3…

TH-OCR:强大的光学字符识别工具与车牌识别应用

在当今数字化的时代&#xff0c;高效准确地识别文本和图像中的字符变得至关重要。TH-OCR&#xff08;清华 OCR&#xff09;作为一款优秀的光学字符识别软件&#xff0c;以其卓越的性能和广泛的应用场景&#xff0c;受到了众多用户的青睐。其中&#xff0c;车牌识别功能更是在交…

嵌入式入门学习——6Protues点亮数码管,认识位码和段码,分辨共阴还是共阳(数字时钟第一步)

0 系列文章入口 嵌入式入门学习——0快速入门&#xff0c;Let‘s Do It&#xff01; 首先新建基于Arduino UNO的protues工程&#xff0c;见本系列第3篇文章 1 点“P”按钮找器件 2 输入“seg”或“digit”查找数码管器件 3 找到我们想要的6位7段数码管 4如图A、B…DP都是段码…

一、go入门

go入门 Go历史1.1 诞生时间1.2 里程碑1.3 团队核心人员 2. 为什么使用Go3. 安装Go5. 入门案例6. 开发工具 Go历史 1.1 诞生时间 Go 语言起源 2007 年&#xff0c;并于 2009 年正式对外发布。它从 2009 年 9 月 21 日开始作为谷歌公司 20% 兼职项目&#xff0c;即相关员工利用…

MATLAB小波变换图像融合系统

二、应用背景及意义 本课题利用小波变换进行图像的融合&#xff0c;然后对融合的结果进行图像质量的评价。所谓小波变换图像融合就是对多个的信息目标进行一系列的图像提取和合成&#xff0c;进而可以获得对同一个信息目标的更为精确、全面、可靠的高低频图像信息描述。并且也…

Vue2项目-二进制流预览

一、docx文档 软件&#xff1a;docx-preview&#xff1b; 版本&#xff1a;"^0.1.20"&#xff1b; 1、安装docx-preview npm i docx-preview0.1.20 2、组件配置 <template><div ref"wordContainer"></div> </template><s…

java集合进阶篇-《泛型通配符及其练习》

个人主页→VON 收录专栏→java从入门到起飞 目录 一、前言 二、泛型通配符简要概述 基本概念 无界通配符 (?)&#xff1a; 上限通配符 (? extends T)&#xff1a; 下限通配符 (? super T)&#xff1a; 三、思考 四、综合练习 Animal类及其javabeen Cat类 Dog类 H…

04 设计模式-创造型模式-建造者模式

建造者模式是一种创建型设计模式&#xff0c;它允许你创建复杂对象的步骤与表示方式相分离。 建造者模式是一种创建型设计模式&#xff0c;它的主要目的是将一个复杂对象的构建过程与其表示相分离&#xff0c;从而可以创建具有不同表示形式的对象。 设计模式&#xff0c;最近…