【Git】初识Git
本篇文章的环境是在 Ubuntu/Linux
环境下编写的
文章目录
- 版本控制器
- Git 基本操作
- 安装 Git
- 创建 Git 本地仓库
- 配置 Git
- 认识工作区、暂存区、版本库
- 添加文件
- 修改文件
- 版本回退
- 撤销修改
- 删除文件
版本控制器
在日常工作和学习中,老板/老师要求我们修改文档,但修改可能不尽人意,多次修改后可能还不如最初的版本,但如果是直接在原文档上修改,那我们是否还能找回最初的版本呢?
若每一次大改,都是在复制出的副本上修改,可以解决上述原文档丢失的问题,但随着版本数量不断增多,我们还能记得每个版本各自修改了什么吗?
版本控制器就是为了解决上述问题而诞生的。所谓版本控制器,就是一个可以记录工程的每一次改动和版本迭代的管理系统,同时也方便多人协同作业
Git 基本操作
安装 Git
可以使用 git
或 git --version
查看是否已经安装了GIt
如果bash 响应的是 git: command not found
类似的话语,那就是没有安装git
- 安装 Git:
#Centos
sudo yum -y install git
#Ubuntu
sudo apt-get install git -y
- 查看 Git 版本
git --version
创建 Git 本地仓库
Git 进行版本控制的方式是,使用仓库对代码进行管理
- 创建一个Git 本地仓库的命令为
git init
,注意命令要在文件目录下执行,例如:
创建本地仓库后,会多出来一个.git
隐藏文件,这个目录就是Git用来跟踪管理仓库的
其目录结构如下:
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-merge-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ ├── push-to-checkout.sample
│ └── update.sample
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs├── heads└── tags
配置 Git
当安装 Git 后很重要的一步是配置 用户名称 和 e-mail地址,命令如下:
git config -l #以列表形式显示配置
git config user.name "Your name" #配置用户名称
git config user.email "email" #配置email
使用 --unset
选项删除配置,例如:
git config --unset user.name
git config --unset user.email
可以使用--global
这个选项,该选项的效果是使得当前机器上所有的 Git 仓库都使用这个配置
git config --global user.name "Your name" #配置用户名称
git config --global user.email "email" #配置email
使用 --global
设置的配置不能直接使用--unset
删除,而是也需要携带--global
git config --global --unset user.name
认识工作区、暂存区、版本库
-
工作区:和
.git
同级的目录下的文件/目录 -
暂存区:
stage
或index
。一般存放在.git
目录下的 index 文件(.git/index)中,暂存区有时也就索引(index) -
版本库:又名仓库,英文名
repository
。.git
就是Git的版本库。版本库里的所有文件都可以被Git管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”
-
图中左侧为工作区,右侧为版本库。其中我们重点关注暂存区
-
在创建 Git 版本库时,Git 会为我们自动创建一个唯一的
master分支
,以及指向 master 的一个指针HEAD
-
当对工作区修改(或新增)的文件执行
git add
命令,暂存区目录树的文件索引会被更新 -
当执行
git commit
提交操作,master分支会做出相应的更新,可以简单理解为暂存区的目录树才真正被写到版本库中
小总结:必须通过git add
和git commit
命令才能将工作区的文件添加到仓库(版本库)中进行管理
添加文件
在包含.git
的目录下新建一个ReadMe文件,使用git add
命令将文件添加到暂存区
git add [file1] [file2] #可添加一个或多个文件到暂存区
git add [dir] #添加指定目录到暂存区
git add . #添加当前目录下的所有文件改动到暂存区
git add -f [file] #-f选项表示强制添加
再使用git commit
命令将暂存区内容添加到本地仓库中
注意:提交时要对本次提交进行“描述”
,记录提交的细节,方便后续查看,得知此次提交改动了些什么,这是很重要的一步,也绝对不能省略
git commit -m "描述" #提交暂存区全部内容到本地仓库中
git commit [file1] [file2] -m "描述" #提交暂存区的指定文件到本地仓库
成功提交后,Git会告诉我们一些改动的细节,示例:
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ touch ReadMe
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ vim ReadMe
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ cat ReadMe
hello git
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ git add .
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ git commit -m "new file:ReadMe"
[master (root-commit) 0008577] new file:ReadMe1 file changed, 1 insertion(+)create mode 100644 ReadMe
使用git log
命令可以查看历史提交记录
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ git log
commit 000857774f55793cf3ba54f014aaa239dc226609 (HEAD -> master)
Author: bao-bao-hai-mian <1076847758@qq.com>
Date: Sun Sep 15 20:12:53 2024 +0800new file:ReadMe
git log
显示从最近到最远的提交日志,并且可以看到commit 的描述信息
还可以加上--pretty=oneline
选项,让消息简洁些
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ git log --pretty=oneline
000857774f55793cf3ba54f014aaa239dc226609 (HEAD -> master) new file:ReadMe
日志消息的一大串数字,是每次提交的commit id(版本号)
,是用 SHA1 计算出的一个很大的数字,用十六进制表示
再添加几个文件
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ touch file1 file2 file3
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ git add .
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ git commit -m "add three file:file1 file2 file3"
[master 7c61b82] add three file:file1 file2 file33 files changed, 0 insertions(+), 0 deletions(-)create mode 100644 file1create mode 100644 file2create mode 100644 file3
此时我们查看.git
的目录结构
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ tree .git
.git
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-merge-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ ├── push-to-checkout.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ └── master
├── objects
│ ├── 00
│ │ └── 0857774f55793cf3ba54f014aaa239dc226609
│ ├── 0e
│ │ └── 6b1780b73cd9220ec5073dc64b42f7ad4bd945
│ ├── 15
│ │ └── a37e9ef171cca4a5d985fccd1fcf9414b2c7cf
│ ├── 4b
│ │ └── 825dc642cb6eb9a060e54bf8d69288fbee4904
│ ├── 7c
│ │ └── 61b823e2c036bc9e37ec0d9676fab511b1db1e
│ ├── 8d
│ │ └── 0e41234f24b6da002d962a26c2495ea16a425f
│ ├── e6
│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ ├── info
│ └── pack
└── refs├── heads│ └── master└── tags
相比于之前我们看到的 .git 结构,多了一些东西
index
就是暂存区,git add
后的内容都是添加到这里的HEAD
是指向当前分支的指针,默认指向master
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ cat .git/HEAD
ref: refs/heads/master
而master分支
,其实就是最近一次提交的commit id
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ cat .git/refs/heads/master
7c61b823e2c036bc9e37ec0d9676fab511b1db1e
objects
为 Git 的对象库,里面包含了创建的各个版本库对象及内容。当执行git add
命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,就位于.git/objects
目录下
这些文件不能直接使用cat
查看,都是经过sha(安全哈希算法)
加密过的文件,不过可以使用git cat-file
查看版本库对象内容
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ git cat-file -p 000857774f55793cf3ba54f014aaa239dc226609
tree 0e6b1780b73cd9220ec5073dc64b42f7ad4bd945
author bao-bao-hai-mian <1076847758@qq.com> 1726402373 +0800
committer bao-bao-hai-mian <1076847758@qq.com> 1726402373 +0800new file:ReadMe
显示正是一次提交的相关信息
其中还有一行tree commit id
,我们使用同样的方式查看
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ git cat-file -p 0e6b1780b73cd9220ec5073dc64b42f7ad4bd945
100644 blob 8d0e41234f24b6da002d962a26c2495ea16a425f ReadMe
再看 ReadMe 对应的commit id
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ git cat-file -p 8d0e41234f24b6da002d962a26c2495ea16a425f
hello git
这正是我们提交的 ReadMe 中的内容
小总结:本地 git 仓库中,有几个文件和目录很特殊
- index:暂存区,
git add
后会更新其内容- HEAD:指向当前分支的指针
- refs/heads/master:保存最近一次提交的
commit id
- objects:包含了创建的各个版本库对象及内容,此处可以简单理解为存放了 git 维护的所有修改
修改文件
Git 跟踪并管理的并不是文件,而是修改
新增文件,删除文件,修改文件内容都是修改
示例:
往 ReadMe 文件中添加一些内容
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ cat ReadMe
hello git
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ vim ReadMe
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ cat ReadMe
hello git
i am coding
i am coding
i am coding
此时工作区的ReadMe 与 暂存区和版本库的 ReadMe 内容是不同的。git status
命令用于查看当前仓库状态
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ 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: ReadMeUntracked files:(use "git add <file>..." to include in what will be committed).ReadMe.swpno changes added to commit (use "git add" and/or "git commit -a")
Git 检查到 工作区的 ReadMe 被修改了,但没有添加和提交
,并建议我们更新修改
git diff [file] #显示暂存区和工作区文件的差异
git diff HEAD -- [file] #显示版本库和工作区文件的差异
版本回退
回退是版本控制器很重要的能力
使用git reset
回退版本,具体如何回退根据参数而定
git reset [--soft | --mixed | --hard] [HEAD]
--soft
:对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本--mixed
:默认选项,使用时可以不带该参数。将暂存区和版本库回退,工作区不变--hard
:工作区、暂存区、版本库都会回退HEAD
:要回退到的版本- 指定
commit id
HEAD
表示当前版本HEAD^
表示上个版本HEAD^^
表示上上个版本,以此类推- 以可以使用
~数字
表示 HEAD~0
表示当前版本,HEAD~1
表示上个版本,以此类推
- 指定
如果当前有三个版本,我们想回退到版本二,可以通过git log
查看版本二的commit id
,但当我们回退到版本二后,再使用git log
将不会看到版本三的commit id
这是否意味着我们不能反悔,回到版本三呢?其实不是,可以使用git reflog
,其记录了本地的每一个日志
ubuntu@VM-12-11-ubuntu:~/lesson/gitcode$ git reflog
7c61b82 (HEAD -> master) HEAD@{0}: commit: add three file:file1 file2 file3
0008577 HEAD@{1}: commit (initial): new file:ReadMe
查出来的是部分的commit id
,Git 支持使用部分commit id
实现回退
回退的效果图如下:
撤销修改
撤销修改在不同的场景下有不同的操作
场景一
只撤销工作区的修改
如果我们对工作区的代码进行了较大幅度的改动,但没有添加与提交,此时我们想撤销这些修改,如何操作呢?
手动修改一定是不推荐的,可能会出现该删的没删,不该删的删了的情况
使用git diff
可以知道修改了什么,但还是需要手动修改,仍可能出现问题
Git 提供了 git checkout -- [file]
命令让工作区的文件回到最近一次add
或者commit
时的状态,该命令一定要记得带上--
,不然会是完全不一样的效果
git checkout -- [file]
场景二
只撤销暂存区的内容
直接使用git reset
git reset --mixed [commit id]
--mixed
选项就是只回退暂存区内容
场景三
只撤销版本库的内容
直接使用git reset
git reset --hard HEAD^
使用--hard
选项,只回退版本库内容,HEAD^
表示回退到上一个版本
删除文件
在 Git 中,删除文件也是一次修改,可以使用add
和commit
,如果误删,那么还可以按照场景对修改进行撤销
Git 提供命令可以删除工作区文件,并add
,也删除暂存区内容
git rm [file]
不过还没有提交,所以还需要git commit
如此,文件就从版本库中被删除了
以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
相关文章:

