Git:Git的一些基本操作

文章目录

  • 基本认识
  • 使用方法
    • 创建本地仓库
    • 配置本地仓库
  • 工作区、暂存区、版本库的概念
  • 添加文件
  • 版本回退
  • 撤销修改
  • 删除操作

基本认识

首先要对Git有一个基本的认知:

Git本质上是一个版本控制器,可以对一个信息的多个版本进行一些控制,而能对版本的控制的好处就是,不管需要哪个版本的内容,都可以借助Git这个工具找到所需要的信息

Git是一个软件,它又是客户端又是服务器
Git是一个只会记录变化的软件
Git是分布式软件,去中心化的

而我们熟知的所谓的GithubGitee,实际上都是网站,这两个网站都是基于Git软件搭建的网站,简单来说,就是让版本的管理可视化而非命令行,有助于进行版本的管理

使用方法

下面进行Linux中关于Git的一些使用场景:

创建本地仓库

在使用Git前,首先要对创建一个Git的仓库:

git init

此时目录下看似没有信息,实际上已经有了一个信息:.git

在这里插入图片描述
而这个.git中是存在许多信息的:

在这里插入图片描述
而这个文件就是代码在本地的一个仓库,仓库就创建好了

配置本地仓库

对于本地仓库的配置,首先要配置的是nameemail的信息

配置name和email

# 配置用户名为xxx
git config user.name "xxx"
# 配置邮箱地址为xxxxxx
git config user.email "xxxxxxxxxx"
# 查看配置的信息
git config -l

删除name和email

信息有录入的途径,也会有删除的途径,Git本地仓库配置删除操作有:

# 删除name
git config --unset user.name
# 删除email
git config --unset user.email

此时再次查看配置信息就没有之前的信息了

–global的概念

在录入信息和删除中可以加入--global这个选项:

git config --global user.name "xxx"
git config --global user.email "xxxxxxxxxx"
git config --global --unset user.name
git config --global --unset user.email

这个选项的意思是,表示这台机器上的所有的Git仓库都采用了这个配置,因为在一台机器上是可以存在多个仓库的

为什么要配置仓库的用户名和邮箱?

这是由于Git本身的功能决定的,对于一个人提交的代码来说,在一个大型项目中重要的一步是这个项目的代码可以溯源,当找到一份异常的提交后,可以根据提交者的用户名和邮箱找到这份代码对应是由谁来完成的,这是Git所应具备的一项功能,因此在提交代码前需要将仓库信息进行初步的配置

工作区、暂存区、版本库的概念

在Git仓库中有上面的三个名词,那么三个词的概念如下:

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

暂存区:也叫做stage或index,一般来说是出于.git目录下的index文件下,也叫做索引

版本库:也叫做仓库,版本库中有一个隐藏的目录.git,前面也有提到这是一个隐藏文件,而这个.git实际上就是我们所谓的仓库,实际上它不算是工作区,是Git的一个版本库,这个版本库中的所有文件都能被Git进行管理,对于工作区中文件的各种操作,比如说新增删除等都能进行一定的追踪,在未来可以对于某个版本进行还原等操作

下面用一张图来阐述这三个区的一个基本概念:

在这里插入图片描述
上图就表明了关于Git中的三个模块的一个基本概念,左侧就是工作区,右侧是版本库,版本库中又存在了一个临时暂存区和master的概念,而实际上版本库中还有对象库的概念,也就是objects,对象库中存储的是关于这些文件的一个索引

关于版本库中还有一个HEAD,这个HEAD其实是一个指针,文件是树形结构,因此必须有一个头指针用来对文件进行一些操作

下面对于工作区和版本库的一些操作进行阐述:

当对于工作区进行修改的时候,如果执行了git add的命令,那么出于暂存区的目录树的内容就会被更新,文件的索引也会被更新,但是这些更新都是暂时的,因为这些信息都被存储在暂存区中,而commit的存在就是对于master分支的一个更新,也就是说,只有在进行了commit的操作后,master的分支进行了相应的更新,也就可以理解为是暂存区的目录树进入到了真正的版本库中

