Git的基本操作(安装Git,创建本地仓库,配置Git,添加、修改、回退、撤销修改、删除文件)

文章目录

  • 一、Git安装
  • 二、创建本地仓库
  • 三、配置Git
  • 四、认识工作区、暂存区、本地库
  • 五、添加文件
  • 六、修改文件
  • 七、版本回退
  • 八、撤销修改
    • 1.对于⼯作区的代码,还没有add
    • 2.已经add,但没有commit
    • 3.已经add,并且已经commit
  • 九、删除⽂件


一、Git安装

Git 是开放源代码的代码托管⼯具,最早是在Linux下开发的。开始也只能应⽤于Linux平台,后⾯慢慢的被移植到windows下,现在,Git可以在Linux、Unix、Mac和Windows这⼏⼤平台上正常运⾏了。

如果你的的平台是centos,安装git相当简单,以我的centos7.6为例:

sudo yum -y install git

我们还可以用下面的指令来查询 git 的版本:

git --verison

二、创建本地仓库

要提前说的是,仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制,就必须先创建⼀个仓库。
创建⼀个 Git 本地仓库对应的命令为:

git init 

注意命令要在⽂件⽬录下执⾏,例如:

在这里插入图片描述

我们发现,当前⽬录下多了⼀个.git 的隐藏⽂件,.git ⽬录是Git来跟踪管理仓库的,不要⼿动修改这个⽬录⾥⾯的⽂件,不然改乱了,就把Git仓库给破坏了。

我们可以看看Git仓库的内容:

在这里插入图片描述

三、配置Git

当安装Git后⾸先要做的事情是设置你的用户名称e-mail地址,这是⾮常重要的。配置命令为:

设置配置
git config [--global] user.name "Your Name"   
git config [--global] user.email "email@example.com"  

删除配置
git config [--global] --unset user.name
git config [--global] --unset user.email

# 把Your Name 改成你的昵称
# 把email@example.com 改成邮箱的格式,只要格式正确即可。

其中--global 是⼀个可选项。如果使⽤了该选项,表⽰这台机器上所有的Git仓库都会使⽤这个配置。如果你希望在不同仓库中使⽤不同的 name 或 e-mail 可以不要--global 选项,注意,执⾏命令时必须要在仓库⾥

我们可以用git config -l来查看配置:

在这里插入图片描述

四、认识工作区、暂存区、本地库

每个 Git 项目的根目录下有一个 .git 目录,它是 Git 默默进行版本控制时读写的“数据库”。下面有几个概念:

  • 工作区:代码所在目录;
  • 暂存区: .git/index 文件
  • 本地仓库: .git 目录;

一个典型的工作流程如下图,绿色部分为工作区(Working Directory),对它进行任何修改(包括:新建文件、删除文件、文件重命名等)都和单纯的修改文件一样,不会涉及到版本控制。

通过新建或粘贴进⽬录的⽂件,并不能称之为向仓库中新增⽂件,⽽只是在⼯作区新增了⽂件。必须要通过使⽤git add 和 git commit 命令才能将⽂件添加到仓库中进⾏管理!!!

在这里插入图片描述

暂存区是一个包含文件索引的目录树.git/index 文件),记录了文件的元数据(文件名、文件长度、修改时间等),而文件内容则存放在 .git/objects 目录下。

用 Git 进行版本控制,实际上就是在工作区、暂存区、本地仓库三个地方进行文件信息的记录。

五、添加文件

我们可以使用git add .将当前⽬录下的所有⽂件改动添加到暂存区,也可以添加指定文件或目录:

添加⼀个或多个⽂件到暂存区:
• git add [file1] [file2] 

添加指定⽬录到暂存区,包括⼦⽬录:
• git add [dir]

此时我们发现objects目录下多了一个文件,而.git目录下也多了一个index目录:

在这里插入图片描述

然后再使用git commit将暂存区的内容添加到本地仓库中:

提交暂存区全部内容到本地仓库中:
git commit -m "message"

提交暂存区的指定内容到仓库区:
git commit [file1] [file2]... -m "message"