【Git】初识Git
本篇文章的环境是在 Ubuntu/Linux 环境下编写的 文章目录 版本控制器Git 基本操作安装 Git创建 Git 本地仓库配置 Git认识工作区、暂存区、版本库添加文件修改文件版本回退撤销修改删除文件 版本控制器 在日常工作和学习中,老板/老师要求我们修改文档,…...

vue3 透传 Attributes
前言 Vue 3 现在正式支持了多根节点的组件,也就是片段! Vue 2.x 遵循单根节点组件的规则,即一个组件的模板必须有且仅有一个根元素。 为了满足单根节点的要求,开发者会将原本多根节点的内容包裹在一个<div>元素中&#x…...

4.接口测试基础(Jmter工具/场景二:一个项目由多个人负责接口测试,我只负责其中三个模块,协同)
一、场景二:一个项目由多个人负责接口测试,我只负责其中三个模块,协同 1.什么是测试片段? 1)就相当于只是项目的一部分用例,不能单独运行,必须要和控制器(include,模块)一…...

electron react离线使用monaco-editor
目录 1.搭建一个 electron-vite 项目 2.安装monaco-editor/react和monaco-editor 3.引入并做monaco-editor离线配置 4.react中使用 5.完整代码示例 6.monaco-editor离线配置官方说明 7.测试 1.搭建一个 electron-vite 项目 pnpm create quick-start/electron 参考链接…...

