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

【Git】Git的基本操作

前言

        Git是当前最主流的版本管理器,它可以控制电脑上的所有格式的文件。

        它对于开发人员,可以管理项目中的源代码文档。(可以记录不同提交的修改细节,并且任意跳转版本)

        本篇博客基于最近对Git的学习,简单介绍一下Git本地仓库的组成和基本操作(add、commit提交操作;log查看提交日志;reset回退版本等操作...)

        注意:当前我使用的centos7.6 云服务器下演示。 

一、Git的安装和本地仓库

1.git的安装和版本查看

        通过代码:git --version 查看当前git版本,再决定是否进行安装。

         如果没有就需要进行安装,在Linux下通过指令:sudo yum install -y git(默认当前你的用户存在管理员权限)

        如上便就安装成功。 

2.git本地仓库初始化与配置

        我们需要对git创建一个专门的仓库,git才能对仓库下的文件进行版本管理,而不是对于任意的文件。这里的“仓库”自然指的就是文件夹了。

        比如当前我创建一个test文件夹为git的本地仓库,进入test后,git就可以对其进行初始化和配置工作了。

命令:git init   

        初始化git仓库。

        会以当前目录作为git的本地仓库,本地仓库下的文件可以收到git版本管理。

        会新增隐藏文件夹.git。内部存在很多文件,它们是用来追踪管理Git仓库的,记住不可修改里面的内容。

        现在,我在test文件夹内,执行此命令,可以看到隐藏文件夹,tree现实其目录树可以看到很多文件。(里面很多文件我们之后会讲到)

         初始化后别忘了配置,git仓库存在一些配置:name和email,后续会用到:

命令:git config [--global] user.name "名字"git config [--global] user.email "email地址"

        配置git仓库的名字和email地址。

命令:git config -l

        可以查看当前本地仓库的配置项目。

命令 git config [--global] --unset [user.name|...]

        删除对应的config属性。

--global:

        上述命令中的[--global]可选项表明全局属性,即在当前主机的所有git本地仓库生效,如果是对应的全局生效,那么unset重置时也需要加上全局属性。

        这里随便配置一下用户为qihai,邮箱为123qihaiqaq@250.com(现编,和本篇博客后续操作无关)。

        现在将qihai删除,换成QiHai:

        现在试着将名字修改为qihai,全局模式设置,正常删除能删除么。

        此时加上全局选项删除才有效,删除后在普通将配置项修改为qihai:

3.认识本地仓库中的工作区、暂存区、版本库

        在具体操作git之前,我们需要认识工作区、暂存区、版本库这三个东西,后续我们操作的时候会更简单易懂的去理解。

        可以看到,在Git下管理我们的文件,首先需要在工作区添加到暂存区(add),其次在将暂存区的内容添加到HEAD指向的master中(commit),此时我们的Git才真正管理了工作区中的文件。 

        我们每次修改的文件,当提交到版本库中时,Git都会为其维护一个git对象,并且放在了object对象库下,其他区域内存放的就是指针。那么何为修改呢?

对于修改的理解就是一切对文件改动的地方:

1.删除、创建

2.增加内容、删除内容

简而言之:新增、修改、删除被称作修改。

二、工作区文件提交到版本库管理

1.将工作区的文件添加到暂存区中

        我们在当前Git本地仓库(工作区-除开.git文件外的地方)创建一个ReadMe文件,里面添加一行:Hello Git!

        现在将它提交到暂存区中。

命令:git add 文件名1 文件名2 ...

        这样可以批量或者单独添加一个多个文件到暂存区中去。

命令:git add .

        .是当前目录下的一个隐藏文件.,表示此目录下的全体文件,这样就可以一次性将工作区的文件添加到暂存区中。

        此时观察.git的目录可以发现已经创建出了index目录,说明已经为此次添加的工作区文件内容创建了git对象。

 

2.将暂存区内提交到HEAD指向的master中去

        将暂存区提交到master中去,此时对应的文件成功被Git管理了起来。

命令:git commit -m "本次提交的细节内容"

        将暂存区提交到版本库中去,此时文件被Git管理了起来。

