Git(一):初识Git

文章目录

  • Git(一):初识Git
    • Git简介
      • 核心功能
      • 分布式特性
      • 结构与操作
      • 优势与适用场景
    • 创建本地仓库
      • git init
      • 配置name与email
      • --global
    • 工作区、暂存区与版本库
      • git add
      • git commit
      • commit后.git的变化

Git(一):初识Git

Git简介

Git 是一个分布式版本控制系统,由 Linus Torvalds 于 2005 年为管理 Linux 内核开发而创建 。其核心功能是跟踪文件的修改历史,并支持多人协作开发,使团队成员能够高效地管理代码变更、回溯版本、合并修改等

核心功能

  • 版本控制:Git 通过记录文件的每次修改(称为“提交”),形成一个完整的版本历史。用户可以随时回溯到任意版本,甚至恢复早期的代码状态
  • 分支与合并:Git 支持创建和管理多个分支(branch),允许开发者在独立的分支上开发新功能或修复问题,最终通过合并(merge)将更改整合到主分支中 。这种非线性工作流程(如“功能分支”模型)显著提升了协作效率
  • 远程协作:Git 是分布式系统,每个开发者本地拥有完整的代码仓库(.git 目录),无需依赖中心服务器。团队成员可通过 git push 和 git pull 同步代码,实现跨设备的协作
  • 差异比较:Git 可生成差异文件(diff),直观展示文件或版本之间的修改内容,便于审查和调试

分布式特性

  • 本地副本:每个开发者拥有独立的本地仓库,即使在无网络连接时也能独立工作,增强了系统的鲁棒性
  • 离线操作:开发者可在本地完成代码修改、提交和分支管理,仅在需要时将更改推送到远程仓库(如 GitHub、GitLab)

结构与操作

  • 工作区:日常存放代码的目录,用户在此进行修改
  • 暂存区(Staging Area) :用于准备提交的中间区域,通过 git add 将修改标记为待提交
  • 版本库(.git) :隐藏的 .git 目录存储所有提交历史和元数据,用户不应直接修改该目录
  • 远程仓库:托管在云端(如 GitHub、Gitee)的代码仓库,用于团队协作和代码同步

优势与适用场景

  • 高效性:Git 的设计注重速度,尤其适合处理大型项目(如 Linux 内核)的频繁更新
  • 灵活性:支持多种开发模式(如功能分支、特性分支),并提供丰富的命令(如 git rebasegit stash)以应对复杂需求
  • 协作能力:通过 git pullgit push,团队成员可实时同步代码,减少冲突并确保代码一致性

创建本地仓库

git init

首先需要我们创建一个文件夹并进入该文件夹中,再执行git init命令,此时文件夹中就会生成一个隐藏目录.git,隐藏的 .git 目录用于存储所有提交历史和元数据,用户不应直接修改该目录

在这里插入图片描述

配置name与email

配置name和email是为了在远程仓库的提交记录中明确操作者。这有助于团队协作时追踪代码修改的来源,确保每个提交都能被正确归因,命令如下:

git config --global user.name "你的名字"
git config --global user.email "你的邮箱地址"

配置成功后,可以使用如下命令查看配置项:

git config -l

在这里插入图片描述

同时,我们也可以删除配置项后再重新配置,用到的命令如下:

git config --global --unset user.name
git config --global --unset user.email

–global

在Git中,git config --global user.name "你的名字"命令中的--global选项表示将配置的用户名应用到当前用户的所有Git仓库中。具体来说,使用--global选项时,Git会将用户信息保存在用户主目录下的.gitconfig文件中,这样无论你在哪个项目中使用Git,都会默认使用这个全局配置的用户名和邮箱地址进行提交

使用--global配置,在删除时也需要带上--global

工作区、暂存区与版本库

我们在gitcode目录中新建一个ReadMe文件,不进行其他操作,此时Git就可以进行版本控制了吗?

答案是不能,因为ReadMe还没有被添加进版本库中,只是在工作区中

  • 工作区:是在电脑上你要写代码或文件的目录。

  • 暂存区:英文叫stage或index。⼀般存放在.git 目录下的index文件(.git/index)中,我们把暂存区有时也叫作索引(index)

  • 版本库:又名仓库,英文名repository 。⼯作区有⼀个隐藏目录.git ,它不算⼯作区,而是Git的版本库。这个版本库里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”

下面这个图展示了工作区、暂存区和版本库之间的关系:

在这里插入图片描述

图中左侧为工作区,右侧为版本库。Git的版本库里存了很多东西,其中最重要的就是暂存区

  • 在创建Git版本库时,Git会为我们自动创建⼀个唯⼀的master分支,以及指向master的⼀个指 针叫HEAD(分支和HEAD的概念后面再说)
  • 当对工作区修改(或新增)的文件执行git add命令时,暂存区目录树的文件索引会被更新
  • 当执行提交操作 git commit 时,master分支会做相应的更新,可以简单理解为暂存区的目录树才会被真正写到版本库中。

