入门系列 - Git基本操作

news2024/11/23 20:47:39

在这里插入图片描述

本篇文章,是基于我自用Linux系统中的自定义文件夹“test_rep”,当做示例演示

具体Git仓库的目录在:/usr/local/git/test_rep

Git基本操作

之前我们已经创建了 Git 版本库了,下一步我们将进行一些 Git 的基本操作。

有关 Git 版本库的知识点请参考:Git创建版本库

git status 查看仓库当前的状态

继续,我们已经成功地添加并提交了一个read.txt文件,现在,是时候继续工作了,于是,我们继续修改read.txt文件,改成如下内容:

$ vim read.txt
Git is a version control system.
Git is free software.#此处是我新增的一段文本
# :wq保存

现在,运行git status命令看看结果:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   read.txt

no changes added to commit (use "git add" and/or "git commit -a")

git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,read.txt被修改过了,但还没有准备提交的修改。如果想精简一下,可以使用git status -s

如果你忘记了具体修改了什么,或者是压根就不是你修改的,我们可以利用git diff这个命令了。

git diff 比较文件的不同

利用git diff这个命令查看文件修改了哪些:

$ git diff read.txt
diff --git a/read.txt b/read.txt
index 7f63a40..46d49bf 100644
--- a/read.txt
+++ b/read.txt
@@ -1 +1,2 @@
 Git is a version control system.
+Git is free software.

diff 是 difference 的简写。上面的命令输出看到,刚才我添加了一行文本。此时知道了read.txt作了什么修改,心里有数了,就可以把它提交到仓库中心了。

提交修改和提交新文件是一样的两步,第一步是git add

$ git add read.txt

此时可以利用git status命令查看一下当前仓库的状态:

$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   read.txt

很明显,上面的内容提醒你read.txt作了修改,下一步就可以按照之前一样提交:

$ git commit -m 'append text'
[master b0259a8] append text
 1 file changed, 1 insertion(+)

提交后,继续利用git status命令查看一下当前仓库的状态:

$ git status
On branch master
nothing to commit, working tree clean

此时,Git 告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。

git log 查看历史提交记录

继续由上面,我们再进行一次修改read.txt文件如下:

$ vim read.txt
Git is a version control system.
Git is free software.
Git is a distributed.#此处是我新增的一段文本
# :wq保存

然后提交:

$ git add read.txt
$ git commit -m 'append new text'
[master fc9d399] append new text
 1 file changed, 1 insertion(+)

像这样,你不断对文件进行修改,然后不断提交修改到版本库里,Git 每当文件commit的时候就可以“保存一个快照”。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

此致,针对read.txt文件一共有3个版本被提交到 Git 仓库里了:

第1个版本:

Git is a version control system.

第2个版本,增加了一行文本:

Git is a version control system.
Git is free software.

第3个版本,又增加了一行文本:

Git is a version control system.
Git is free software.
Git is a distributed.

这里只是简单的测试而已,但是实际工作中,谁知道你或者你的同事提交过多少次,具体提交的时候改的什么更不会记得了,此时我们可以利用git log命令查看历史提交记录:

$ git log
commit fc9d399882b59e87920114579978e54cca018d13 (HEAD -> master)
Author: lee <lee@lee.com>
Date:   Wed Nov 30 21:09:20 2022 +0800

    append new text

commit b0259a82217775f384626ed7284a4d63f9fd177e
Author: lee <lee@lee.com>
Date:   Wed Nov 30 21:00:45 2022 +0800

    append text

commit 0fdd2240456285ba556d25f673da44cb01389958
Author: lee <lee@lee.com>
Date:   Wed Nov 30 15:35:00 2022 +0800

    append two files
#以上信息均是我本机的测试环境,还是得以你的测试环境对应即可

git log命令显示从最近到最远的提交日志,我们可以看我这里的3次提交,最近的一次是刚刚提交的,注释为“append new text”。

如果嫌输出的信息太多,眼花不是不可能的,可以试试加上--pretty=oneline参数:

$ git log --pretty=oneline
fc9d399882b59e87920114579978e54cca018d13 (HEAD -> master) append new text
b0259a82217775f384626ed7284a4d63f9fd177e append text
0fdd2240456285ba556d25f673da44cb01389958 append two files

以上展示的,就清爽多了。

再有,利用--reverse参数来逆向显示所有日志:

$ git log --reverse --pretty=oneline
0fdd2240456285ba556d25f673da44cb01389958 append two files
b0259a82217775f384626ed7284a4d63f9fd177e append text
fc9d399882b59e87920114579978e54cca018d13 (HEAD -> master) append new text

还可以利用-author=用户名查询指定用户的日志,甚至可以指定日期节点的命令:--since--before,但是你也可以用--until--after

其中,有HEAD标识的,代表次版本为当前最新版本。

需要友情提示的是,你看到的一大串类似fc9d39988...的是commit id(版本号),和 SVN 不一样,Git 的commit id不是1,2,3……递增的数字,而是一个 SHA1 计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,每个人的测试环境不同,到时候还得以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为 Git 是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

git blame 查看指定文件的修改记录

从某种意义上说,git log命令显示的所有操作的日志,其实我们还可以使用git blame查看指定文件的操作日志,比如我们之前知道修改了read.txt文件,我们可以直接查看该文件的日志:

#git blame 文件名
$ git blame read.txt
^0fdd224 (lee 2022-11-30 15:35:00 +0800 1) Git is a version control system.
b0259a82 (lee 2022-11-30 21:00:45 +0800 2) Git is free software.
fc9d3998 (lee 2022-11-30 21:09:20 +0800 3) Git is a distributed.

git blame命令是以列表形式显示修改记录。

git reset 回退版本

现在,查看历史提交记录:

$ git log --pretty=oneline
#最后一步,当前版本,HEAD标识
fc9d399882b59e87920114579978e54cca018d13 (HEAD -> master) append new text
#上个版本
b0259a82217775f384626ed7284a4d63f9fd177e append text
#最初提交的两个文件
0fdd2240456285ba556d25f673da44cb01389958 append two filesv

首先,Git 必须知道当前版本是哪个版本,在 Git 中,用HEAD表示当前版本,也就是最新的提交fc9d39988...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

现在,我们要把当前版本append new text回退到上一个版本append text,就可以使用git reset命令:

$ git reset --hard HEAD^	#回退到上一个版本,HEAD^代表上一个版本
HEAD is now at b0259a8 append text	#执行成功,显示当前的HEAD为“b0259a8 append text”

我们可以查看一下刚才read.txt文件内容:

$ cat read.txt
Git is a version control system.
Git is free software.

由上面信息得知,最后一次追加的那帮文本"Git is a distributed.",已经回退没了,也被还原。

其实某种意义上,就类似指针似的,它再某个地址上,回退就像切换了某个指针地址。

下面我们详细解释一下git reset命令,git reset命令用于回退版本,也可以指定退回某一次提交的版本。

它的基本命令语法格式如下:

$ git reset [--soft | --mixed | --hard] [HEAD]
参数功能场景
–hard清空工作区与缓存区放弃目标版本后所有的修改
–soft保留工作区与缓存区,但是把版本之间的差异存放在缓存区合并多个commit
–mixed(或缺省)保留工作区清空缓存区,把版本之间的差异存放在工作区1 有错误的commit需要修改
2 git reset HEAD清空缓存区

git reset命令可以指定不同的回退方式:

#例如
$ git reset HEAD^            	# 回退所有内容到上一个版本  
$ git reset HEAD^ read.txt  	# 回退read.txt文件的版本到上一个版本  
$ git reset 0fdd224           	# 回退到指定版本,也就是commit id,不用写全,但是要尽可能长点,个人习惯写6-7位

git reset命令涉及到了一些 Git 的工作区、缓存区和版本库之间的关系,所以实现理解一下 Git 的工作区、缓存区和版本库是有必要的,我在前面的博文里已经简单的阐述过。这里我简单的给一个图例:

在这里插入图片描述

git reset --mixed(默认)

  • 移动本地库HEAD指针
  • 重置暂存区
  • 意思就是,回滚后,不仅移动了本地库的指针,同时暂存区的东西也没了,意思就是你上次添加到暂存区的文件没了

git reset --soft

  • 移动本地库HEAD指针
  • 意思就是,回滚后,仅仅是把本地库的指针移动了,而暂存区和你本地的代码是没有做任何改变的。而你上次改动已提交committed到本地库的代码显示是绿色即未提交

