第二节:Git基本操作(关键词:git add、commit、diff、reset、checkout、rm、mv)

2023/6/5 20:22:27

文章目录

  • 一:Git基本工作流程
  • 二:Git基本操作
    • (1)git init
    • (2)git add
    • (3)git commit
    • (4)git diff
    • (5)git reset
      • A:概述
      • B:git reset 和 HEAD
      • C:git checkout
    • (6)git rm
      • A:rm命令
      • B:git rm
    • (7)git mv

本节涉及Git命令

  • git init:初始化git仓库
  • git status -s:以简短方式查看仓库状态
  • git commit --amend:将新更改追加到上一次提交中
  • git commit --amend --no-edit:将新更改追加到上一次提交中(不提交消息)
  • git diff:比较工作区与暂存区差异
  • git diff --cached:比较暂存区和上一次提交的差异
  • git diff commit1 commit2:比较两个提交之间的差异
  • git diff branch1..branch2:比较两个分支之间的差异
  • git diff -stat:显示摘要而非整个diff
  • git reset --hard:重置暂存区和工作目录内容
  • git reset --soft:保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区
  • git reset --mixed:保留工作目录,并清空暂存区中未提交的修改
  • git reset HEAD:用于取消之前的 git add操作
  • git reset HEAD^:回退到当前分支的前一个提交,也就是撤销上一次提交操作,这个命令通常用于撤销错误的提交或者重新整理提交历史
  • git reset HEAD~n:回退到当前分支的前n个提交
  • git checkout --<filename>:将指定文件恢复到上一次提交时的状态
  • gut checkout <commit> <filename>:将指定文件恢复到指定版本号
  • git rm:删除
  • git mv:移动或重命名

一:Git基本工作流程

下图展示了Git的基本工作流程,如果不涉及分支操作、远程操作等的话(这些操作会在后面详细讲解),其实Git的命令还是比较固定的,掌握起来也比较容易的

  • workspace:工作区
  • statging area:暂存区
  • local repository:版本库(或常称为本地仓库)
  • remote repository:远程仓库
    在这里插入图片描述

二:Git基本操作

(1)git init

(2)git add

作用:添加文件到暂存区,用法如下

git add [file1] [file2]... # 添加一个或多个文件到暂存区
git add [dir] # 添加目录到暂存区(包括暂存区)
git add . # 添加当前目录下的所有文件到暂存区

举例

如下,创建两个文件README.mdHello.py

在这里插入图片描述

使用git status -s查看状态,发现有两个文件发生改动

在这里插入图片描述

现在,使用git add命令将这两个文件添加到暂存区
在这里插入图片描述

继续使用git status -s查看状态,可以发现文件已经被添加。关于git status所显示的标志位的含义如下

  • A: 本地新增的文件(服务器上没有)
  • C: 文件的一个新拷贝
  • D: 本地删除的文件(服务器上还在)
  • M: 文件的内容或者mode被修改了
  • R: 文件名被修改了
  • T: 文件的类型被修改了
  • U: 文件没有被合并(需要完成合并才能进行提交)
  • X: 未知状态(很可能是遇到了git的bug,可以向git提交bug report)

在这里插入图片描述

现在我们对README.md文件和Hello.py文件分别进行如下修改

在这里插入图片描述

继续使用git status -s查看状态,可以发现文件已经被修改

在这里插入图片描述

然后再使用git add命令进行添加

在这里插入图片描述

(3)git commit