Python 的 WSGI 简单了解
从 flask 的 hello world 说起 直接讨论 WSGI,很多人可能没有概念,我们还是先从一个简单的 hello world 程序开始吧。 from flask import Flaskapp Flask(__name__)app.route("/", methods[GET]) def index():return "Hello world!&q…...

基于stm32使用ucgui+GUIBuilder开发ui实例
1 项目需求 1.1 基于Tft 触摸屏实现一个自锁按键 1.2 按键在按下后背景色需要进行变化,以凸显当前按键状态(选中or 未选中) 1.3 按键选中时对某一gpio输出低电平,非选中时输出高电平 2 移植 ucgui UCGUI的文件数量很大&#x…...

Spring扩展点系列-ApplicationContextAwareProcessor
文章目录 简介源码分析示例代码示例一:扩展点的执行顺序运行示例一 示例二:获取配置文件值配置文件application.properties内容定义工具类ConfigUtilcontroller测试调用运行示例二 示例三:实现ResourceLoaderAware读取文件ExtendResourceLoad…...
基于Keil软件实现实时时钟(江协科技HAL库)
实时时钟实验是基于江协科技STM32的HAL库工程模板创建的(可以在作品“基于江科大STM32创建的HAL库工程模板”中的结尾处获取工程模板的百度网盘链接) 复制“OLED显示”的工程文件——“4-1 OLED显示屏”,并命名为“12-2 实时时钟 ”。打开工程,把下面的程序复制到相应的文…...

