Git企业开发控制理论和实操-从入门到深入(二)|Git的基本操作

前言 

那么这里博主先安利一些干货满满的专栏了!

首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。

高质量博客汇总https://blog.csdn.net/yu_cblog/category_12379430.html

然后就是博主最近最花信息的一个专栏《Git企业开发控制理论和实操》希望大家多多关注!
Git企业开发控制理论和实操https://blog.csdn.net/yu_cblog/category_12419275.html?spm=1001.2014.3001.5482

博主的Github主页

里面都是一些博主自己做的项目,希望对大家有帮助。

Yufccode (Fengcheng Yu) · GitHubfocus on backend development. Yufccode has 12 repositories available. Follow their code on GitHub.https://github.com/Yufccode


Git的基本操作

创建本地仓库

命令:git init

创建好之后会多一个 .git 目录,里面是什么我们先不管,后面再说。

 不要手动修改里面的任何内容!

配置本地仓库

一进去之后首先要配置的两个东西,是一定要配置的

  • name
  • email

如果不配置在后续就会有一系列的问题。

配置使用 git config 命令

git config user.name "xxx"
git config user.email "xxx"

检查是否配置好了:

git config -l # 检查config中的所有配置

删除配置:

比如删除名字

git config --unset user.name

全局设置:

表示可以在当前机器下的所有仓库中都生效。

git config --global user.name "xxx" # 全局设置
git confit --global --unset user.name # 全局重置

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

现在,请问这个git仓库可以管理这个README.md吗?

答案是还不可以。因为本质上.git才是仓库,外面不是。

但是.git是绝对不允许手动修改的。

其实.git里面叫做版本库(仓库),外面叫做工作区。

那么怎么样才能让README.md被管理呢?要进行一些操作。

 

这张图的工作区,就是README.md所在的地方。

stage可以称作暂存区/索引,即/index

HEAD是一个指针,只想master,这个概念我们到后面再理解。

添加文件

git add

本质是添加到stage中!

命令:

git add # 后面跟上文件名
git add . # 添加当前所有问题
git add file.log test.txt # 添加指定文件

git commit

git commit -m "add my first file" # 这里不要乱写,这里写的是提交的细节,对后续维护很重要

git log

git log

可以打印从近到远的所有提交记录。

这个是经过哈希计算出来的,很大的数字。

git log --pretty=oneline # 这样可以打印的漂亮一点

学会看懂.git目录里的文件

我们可以看看完成了一系列操作后的目录结构,如下所示。