注意 git commit 后面的 -m 选项,要跟上描述本次提交的 message,由用户自己完成,
这部分内容绝对不能忽略,并要好好描述,是用来记录你的提交细节,是给程序员看的

在这里插入图片描述

我们可以使用git log 或者git log --pretty=oneline来查看历史提交信息:

在这里插入图片描述

需要说明的是,我们看到的⼀⼤串类似1c43…802的是每次提交的commit id (版本号),Git的commit id 不是1,2,3……递增的数字,⽽是⼀个SHA1计算出来的⼀个⾮常⼤的数字,⽤⼗六进制表示。

接下来我们来看看.git目录的内容:

  1. index 就是我们的暂存区,add后的内容都是添加到这⾥的。
  2. HEAD 就是我们的默认指向master分⽀的指针。
    在这里插入图片描述
    而默认的master分支,其实就是(这里保存了我们第一次提交的commit id):
    在这里插入图片描述
  3. objects 为Git 的对象库,⾥⾯包含了创建的各种版本库对象及内容。当执⾏git add 命令时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的对象中,就位于.git/objects⽬录下,让我们来看看这些对象有何⽤处:
    在这里插入图片描述
    查找objects时要将commit id 分成2部分,其前2位是⽂件夹名称,后38位是⽂件名称。找到这个⽂件之后,⼀般不能直接看到⾥⾯是什么,该类⽂件是使⽤sha(安全哈希算法)加密过的git cat-file 命令来查看版本库对象的内容:
    在这里插入图片描述

这是.git的整体结构:

在这里插入图片描述

六、修改文件

Git ⽐其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,⽽⾮⽂件

什么是修改?⽐如你新增了⼀⾏,这就是⼀个修改,删除了⼀⾏,也是⼀个修改,更改了某些字符,也是⼀个修改,,甚⾄创建⼀个新⽂件,也算⼀个修改。让我们将ReadMe⽂件进⾏⼀次修改:

在这里插入图片描述

此时,仓库中的ReadMe和我们⼯作区的ReadMe是不同的,如何查看当前仓库的状态呢?我们使用git status:

在这里插入图片描述

上⾯的结果告诉我们,ReadMe被修改过了,但还没有完成添加与提交。

⽬前,我们只知道⽂件被修改了,如果能知道具体哪些地⽅被修改了,就更好了。有同学会说,我刚改的我知道呀!可是,你还记得你三天前写了什么代码吗?或者没写?

在这里插入图片描述

git diff [file] 命令⽤来显⽰暂存区和⼯作区⽂件的区别,显⽰的格式正是Unix通⽤的diff 格式。也可以使⽤git diff HEAD -- [file] 命令来查看版本库和⼯作区⽂件的区别。知道了对ReadMe做了什么修改后,再把它提交到本地仓库就放⼼多了。

我们git add 、 commit后,工作区 clean,没有文件需要提交了!

在这里插入图片描述

七、版本回退

执⾏git reset 命令⽤于回退版本,可以指定退回某⼀次提交的版本。要解释⼀下“回退”本质是要将版本库中的内容进⾏回退,⼯作区或暂存区是否回退由命令参数决定

命令语法格式为:git reset  [-soft|-mixed|-hard] [HEAD]

--soft  参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
--mixed 为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容,⼯作区⽂件保持不变。
--hard  参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚,
		你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重。
		
HEAD 可直接写成commit id,表⽰指定退回的版本

HEAD   表⽰当前版本    HEAD~0 表⽰当前版本
HEAD^  上⼀个版本      HEAD~1 上⼀个版本
HEAD^^ 上上⼀个版本    HEAD~2 上上⼀个版本

我们对ReadMe文件进行3次提交,形成3个版本的ReadMe:

wml@hcss-ecs-e18a testgit]$ vim ReadMe 
[wml@hcss-ecs-e18a testgit]$ git add ReadMe 
[wml@hcss-ecs-e18a testgit]$ git commit -m 'version1'
[master b20581a] version1
 1 file changed, 1 insertion(+)
[wml@hcss-ecs-e18a testgit]$ vim ReadMe 
[wml@hcss-ecs-e18a testgit]$ git add ReadMe 
[wml@hcss-ecs-e18a testgit]$ git commit -m 'version2'
[master f7933bd] version2
 1 file changed, 1 insertion(+)