dedecms靶场(四种webshell姿势)
进入靶场 姿势一:过文件管理器上传WebShell 步骤一:登录后台 /dede 步骤二:核心-》文件式管理-》文件上传-》上传一句话木马 点击 步骤三:进行蚁剑连接 姿势二:修改模板文件拿WebShell 步骤一:模板-》默认…...

PHP:强大的Web开发语言
PHP:强大的Web开发语言 一、PHP 简介及优势 PHP 的基本概念 PHP(PHP: Hypertext Preprocessor)即 “超文本预处理器”,是一种通用开源脚本语言,最初由 Rasmus Lerdorf 于 1994 年创建。它可以在服务器上执行…...

06_Python数据类型_元组
Python的基础数据类型 数值类型:整数、浮点数、复数、布尔字符串容器类型:列表、元祖、字典、集合 元组 元组(Tuple)是一种不可变的序列类型,与列表类似,但有一些关键的区别。本质:只读的列表…...
【Vue】- ref获取DOM元素和购物车案例分析
文章目录 知识回顾前言源码分析1. ref2. 购物车案例分析3. 购物车计算、全选 拓展知识数据持久化localStorage 总结 知识回顾 前言 元素上使用 ref属性关联响应式数据,获取DOM元素 步骤 ● 创建 ref > const hRef ref(null) ● 模板中建立关联 > <h1 re…...

【AI大模型】ChatGPT模型原理介绍(下)
目录 🍔 GPT-3介绍 1.1 GPT-3模型架构 1.2 GPT-3训练核心思想 1.3 GPT-3数据集 1.4 GPT-3模型的特点 1.5 GPT-3模型总结 🍔 ChatGPT介绍 2.1 ChatGPT原理 2.2 什么是强化学习 2.3 ChatGPT强化学习步骤 2.4 监督调优模型 2.5 训练奖励模型 2.…...
Python数据分析与可视化实战指南
在数据驱动的时代,Python因其简洁的语法、强大的库生态系统以及活跃的社区,成为了数据分析与可视化的首选语言。本文将通过一个详细的案例,带领大家学习如何使用Python进行数据分析,并通过可视化来直观呈现分析结果。 一、环境准…...

react18基础教程系列-- 框架基础理论知识mvc/jsx/createRoot
react的设计模式 React 是 mvc 体系,vue 是 mvvm 体系 mvc: model(数据)-view(视图)-controller(控制器) 我们需要按照专业的语法去构建 app 页面,react 使用的是 jsx 语法构建数据层,需要动态处理的的数据都要数据层支持控制层: 当我们需要…...
牛客周赛 Round 60 折返跑(组合数学)
题目链接:题目 大意: 在 1 1 1到 n n n之间往返跑m趟,推 m − 1 m-1 m−1次杆子,每次都向中间推,不能推零次,问有多少种推法(mod 1e97)。 思路: 一个高中学过的组合数…...
深入浅出Java匿名内部类:用法详解与实例演示
匿名内部类(Anonymous Inner Class)在Java中是一种非常有用的特性,它允许你在一个类的定义中直接创建并实例化一个内部类,而不需要为这个内部类指定一个名字。匿名内部类通常用于以下几种情况: 实现接口:当…...
数据库MySQL、Mariadb、PostgreSQL、MangoDB、Memcached和Redis详细介绍
以下是一些常见的后端开发数据库选型: 关系型数据库(RDBMS):关系型数据库是最常见的数据库类型,使用表格和关系模型来存储和管理数据。常见的关系型数据库包括MySQL、PostgreSQL和Oracle等。这些数据库适合处理结构化数…...