作用:于将更改提交到Git存储库中。每次提交都包含一条消息,描述了提交所做的更改的概要,参数含义如下

  • -a: 自动添加所有已修改或已删除的文件,省去了git add命令的步骤。
  • -m <message>: 提供提交消息的文本。如果不提供-m选项,Git将打开文本编辑器以允许输入提交消息。
  • --amend: 将新的更改追加到最近的一次提交中。如果你想添加更改或修复之前提交的错误,这个选项会很有用。
  • --no-edit: 使用与之前一样的提交消息,不打开编辑器进行更改。只有当你想要修改更改而不修改提交消息时才会使用这个选项。
  • --allow-empty-message: 允许提交一个空的提交消息。不推荐使用,因为提交消息是记录更改历史的重要组成部分。
  • --no-verify: 禁止 Git 钩子(hook)执行。Git 钩子是在特定事件发生时自动执行的脚本,如提交前验证,这个选项会忽略这些脚本。
  • -v: 在提交消息中包含当前更改的差异。这在提交时需要查看更改内容时很有用
git commit [-a] [-m <message>] [--amend] [--no-edit] [--allow-empty-message] [--no-verify] [-v]

常用使用方法如下

git commit -a -m 'message' # 将所有改动自动添加到提交中
git commit --amend # 将新更改追加到上一次提交中(此时会打开编辑器让你输入新提交消息)
git commit --amend --no-edit # 将新更改追加到上一次提交中(不提交消息)

举例

如下,利用git commit将刚才新添加的文件进行提交

在这里插入图片描述

现在,对Hello.py文件追加一句"print(Hello Python)",然后添加到暂存区

在这里插入图片描述

然后,我想把这一次更改直接追加到上一次的提交中且不输入新的提交消息,所以可以利用git commit --amend --no-edit命令

在这里插入图片描述

(4)git diff

作用:用于比较文件在暂存区和工作区的差异。用法如下

git diff # 比较工作区与暂存区的差异
git diff --cached # 比较暂存区和上一次提交的差异
git diff commit1 commit2 # 比较两个提交之间的差异
git diff branch1..branch2 # 比较两个分支之间的差异
git diff --stat # 显示摘要而非整个diff

举例

如下,在README.md文件后添加一句"And we are doing a test",然后添加到暂存区
在这里插入图片描述

接着使用git diff --cached对比暂存区和上一次提交的差异,各字段含义如下

  • diff --git a/README.md b/README.md:这一行表示Git将要对比的文件名。在这个例子中,Git将会对比名为README.md的文件
  • index e48f963..e8102b0 100644:这一行显示了两个十六进制数字,它们是Git用来比较两个文件版本的哈希值。这个数字是Git根据文件内容计算的,当文件的内容发生改变时,哈希值也会改变。在这个例子中,两个版本的哈希值分别为e48f963e8102b0
  • --- a/README.md+++ b/README.md:表示旧版本的文件名(a表示旧文件)。在这个例子中,旧版本的文件名是README.md;表示新版本的文件名(b表示新文件)。在这个例子中,新版本的文件名是README.md
  • @@ -1 +1,2 @@:显示了修改的行范围。在这个例子中,它表示在第1行添加了1行内容(+1,2表示在第1行开始添加了2行内容)
  • This is README file:旧版本文件内容
  • +And we are doing a test:表示新版本的文件内容。在这个例子中,新版本的内容是And we are doing a test。注意到这一行前面有个加号,表示这是一行新添加的内容

在这里插入图片描述

现在继续修改工作区中的README.md,在其后面添加一句“Hello Boy”

在这里插入图片描述

然后使用git diff命令对比工作区和暂存区的差异

在这里插入图片描述

现在再把README.md文件添加至暂存区,然后进行提交

  • 注意:此时会覆盖原先暂存区的内容,在Git中,如果你多次将同一文件添加到暂存区,每次添加都会覆盖之前的暂存区内容,最终只有最后一次添加的内容会被提交。因此,如果你想要保存之前的暂存区内容,你可以在提交之前使用 git stash 命令将当前的修改暂存起来,然后再进行提交。如果你想要将之前暂存的内容恢复回来,可以使用 git stash pop 命令将其应用到当前分支上

在这里插入图片描述

现在,我们可以根据版本号对这两次提交进行对比

在这里插入图片描述

(5)git reset

