【Git】Git的基本操作

news2025/1/20 19:16:34

前言

        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到暂存区内。

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

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

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

相关文章

docker学习笔记05-TCP远程连接与docker compose简介

1.配置docker客户端远程访问 A.在另一台机器上安装客户端 远程访问,再搭建一台测试机,先安装包dockercli 客户端 yum install -y yum-utils --或者用阿里源 快些 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos…

Leetcode算法系列| 10. 正则表达式匹配

目录 1.题目2.题解C# 解法一:分段匹配法C# 解法二:回溯法C# 解法三:动态规划 1.题目 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 1.‘.’ 匹配任意单个字符 2.‘.’ 匹配任意单个字…

YOLOv8 上手体验

Yooooooo🎇 🥪环境搭建⚡注意💡CUDAPyTorch💡ultralytics 🦪食用💡cmd💡Python 🍲导出官方模型到本地 🥪环境搭建 ⚡注意 Python>3.8 PyTorch>1.8 💡C…

2023-12-30 AIGC-LangChain指南-打造LLM的垂域AI框架

摘要: 2023-12-30 AIGC-LangChain指南-打造LLM的垂域AI框架 LangChain指南-打造LLM的垂域AI框架 CHATGPT以来,Langchain 可能是目前在 AI 领域中最热门的事物之一,仅次于向量数据库。 它是一个框架,用于在大型语言模型上开发应用程序&#…

数据库原理与应用快速复习(期末急救)

文章目录 第一章数据库系统概述数据、数据库、数据库管理系统、数据定义、数据组织、存储和管理、数据操纵功能、数据库系统的构成数据管理功能、数据库管理的3个阶段以及特点数据库的特点、共享、独立、DBMS数据控制功能数据库的特点 数据模型两类数据模型、逻辑模型主要包括什…

每日一题——LeetCode961

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

【JavaEE进阶】 @RequestMapping注解

文章目录 🎄什么是RequestMapping 注解🌳RequestMapping 使⽤🌲RequestMapping 是GET还是POST请求?🚩使用Postman构造POST请求 ⭕总结 🎄什么是RequestMapping 注解 在Spring MVC 中使⽤ RequestMapping 来…

EasyNTS端口穿透服务新版本发布 0.8.7 增加隧道流量总数记录,可以知晓设备哪个端口耗费流量了

EasyNTS上云平台可通过远程访问内网应用,包含网络桥接、云端运维、视频直播等功能,极大地解决了现场无固定IP、端口不开放、系统权限不开放等问题。平台可提供一站式上云服务,提供直播上云、设备上云、业务上云、运维上云服务,承上…

m3u8网络视频文件下载方法

在windows下,使用命令行cmd的命令下载m3u8视频文件并保存为mp4文件。 1.下载ffmpeg,访问FFmpeg官方网站:https://www.ffmpeg.org/进行下载 ffmpeg下载,安装,操作说明 https://blog.csdn.net/m0_53157282/article/det…

用通俗易懂的方式讲解大模型:使用 FastChat 部署 LLM 的体验太爽了

之前介绍了Langchain-Chatchat 项目的部署,该项目底层改用了 FastChat 来提供 LLM(大语言模型)的 API 服务。 出于好奇又研究了一下 FastChat,发现它的功能很强大,可以用来部署市面上大部分的 LLM 模型,可以将 LLM 部署为带有标准…

精品Nodejs实现的校园疫情防控管理系统的设计与实现健康打卡

《[含文档PPT源码等]精品Nodejs实现的校园疫情防控管理系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: 操作系统:Windows 10、Windows 7、Win…

uniapp中uview组件库丰富的Calendar 日历用法

目录 基本使用 #日历模式 #单个日期模式 #多个日期模式 #日期范围模式 #自定义主题颜色 #自定义文案 #日期最大范围 #是否显示农历 #默认日期 基本使用 通过show绑定一个布尔变量用于打开或收起日历弹窗。通过mode参数指定选择日期模式,包含单选/多选/范围…

gitlab 11.11.8的备份与恢复及500错误的修复

gitlab已经集成了非常方便的备份和恢复命令,只要我们执行这些命令就能完成gitlab的备份与恢复了。 我想gitlab备份与恢复的目的无非就是将已经运行了很久的旧的gitlab服务,迁移到新的服务器上。如果你旧的gitlab上项目很少,就需要考虑迁移服…

基于ElementUI二次封装el-table与el-pagination分页组件[实际项目使用]

效果&#xff1a; 二次封装el-table组件 <template><div><!-- showHeader:是否显示头部size:表格的大小height:表格的高度isStripe:表格是否为斑马纹类型tableData:表格数据源isBorder:是否表格边框handleSelectionChange:行选中&#xff0c;多选内容发生变化回…

基于虚拟机ubuntu的linux和shell脚本的学习,以及SSH远程登陆实战

简介 特点 是一款操作系统,跟windows,macos一样,有下面的特点 简单和高效,一切皆文件,所有配置都通过修改文件解决,不需要繁琐的权限和设置 权限高,把所有细节都交给用户,可完全自定义 安全,所有程序只有自己执行才会启动 分类 1、debian系主要有Debian&#xff0c;Ubun…

yolov8实战第四天——yolov8图像分类 ResNet50图像分类(保姆式教程)

yolov8实战第一天——yolov8部署并训练自己的数据集&#xff08;保姆式教程&#xff09;_yolov8训练自己的数据集-CSDN博客在前几天&#xff0c;我们使用yolov8进行了部署&#xff0c;并在目标检测方向上进行自己数据集的训练与测试&#xff0c;今天我们训练下yolov8的图像分类…

PHP序列化总结1--序列化和反序列化的基础知识

序列化和反序列化的作用 1.序列化&#xff1a;将对象转化成数组或者字符串的形式 2.反序列化&#xff1a;将数组或字符串的形式转化为对象 为什么要进行序列化 这种数据形式中间会有很多空格&#xff0c;不同人有不同的书写情况&#xff0c;可能还会出现换行的情况 为此为了…

C# Image Caption

目录 介绍 效果 模型 decoder_fc_nsc.onnx encoder.onnx 项目 代码 下载 C# Image Caption 介绍 地址&#xff1a;https://github.com/ruotianluo/ImageCaptioning.pytorch I decide to sync up this repo and self-critical.pytorch. (The old master is in old ma…

07-项目打包 React Hooks

项目打包 项目打包是为了把整个项目都打包成最纯粹的js&#xff0c;让浏览器可以直接执行 打包命令已经在package.json里面定义好了 运行命令&#xff1a;npm run build&#xff0c;执行时间取决于第三方插件的数量以及电脑配置 打包完之后再build文件夹下&#xff0c;这个…

Self-attention学习笔记(Self Attention、multi-head self attention)

李宏毅机器学习Transformer Self Attention学习笔记记录一下几个方面的内容 1、Self Attention解决了什么问题2、Self Attention 的实现方法以及网络结构Multi-head Self Attentionpositional encoding 3、Self Attention 方法的应用4、Self Attention 与CNN以及RNN对比 1、Se…