[wml@hcss-ecs-e18a testgit]$ vim ReadMe 
[wml@hcss-ecs-e18a testgit]$ git add ReadMe 
[wml@hcss-ecs-e18a testgit]$ git commit -m 'version3'
[master 8f06c3b] version3
 1 file changed, 1 insertion(+)

然后我们查看提交记录:

[wml@hcss-ecs-e18a testgit]$ git log --pretty=oneline
8f06c3b610971c0d8ef6694e0b1ca176e0317ef0 version3
f7933bd62a5abac4ac568e26ecbaf36adb279479 version2
b20581a5d7b7e59ba701d7ac878c82f380b55a1e version1
5c455e504433e0d7e2262f8a347a90dd1364e6f8 添加一些数据
1c435239ffe35b1dd3f763d618d9d48acf6b7802 第一次提交

现在,如果我们在提交完version3后,发现version3编写错误,想回退到version2,重新基于version 2 开始编写。由于我们在这⾥希望的是将⼯作区的内容也回退到要⽤到–hard 参数,示例如下:

在这里插入图片描述

如果我们后悔了呢?还能撤销回退到version3吗?如果我们能够找到version3的commit id,那么就可以!如果我们在终端的 git log 中找不到了,我们还能用git reflog来查找最近执行的指令:

在这里插入图片描述

Git 版本回退的速度非常快,,因为Git 在内部有个指向当前分⽀(此处是master)的HEAD指针,refs/heads/master ⽂件⾥保存当前 master 分⽀的最新commit id,当我们在回退版本的时候,Git 仅仅是给refs/heads/master 中存储⼀个特定的version。
在这里插入图片描述

八、撤销修改

1.对于⼯作区的代码,还没有add

例如我们向ReadMe文件中添加几行数据:

[wml@hcss-ecs-e18a testgit]$ cat ReadMe 
aaa
version1
version2
[wml@hcss-ecs-e18a testgit]$ vim ReadMe 
[wml@hcss-ecs-e18a testgit]$ cat ReadMe 
aaa
version1
version2
safasdfasf
agsdgsdg
gasdgasdg
gasdgasdga
adsgasg

我们可以直接删除(效率不高),也可以通过git checkout -- [file]让工作区的文件回到最近一次 addcommit时的状态。

在这里插入图片描述

2.已经add,但没有commit

我们向ReadMe文件中添加几行数据,用git add添加到暂存区:

[wml@hcss-ecs-e18a testgit]$ cat ReadMe 
aaa
version1
version2
[wml@hcss-ecs-e18a testgit]$ vim ReadMe 
[wml@hcss-ecs-e18a testgit]$ cat ReadMe 
aaa
version1
version2
fsdafdafsga
gasdgasdg
adsgagsdgas
gasdgsagas
gdasgasdgas
[wml@hcss-ecs-e18a testgit]$ git add ReadMe //add到缓存区
[wml@hcss-ecs-e18a testgit]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   ReadMe
#

我们的做法如下:

在这里插入图片描述

3.已经add,并且已经commit

我们向ReadMe文件中添加几行数据,用git add添加到暂存区,再用git commit提交到版本库。

[wml@hcss-ecs-e18a testgit]$ cat ReadMe 
aaa
version1
version2
[wml@hcss-ecs-e18a testgit]$ vim ReadMe 
[wml@hcss-ecs-e18a testgit]$ cat ReadMe 
aaa
version1
version2
fsadfsdg
gdasgsd
gadsgdsg
gasdgasdgasgg
[wml@hcss-ecs-e18a testgit]$ git add ReadMe 
[wml@hcss-ecs-e18a testgit]$ git commit ReadMe -m 'first commit'
[master bf00595] first commit
 1 file changed, 4 insertions(+)

我们的做法如下:

在这里插入图片描述

九、删除⽂件

在Git中,删除也是⼀个修改操作,如果我们想删除ReadMe文件:

在这里插入图片描述

此时,⼯作区和版本库就不⼀致了,要删⽂件,⽬前除了要删⼯作区的⽂件,还要清除版本库的⽂件。