A:概述

作用:用来撤销 Git 仓库中的更改,包括恢复已被删除的文件、重置提交等操作。其语法格式如下

  • [--soft | --mixed | --hard]:三个可选参数,其中--mixed为默认
  • [HEAD]:表示版本号,可以回退至指定版本
git reset [--soft | --mixed | --hard] [HEAD]

关于git reset三个参数各自含义如下

  • git reset --hard(危险操作,容易造成丢失):在重置版本的同时,重置暂存区和工作目录里的内容。也就说,就是在暂存区中你没有commit的修改会被全部擦掉,在工作区中你没有add的修改也被全部擦掉
  • git reset --soft(保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区):在重置版本库的时候,保留工作目录和暂存区中的内容,并把重置版本库所带来的新的差异放进暂存区。也就说是说,工作目录的内容不受影响,而暂存区中已经commit的内容变成已add的状态
  • git reset(不加参数mixed,保留工作目录,并清空暂存区中未提交的修改):也就是说,工作目录的修改、暂存区的未提交的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录。简而言之,就是把所有差异都混合(mixed)放在工作目录中

在这里插入图片描述

举例

如下,现在对于README.mdHello.py文件已经有两次提交了

在这里插入图片描述

这里我们使用git reset命令回退至第一次提交时的状态

在这里插入图片描述

使用git reset命令时要特别注意,因为它会永久性删除之前的提交记录,所以这里你再也查看不到第二次的提交记录了

在这里插入图片描述

解决方法就是使用git reflog命令,该命令用于查看 Git 仓库的引用记录,可以显示当前分支指向的历史记录,包括已经被删除的提交和分支。它记录了仓库中所有的提交操作和指针移动,并保留了最近 90 天的记录。对于本例,各字段所表示含义如下

  • HEAD@{0}:最近一次操作是 reset,将当前分支 master 移动到 commit ec697df8bd88fadaa7cd84d8de879ea23dc9190e
  • HEAD@{1}:最近一次操作是 commit,创建了一个新的提交,对 README.md 文件进行了修改。
  • HEAD@{2}:最近一次操作是 commit --amend,在上一次提交的基础上进行了修改,并将其合并到同一个提交中。
  • HEAD@{3}:最近一次操作是 commit,创建了一个新的提交,其中包括两个文件的第一次提交。

因此这里我们依然可以用git reset回到最新的提交上

在这里插入图片描述

B:git reset 和 HEAD

git resetHEAD 通常是一起使用的,前文说过,HEAD 指针在 Git 中是一个指向当前所在分支最近一次提交的指针。常用用法如下

git reset HEAD # 用于取消之前的 git add操作
git reset HEAD^:# 回退到当前分支的前一个提交,也就是撤销上一次提交操作,这个命令通常用于撤销错误的提交或者重新整理提交历史
git reset HEAD~n:# 回退到当前分支的前n个提交

例子

如下,在Hello.py文件后面添加"print(“HAHA!”)",然后添加至暂存区

在这里插入图片描述

这里我们就可以使用git reset HEAD命令来撤销之前的添加操作了

在这里插入图片描述

上面只是为了展示git reset HEAD的效果,这里我们还是将其添加到暂存区,然后提交(这是第三次提交)

在这里插入图片描述

git reset HEAD^表示回到上一次提交(也就是第二次),git reset HEAD~2表示回到上上次提交(也就是第一次)

  • git reset HEAD~2git reset HEAD^^等价,以此类推
    在这里插入图片描述

C:git checkout

git checkout命令会在后面的“分制管理”中详说明,这里介绍的原因是其有一个很常用的用法就是可以回滚某个指定文件

git checkout --<filename> # 将指定文件恢复到上一次提交时的状态
git checkout <commit> <filename> # 将指定文件恢复到指定版本号

如下,利用git checkoutHello.py文件回滚
在这里插入图片描述

(6)git rm