3.打印从近到远的提交日志

        我们可以打印出最近的提交日志。

命令:git log

        打印出最近的Gitcommit提交日志。

命令:git log --pretty=oneline

        打印一行漂亮可观的提交日志。

        这里需要对日志中的内容进行阐释:

commit:是生成的hash-id,后续简称commit_id。

        一个commit_id指向的是一个git对象,也就是在add后创建的此次修改的git对象,保存此次提交的工作区修改数据。 

        一个id,比如:96cbd6922eaa24d8a28a8756b90ecf55cc06c15e。其中前两位96表示在object下的文件夹名,而cbd6922eaa24d8a28a8756b90ecf55cc06c15e就是保存的对象名。

​​​​​Author:为提交人的name和email。

Date:提交时间

下面的就是提交的细节信息

         现在我在工作区新增三个文件:file1,file2,file3.我现在一次性添加到暂存区并且提交。

        此时可以漂亮的打印日志查看:

 

        可以看见,此时只是打印出了commit-id和提交的细节内容,可以更加方便的进行查看。 

4.查看git对象中的内容

        那么对于git对象我们可以查看吗?当然可以,Git为我们提供了查看对应commit-idGit对象的命令。

命令:git cat-file -p commit-id

        -p是打印文件内容。

        此命令就是显示对应commit-id的Git对象内容。

        比如,现在我查看第一次提交的commit-id的内容:

        就可以看到与这次提交的相关信息,其中,我们当前可以关心的是tree,tree里存放的commit-id就是这次我们实际修改的工作区文件内容:

5.提交与.git相关的细节内容

        我们实际操作后其实关心的就是两个命令:add、commit。那么如何和我们的底层联系起来呢?

        首先add操作后如果存在文件修改,那么会创建index作为暂存区,并且将工作区的内容提交到index中去。(之前add后展示的有)

        那么现在从暂存区提交到HEAD中的指向区域,那么这个HEAD里到底是什么呢?

        可以看到,HEAD当前的指向就是.git目录下的refs/heads/master。那么master中存储的是什么呢?

        可以发现,master中存的就是最近一次的commit-id。对应的就是git文件,维护在Object对象库中的。 

        由此,我们可以简单总结一下:

    index:暂存区,放add新增的内容。
    head:指针,指向ref: refs/heads/master
    master:存放的是最新一次的commit id。->git对象,git对象维护到对象库中,查看git维护的文件。
    需要注意:commit只是将暂存区内的内容写入到版本仓库中的。

三、查看修改文件细节

        那么现在还有一个现实操作上的问题。就是我现在正在工作区中工作,我如何去查看当前工作区的文件和我版本库中当前版本的差异呢?

命令:git status

        查看当前Git仓库状态。

        即将当前Gitmaster存储的版本和暂存区、工作区的文件进行对比,查看差异。

        在当前提交完毕的情况下查看自然没有任何区别:

        现在我将ReadMe文件新增一行:Hello, Git and Linux!

 (注意echo的追加重定向>>本身是自动追加下一行,不用带"",如果带""后面的!会识别错误,注意踩坑)

        此时查看就能发现差异:

        可以发现,此时就是提示我们当前工作区的内容并没有添加到暂存区内(staged就是暂存区和index同样叫法)

         但是这里也只是大致的提示,我们可以详细查看暂存区和工作区的细节区别:

命令:git diff [HEAD] 文件名

        显示暂存区和工作区之间的详细差异。

        其中存在改动前(---)、改动后(+++)

        对于@@中的内容,-表示改动前,+表示改动后,数字具体表示从多少行开始,后面是连续的多少行。

        @@下面的修改内容+表示新增,-表示减少。

        加上HEAD 可以查看版本库和工作区之间的区别

 

         如果add后但是还没commit可以看到版本库和工作区之间的细节差异:

四、版本回退功能

1.版本常规跳转

        这是Git的重要功能之一,也是版本管理器最核心的部分。

        在我们提交的几个版本中,如果能够任意回退版本就能很方便我们的工作。