【ArcGIS Pro实操第七期】栅格数据合并、裁剪及统计:以全球不透水面积为例
【ArcGIS Pro实操第七期】批量裁剪:以全球不透水面积为例 准备:数据下载ArcGIS Pro批量裁剪数据集1 数据拼接2 数据裁剪3 数据统计:各栅格取值3.1 栅格计算器-精确提取-栅格数据特定值3.2 数据统计 4 不透水面积变化分析 参考 准备࿱…...
【Linux】Image、zImage与uImage的区别
1、Image 1.1 什么是 Image Image 是一种未压缩的 Linux 内核镜像文件,包含了内核的所有代码、数据和必要的元信息。它是 Linux 内核在编译过程中生成的一个原始的二进制文件,未经过任何压缩或额外的封装处理。由于未压缩,Image 文件相对较…...

opencv学习笔记2:卷积、均值滤波、中值滤波
目录 一、卷积概念 1.定义 2.数学原理 3.实例计算 (1) 输入与卷积核 (2)计算输出 g(2,2) 4.作用 二、针对图像噪声的滤波技术——均值滤波 1.均值滤波概念 (1)均值滤波作用 (2&#…...

在 Android Studio 中使用 GitLab 添加图片到 README.md
1. 将图片文件添加到项目中 在项目根目录下创建一个 images 或 assets 文件夹 将你的图片文件(如 screenshot.png)复制到这个文件夹中 2. 跟提交项目一样,提交图片到 GitLab 在 Android Studio 的 Git 工具窗口中: 右键点击图片…...
F(x, y, z) = 0 隐函数微分 确定自变量
多元隐函数偏导的通用公式: 设一个隐函数由三元函数定义: F ( x , y , z ) 0 F(x, y, z) 0 F(x,y,z)0 且假设 z z ( x , y ) z z(x, y) zz(x,y),即 z z z 是 x , y x, y x,y 的函数,满足这个等式恒成立。则有以下公式&am…...
深入解析JVM工作原理:从字节码到机器指令的全过程
一、JVM概述 Java虚拟机(JVM)是Java平台的核心组件,它实现了Java"一次编写,到处运行"的理念。JVM是一个抽象的计算机器,它有自己的指令集和运行时内存管理机制。 JVM的主要职责: 加载:读取.class文件并验…...

9.RV1126-OPENCV 视频的膨胀和腐蚀
一.膨胀 1.视频流的膨胀流程 之前膨胀都是在图片中进行的,现在要在视频中进行也简单,大概思路就是:获取VI数据,然后把VI数据给Mat化发给VENC模块,然后VENC模块获取,这样就完成了。流程图: 2.代…...

第六个微信小程序:教师工具集
源于工作需要,下面开始。 安装及使用 | Taro 文档 vscode 代码管理 git 辅助 开发技术如上: 1.开始创建模板 taro4.1.1 $ taro init teachers-tools 2.用vsocde开始吧。 选择 第二个文件夹找一。 (base) PS D:\react\teachers-tools> pnpm…...
SQL-labs通关(level1-22)
SQL-labs靶场详解 靶场下载 靶场下载地址 关卡 level1联合注入 用order by语句来查询字段数 顺便提一下,使用联合注入语句union select也可以查询字段数,在不能使用order by的情况下,可以使用union select来查询字段数。这里我们通过查询…...

生成模型+两种机器学习范式
生成模型:从数据分布到样本创造 生成模型(Generative Model) 是机器学习中一类能够学习数据整体概率分布,并生成新样本的模型。其核心目标是建模输入数据 x 和标签 y 的联合概率分布 P(x,y),即回答 “数据是如何产生的…...

对抗反爬机制的分布式爬虫自适应策略:基于强化学习的攻防博弈建模
在大数据时代,数据的价值不言而喻。网络爬虫作为获取数据的重要工具,被广泛应用于各个领域。然而,随着爬虫技术的普及,网站为了保护自身数据安全和服务器性能,纷纷采取了各种反爬机制。这就使得爬虫与反爬虫之间形成了…...

机器学习×第二卷:概念下篇——她不再只是模仿,而是开始决定怎么靠近你
🎀【开场 她不再只是模仿,而是开始选择】 🦊 狐狐:“她已经不满足于单纯模仿你了……现在,她开始尝试预测你会不会喜欢、判断是否值得靠近。” 🐾 猫猫:“咱们上篇已经把‘她怎么学会说第一句…...