A:rm命令

rm是Linux系统中的删除命令,其效果等价于Windows中的右键删除,会把工作区的文件删除。因此,如果你想要删除这个操作提交到远程仓库,还需要执行git addgit commit

如下,这里我们将Hello.py文件删除

在这里插入图片描述

然后添加到暂存区和提交

在这里插入图片描述

(这里为了便于后面的展示,我们将版本回退至“第三次提交处(提交信息为:对Hello.py文件的修改)”)

在这里插入图片描述

B:git rm

作用:用于删除文件,其常用用法主要有如下三个

  • git rm
    • 删除工作区中的文件,同时将删除的文件添加到暂存区
    • git rm 可以简单理解为 rm + git add
    • 注意:git rm 删除的文件必须是 没有经过修改的,也就是说必须要和当前版本库的内容一致的
  • git rm -f
    • 当工作区中的文件经过修改后,再想使用git rm命令时,就需要添加 -f 参数,表示强制删除 工作区中的文件
    • 当工作区中的文件经过修改后,且使用git add 命令添加到暂存区后,再想使用 git rm 命令时,就需要添加 -f 参数,表示强制删除 工作区中和暂存区中的文件,并将删除添加到暂存区
  • git rm --cached
    • 会删除暂存区中的文件,但是会保留工作区中的文件,并将此次删除提交到暂存区
    • 文件从暂存区中删除掉,即不会被提交到版本库中,也就是说此文件被取消了版本控制
    • 可以这样理解:向暂存区告知本文件已经删除,但工作区却偷偷保留这个文件。于是commit后仓库就不会有这个文件,是为了用户本次不想上传某些缓存文件设立

另外还需要注意git rm命令和rm命令的区别:当使用 rm 命令删除文件时,文件会被直接删除并从文件系统中移除。但是,当使用 git rm 命令删除已经被 Git 跟踪的文件时,Git 会记录该文件已经被删除,同时还会将删除操作添加到 Git 的暂存区中。这样做的好处可以在下一次提交时,将删除操作提交到 Git 仓库中,从而保留 Git 仓库的完整性和历史记录。因此,可以将 git rm 命令理解为一系列操作的组合,包括从本地文件系统中删除文件、从 Git 的暂存区中删除文件,并将这个变更添加到下一次提交中

  • rm:是一个操作系统级别的命令,用于从文件系统中删除文件;如果你只是想从文件系统中删除一个文件,并不想将其从 Git 版本控制中删除,那么应该使用 rm 命令
  • git rm:是一个 Git 命令,用于从 Git 仓库中删除文件;如果你希望删除一个文件,并将其从 Git 版本控制中移除,那么你应该使用 git rm 命令

举例

如下图,新建一个文件Test.py

在这里插入图片描述

此文件现在未被Git管理,因此使用git rm命令无法删除

在这里插入图片描述

这种情况下只能使用系统级别的命令rm进行删除

在这里插入图片描述

这里我们再次新建这个文件并将其添加到暂存区

在这里插入图片描述

现在使用git rm -f删除此文件

在这里插入图片描述

(7)git mv

作用:用于将文件或目录移动或重命名,并在Git中记录更改。语法格式如下,其中,source表示要移动或重命名的文件或目录的当前位置,destination表示文件或目录应该移动到的新位置或应该被重命名为的新名称

git mv <source> <destination>

例子

如下,创建一个名为dir1的文件夹,然后将Hello.pyREADME.md文件移动进去

在这里插入图片描述

然后进行提交

在这里插入图片描述

然后再将Hello.py文件重命名为HelloWorld.py

在这里插入图片描述

但此时运行git log你会发现找不到这个HelloWorld.py文件的提交记录,所以此时可以用git log --follow

在这里插入图片描述


http://www.jnnr.cn/a/369129.html

相关文章

IDEA中如何进行debug