(base) [yufc@ALiCentos7:~/Src/Bit-Courses/GitDevelopment/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
│   ├── 0d
│   │   └── f05318450b3455603cd0b0fc2cb4f4c8faa366
│   ├── 86
│   │   └── 5a7036c778b72e201a13e65b37bc35cbd83ade
│   ├── 8d
│   │   └── 9ba68bb8b2dfea545ec559b43f9f08d4d362c0
│   ├── d3
│   │   └── b98d1ce30bb03f3140dee28718bbdf08579543
│   ├── e6
│   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│   ├── f4
│   │   └── 2df147c60543792b9b56e1118f11409d55e87a
│   ├── info
│   └── pack
└── refs
  ├── heads
  │   └── master
  └── tags
​
18 directories, 24 files

我们在刚才说了,add之后东西会被放到暂存区里面去:/index

暂存区 /index

然后我们可以在目录结构中找到这个index了。

add之后的内容就会放到index里面去的!

HEAD指针

我们还要看HEAD,刚才说了HEAD是一个指针,指向master。

就是指向master的

master

可以发现,master就是最新的一次提交的commit id 

我们刚才说了,master里面存放的都是对象object的索引,可以把commit id理解成一个对象

object对象

那么如何查看object对象里面的具体内容呢?

首先要把上面的 commit id 分成两部分来看。

前两位,也就是f4表示文件夹的名称,后面表示文件名,如图所示。

但是现在查看不能直接cat了,要用一个特殊的命令

git cat-file -p [commit id]

最新的一次提交的描述信息,就写在这里。

学到这里,我们可以输出一个结论:Git追踪管理的其实就是修改,而不是文件!

修改文件

git status命令

先介绍一个命令,用于查看仓库的状态。

git status

我刚才在我的README.md里面新增了一行,然后git statues 告诉我:

Changes not staged for commit :暂存区中没有要修改的内容

修改的内容在工作区的README.md

git diff命令

git diff README.md

即:找出工作区和暂存区中README.md文件的差异。打印格式是Unix常用的diff格式。

 

修改后

我们git add .一下之后,再git status试一下

 

提交看看。

版本回退

回退操作

重点命令:

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

直接上例子。

我们的README.md其实是有两个版本的,一个是一开始的版本,一个是添加一行后的版本。

git reset本质是回退版本库中的内容。

--soft--mixed--hard
只回退版本库中的内容,工作区和暂存区不变版本库+暂存区回退,工作区不变回退所有区域中的内容

默认使用--mixed选项。

--hard慎用,因为如果我正在工作区进行开发,但是调用了--hard的回退,工作区的内容就直接丢失了。

在操作直线先看看日志。

 

调用git reset

回退之后,在add my first file这一次修改之后的所有修改,都会直接被回退。

如果后续需要撤销修改:也是执行git reset命令。

如果你的bash还没clear,还是能看到刚才的commit id

那直接调用git reset也是可以撤销的。

那如果你屏幕clear了呢?也是可以撤销的。

git reflog # 它可以看到本地每一次的提交命令

前面那些短的数字和字母,其实就是 commit id 的一部分。用这一部分也是可以回退的。

回退本质

本质就是一个指针动来动去而已。

撤销修改

如果我们在工作区在一个版本基础上继续开发,但是越写越觉得自己的代码是垃圾,写不下去了,想直接回到修改前的版本。

首先是有三个场景:

  • 只在工作区中改了

  • add了但没有commit

  • commit了

情况一:仅在工作区中进行了修改

git checkout -- README.md

这个命令可以让文件撤销到上一次add时候的状态。

注意:命令中的--是很重要的,如果不加--,命令是另外一个含义。

情况二:add了但没有commit

先把准备工作做一下,把工作区和暂存区的弄成一致的先。

利用git reset就行

git reset --hard ... # 这个命令也可以回退到和当前版本库内容一致的版本下,即版本库啥样就回退到啥样
git reset --hard HEAD # 表示回退到当前版本
git reset --hard HEAD^ # 表示回退到上一个版本
git reset --hard HEAD^^ # 表示回退到上两个版本,以此类推
# 当然这里面reset的选项可以自己选

情况三:已经commit

同样可以利用git reset命令。

那么我们知道HEAD是当前版本,HEAD^是上一个版本,所以情况三也是很好解决的。

git reset --hard HEAD^ # 三个区都回退到上个版本

注意:情况三有一个大的前提条件,即:commit之后没有push操作。

至于什么是push操作后续才会讲解。

为什么要有这个前提呢,不是说push了我们的代码就改不了,而是说,在企业中,跑的代码是远程仓库中的代码,不是我本地的代码。

撤销的目的:就是不影响远程仓库的代码。

删除文件

方法一

在工作区rm之后,addcommit就行了。

方法二

使用git提供的命令。

git rm file1

这个命令可以帮我们做两件事:

  • 删除工作区中的file1

  • 删除暂存区中的file1

因此我们再git commit一下就能完成删除了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3+Pinia+Koa+Three.js 全栈电商项目总结复盘

前言 前几天一个朋友去义乌旅游,带回来很多小商品,就是一整个物美价廉,但是为什么线下购物和网购有的时候差别这么大(网购经常要退换货啊😭😭😭),为此我萌生了一个想法&…

Nginx详解 第三部分:Nginx高级配置(附配置实例)

Part 3 一、网页的状态页二、Nginx第三方模块2.1 echo 模块 三、变量3.1 内置变量3.1.1 常用内置变量3.1.2 举个例子 3.2 自定义变量 四、自定义访问日志 (优化)4.1 自定义访问日志的格式4.2 自定义json 格式日志 五、Nginx压缩功能(重要)六、HTTPS 功能…

集合框架-(Collection/Map)

1.单列集合 1.1基础概要 集合中存储的是对象的地址信息,想要输出对象的信息,需要在具体的类中重写toString()方法 Collection代表单列集合,每个元素数据只包含一个值 List集合:添加的元素可以是有序、可…

2023年最新 Github Pages 使用手册

参考:GitHub Pages 快速入门 1、什么是 Github Pages GitHub Pages 是一项静态站点托管服务,它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件,(可选)通过构建过程运行文件,然后发布网站。 可…

tensordataset 和dataloader取值

测试1 from torch.utils.data import TensorDataset,DataLoader import numpy as np import torch a np.array([[1,2,3],[2,3,3],[1,1,2],[10,10,10],[100,200,200],[-1,-2,-3]]) print(a)X torch.FloatTensor(a) print(X)dataset TensorDataset(X,X)测试2 from torch.uti…

Java接收json参数

JSON 并不是唯一能够实现在互联网中传输数据的方式,除此之外还有一种 XML 格式。JSON 和 XML 能够执行许多相同的任务,那么我们为什么要使用 JSON,而不是 XML 呢? 之所以使用 JSON,最主要的原因是 JavaScript。众所周知…

vscode流程图插件使用

vscode流程图插件使用 1.在vscode中点击左下角设置然后选择扩展。 2.在扩展中搜索Draw.io Integration,安装上面第一个插件。 3.安装插件后在工程中创建一个后缀为drawio的文件并且双击打开即可绘制流程图

SpringBoot项目在启动后自动关闭

问题描述: 今天搭建了一个SpringBoot项目,但是在启动之后就自行关闭了,就像下面这样: 原因分析:在创建SpringBoot项目的时候,Web的依赖没有导入,默认以普通java项目运行导致的终止。 解决方案…

比较重合点的排斥能

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由5张二值化的图片组成,让A中有2个1,B中有1个1,有一个点重合,排列组合,统计迭代次数并排序。 得到数据 构造平均列A 构造平均列…

【GoLang】go入门:go语言执行过程分析 常见数据类型(基本数据类型)

1、go语言执行过程分析 【1】执行流程分析 通过 go build 进行编译 运行上一步生成的可执行文件 通过 go run 命令直接运行 【2】上述两种执行流程的区别 在编译时,编译器会将程序运行时依赖的库文件包含在可执行文件中,所以可执行文件会变大很多通过g…

Git入门

本文主要介绍Git的入门知识。首先讲述版本控制工具的一些背景, 然后介绍如何在你自己的系统上安装.配置和运行Git。学完本文,你将明白Git是怎么来的、为什么需要Git,并掌握使用Git的基础知识。 一、版本控制 什么是“版本控制”,为什么需要它?版本控制是…

Python OCR 使用easyocr库将图片中的文章提取出来

Python OCR 使用easyocr库将图片中的文章提取出来 初环境内容步骤一:安装easyocr库步骤二:导入必要的库步骤三:创建OCR阅读器对象步骤四:指定要识别的图片路径步骤五:执行OCR识别并提取文章内容步骤六:遍历…

Docker consul的容器服务注册与发现

前言一、服务注册与发现二、consul 介绍三、consul 部署3.1 consul服务器3.1.1 建立 Consul 服务3.1.2 查看集群信息3.1.3 通过 http api 获取集群信息 3.2 registrator服务器3.2.1 安装 Gliderlabs/Registrator3.2.2 测试服务发现功能是否正常3.2.3 验证 http 和 nginx 服务是…

Leetcode-每日一题【剑指 Offer 37. 序列化二叉树】

题目 请实现两个函数,分别用来序列化和反序列化二叉树。 你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 …

Vue2向Vue3过度Vue3状态管理工具Pinia

目录 1. 什么是Pinia2. 手动添加Pinia到Vue项目3. Pinia基础使用4. getters实现5. action异步实现6. storeToRefs工具函数7. Pinia的调试8. Pinia持久化插件 1. 什么是Pinia Pinia 是 Vue 的专属的最新状态管理库 ,是 Vuex 状态管理工具的替代品 2. 手动添加Pinia到…

【Java】树结构SQL数据的如何去实现搜索

这里写自定义目录标题 需要实现的效果前端需要的json格式:一定是一个完整的树结构错误错误的返回格式错误的返回格式实现的效果 正确正确的返回格式正确的展示画面 后端逻辑分析代码总览 数据库表结构 需要实现的效果 前端需要的json格式:一定是一个完整…

【算法】倍增-ST表

一.倍增 倍增是一种常用的算法技巧,通常用于优化时间复杂度。它的核心思想是将原问题分解成若干个规模较小的子问题,通过对子问题的求解来得到原问题的解。具体来说,倍增算法通常采用二分思想,将问题规模不断缩小,直到…

C#获取DataTable的前N行数据然后按指定字段排序

获取DataTable的前N行数据然后按指定字段排序 可以使用以下三种代码: 第一种:使用Linq DataTable dtLast dataTable.AsEnumerable().Take(count).OrderBy(dataRow > Convert.ToInt32(dataRow["Sequence"])).CopyToDataTable(); 第二种…

【Terraform学习】使用 Terraform 从 EC2 实例访问 S3 存储桶(Terraform-AWS最佳实战学习)

使用 Terraform 从 EC2 实例访问 S3 存储桶 实验步骤 前提条件 安装 Terraform: 地址 下载仓库代码模版 本实验代码位于 task_ec2_s3connet 文件夹中。 变量文件 variables.tf 在上面的代码中,您将声明,aws_access_key,aws_…

stm32之9.中断优先级配置

主函数main.c #include <stm32f4xx.h> #include "led.h" #include "key.h"#define PAin(n) (*(volatile uint32_t *)(0x42000000 (GPIOA_BASE0x10-0x40000000)*32 (n)*4)) #define PEin(n) (*(volatile uint32_t *)(0x42000000 (GP…