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

Git的一些基本操作

初始git

我们给出下面的一个场景,在大学里,一些老师在我们做完实验之后喜欢让我们交实验报告,假设我们有一个比较追求完美的老师和一个勤奋的学生,这个学生叫做小帅,那天小帅桑勤奋的完成实验报告,在第二天的时候就去老师办公室教实验报告,但是这个老师一看小帅的实验报告,马上说这个实验报告不行,让你区改一下,这个时候就有我们第一版本的实验报告,然后你去改了好几次,也有好多版本的时候,假设小帅已经写了五个版本的时候,老师说”小帅啊,我看你是个勤奋的学生,是这样的,我看你这个报告还是第二次的最好,你把你第二次改的实验报告拿来就可以了”,因为小帅的实验报告是在每次的基础上改的,所以没有保留之前的版本,这个小帅的心中有一万头草泥马在奔跑,就这样勤奋的小帅被刁钻的老师打败了,这个时候git的作用就可以体现出来了,他就是一个版本控制器,我们可以理解有了它,小帅就能轻松的找出第二个版本的实验报告,因为每一次的实验报告git都会记录下来,但是git可不是仅仅记录实验报告用着,对程序员来说,就是一个可以管理我们源代码的一个重要工具。

为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你 了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和 版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。
⽬前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的⽂件,例如 doc、excel、dwg、 dgn、rvt等等。对于我们开发⼈员来说,Git 最重要的就是可以帮助我们管理软件开发项⽬中的源代码 ⽂件!
 注意事项
还需要再明确⼀点,所有的版本控制系统,Git 也不例外,其实只能跟踪⽂本⽂件的改动,⽐如 TXT ⽂ 件,⽹⻚,所有的程序代码等等。版本控制系统可以告诉你每次的改动,⽐如在第5⾏加了⼀个单词 “Linux”,在第8⾏删了⼀个单词 “Windows”。 ⽽图⽚、视频这些⼆进制⽂件,虽然也能由版本控制系统管理,但没法跟踪⽂件的变化,只能把⼆进 制⽂件每次改动串起来,也就是只知道图⽚从100KB改成了120KB,但到底改了啥,版本控制系统不 知道,也没法知道

git的本质就是一个版本控制器 

git的安装

我们可以先来查询一下我们的云服务器上是否存在git,输入指令

sudo yum -y install git

我们也可以在我们后面输入指令

git --version

来查看我们的版本(后面我演示都是在我自己的本地云服务器上)

[tjl@hecs-67680 ~]$ git --version
git version 1.8.3.1
[tjl@hecs-67680 ~]$ 

这样我们就可以查询我们的版本了。

Linux-ubuntu

如果你的平台是ubuntu我们可以执行下面的指令来安装git

sudo apt-get install git -y

 查询git的版本还是下面的这个条指令

git --version

这样我们的第一步完成了。

创建本地仓库

首先我们需要在本地创建一个目录,因为我们现在知道git是一个版本控制器,所以就应该在一个目录下进行对我们文件进行管理。

创建出目录指令

mkdir gitcode

然后我们进入目录,别忘记进入目录是cd指令

cd gitcode

然后我们在当前目录下输入指令

git init

就可以对我们的仓库进行初始化了。

我们执行指令就可以看到我们下面的结果

[tjl@hecs-67680 gitcode]$ ll -a
total 12
drwxrwxr-x  3 tjl tjl 4096 Feb  5 11:46 .
drwx------ 20 tjl tjl 4096 Feb  4 21:17 ..
drwxrwxr-x  8 tjl tjl 4096 Feb  4 22:34 .git

因为我这里直接创建过东西,所以有一些东西不一样,我把它删了,看到的就是这个东西

先来了解这里.git是一个什么东西,它就是版本库,我们来看看下面的这个图

执行指令tree .git

可以看到这个就是.git版本库里面的东西,我们后面会一个一个讲解,比如这里的Head指针

对象库(objects)还有暂存区(index)这些,现在我们需要做的就是完成一些配置

我们直接执行下面的指令进行配置

git config --global user.name "内容(比如我写的就是姓名缩写)"
gti config --global user.email "最好输入就是你的邮箱,便于管理"

 我们这里如果没有加上--global就不是全局的,最好写成就是加上的,这样所有的地方都有你的记录,在企业中我们的姓名和邮箱这个是很重要的,因为这样就可以看到每次提交人的信息,以便有问题的时候可以找到你。