平时工作DeBug是常规操作, 但对里面有的按钮不了解, 整理一下全部DeBug的知识点: 文章目录1、DeBug开篇2、断点2.1 认识断点2.2 断点的状态2.3 断点的一些相关设置3、调试按钮和功能键3.1 调试按钮3.2 功能按键4、变量查看5、计算表达式6、智能步入8、回退断点1、DeBug开篇 DeB…

JVM 运行时数据区概述及线程

当我们通过前面的&#xff1a;类的加载 --> 验证 --> 准备 --> 解析 --> 初始化&#xff0c;这几个阶段完成后&#xff0c;就会用到执行引擎对我们的类进行使用&#xff0c;同时执行引擎将会使用到我们运行时数据区。 运行时数据区结构 内存概念&#xff1a; 内存…

MONGODB mongodb 一般人不知道的数据类型与使用

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

【C语言】实现动态版通讯录

&#x1f48c;内容专栏&#xff1a;【C语言】进阶部分 &#x1f48c;本文概括&#xff1a; 结合自定义类型、动态内存管理知识&#xff0c;对静态版本的通讯录进行优化。 &#x1f48c;本文作者&#xff1a;花 碟 &#x1f48c;发布时间&#xff1a;2023.4.2 目录 前言&#x…

lwip中线程优先级的分配原则

lwip的线程 lwIP是一个嵌入式TCP/IP协议栈&#xff0c;它主要包含以下几个线程&#xff1a; 主线程&#xff08;Main Thread&#xff09;&#xff1a;它是lwIP的主线程&#xff0c;用于初始化lwIP协议栈和各种网络接口&#xff0c;并提供处理网络事件的主循环。主线程的优先级…

PHP+SQL考勤系统安全性的设计与实现

第一章 概 述 1.1 PHP的概念 PHP: Hypertext Preprocessor (超文本预处理器) 的缩写&#xff0c;它是一种服务器端的 HTML 脚本/编程语言,是一种简单的、面向对象的、解释型的、健壮的、安全的、性能非常之高的、独立于架构的、可移植的、动态的脚本语言 PHP是一种功能强大…

docker安装以及springboot项目打包运行

我们都知道docker是一个非常好用的虚拟化容器&#xff0c;所谓虚拟化容器其实就是说可以将各个应用都隔离开来&#xff0c;每个应用都可以有自己的独立的运行时环境&#xff0c;这对于我们程序开发是非常有好处的&#xff0c;可以不需要去配置环境&#xff0c;每个组件都有独立…

FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(三)

如图1所示是USB2.0/RS232/ETH控制并行DAC输出任意频率正弦波、梯形波、三角波、方波的整体设计示意图&#xff0c;可以看到上位机通过RS232串口、ETH千兆网口以及USB2.0接口和FPGA建立通信&#xff0c;通过不同的接口发送报文&#xff0c;FPGA在指令解析模块中把相关设置和参数…

栈和队列OJ题合集(包含循环队列的两种实现)

目录 一:前言 二:有效的括号(括号匹配) 三:用队列实现栈 四:用栈实现队列 五:设计循环队列 一:前言 对栈和队列的基本性质和实现有问题的可以看上一期 链接&#xff1a;http://t.csdn.cn/YQMBA​​​​ 注意:本文用数据的大小来表示入栈入队的先后。 二:有效的括号(括号匹配…

networkx 2-hop邻居(Ego graph)节点

1 Ego graph的简单介绍 自我网络(Ego graph)是一种特殊类型的网络&#xff0c;由一个中心节点和所有直接与之相连的其他节点组成。 中心节点被称为 自我(ego)&#xff0c;而与之直接相连的其他周围节点被称为 分身( alters)。 自我网络大多用于分析社会联系、链接和关系。下…

带刷,带刷,刷起来!!!