命令:git reset [--soft | --mixed | --hard] id

        回退到指定commit-id的版本。

        选项区别:

                1.soft:只回退版本库的内容

                2.mixed:版本库和暂存区进行回退。-默认选项

                3.hard:回退所有内容(工作区、暂存区、版本库)。

                        谨慎使用,容易造成数据丢失。

        id:可以是commit-id,也可以是git reflog中的部分id(后续介绍git reflog)

               id也可以是HEAD,表示当前Msater存储的上一个版本,HEAD^就是上上个版本,^可以不断增多,依次类推。

        在上面的示例中,我们有三个版本:

        现在,我想让全体跳转到第一个版本:

        可以发现,版本成功回退成功,并且此时我们打印日志会发现一件惊奇的事情:

 

        日志也是回退了的。那是不是把前两次的git文件删除了呢?那想回到之前的版本怎么办?

        别急,Git记录的修改文件并没有删除,我们可以利用之前的Git日志找到之前的提交版本commit-id即可,然后就可以回到我们的第三个版本:

2.查看所有提交的git命令

         那么如果此时我们找不到了之前版本日志,但是已经回退了版本怎么办?如何找到历史版本呢?(这里为了演示先回退到第一个版本)

命令:git reflog

        记录本地的每次的Git执行命令,不会随着版本回退得到修改。

        里面存在的一部分commit-id,使用reset一样可以进行回退。 

         可以发现,虽然一开始的log文件没了,但是我们还有rflog的救命稻草存在,按照部分commit-id使用reset进行回退即可。

3.撤销修改

        有些时候,我们在工作区工作,比如修改了两三天了,但是发现还是不行,想回退到一开始重新写,那么这个时候需要撤销修改。

        如果此时我们人工的去修改,会非常好时间并且还能把以前的代码给删了。

        Git为这样的操作提供了方案(基于历史的版本)

        对于三种工作区的操作,我们又可以将上述问题分解为如下的几种情况:

1.未进行add操作

命令:git checkout -- 对应文件

        此时会将工作区撤回到最近一次的add操作。

        比如目前我对ReadMe文件随便增加了一行数据,没有add操作。

        现在直接对工作区回退到上次add操作即可:

2.进行了add操作但是没commit操作

命令:git reset [--mixed | --hard] HEAD

        进行版本回退操作,选择mixed只对暂存区和版本库进行回退,对于工作区可以采用第一种,要么hard全部回退到上一次版本。

        结合上面的举的例子,现在我add了,但是没有commit。

 

        现在我先将暂存区和版本库回退到上个版本:

        然后在采用1的操作即可:

3.进行了commit操作,但是没有进行push操作

命令:git reset [--mixed | --hard] HEAD^

        进行版本回退操作,选择mixed只对暂存区和版本库进行回退上上个版本,对于工作区可以采用第一种,要么hard全部回退到上上次版本。

        结合上面的例子,这次我commit提交到了版本库中,但是没有push到远程仓库(后面的概念,以后会提到,这里只需理解没有进行此操作即可)

        实际上,这里也就是版本回退了。

五、对版本库文件的删除 

        如果,我们相对Git仓库下的文件机械能删除,并且想要被Git管理,一般是如下的步骤:

        1删除文件,2add到暂存区,3commit提交到版本库。完成对文件的删除。

        存在一个命令可以简化12步骤(将其结合在一起)

命令:git rm 文件名

        会删除对应文件,然后add到暂存区内。

        此时就可以完成对管理文件的删除。

相关文章:

【Git】Git的基本操作

前言 Git是当前最主流的版本管理器,它可以控制电脑上的所有格式的文件。 它对于开发人员,可以管理项目中的源代码文档。(可以记录不同提交的修改细节,并且任意跳转版本) 本篇博客基于最近对Git的学习,简单介…...

【超图】SuperMap iClient3D for WebGL/WebGPU —— 数据集合并缓存如何控制对象样式

作者:taco 最近在支持的过程中,遇到了一个新问题!之前研究功能的时候竟然没有想到。通常我们控制单个对象的显隐、颜色、偏移的参数都是根据对象所在的图层以及对象单独的id来算的。那么问题来了,合并后的图层。他怎么控制单个对象…...