由上述描述我们便能得知:通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是 在⼯作区新增了文件。必须要通过使用git addgit commit命令才能将文件添加到仓库中进行管理!!

但是上图中并没有体现版本控制!我们每次**修改(新增、修改、删除)**的内容存放在那里呢?

原因是在版本库中还有一个名为Objects的对象库,里面包含了创建的各种版本库对象及内容。当执行git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的⼀个新的对象中,就位于".git/objects"目录下

git add

git add是 Git 中用于将文件修改添加到暂存区(Staging Area)的命令。暂存区是提交前保存更改的临时区域。通过git add,可以将工作目录中的文件修改、新增或删除操作标记为“已暂存”,以便后续提交到版本库

我们执行git add命令,将ReadMe文件添加到暂存区中,再查看一下.git的目录结构:

在这里插入图片描述

index与master中存放的都是索引,指向的是Objects中的对象

git add命令执行时有两种方式:

  • git add后面直接加上文件名表示只添加该文件到暂存区,可以同时添加多个文件

  • git add .表示添加工作区中所有文件到暂存区

git add其他常见选项

  • 添加所有文件(包括删除的文件)
git add -A(all)

该命令会将当前目录下所有文件的修改、新增和删除操作添加到暂存区,适用于一次性处理所有变更

  • 仅添加已跟踪文件的修改和删除
git add -u

该命令会将已跟踪文件的修改(modified)和删除(deleted)添加到暂存区,但不包括新增的文件(new)

  • 撤销添加,若需撤销git add操作,可使用git reset
git reset 

git commit

git commit是 Git 中用于记录对存储库更改的核心命令。它将暂存区的内容(即通过git add添加的文件)保存为一个新的提交,并附带描述更改的日志消息。新提交通常会成为当前分支的最新提交并更新分支指针指向它,格式如下:

git commit -m "日志信息"

在这里插入图片描述

同时我们可以使用git log 命令来查看提交记录,它会按时间倒序显示当前分支的提交记录,最近的提交在顶部。每个提交包含哈希值、作者、日期和提交信息

在这里插入图片描述

git log --pretty=oneline可以按行打印

在这里插入图片描述

那一长串的数字就是每次commit生成的commit id,它是每次提交的唯一标识,可以用来进行版本追踪、数据完整性校验、协作开发、回滚操作、代码版本管理

git commit其他常见选项

  • 修改最近一次提交,可以用来修正提交消息或添加遗漏的文件
git commit --amend -m "新的提交消息"
  • 预览将要提交的内容,但不实际创建提交
git commit --dry-run

commit后.git的变化

在前面的图中,HEAD指向了master,我们来验证一下:
在这里插入图片描述

我们再来看一下master指向的是什么

在这里插入图片描述

我们发现master指向了一个commit id,我们再查看一下这个commit id指向的内容,命令如下:

git cat-file -p commit id

在这里插入图片描述

这时我们发现,它就是我们最近一次提交的日志信息,我们再来查看一下tree后面的commit id:

在这里插入图片描述

我们一直查看到底,就会发现,其中记录了我们在ReadMe中新增的内容,而上述所有的commit id均在Objects中有记录
在这里插入图片描述

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

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

相关文章

第19天:初级数据库学习笔记3

分组函数(多行处理函数) 即多个输入对应一个输出。前面讲的数据处理函数是单行处理函数。(在公司中常说单,多行处理函数) 分组函数包括五个: max:最大值min:最小值avg&#xff1a…

Windows11下搭建Raspberry Pi Pico编译环境

1. 系统与工具要求 PC平台: Windows 11 专业版 Windows GCC: gcc-15.1.0-64.exe GNU Make: 4.3 Git: 2.49.0 cmake: 4.0.2 python:3.12.11 Arm GNU Toolchain Downloads – Arm Developer 2. 工具安装与验证 2.1 工具安装 winget安装依赖工具(Windows …

【C语言极简自学笔记】重讲运算符

一、算术操作符 算术操作符描述把两个操作数相加-第一个操作数减去第二个操作数*把两个操作数相乘/分子除以分母%取模运算符,整除后的余数 注意:1.除号的两端都是整数的时候执行的是整数的除法,两端只要有一个浮点数,就执行浮点…

持续集成 CI/CD-Jenkins持续集成GitLab项目打包docker镜像推送k8s集群并部署至rancher

Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 之前是通过jar包在shell服务器上进行手动部署,麻烦且耗时。现通过Jenkins进行持续集成实现CI/CD。以test分支为例 提交即部署。 由于是根据自己实际使用过程 具体使用到了 gitlabjenkinsdockerharborra…

Apache Iceberg与Hive集成:非分区表篇

引言 在大数据处理领域,Apache Iceberg凭借其先进的表格式设计,为大规模数据分析带来了新的可能。当Iceberg与Hive集成时,这种强强联合为数据管理与分析流程提供了更高的灵活性和效率。本文将聚焦于Iceberg与Hive集成中的非分区表场景&#…

webpack 如何区分开发环境和生产环境

第一种方法: 方法出处:命令行接口(CLI) | webpack 中文文档 1.利用webpack.config.js 返回的是个函数,利用函数的参数,来区分环境 具体步骤 1) package.json文件:在npm scripts 命令后面追加 …