走到这,一般有两种情况:误删了或者没删完!

对于误删,用git checkout -- [file]恢复:
在这里插入图片描述

对于没删完,这时就需要使⽤git rm从暂存区和⼯作区中删除,并且commit
在这里插入图片描述

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

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

相关文章

使用 ReclaiMe Pro 恢复任意文件系统(Win/Linux/MacOS)

天津鸿萌科贸发展有限公司是 ReclaiMe Pro 数据恢复软件授权代理商。 ReclaiMe Pro 是一个通用工具包&#xff0c;几乎可以用于从所有文件系统&#xff08;从 Windows 系列文件系统、Linux 和 MacOS&#xff09;中恢复数据。此外&#xff0c;考虑到数据恢复工作的具体情况&…

【组合递归回溯】【StringBuilder】Leetcode 17. 电话号码的字母组合

【组合递归回溯】【StringBuilde】Leetcode 17. 电话号码的字母组合 StringBulider常用方法&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;17…

【webpack】和【vite】中获取本地文件夹目录下的所有图片

1. webpack&#xff08;require.context&#xff09; const systemUrls ref<{ url: string; name: string }[]>([]);// 获取该目录下的所有svg文件const files require.context(public/icon, false, /\.svg$/);systemUrls.value files.keys().map((key) > {const f…

ROS 2基础概念#4:消息(Message)| ROS 2学习笔记

ROS 2消息简介 ROS程序使用三种不同的接口来进行沟通&#xff1a;消息&#xff08;message&#xff09;&#xff0c;服务&#xff08;service&#xff09;和动作&#xff08;action&#xff09;。ROS 2使用一种简化的描述语言&#xff1a;IDL&#xff08;interface definition…

【深入理解LRU Cache】:缓存算法的经典之作

目录 一、什么是LRU Cache&#xff1f; 二、LRU Cache的实现 1.JDK中类似LRUCahe的数据结构LinkedHashMap 2.自己实现双向链表 三、LRU Cache的OJ 一、什么是LRU Cache&#xff1f; LRU Cache&#xff08;Least Recently Used的缩写&#xff0c;即最近最少使用&#xff0…

游戏行业需要堡垒机吗?用哪款堡垒机好?

相信大家对于游戏都不陌生&#xff0c;上到老&#xff0c;下到小&#xff0c;越来越多的小伙伴开始玩游戏。随着游戏用户的增加&#xff0c;如何保障用户资料安全&#xff0c;如何确保游戏公司数据安全等是一个不容忽视的问题。因此不少人在问&#xff0c;游戏行业需要堡垒机吗…

数据结构----完全二叉树的时间复杂度讲解,堆排序