当然如果我们一开始设置错误的时候,我们也可以进行重置,指令就是

git config --unset user.name
git config --unset user.email

注意:我们的指令进行的时候可一定要在我们的仓库下执行,否则没有我用

认识⼯作区、暂存区、版本库

图来

啥是我们的工作区,啥是我们的版本库呢???

首先在我们的仓库下,也就是我们的目录下,除了.git的区域就是我们的工作区,而我们的.git就是版本库了,那他们有是联系吗。

首先就是我们这里就需要来了解一下两条指令

git add [文件名]//将我们工作区的内容提交到暂存区
git commit -m "标签"//将我们的内容提交到版本库中,会有一个HEAD的指针来进行指示

只有在commit之后我们的内容才会真正的进入版本库中了

 

这里需要扩展的一点因为我们的 暂存区其实是一个轻量级的库,所以其实我们一些修改的内容在add的时候是放在对象库中,这里修改的内容是指哪些呢,首先就是新增文件,在文件里添加内容,删除文件,这些操作都会存在对象库中。然后我们的暂存区就会从里面拿出内容add进去。

我们现在我们目录下,也就是工作区创建出一个文件叫做ReadMe,并用vim在里面添加一些文本内容。

[tjl@hecs-67680 gitcode]$ vim ReadMe
[tjl@hecs-67680 gitcode]$ ll
total 4
-rw-rw-r-- 1 tjl tjl 10 Feb  5 12:12 ReadMe
[tjl@hecs-67680 gitcode]$ cat ReadMe 
Hello Git

然后进行git add进行添加到我们的暂存区当中。

git add ReadMe 

那要彻底的放到我们的版本库中的话需要执行的指令就是git commit -m "first add"

执行指令可以看到以下的场景。

[tjl@hecs-67680 gitcode]$ git commit -m "the first add"
[master a6900ba] the first add1 file changed, 1 insertion(+), 2 deletions(-)

我们也可以继续用git log来查询我们的提交记录

因为之前提交过内容,所以大家看的这里比较多,但是其实如果大家一开始什么都没提交的话,请情况只有这里的第一条内容,我们这里可以看到每次提交的时间,还有姓名和邮箱,这样就话在企业里也可以对你进行很好的管理。

我们也可以只打印这里的commit ID

[tjl@hecs-67680 gitcode]$ git log --pretty=oneline
a6900ba4258d83df1a8e67c1f4f2ffed32946633 the first add
3e54e85c13b3492b5a27fed80d8e3baa19c247ec the second commit
f9cca32c3296b756ff8fe68371280e1f2bab5828 the first commit

 

需要说明的是,我们看到的⼀⼤串类似 23807c5...56eed6 的是每次提交的 commit id (版本
号),Git 的 commit id 不是1,2,3……递增的数字,⽽是⼀个 SHA1 计算出来的⼀个⾮常⼤的数 字,⽤⼗六进制表⽰(你看到的 commit id 和我的肯定不⼀样,以你⾃⼰的为准)

 因为为了更好的演示后面的一些操作我们这里还需要添加一些文件,大家可以看看我下面的操作,就不讲解没一个操作是怎样的,因为很简单。

[tjl@hecs-67680 gitcode]$ touch test1 test2
[tjl@hecs-67680 gitcode]$ git add test1 test2
[tjl@hecs-67680 gitcode]$ touch test3
[tjl@hecs-67680 gitcode]$ git add test3
[tjl@hecs-67680 gitcode]$ git commit -m "commit test"
[master a9ff80a] commit test3 files changed, 0 insertions(+), 0 deletions(-)create mode 100644 test1create mode 100644 test2create mode 100644 test3
[tjl@hecs-67680 gitcode]$ 

再来打开我们.git

现在我们就可以清楚的看到一些变化,首先就是我们的暂存区(index)

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

 我们也可以来看看HEAD下的东西

[tjl@hecs-67680 gitcode]$ cat .git/HEAD
ref: refs/heads/master
[tjl@hecs-67680 gitcode]$ 

然后我们再来进入一个目录

[tjl@hecs-67680 gitcode]$ cat .git/refs/heads/master
a9ff80ab653911ff6127ef4450b04accf52eca4b

下面的这个ID其实就是我们最近一次commit的ID,这个ID就可以来来查看对象中的内容