由此可以引出一些结论:

首先要明确的是,.git就是我们所谓的仓库,但不能直接向仓库中写入东西,应该要在仓库所在的工作区下进行写入或其他操作

如果只是用新建或粘贴等的一些操作,并不能是向仓库中添加文件,只是在工作区进行了一定的写入和修改,必须要用add的操作将你所修改的目录树上传到stage暂存区,再从暂存区中commit文件到仓库,才能真正进行管理

添加文件

上面总结了一些关于文件的操作,那么下面具体的使用:

现在在.git所在目录下新建了一个test文件,那么就可以使用add的命令把文件添加到暂存区

# test所指的是文件名
git add test
# 表示直接将当前目录下的所有内容都新增到暂存区
git add .

再使用commit的命令将暂存区的内容都添加到本地仓库中

# message表示的就是关于本次提交的一些描述性的语言,用来记录提交细节
git commit -m "message"

查看.git文件

先看刚创建的git下的目录树:

[test@VM-16-11-centos GitCode]$ tree .git
.git
|-- branches
|-- config
|-- description
|-- HEAD
|-- hooks
|   |-- applypatch-msg.sample
|   |-- commit-msg.sample
|   |-- post-update.sample
|   |-- pre-applypatch.sample
|   |-- pre-commit.sample
|   |-- prepare-commit-msg.sample
|   |-- pre-push.sample
|   |-- pre-rebase.sample
|   `-- update.sample
|-- info
|   `-- exclude
|-- objects
|   |-- info
|   `-- pack
`-- refs|-- heads`-- tags

现在我们创建了一个test文件,接着把这个文件进行addcommit操作:

[test@VM-16-11-centos GitCode]$ tree .git
.git
|-- branches
|-- COMMIT_EDITMSG
|-- config
|-- description
|-- HEAD
|-- hooks
|   |-- applypatch-msg.sample
|   |-- commit-msg.sample
|   |-- post-update.sample
|   |-- pre-applypatch.sample
|   |-- pre-commit.sample
|   |-- prepare-commit-msg.sample
|   |-- pre-push.sample
|   |-- pre-rebase.sample
|   `-- update.sample
|-- index
|-- info
|   `-- exclude
|-- logs
|   |-- HEAD
|   `-- refs
|       `-- heads
|           `-- master
|-- objects
|   |-- 22
|   |   `-- 7d6160665cbf086283c40409fe293725aba9c0
|   |-- de
|   |   `-- 52fd134820bcfe69a77b154d8f429ba43d954a
|   |-- f2
|   |   `-- 2a908e15bc9989e5a8de489dd757e37ca2e728
|   |-- info
|   `-- pack
`-- refs|-- heads|   `-- master`-- tags

使用git log命令可以查看历史的提交记录:

在这里插入图片描述
则此时显示的就是关于git提交的一些历史记录,这当中commit中有一组数据,我们要记录下来:

#  commit后生成的一段十六进制编号
de52fd134820bcfe69a77b154d8f429ba43d954a

下面对比进行提交前后的目录树:

在这里插入图片描述
从中可以看出的第一个变化,就是提交后的目录树新增了一个index目录,而这也印证了前面所说的关于Git的暂存区的概念

前面又提到了,HEAD就是默认指向master分支的一个指针,因此可以在Linux下查看HEAD指向的内容:

在这里插入图片描述
从内容中可以看出,master路径下存放的是一段编号:

de52fd134820bcfe69a77b154d8f429ba43d954a

而这段编号和我们前面所看到的内容是一样的,这段内容保存的就是当前最新的commit id

下面继续来看树更新的部分:

在这里插入图片描述
objects中也进行了一些更新,而前面说到过,objects实际上就是Git的对象库,里面包含了创建的各种版本库对象和内容,当执行git add的命令的时候,暂存区的目录树被进行了更新,同时工作区的内容就被写入了对象库中的一个新的对象中,而这个对象就位于objects目录下,那么如何查看这个路径下的内容?

在查找的时候要把commit id分成两个部分,前两位是文件夹的名称,后面是文件的名称,因此就定位到了de文件夹下的相关内容

而如何查看这个文件的具体内容?实际上这个内容是不可以被直接查看的,因为这个内容被安全哈希算法进行了一定程度的加密形成的文件,但也有解决方法,可以用git cat-file命令来查看版本库对象的内容

# xxxx表示的是commit id
git cat-file -p xxxx

在这里插入图片描述
由此可以看出,这个commit id下存储的信息就是当初在commit -m后所写的更新信息

由此我们可以看出:

  1. HEAD是一个默认指向master分支的一个指针
  2. refs/heads/master文件中存储的是当前master分支的最新的一个commit id
  3. objects中包含了创建的各种版本库对象的内容,可以说是存放了Git维护中的所有的修改

关于add和commit的一些额外命令

git status

该命令用于查看在你上次提交后是否对于文件有进行新的修改

# xxx表示要对比的文件名
git diff xxx

下面进行一些实验:

现在重新写一个内容进行更新:

在这里插入图片描述
此时这里使用vim又输入了一些内容,此时输入命令后就提示要先提交到暂存区,再进行提交,下面执行addcommit命令

在这里插入图片描述

此时就提示已经工作区没有需要提交的内容

版本回退

既然是版本控制工具,那么想要得到之前的版本也是应该具备的一项功能,那么在Linux中如何实现版本回退?

需要用到reset指令!

# soft表示只改变版本库
git reset --soft [commit id]
# mixed表示改变暂存区内容
git reset --mixed [commit id]
# hard表示将暂存区和工作区都退回到以前版本
git reset --hard [commit id]

因此从中看出,hard指令在使用的时候是需要慎重的,如果你所写的代码没有进行提交,直接使用这个命令会导致代码被覆盖

简单来说,git reset命令的核心就是前面所说的commit id,如果能找到commit id就可以实现一系列的功能,因此下面Git还提供了一个找commit id的方法:

git reflog

Git回退的机理是什么?

对于当前的Git版本来说,Git版本的回退是相当快的,因为在Git内部有一个指向当前分支的HEAD指针,而在master文件中存储着最新的commit id,因此当在回退版本的时候,Git仅仅是把master中存储一个特定的版本,而当回退的时候,只需要让HEAD指针指向的master指向前面的一个版本就可以了

撤销修改

本小节主要介绍的是关于Git使用中版本回退的问题:

下面展示多个场景的不同使用方法:

1. 对于工作区内还没有add的代码

  1. 直接手动删除

这样的操作是有风险的,可能会多删或其他问题情况出现

  1. 使用命令
# xxx表示文件名
git checkout -- xxx

这个命令的作用就是将当前工作区的代码回退到上一次add时所提交的代码

2. 对于已经add没有commit的代码

对于这种情况,可以考虑使用前面的reset命令,选项可以采用mixedhard都可以

这里要补充一点,reset并非必须使用commit id,也可以直接使用HEAD和^的组合:

# 这里的xxx可以是commit id,也可以直接写HEAD表示当前版本,也可以写HEAD^表示上一个或HEAD^^...
git reset [选项] xxxx

3. 对于已经commit没有push的代码

对于这种情况,直接使用HEAD^进行版本回退即可

git reset HEAD^

4. 如果进行push后的代码如何处理

此时涉及到远程仓库的概念,后面进行一些总结

删除操作

删除操作有两种:

  1. 直接使用Linux下的删除命令
rm -f [file]
git add [file]
git commit -m "xxx"
  1. 直接使用Git本身提供的删除命令
git rm [file]
git commit -m "xxx"

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

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

相关文章

腾讯mini项目-【指标监控服务重构】2023-08-16

今日已办 v1 验证 StageHandler 在处理消息时是否为单例,【错误尝试】 type StageHandler struct { }func (s StageHandler) Middleware1(h message.HandlerFunc) message.HandlerFunc {return func(msg *message.Message) ([]*message.Message, error) {log.Log…

mac 本地运行 http-proxy-middleware ,请求超时

const http require(http)"/customer": {target: "http://10.10.111.192:8080/",// target: "http://user.jinfu.baohan.com/",changeOrigin: true, // 是否启用跨域// 解决mac 代理超时问题headers: {Connection: "keep-alive"},// …

脚本:python绘制七夕爱心

文章目录 效果脚本Reference 效果 脚本 import random from math import sin, cos, pi, log from tkinter import *CANVAS_WIDTH 640 # 画布的宽 CANVAS_HEIGHT 640 # 画布的高 CANVAS_CENTER_X CANVAS_WIDTH / 2 # 画布中心的X轴坐标 CANVAS_CENTER_Y CANVAS_HEIGHT /…

WebGL 根据模型矩阵的逆转置矩阵计算运动物体的光照效果

目录 前言 坐标变换引起法向量变化 变化规律: 魔法矩阵:逆转置矩阵 逆转置矩阵的用法总结 Matrix4对象的 setInverseOf 、transpose 方法规范(以完成逆转置矩阵) 示例代码(LightedTranslatedRotatedCube.js&am…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS基础(二)

人生是旷野&#xff0c;不是轨道。 思维导图 一、运算符 1.1 赋值运算符 1.2 一元运算符 1.3 比较运算符 1.4 逻辑运算符 逻辑与&#xff0c;一假则假 逻辑或&#xff0c;一真则真 <!DOCTYPE html> <html lang"en"><head><meta charset&quo…

win10远程桌面控制Ubuntu服务器 - 内网穿透实现公网远程

文章目录 前言视频教程1. ubuntu安装XRDP2.局域网测试连接3. Ubuntu安装cpolar内网穿透4.cpolar公网地址测试访问5.固定域名公网地址 转载自cpolar极点云文章&#xff1a;树莓派使用Nginx 搭建轻量级网站远程访问 前言 XRDP是一种开源工具&#xff0c;它允许用户通过Windows R…

【力扣周赛】第 362 场周赛(⭐差分匹配状态压缩DP矩阵快速幂优化DPKMP)

文章目录 竞赛链接Q1&#xff1a;2848. 与车相交的点解法1——排序后枚举解法2——差分数组⭐差分数组相关题目列表&#x1f4d5;1094. 拼车1109. 航班预订统计2381. 字母移位 II2406. 将区间分为最少组数解法1——排序贪心优先队列解法2——差分数组 2772. 使数组中的所有元素…

Java 高频疑难问题系列一

​​​​​​​ 目录 ​编辑​​​​​​​ 1.零长度 2.redis的有序集的排序 3.Unsafe类 4.带资源的try语句 5.Spring如何实现计划任务 6.Java中普通代码块,构造代码块,静态代码块执行顺序 7.MyBatis缓存机制 8.Redis Java 2种类型操作转换 9.CAS底层原理和问题 1…

无涯教程-JavaScript - AGGREGATE函数

描述 返回列表或数据库中的聚合。 AGGREGATE函数可以将不同的聚合函数应用于列表或数据库,并且可以选择忽略隐藏的行和错误值。 AGGREGATE函数具有两种不同的格式- 参考格式数组格式 参考格式 语法 AGGREGATE (function_num, options, ref1, [ref2] …)争论 Argument描述…

【学习笔记】Java 一对一培训(2.1)Java基础语法

【学习笔记】Java 一对一培训&#xff08;2.1&#xff09;Java基础语法 关键词&#xff1a;Java、Spring Boot、Idea、数据库、一对一、培训、教学本文主要内容含Java简介、Java基础语法、Java对象和类、Java基本数据类型、Java变量类型、Java修饰符计划2小时完成&#xff0c;…

机器学习:PCA(Principal Component Analysis主成分)降维

参考&#xff1a;PCA降维原理 操作步骤与优缺点_TranSad的博客-CSDN博客 PCA降维算法_偶尔努力翻身的咸鱼的博客-CSDN博客 需要提前了解的数学知识&#xff1a; 一、PCA的主要思想 PCA&#xff0c;即主成分分析方法&#xff0c;是一种使用最广泛的数据降维算法。PCA的主要思想…

【计算机视觉】Vision and Language Pre-Trained Models算法介绍合集(一)

文章目录 一、ALIGN二、Contrastive Language-Image Pre-training&#xff08;CLIP&#xff09;三、Learning Cross-Modality Encoder Representations from Transformers&#xff08;LXMERT&#xff09;四、BLIP: Bootstrapping Language-Image Pre-training五、Vision-and-La…

带你进入桌面数控机床金工实训室

桌面型数控车床实训室 你知道中国哪所大学金工实训室拥有多的小型数控机床吗&#xff1f;答案是安徽工程大学。其国际工程师学院里面建了一栋新楼&#xff0c;专门分配了4个独立的房间作为实训室&#xff0c;占地300平方米&#xff0c;分别配置了小型数控车床&#xff0c;小型…

ES6中新增加的Symbol数据类型及其使用场景

聚沙成塔每天进步一点点 ⭐ 专栏简介在这里插入图片描述 ⭐ ES6中的Symbol数据类型⭐ 对象属性名称⭐ 防止属性冲突⭐ 内置Symbols⭐ 迭代器和生成器⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航…

chatgpt综述和报告

ChatGPT究竟强在哪&#xff1f;复旦大学邱锡鹏教授《大型语言模型的能力分析与应用》_哔哩哔哩_bilibili2022年底&#xff0c;美国OpenA1公司发布了ChatGPT&#xff0c;一个可以与人类对话交互的千亿规模参数的大型语言模型。它可以根据用户输入的指令完成各种语言相关的任务&a…

电商API的应用价值:淘宝1688京东API接口系列

API接口是一种软件应用程序&#xff0c;它充当两个不同软件应用程序之间的中介。它帮助不同的应用程序相互通信&#xff0c;共享数据&#xff0c;从而使用户能够完成不同的任务。API接口的用途非常广泛&#xff0c;下面是一些常见的用途&#xff1a; 数据共享&#xff1a;API接…

ChatGPT在职业规划中的智能助手

随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐成为我们日常生活的一部分。ChatGPT作为一种智能语言模型&#xff0c;可以在职业规划中充当智能助手的角色。本文将探讨ChatGPT在职业规划中的应用&#xff0c;以及它如何成为未来工作的智能伙伴。 首先…

2020-2023中国高等级自动驾驶产业发展趋势研究-中国高等级自动驾驶发展近况

1.2 中国高等级自动驾驶发展近况 通过对中国高等级自动驾驶行业的观察和分析&#xff0c;亿欧汽车认为&#xff0c;除技术解决方案提供商外&#xff0c;如今的车企、政府、资本同样在产业链中扮演重要角色。此外&#xff0c;车路协同技术的发展也为高等级自动驾驶的发展提供了更…

EagleSDR USB HAT FT600

给EagleSDR做了个USB 3.0的子卡&#xff0c;采用FT600方案&#xff0c;实物如下&#xff1a; 用FT600DataStreamerDemoApp测试&#xff0c;速度如下&#xff1a; 由于FT600是16bit的接口&#xff0c;如果用FT601的32bit接口&#xff0c;性能应该还会有大幅提升。 测试代码很简…

数据库基础

文章目录 1. 什么是数据库2. 服务器&#xff0c;数据库&#xff0c;表关系3. MySQL架构4. SQL分类 1. 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题 文件不利于数据查询和管理 文件不利于…