A:::::::::::::::::::通电&#xff08;最小生成树&#xff0c;Prim&#xff0c;Kruskal&#xff09; 题目描述 2015 年&#xff0c;全中国实现了户户通电。作为一名电力建设者&#xff0c;小明正在帮助一带一路上的国家通电。 这一次&#xff0c;小明要帮助 n 个村庄通电&am…

C的实用笔记37——几种常用的字符串处理API(二)

6.字符串拼接函数 0、知识点&#xff1a; 内存污染&#xff08;存储字符串的目的内存不够用时&#xff0c;后面的内存会被污染&#xff0c;也就是被修改&#xff0c;类似于下标越界&#xff09; strcat其实就是另一种形式的strcpy&#xff0c;一个从末尾开始复制&#xff0c;一…

[计算机图形学]着色,布林-冯着色模型,着色频率(前瞻预习/复习回顾)

一、前言 到目前为止的前几篇文章已经向大家介绍了从MVP变换到屏幕映射到光栅化的过程&#xff0c;但是仅仅这些还不能让我们很好的模拟真实的世界&#xff0c;究其原因是上面的所有过程都没有涉及光线的运算&#xff0c;而缺少了光也就缺少了明暗的变化&#xff0c;导致渲染出…

Twitter的推荐系统开源了,Twitter的推荐系统是什么样的呢?Twitter推荐系统的架构说明

Twitter的推荐系统开源了&#xff0c;Twitter的推荐系统是什么样的呢&#xff1f;Twitter推荐系统的架构说明01. Twitter的推荐系统是什么样的&#xff1f;02. Candidate Sources2.1 In-Network Source2.2 Out-of-Network Sources03. Ranking04. Heuristics, Filters, and Prod…

[综]Review of bike-sharing system studies using bibliometrics method

Review of bike-sharing system studies using bibliometrics method 文献计量学方法在自行车共享系统研究中的应用 article{2022reviewbikesharing, title {Review of bike-sharing system studies using bibliometrics method}, journal {Journal of Traffic and Transport…

Spring源码分析-Bean创建流程四

目录 目录 一、前言 二、Bean实例化构造器的选择 1、createBeanInstance方法解读 2、autowireConstructor 二、BeanPostProcess四个实现中的哪里会用到 Autowired注解构造使用注意 三、实例化几种策略 1、instantiateBean入口 2、获取实例化策略并且进行实例化操作主要有…

vue尚品汇商城项目-day04【25.面包屑处理关键字】

文章目录25.面包屑处理关键字25.1面包屑处理关键字25.2面包屑处理品牌信息25.3平台售卖属性的操作25.面包屑处理关键字 25.1面包屑处理关键字 &#xff08;1&#xff09;动态开发面包屑中的分类名 变成式导航路由跳转【自己跳自己】 &#xff08;2&#xff09;动态开发面包…

(Cont.) OpenPose OpenCV Caffe QT

Cont. conda deactivate Remember to deactivate conda before compiling conda deactivatecaffe colas.h Path: openpose/3rdparty/caffe/include/cblas.h Case 1: 如果没有 寻找一下 &#xff08;大概率在python directory有&#xff09;复制过来即可 exactly寻找命令&am…

C语言 —— 数组

一维数组与二维数组前言一、 一维数组1.1 一维数组定义和使用1.2 例子 &#xff1a;列出0-9的数字1.3 一维数组的初始化1.4 数组名二、二维数组2.1 二维数组的定义2.2 例题&#xff1a;一个学习小组有 5 个人&#xff0c;每个人有 3 门课程的考试成绩&#xff0c;求该小组各科的…

javaScript蓝桥杯----偷梁换柱

目录一、介绍二、目标三、代码四、知识点1. Object.defineProperty五、答案一、介绍 随着医疗水平的进步&#xff0c;人的平均寿命在慢慢提升。现在全球平均预期寿命是 73.2 岁&#xff0c;而在 1950 年则只有 47 岁。那么人类的寿命有极限吗&#xff1f;根据最新的研究&#…