[tjl@hecs-67680 gitcode]$ git cat-file -p a9ff80ab653911ff6127ef4450b04accf52eca4b
tree d2c1bc8d75fc468be739934ae0d1217eec64ce3b
parent a6900ba4258d83df1a8e67c1f4f2ffed32946633
author tjl <2357850265@qq.com> 1707107089 +0800
committer tjl <2357850265@qq.com> 1707107089 +0800commit test

这个就是我们的最近一次对这些文件的修改都被记录下来了

总结⼀下,在本地的 git 仓库中,有⼏个⽂件或者⽬录很特殊  

 

index: 暂存区, git add 后会更新该内容。
HEAD: 默认指向 master 分⽀的⼀个指针。
refs/heads/master: ⽂件⾥保存当前 master 分⽀的最新 commit id
objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改。

 这里继续添加两个指令

git status //来查看上次提交之后在工作区中的内容是否被修改
git diff [文件] //来显示工作区和暂存区的不同

啥意思呢???

就是我们在工作区是可以继续一些操作,比如我们是不是可以创建出文件,也可以在文件中新增内容,但是我们没有进行add操作,这些内容就还是在工作区,我们并没有将修改的对象加载到暂存区,所以就可以用git status 来查看,然后git diff可以更清楚的对比我们到底哪里进行修改,有人就会问,我刚修改的对象我怎么可能忘记呢!假如场景是下面的这个,有一天你写了代码提交了,然后你又改了,改好之后你妈叫你去吃饭了,然后你忘记提交了,三天之后你还记得你改在哪里了吗,所以git diff就可以来帮助我们解决这个问题

版本回退

之前我们也提到过,Git 能够管理⽂件的历史版本,这也是版本控制器重要的能⼒。如果有⼀天你发现 之前前的⼯作做的出现了很⼤的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本 回退的功能了。

有时候我们可能想找到上一版本的时候我们也可以通过版本回退的操作进行查找,指令就是以下的内容

 git reset [--soft | --mixed | --hard]  commitID

 

看这个图就可以来理解我们使用不同指令进行回退的时候应该加上那个指令

一般不建议加上 --haed,因为这个是把工作区,暂存区,版本库的内容都回退,虽然可以用指令查询到,但是如果commit ID变了的话就不能查询到了,反正建议就是最好不要用,。

 查询以往commitID可以用的指令

git reflog 

今天的内容就到这里,后面会继续更新git的内容!

 

相关文章:

  • MC34063异常发热分析
  • 【初识爬虫+requests模块】
  • 服务器与电脑的区别
  • 酷开科技,打造非凡的生活体验
  • vue-cli引入本地json数据:封装为js文件,无需请求直接读取
  • hive 创建表 字段类型
  • React+Antd实现省、市区级联下拉多选组件(支持只选省不选市)
  • 使用 git 上传文件时,运行 命令 git pull origin 时未成功,出现报错信息
  • Avalonia学习(二十三)-大屏
  • 【经典项目】Java实现打地鼠小游戏(附源码)
  • 8.Swift条件语句
  • 【0258】pg内核支持的所有 inval messages 类型
  • 悬而未决:daterangepicker设置默认选择日期时间后点确认无值的BUG
  • 5年前端仔的2023年终总结
  • 5-4、S加减单片机程序【51单片机+L298N步进电机系列教程】
  • co.js - 让异步代码同步化
  • CSS盒模型深入
  • DataBase in Android
  • ES6 学习笔记(一)let,const和解构赋值
  • If…else
  • Java 内存分配及垃圾回收机制初探
  • laravel 用artisan创建自己的模板
  • nfs客户端进程变D,延伸linux的lock
  • Python 反序列化安全问题(二)
  • Rancher-k8s加速安装文档
  • Redis 懒删除(lazy free)简史
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 我这样减少了26.5M Java内存!
  • 一、python与pycharm的安装
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 阿里云API、SDK和CLI应用实践方案
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • (BFS)hdoj2377-Bus Pass
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .NET 常见的偏门问题
  • @Controller和@RestController的区别?
  • @Import注解详解
  • @Not - Empty-Null-Blank
  • @Transactional 竟也能解决分布式事务?
  • [ 数据结构 - C++] AVL树原理及实现
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • []指针
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [Android Pro] AndroidX重构和映射
  • [Android学习笔记]ScrollView的使用