git reset --hard

  • 移动本地库HEAD指针
  • 重置暂存区
  • 重置工作区
  • 意思就是,回滚后,本地代码就是你回退版本的代码

从上面的解析看来,刚才我用的是**–hard**,更像是一劳永逸的回退,直接回退到底了。

至于有人问,能不能再回退回去?答案是肯定的,前提你知道之前的“commit id”,可以直接通过指定“commit id”回退,从而起到回退回去的操作。之前的窗口关了,记不得了?那我也没啥办法,搜搜网络吧,作者本人也没研究过,毕竟谁没事干回退来回退去啊。

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

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

相关文章

微服务框架 SpringCloud微服务架构 28 数据同步 28.3 声明队列和交换机

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构28 数据同步28.3 声明队列和交换机28.3.1 直接开干28 数据同步 28.3 声明…

【Mybatis】一级缓存和二级缓存

【Mybatis】一级缓存和二级缓存&#xff08;一&#xff09;为什么需要缓存&#xff08;二&#xff09;一级缓存&#xff08;在SqlSession上缓存&#xff09;【1】示例代码【2】增删改操作会刷新一级缓存【3】一级缓存流程总结&#xff08;1&#xff09;一级缓存简介&#xff08…

多点DMALL冲刺港股:年亏损超9亿 腾讯IDG金蝶是股东

雷递网 雷建平 12月8日多点数智有限公司&#xff08;简称&#xff1a;“多点数智”&#xff09;日前递交招股书&#xff0c;准备在港交所上市。年亏损超9亿多点DMALL成立于2015年&#xff0c;为本地零售业提供基于云的一站式端到端的数字零售SaaS平台。多点DMALL提供的服务包括…

搜索是过拟合的生成;生成是欠拟合的搜索

神经搜索的最大竞争者可能来自于一种甚至不需要向量嵌入作为中间表示的技术 —— 一种直接返回你想要的结果的端到端技术。"那么&#xff0c;谁将是神经搜索最大的竞争对手&#xff1f;"本文作者&#xff1a;肖涵&#xff0c;Jina AI 创始人兼 CEO 谁将是神经搜索最大…

Redis框架(二):SpringDataRedis入门和序列化方式解决内存占用问题

SpringDataRedis入门和序列化方式解决内存占用问题基本介绍实例Demo自定义RedisTemplate序列化自定义的RestTemplate的内存占用问题StringRedisTemplate解决内存占用问题总结SpringCloud章节复习已经过去&#xff0c;新的章节Redis开始了&#xff0c;这个章节中将会回顾Redis 主…

c#入门-可选参数,不定长参数

可选参数 声明可选参数 函数的参数在声明时&#xff0c;可以同时为其赋值一个常量。 但是所有这样的参数&#xff0c;需要在所有必填参数的后面。 void Any(int i 10) {Console.WriteLine(i); }使用可选参数 稍后&#xff0c;在调用函数时&#xff0c;你可以不填可选参数。…

1 - 线程池的基础用法

参考&#xff1a;线程池的基本用法 - 简书 1、为什么要用线程池&#xff1f; 在java中&#xff0c;开启线程的方式一般分为以下三种&#xff1a; a. 继承Thread&#xff0c;实现其run方法&#xff1b; b. 实现Runnabler接口&#xff0c;通过Thread来实现线程&#xff1b; …

法的概念与大纲

一、法的概念 法是由国家制定或认可并由国家强制力保证实施的&#xff0c;反映特定物质生活条件所决定的统治阶级意志&#xff0c;以权利和义务为内容&#xff0c;以确认、保护和发展对统治阶级有利的社会关系和社会秩序为目的的规范系统。 二、法的特征 规范性 国家意志性 权…

微信恢复大师花了200多,套路一环接一环!

数据恢复本是一个科技进步的体现&#xff0c;让误操作导致的重要数据可以找回来。但是近年来数据恢复跟诈骗挂钩&#xff0c;数据恢复本是利好的事情&#xff0c;为什么会跟诈骗挂钩。究竟是什么原因呢&#xff1f;最近小编发现&#xff0c;百度推荐词出现&#xff1a;“微信恢…

Neural Network-神经网络算法本质

1. Word2vec~single CBOW算法推导BP word2vec主要实现方式有&#xff1a;skip-gram和CBOW。 CBOW的目的是根据上下文contextual words来预测当前中心词的概率&#xff0c;且上下文所有单词对当前中心词出现的概率影响权重是一样的&#xff0c;如在袋子中取词&#xff0c;取出…