目录 一.建堆的时间复杂度 1.向上调整算法建堆 2.向下调整算法建堆 二.堆排序 1.概念 2.代码思路 3.代码实现 一.建堆的时间复杂度 1.向上调整算法建堆 我们就以极端情况考虑时间复杂度(满二叉树遍历所有层) 假设所有节点个数为N,树的高度为h N 2^02^12^2......2^(h-…

表的连接【MySQL】

文章目录 什么是连接测试表内连接外连接左外连接右外连接全外连接 自然连接交叉连接参考资料 什么是连接 数据库的连接是指在数据库系统中&#xff0c;两个或多个数据表之间建立的关联关系&#xff0c;使它们可以进行数据的交互和操作。连接通常基于某种共同的字段或条件&…

2.1_2 数据通信基础知识

文章目录 2.1_2 数据通信基础知识&#xff08;一&#xff09;典型的数据通信模型&#xff08;二&#xff09;数据通信相关术语&#xff08;三&#xff09;设计数据通信系统要考虑的3个问题&#xff08;1&#xff09;三种通信方式&#xff08;2&#xff09;串行传输 & 并行传…

开源的python 游戏开发库介绍

本文将为您详细讲解开源的 Python 游戏开发库&#xff0c;以及它们的特点、区别和应用场景。Python 社区提供了多种游戏开发库&#xff0c;这些库可以帮助您在 Python 应用程序中实现游戏逻辑、图形渲染、声音处理等功能。 1. Pygame 特点 - 基于 Python 的游戏开发库。…

C语言分析基础排序算法——交换排序

目录 交换排序 冒泡排序 快速排序 Hoare版本快速排序 挖坑法快速排序 前后指针法快速排序 快速排序优化 快速排序非递归版 交换排序 冒泡排序 见C语言基础知识指针部分博客C语言指针-CSDN博客 快速排序 Hoare版本快速排序 Hoare版本快速排序的过程类似于二叉树前序…

程序员常用小工具推荐

前言 工作或者学习时&#xff0c;常常有一些工具能帮到我们很多&#xff0c;本次简单列举和说明&#xff0c;如果有更多更好用的&#xff0c;欢迎讨论补充。 工具大全 网络分析工具 Wireshark,可以很清晰的解析和过滤网络包&#xff0c;也有助于分析网络的的传输原理。linux环…

基于FPGA的HyperRam接口设计与实现

一 HyperRAM 针对一些低功耗、低带宽应用&#xff08;物联网、消费产品、汽车和工业应用等&#xff09;&#xff0c;涉及到外部存储&#xff0c;HyperRAM提供了更简洁的内存解决方案。 HyperRAM具有以下特性&#xff1a; 1、超低功耗&#xff1a;200MHz工作频率下读写不到50mW…

新书速览|Vue.js 3.x+Element Plus从入门到精通(视频教学版)

详解Vue.jsElement Plus框架各组件的用法&#xff0c;实战网上商城系统和图书借阅系统开发 本书内容 《Vue.js 3.xElement Plus从入门到精通&#xff1a;视频教学版》通过对Vue.js&#xff08;简称Vue&#xff09;的示例和综合案例的介绍与演练&#xff0c;使读者快速掌握Vue.j…

计算机网络—eNSP搭建基础 IP网络

目录 1.下载eNSP 2.启动eNSP 3.建立拓扑 4.建立一条物理连接 5.进入终端系统配置界面 6.配置终端系统 7.启动终端系统设备 8.捕获接口报文 9.生成接口流量 10.观察捕获的报文 1.下载eNSP 网上有许多下载eNSP的方式&#xff0c;记得还要下其它三个Virtual Box、Winpa…

HSCCTF 3th 2024 Web方向 题解wp

WEB-CHECKIN【*没出】 直接给了源码 <?php highlight_file(__FILE__); error_reporting(0); $a$_POST[1]; $b"php://filter/$a/resource/dev/null"; if(file_get_contents($b)"2024"){echo file_get_contents(/flag); }else{echo $b; }咋这么像 WEB…

python文件组织:包(package)、模块(module)、文件(file)

包&#xff1a; 模块所在的包&#xff0c;创建一个包用于组织多个模块&#xff0c;包文件夹中必须创建一个名为’__init__.py’的文件&#xff0c;以将其识别为包&#xff0c;否则只能算作是一个普通的目录。在使用该包时&#xff0c;init自动执行。 包可以多层嵌套&#xff…

使用 ReclaiMe Pro 进行 RAIDZ 数据恢复

天津鸿萌科贸发展有限公司是 ReclaiMe Pro 数据恢复软件授权代理商。 ZFS 是一个开源文件系统&#xff0c;主要用于 FreeNAS 和 NAS4Free 存储系统。在开发 ZFS 时&#xff0c;主要目标是可靠性&#xff0c;这是通过写时复制、冗余元数据、日志等不同功能来实现的。ZFS 使用自…

Redis核心数据结构之跳跃表

跳跃表 概述 跳跃表(skiplist)是一种有序数据结构&#xff0c;它通过在每个节点中维持多个指向其他节点的指针&#xff0c;从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找&#xff0c;还可以通过顺序性操作来批量处理节点。在大部分情况下&am…

VB 数据质量诊断软件(分析数据的完整性,合理性,准确性)-139-(代码+程序说明)

转载地址http://www.3q2008.com/soft/search.asp?keyword139 前言: 为何口出狂言,作任何VB和ASP的系统, 这个就是很好的一个证明 :) 又有些狂了... 数据库操作谁都会,接触的多了也没什么难的,VB编程难在哪?算法上,这个是一个算法题的毕业设计 哈哈忙活了足足有一○小时, …