intellij IDEA开发工具的使用(打开/关闭工程;删除类文件;修改类/包/模块/项目名称;导入/删除模块)

1,打开工程 打开IDEA,会看到如下界面 1栏目里是自己曾经打开过的project(工程),直接点击就好。如果需要打开其他工程,则点击open,会出下以下界面。 选择需要加载的project(工程&…...

抖音详情API:开发环境搭建与工具选择

随着短视频的流行,抖音已经成为了一个备受欢迎的社交媒体平台。对于开发人员而言,利用抖音详情API开发定制化的抖音应用具有巨大的潜力。本文将为你详细介绍开发抖音应用的开发环境搭建与工具选择,帮助你顺利地开始开发工作。 一、开发环境搭…...

IntelliJ IDEA [插件 MybatisX] mapper和xml间跳转

文章目录 1. 安装插件2. 如何使用3. 主要功能总结 MybatisX 是一款为 IntelliJ IDEA 提供支持的 MyBatis 开发插件 它通过提供丰富的功能集,大大简化了 MyBatis XML 文件的编写、映射关系的可视化查看以及 SQL 语句的调试等操作。本文将介绍如何安装、配置和使用 In…...

Havenask 分布式索引构建服务 --Build Service

Havenask 是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎,深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。本文针对性介绍了 Havenask 分布式索引构建服务——Build Service,主打稳定、快速、易管理,是在线系…...

vscode软件安装步骤

目录 一、下载软件安装包 二、运行安装包后 一、下载软件安装包 打开vscode官方网址,找到下载界面 链接如下:Download Visual Studio Code - Mac, Linux, Windows 我是windows电脑,各位小伙伴自己选择合适的版本,点击下载按钮…...

C语言中灵活多变的动态内存,malloc函数 free函数 calloc函数 realloc函数

文章目录 🚀前言🚀管理动态内存的函数✈️malloc函数✈️free函数✈️calloc函数✈️realloc函数 🚀在使用动态内存函数时的常见错误✈️对NULL指针的解引用✈️ 对动态开辟空间的越界访问✈️对非动态开辟内存使用free释放✈️使用free释放一…...

小细节处理

重载运算符&#xff1a;重载<运算符。 bool operator<(const Edge&s)const{return w<s.w;}...

【42页动态规划学习笔记分享】动态规划核心原理详解及27道LeetCode相关经典题目汇总

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…...

Python正则的匹配与替换

import re 查找时的注意事项&#xff0c;要查找的内容左右两边打出来&#xff0c;用真正的字符&#xff0c;不要用.*?&#xff0c;离查找内容远一点&#xff0c;再用.*? a /aksj<a>哈哈哈<a><p>拉阿鲁<p>\.askjp b re.findall(<a>(.*?)<…...

解决ELement-UI懒加载三级联动数据不回显(天坑)

最老是遇到这类问题头有点大,最后也是解决了,为铁铁们总结了一下几点 一.查看数据类型是否一致 未选择下 选择下 二.处理数据时使用this.$set方法来动态地设置实例中的属性&#xff0c;以确保其响应式 三.绑定v-if 确保每次重新加载 四.绑定key 五.完整代码...

【数据结构和算法】找出两数组的不同

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 哈希类算法题注意事项 2.2 方法一&#xff1a;哈希法 三、代码 3.1 方法一&#xff1a;哈希法 四…...

基于Python的B站排行榜大数据分析与可视化系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文介绍了一项基于Python的B站排行榜大数据分析与可视化系统的研究。通过网络爬虫技术&#xff0c;系统能够自动分析B站网址&#xff0c;提取大量相关文本信息并存储在系统中。通过对这些信息进行…...

MySQL一些常用命令

1、登录本地MySQL #一种是 mysql -u root -p; #(输入密码后回车)#另一种是 mysql -uroot -p123456; #(在-p后面直接带上密码)2、启动MySQL服务 net start mysql; 3、关闭MySQL服务&#xff1a; net stop mysql; 4、创建数据库 create database 数据库名; 5、创建数据…...

WPF 新手指引弹窗

新手指引弹窗介绍 我们在第一次使用某个软件时&#xff0c;通常会有一个“新手指引”教学引导。WPF实现“新手指引”非常方便&#xff0c;且非常有趣。接下来我们就开始制作一个简单的”新手指引”(代码简单易懂&#xff0c;便于移植)&#xff0c;引用到我们的项目中又可添加一…...

py注册登录界面

代码分析 引入tkinter库&#xff0c;并从中导入messagebox模块。 read_users()函数用于读取存储用户信息的文本文件"users.txt"。它打开文件并逐行读取&#xff0c;将每行的用户名和密码以空格分隔后存储在一个列表中&#xff0c;最后返回该列表。 login(username,…...

基于电商场景的高并发RocketMQ实战-Consumer端队列负载均衡分配机制、并发消费以及消费进度提交

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 【11来了】文章导读地址&#xff1a;点击查看文章导读&#xff01; &#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f3…...

【Java开发岗面试】八股文—数据库MySQLRedis

声明&#xff1a; 背景&#xff1a;本人为24届双非硕校招生&#xff0c;已经完整经历了一次秋招&#xff0c;拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验&#xff08;主要是校招&#xff09;&#xff0c;包括我自己总结的八股文、算法、项目介绍、HR面和面试…...

IntelliJ IDEA [设置] 隐藏 .idea 等 .XXX 文件夹

文章目录 1. 问题描述2. 解决办法3. 最后效果4. 特殊处理&#xff08;正常不需要此步骤&#xff09;总结 我们使用 IntelliJ IDEA 导入项目的时候&#xff0c;经常会看到一些 .XXX 的文件夹&#xff08;例如&#xff1a;.idea&#xff0c;.mvn&#xff0c;.gradle 等&#xff0…...

每日一题——LeetCode961

方法一 排序法&#xff1a; 2*n长度的数组里面有一个元素重复了n次&#xff0c;那么将数组排序&#xff0c;求出排序后数组的中间值&#xff08;因为长度是偶数&#xff0c;没有刚好的中间值&#xff0c;默认求的中间值是偏左边的那个&#xff09;那么共有三种情况&#xff1a;…...

基于Unity Editor开发一个技能编辑器可能涉及到的内容

基于Unity Editor开发一个技能编辑器&#xff0c;涉及到的方面较多&#xff0c;涵盖了Unity自身的GUI框架、序列化系统、自定义编辑器、脚本调用与数据存储等。下面是几个关键点和你可能会用到的类以及API&#xff1a; 自定义Inspector&#xff1a; 使用Editor类来重写组件的I…...

Ubuntu 22.04 安装ftp实现与windows文件互传

Ubuntu 22.04 安装ftp实现与windows文件互传 1、配置安装 安装&#xff1a; sudo apt install vsftpd -y使能开机自启&#xff1a; sudo systemctl enable vsftpd 启动&#xff1a; sudo systemctl start vsftpd创建ftp工作目录&#xff1a; sudo mkdir -p /home/ftp/uftp…...

EasyPoi使用案例

EasyPoi使用案例 easypoi旨在简化Excel和Word的操作。基于注解的导入导出&#xff0c;修改注解就可以修改Excel&#xff1b;支持常用的样式自定义&#xff1b;基于map可以灵活定义表头字段&#xff1b;支持一对多的导入导出&#xff1b;支持模板的导出&#xff1b;支持HTML/Exc…...

分布式系统架构设计之分布式数据存储的分类和组合策略

在现下科技发展迅猛的背景下&#xff0c;分布式系统已经成为许多大规模应用和服务的基础架构。分布式架构的设计不仅仅是一项技术挑战&#xff0c;更是对数据存储、管理和处理能力的严峻考验。随着云原生、大数据、人工智能等技术的崛起&#xff0c;分布式系统对于数据的高效存…...

javaEE -18(11000字 JavaScript入门 - 3)

一&#xff1a;事件 &#xff08;高级&#xff09; 1.1 注册事件&#xff08;绑定事件&#xff09; 给元素添加事件&#xff0c;称为注册事件或者绑定事件&#xff0c;注册事件有两种方式&#xff1a;传统方式和方法监听注册方式 传统注册方式 &#xff1a; 利用 on 开头的…...

LangChain.js 实战系列:入门介绍

&#x1f4dd; LangChain.js 是一个快速开发大模型应用的框架&#xff0c;它提供了一系列强大的功能和工具&#xff0c;使得开发者能够更加高效地构建复杂的应用程序。LangChain.js 实战系列文章将介绍在实际项目中使用 LangChain.js 时的一些方法和技巧。 LangChain.js 是一个…...

pyCharm 打印控制台中文乱码解决办法

解决方法 在 "File" -> "Settings" 中的控制台设置&#xff1a; 在 "File" -> "Settings" 中&#xff0c;你可以找到 "Editor" -> "General" -> "Console"。在这里&#xff0c;你可能会找到…...

计算机基础--Linux详解

一概述 Linux是一种自由和开放源码的类UNIX操作系统。它是由林纳斯托瓦兹于1991年首次发布的&#xff0c;并从那时起在全球范围内得到了广泛的应用和开发。Linux具有强大的可定制性&#xff0c;可以运行在各种硬件平台上&#xff0c;包括x86、ARM、MIPS等。它不仅广泛应用于服…...

基于OpenAI的Whisper构建的高效语音识别模型:faster-whisper

1 faster-whisper介绍 faster-whisper是基于OpenAI的Whisper模型的高效实现&#xff0c;它利用CTranslate2&#xff0c;一个专为Transformer模型设计的快速推理引擎。这种实现不仅提高了语音识别的速度&#xff0c;还优化了内存使用效率。faster-whisper的核心优势在于其能够在…...

东莞网站建设营销哪家好/排名网站

React学习01React简介React的特点React第一个例子虚拟DOM的两种创建方式虚拟DOM与真实DOM的区别JSXJSX练习模块与组件函数式组件类式组件组件属性stateReact事件bind的使用setState的使用state的简写方式props使用state进行实现(不建议使用)使用props批量传递props对props进行限…...

做网站vi系统是什么/百度网站客服

我采用得是STM32F10RC 参考得是STM32普中科技的给出得例子&#xff1a;https://www.bilibili.com/video/av30149282/?p45&#xff08;这里给出网址&#xff09; 1、基本介绍 包含有两个看门狗&#xff0c;独立看门狗&#xff1a;IWDG 窗口看门狗&#xff1a;WWDG 用来检测由…...

温州做网站哪家好/启动互联全网营销推广

点击文章最下方左下角” ,获得更多知识。1. 如图,在边长为4的正方形ABCD中,以点B为圆心,AB为半径画弧,交对角线BD与点E,则图中阴影部分的面积是(结果保留π )A.8&#xff0d;π B.16&#xff0d;2π C.8&#xff0d;2π D.8&#xff0d;π2. 如图,∠AOB&#xff1d;90,∠B&…...

wordpress 汉化包/汨罗网站seo

问题1解决启动服务&#xff1a;service mysqld start;/sbin/iptables -I INPUT -p tcp --dport 8011 -j ACCEPT #开启8011端口/etc/rc.d/init.d/iptables save #保存配置/etc/rc.d/init.d/iptables restart #重启服务#查看端口是否已经开放/etc/init.d/iptables status问题2解决…...

低价做网站/佛山网站建设模板

写入文件操作 加载文件模块操作 const fs require(fs/promises);实现写文件操作 let msg Hello World, 你好世界!;调用 fs.writeFile() 进行文件写入 // fs.writeFile(file, data[, options], callback) fs.writeFile(./hello.txt, msg, utf8, function(err) {// console.log…...

东方热线宁波论坛/北京seo推广公司

子模块6 活动目录用户和计算机子模块6 活动目录用户和计算机 技能一 计算机账户的管理 任务一 建立计算机账户 任务二 查看修改计算机账户属性 任务三 停用和启用计算机账户 任务四 移动计算机账户 任务五 管理客户机 任务六 删除计算机账户 子模块6 活动目录用户和计算机 技能…...