痞子衡嵌入式:国内外串行NOR Flash厂商官网Cross Reference功能使用体验

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家讲的是国内外串行NOR Flash厂商官网Cross Reference功能。 串行 NOR Flash 是一个相对发展稳定的市场&#xff0c;目前全球市场约 90% 的份额被中国的三家厂商(Winbond华邦/MXIC旺宏/GigaDevice兆…

Java入门教程(26)——继承

文章目录1.继承的作用2.继承的关键字3.继承的特点4.实例5.instanceof 运算符继承是面向对象三大特征之一&#xff0c;继承可以让我们减少代码量&#xff0c;实现类的复用1.继承的作用 代码复用&#xff0c;更加容易实现类的扩展方便建模 2.继承的关键字 extends&#xff0c;…

网站都变灰了,几行代码可以实现

前言 这两天&#xff0c;我们经常逛的好多网站、app首页都变灰了&#xff0c;原因大家应该都知道了 网站变灰 ①B站 ②爱奇艺 ③ 腾讯视频 ④ csdn ⑤百度 怎么实现的呢&#xff1f; 难道这些网站开发商在网站开发的时候都准备一套灰色主题的UI么&#xff1f; 好奇心…

端水or信仰?ChatGPT“点评”Web3未来

近日&#xff0c;OpenAI发布了人工智能聊天机器人模型 ChatGPT&#xff0c;产品自11月30日发布到现在仅一周时间&#xff0c;就积累了上百万用户&#xff0c;广受大家好评。有人让它写代码&#xff0c;有人拿高考题目考验它&#xff0c;这些“难题”似乎都难不倒它&#xff0c;…

vue3 教程(上)

学 vue3 通过官方文档更详细&#xff0c;不过阅读本博客&#xff0c;可以更容易理解&#xff0c;且帮你速成&#xff01; 官方文档&#xff08;记得将API风格偏好切换为 组合式 否则你学的是vue2&#xff09; https://cn.vuejs.org/guide/introduction.html 学习前的准备 创建…

[synchronized ]关键字详解

目录 1.synchronized 特性 1.1互斥性 1.2内存刷新 1.3可重入 2.Java 标准库中的线程安全类 3.死锁问题 3.1 一个线程,一把锁 3.2 两个线程,两把锁 3.3 多个线程,多把锁 4.死锁的条件 1.synchronized 特性 1.1互斥性 synchronized 关键字会起到互斥效果,当某个线程执…

【C语言】字符串函数(一)

目录 一、strlen函数(计算字符串长度) 1、strlen函数的用途 2、strlen函数的使用 3、strlen函数的模拟实现 二、strcpy函数(字符串拷贝) 1、strcpy函数的用途 2、strcpy函数的使用 3、strcpy函数的模拟实现 三、strcat函数(字符串追加) 1、strcat函数的用途 2、strcat函数的使用…

【JavaSE】接口剩余内容

目录 1、接口使用实例 &#x1f4d5;逐步分析学生数组排序的写法 ✨思路&#xff1a; ✨代码实现 ✨弊端 &#x1f4d5;、改进 改进思路&#xff1a; 代码实现&#xff1a; 2、Cloneable接口和深拷贝 2.1、cloneable接口的作用 2.2、深拷贝和浅拷贝 2.2.1、浅拷贝 …

yum安装openldap2.4.44,并配置增量复制(Delta-syncrepl)环境

本文是在centos7环境下通过yum安装openldap2.4.44&#xff0c;并配置增量复制&#xff08;Delta-syncrepl&#xff09;环境 官网对于增量复制介绍&#xff1a;https://www.openldap.org/doc/admin24/replication.html#Delta-syncrepl%20replication Delta-syncrepl 是 syncrep…

ADI Blackfin DSP处理器-BF533的开发详解3:GPIO(含源代码)

我们从最基础的GPIO开始&#xff0c;先讲外设&#xff0c;这玩意不管是单片机&#xff0c;还是ARM&#xff0c;又或是FPGA&#xff0c;甚至SOC的芯片&#xff0c;都有GPIO&#xff0c;有共性&#xff0c;就好理解&#xff0c;让我们看看在ADI的DSP里头&#xff0c;GPIO是怎么一…