React组件通信——context(提供者/消费者)

Context 是 React 提供的一种组件间通信方式,主要用于解决跨层级组件 props 传递的问题。它允许数据在组件树中"跨级"传递,无需显式地通过每一层 props 向下传递。 一、Context 核心概念 1. 基本组成 React.createContext:创建 C…

“微信短剧小程序开发指南:从架构设计到上线“

1. 引言:短剧市场的机遇与挑战 近年来,短视频和微短剧市场呈现爆发式增长,用户碎片化娱乐需求激增。短剧小程序凭借轻量化、社交传播快、变现能力强等特点,成为内容创业的新风口。然而,开发一个稳定、流畅且具备商业价…

RPC与RESTful对比:两种API设计风格的核心差异与实践选择

# RPC与RESTful对比:两种API设计风格的核心差异与实践选择 ## 一、架构哲学与设计目标差异 1. **RPC(Remote Procedure Call)** - **核心思想**:将远程服务调用伪装成本地方法调用(方法导向) - 典型行为…

【pytest进阶】pytest之钩子函数

什么是 hook (钩子)函数 经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是什么? what is hook ?钩子hook,顾名思义,可以理解是一个挂钩,作用是有需要的时候挂一个东西…

深度学习计算——动手学深度学习5

环境:PyCharm python3.8 1. 层和块 块(block)可以描述 单个层、由多个层组成的组件或整个模型本身。 使用块进行抽象的好处: 可将块组合成更大的组件(这一过程通常是递归) 如 图5.1.1所示。通过定义代码来按需生成任意复杂度…

NodeJS的fs模块的readFile和createReadStream区别以及常见方法

Node.js 本身没有像 Java 那样严格区分字符流和字节流,区别主要靠编码(encoding)来控制数据是以 Buffer(二进制字节)形式还是字符串(字符)形式处理。 详细解释: 方面JavaNode.js字节…

基于二进制XOR运算的机器人运动轨迹与对称图像自动生成算法

原创:项道德(daode3056,daode1212) 新的算法出现,往往能给某些行业与产业带来革命与突破。为探索机器人运动轨迹与对称图像自动生成算法,本人已经通过18种算法的测试,最终,以二进制的XOR运算为…

Spring AI 项目实战(七):Spring Boot + Spring AI Tools + DeepSeek 智能工具平台(附完整源码)

系列文章 序号文章名称1Spring AI 项目实战(一):Spring AI 核心模块入门2Spring AI 项目实战(二):Spring Boot + AI + DeepSeek 深度实战(附完整源码)3Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码)4Spring AI 项目实战(四…

spring-webmvc @RequestHeader 典型用法

典型用法 基础用法:获取指定请求头值 GetMapping("/info") public String getInfo(RequestHeader("User-Agent") String userAgent) {return "User-Agent: " userAgent; }如果请求中包含 User-Agent 请求头,则其值将被…

Ubuntu:20.04中安装docker

是的,您列出的命令是完整的安装步骤,但为了确保100%可靠性和处理可能的问题,我建议进行以下优化和补充: 完整优化的安装脚本(包含错误处理和验证) #!/bin/bash# 1. 彻底清理旧版本和配置 sudo apt remove…

大数据实时风控引擎:Spark Streaming、Kafka、Flink与Doris的融合实践

大数据实时风控引擎:Spark Streaming、Kafka、Flink与Doris的融合实践 在数字金融、电商交易与在线服务的核心战场,风险控制能力已成为业务的生命线。传统批量风控模式在应对瞬息万变的欺诈攻击、信用风险时捉襟见肘。本文将深入探讨如何利用**Spark St…

【创龙瑞芯微 RK3576 全国产 ARM 八核 2.2GHz 工业开发板-硬件说明书】

前 言 本文主要介绍TL3576-EVM评估板硬件接口资源以及设计注意事项等内容。 RK3576J/RK3576处理器的IO电平标准一般为1.8V、3.3V,上拉电源一般不超过3.3V或1.8V,当外接信号电平与IO电平不匹配时,中间需增加电平转换芯片或信号隔离芯片。按键或接口需考虑ESD设计,ESD器件…

一文吃透ADB,从入门到精通

目录 一、ADB 简介1.1 什么是 ADB1.2 ADB 的工作原理1.3 ADB 的安装与环境配置 二、ADB 基础命令2.1 设备连接相关命令2.2 应用管理命令2.3 文件传输命令 三、ADB 高级命令3.1 ADB Shell 深入探究3.2 日志查看与分析3.3 设备信息获取3.4 屏幕操作与录制 四、ADB 常见问题与解决…

PostgreSQL高可用架构设计与实践指南

# PostgreSQL高可用架构设计与实践指南 ## 一、高可用性核心诉求 PostgreSQL作为企业级关系型数据库,高可用设计需要满足以下关键指标: - 故障恢复时间(RTO):秒级到分钟级自动切换能力 - 数据损失容忍度&#xff0…