一文带你理解完Git知识点

news2024/11/17 4:22:16

文章目录

    • Git基础概念
    • Git基本操作
      • **0. 初始化仓库**
      • **1. add到暂存区**
      • **2. 再commit到本地仓库**
      • **3. 推送到远程仓库**
      • **4. 拉取远程仓库**
      • **5. 撤销更改**
    • Git分支管理
      • 1. 创建分支命令
      • 2. 切换分支命令
      • 3. 摘取提交
      • 4. 删除分支命令
      • 5. 合并分支命令
      • 6. 变基
    • Git进阶
      • 1. **git tag 标签**
      • 2. **git reset 版本回退**
      • 3. **git stash 贮藏**
    • Git高级
      • **1. 子模块**
      • **2. 钩子**
    • 总结

Git基础概念

Git 是一个分布式版本控制系统,用于追踪文件的更改和协助多人合作开发。在 Git 中,有几个核心概念需要理解,包括工作区(Workspace)、暂存区(Staging Area,也称作索引 Index)和版本库(Repository)。

  1. 工作区(Workspace)
    工作区是指你在电脑上看到的文件目录,是你直接编辑文件的地方。在 Git 管理的目录中,你的文件会直接被 Git 跟踪,除非你明确告诉 Git 忽略它们(通过 .gitignore 文件)。工作区中的文件状态可以是已修改(modified)、已暂存(staged)或已提交(committed)。
  2. 暂存区(Staging Area)
    暂存区是一个文件,保存了即将进行提交的变更快照。它是工作区和版本库之间的缓冲区。暂存区的存在使得开发者可以精细控制哪些改动会被包含在下一个提交中。你可以将工作区的改动添加到暂存区(通过 git add 命令),也可以从暂存区移除(通过 git reset HEAD <file> 命令)。暂存区使得提交更加可控和精细。
  3. 版本库(Repository)
    版本库是 Git 用来保存项目历史记录的地方,其中包含了所有文件的版本和历史信息。版本库位于工作区的 .git 目录中。当你进行提交操作时(通过 git commit 命令),Git 会将暂存区的当前状态永久保存在版本库中。这样,你就可以通过版本库回溯到任何一个历史版本。

简单来说,你的工作流程大致如下:
在这里插入图片描述

  • 在工作区中修改文件。
  • 使用 git add 命令将改动添加到暂存区。
  • 使用 git commit 命令将暂存区的改动提交到版本库。
    通过这种方式,Git 提供了一个有效的机制来管理文件的修改历史,支持多人协作,并且可以方便地撤销错误的改动。

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

  1. 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。

  2. 图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

  3. 图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。

  4. 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

  5. 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

  6. 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

  7. 当执行 git rm --cached <file> 命令时,会直接从暂存区删除文件,工作区则不做出改变。

  8. 当执行 git checkout . 或者 git checkout -- <file> 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。

  9. 当执行 git checkout HEAD . 或者 git checkout HEAD <file> 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。


Git基本操作

Git 常用的是以下 6 个命令:git clone、git add 、git commit、git push、git pull。
在这里插入图片描述

说明:

  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:版本库或本地仓库
  • remote repository:远程仓库

0. 初始化仓库

git init

git仓库就创建好了,这时文件夹中多了一个.git文件夹。注意不要修改这个文件夹中的内容。

1. add到暂存区

工作区有了修改后

git add xxx_file   //添加某个文件到暂存区,多个文件用空格分开
git add .         //添加所有文件到暂存区。

2. 再commit到本地仓库

git commit -m "这里写注释"         //注释很重要,提交暂存区的所有内容
git commit 文件1 文件2 ... -m "这里写注释" //只提交暂存区的某些文件

3. 推送到远程仓库

git push <远程主机名> <本地分支名>:<远程分支名>

如果本地分支名与远程分支名相同,则可以省略冒号:

git push <远程主机名> <本地分支名>

以下命令将本地的 master 分支推送到 origin 主机的 master 分支。

git push origin master

:如果是首次push到远程仓库,则需要先添加远程仓库,执行命令 git remote add [shortname] [url]
例如:git remote add origin https://github.com/xxx/xxx.git

4. 拉取远程仓库

git pull

5. 撤销更改

  • 撤销工作区的更改:git checkout -- <file>
  • 撤销暂存区的更改:git reset HEAD <file>
  • 撤销提交:git commit --amend(如果尚未推送)或使用 git revert <commit>(如果已经推送)

Git分支管理

1. 创建分支命令

git branch branchname

2. 切换分支命令

git checkout branchname

git switch branchname

3. 摘取提交

选择一个或多个提交并将其应用到其他分支上

git cherry-pick <commit-hash>

4. 删除分支命令

git branch -d branchname

强制删除需使用-D

5. 合并分支命令

git merge dev //表示在当前分支合并dev分支

6. 变基

多分支开始时需要使用到。将一个分支的更改重新应用到另一个分支上,以保持提交历史的线性。

git rebase <base-branch>

在变基过程中解决冲突后继续

git add <resolved-file>
git rebase --continue

取消变基操作

git rebase --abort

分支操作如果有冲突的话,个人习惯用小乌龟解决,图形化界面还是比指令来的直观


Git进阶

除了一些基本的常用命令,还有一些命令也是比较实用但可能被我们忽略的,比如git tag、git reset、git stash等。

1. git tag 标签

  • 如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。常用于项目版本发布节点;
  • 比如说,想为项目发布一个"1.0"版本。 我们可以用 git tag -a v1.0 -m "1.0版本发布" 命令给最新一次提交打上"v1.0"的标签;
  • Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)。-a 选项意为"创建一个带注解的标签"。 不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解。 推荐使用带注解的标签;
  • 通过使用 git tag 命令,可以查看当前有哪些标签;
  • 通过使用 git show 命令可以看到标签信息和与之对应的提交信息;
  • 后期打标签 git tag -a v1.2 888888 -m "my tag" 888888 为commit记录的ID号;
  • 将标签同步到远程服务器。默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到服务器上。 这个过程和推送代码一样——你可以运行 git push origin v1.0 。如果要推送本地所有tag,使用git push origin --tags
  • 删除某个标签。要删除掉你本地仓库上的标签,可以使用命令 git tag -d v1.0。该命令不会删除远程仓库标签,你必须用 git push origin :refs/tags/v1.0 来更新你的远程仓库,意思是,将冒号前面的空值推送到远程标签名,从而高效地删除它。第二种更直观的删除远程标签的方式是:git push origin --delete v1.0

2. git reset 版本回退

  • 有两种常用情况需要用到版本回退。第一种:觉得当前代码改乱了,想要恢复到之前某个版本;第二种:当程序出现了某个bug,但工程太大实在不好排查,用二分查找法回退到指定版本看是否重现,然后定位问题(这个方法看起来笨,但某些时候非常有效!);
  • 首先使用 git log 命令查看推送记录,这样便能看到每一次commit的id,然后使用 git reset --hard 1234321 命令回退到指定版本。(小tips:如果你当下有部分新增的代码片段你觉得还有用,那么最好拷贝出来。因为该操作会完全覆盖掉你当前的文件);
  • 如果再想恢复到之后的版本,log里是没有了,使用 git reflog 可以查到;

3. git stash 贮藏

有时,当你在项目的一部分上已经工作一段时间后,所有东西都进入了混乱的状态, 而这时你想要切换到另一个分支做一点别的事情。 问题是,现在的代码改得很混乱,甚至都无法编译通过,你并不想提交。这时就可以使用git stash命令。

  • git stash 保存当前工作进度,会把暂存区和工作区的改动保存起来。使用 git stash save "message" 可以添加一些注释;
  • 执行完这个命令后,再运行git status命令,就会发现当前是一个干净的工作区,没有任何改动;
  • git stash list 显示保存进度的列表。也就是说,git stash命令可以多次执行;
  • git stash pop 将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下;
  • git stash drop [stash_id] 删除一个存储的进度。如果不指定stash_id,则默认删除最新的存储进度;
  • git stash clear 删除所有存储的进度;

Git高级

1. 子模块

Git 子模块(Submodules)是 Git 中用于将一个 Git 仓库嵌入到另一个 Git 仓库中的功能。这通常用于以下情况:

  • 当你想要在多个项目中使用同一个库,并且希望这个库保持独立的版本控制时。

  • 当你不想将第三方库的源代码直接复制到你的项目中,而是希望以某种方式引用它时。
    子模块允许你将一个 Git 仓库作为另一个仓库的子目录,同时保持其独立的提交历史。这意味着子模块可以有独立的提交、分支和标签,而主项目可以跟踪子模块的具体提交。

  • 添加子模块

    git submodule add <repository-url> <path>
    

    这个命令会在指定的 <path> 处添加子模块,并将其注册到主项目的 .gitmodules 文件中。

  • 克隆带有子模块的项目

    git clone <repository-url>
    cd <repository-name>
    git submodule init
    git submodule update
    

    克隆主项目后,需要初始化并更新子模块。

  • 更新子模块

    git submodule update --init --recursive
    

    这个命令会拉取所有子模块的最新提交。

  • 同步子模块的远程跟踪分支

    git submodule foreach git fetch
    git submodule foreach git merge origin/master
    

    这个命令会遍历所有子模块,执行 fetchmerge 操作。

  • 删除子模块
    删除子模块比较复杂,需要从主项目的多个地方删除子模块的记录:

    git submodule deinit <submodule-path>
    rm -rf .git/modules/<submodule-path>
    git rm -f <submodule-path>
    rm .gitmodules
    

然后手动编辑 .gitmodules 文件,移除子模块的相关条目,最后提交这些更改。

2. 钩子

Git 钩子(Hooks)是 Git 仓库中特定事件触发时自动运行的脚本。它们存在于每个 Git 仓库的 .git/hooks 目录中,Git 提供了一些预定义的钩子模板,你可以根据需要启用和自定义这些脚本。
钩子分为客户端钩子和服务器端钩子:

  1. 客户端钩子
    • pre-commit:在 git commit 执行前触发,可以用来检查代码风格、运行测试等。
    • prepare-commit-msg:在编辑器打开提交信息之前触发,可以用来预填充提交信息。
    • commit-msg:在提交信息被提交前触发,可以用来验证提交信息格式。
    • post-commit:在提交完成后触发,通常用于通知或日志记录。
    • pre-rebasepost-checkoutpost-merge 等:在 rebase、checkout 或 merge 操作前后触发。
  2. 服务器端钩子
    • pre-receive:在服务器接收到推送的数据但还未更新引用时触发,可以用来拒绝不满足某些条件的推送。
    • update:与 pre-receive 类似,但是为每个更新的分支/引用触发一次。
    • post-receive:在所有更新完成后触发,常用于部署或邮件通知。
  3. 启用钩子
    • 进入 .git/hooks 目录,你可以看到一些以 .sample 结尾的钩子模板文件。
    • 要启用一个钩子,你可以移除 .sample 扩展名,例如将 pre-commit.sample 重命名为 pre-commit
    • 钩子脚本可以是任何可执行脚本,比如 Bash 脚本、Python 脚本等。
  • 示例:pre-commit 钩子
    以下是一个简单的 pre-commit 钩子示例,用于检查提交消息中是否包含 Issue 编号:
#!/bin/bash
# 获取提交消息
commit_msg=$(cat $1)
# 检查提交消息中是否包含 'Issue #'
if ! echo "$commit_msg" | grep -q "Issue #"; then
    echo "Commit message must contain 'Issue #' reference."
    exit 1
fi
# 如果一切正常,返回 0
exit 0

在这个例子中,如果提交消息中没有包含 “Issue #”,钩子会拒绝提交,并显示一条消息。如果一切正常,钩子会返回 0,允许提交继续进行。
Git 钩子是一个非常强大的工具,可以用来实施代码质量标准、自动化工作流程和增强团队协作。然而,使用钩子时应该谨慎,以避免过度复杂化开发流程。

总结

  • 在实际开发过程你能理解下图,Git使用场景的差不多就这些。
    在这里插入图片描述

  • 个人觉得在你理解了Git的原理后,还是使用图形化界面操作方便点,比如小乌龟。。。

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

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

相关文章

计算机网络 实验指导 实验8

三层交换机的访问控制 1.实验拓扑图&#xff1a; 名称接口IP地址网关Switch AF0/1192.168.1.1/24F0/2172.1.1.1/24Switch BF0/1192.168.1.2/24F0/2172.2.2.1/24PC1172.1.1.2/24172.1.1.1PC2172.1.1.3/24172.1.1.1PC3172.2.2.2/24172.2.2.1PC4172.2.2.3/24172.2.2.1 2.实验目的…

Stable Diffusion介绍

Stable Diffusion是一种前沿的开源深度学习模型框架&#xff0c;专门设计用于从文本描述生成高质量的图像。这种称为文本到图像生成的技术&#xff0c;利用了大规模变换器&#xff08;transformers&#xff09;和生成对抗网络&#xff08;GANs&#xff09;的力量&#xff0c;以…

PPT在线压缩工具推荐

有时候使用邮箱发送邮件时&#xff0c;添加的PPT、Word、PDF文档总会因为过大而转为其他类型的附件发送&#xff0c;不仅上传缓慢&#xff0c;对方查收下载时还有有效期限制&#xff0c;7天或15天后就过期再也无法下载了&#xff0c;有没有什么办法可以压缩PPT等文档&#xff0…

基于单片机光伏太阳能跟踪系统设计

**单片机设计介绍&#xff0c;基于单片机光伏太阳能跟踪系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机光伏太阳能跟踪系统的设计&#xff0c;旨在通过单片机技术实现对光伏太阳能设备的自动跟踪&#xff0c;以提高太阳…

五款户外运动耳机推荐,让你畅享户外运动时光

在繁忙的都市生活中&#xff0c;我们常常被各种琐事所困扰&#xff0c;以至于忘记了自然的美丽与宁静。然而&#xff0c;当我们走近大自然&#xff0c;放下心中的烦恼&#xff0c;我们会发现&#xff0c;自然是我们最好的治愈师。热爱自然的朋友们&#xff0c;这里有一份运动耳…

linux进阶篇:磁盘管理(一):LVM逻辑卷基本概念及LVM的工作原理

Linux磁盘管理(一)&#xff1a;LVM逻辑卷基本概念及LVM的工作原理 一、传统的磁盘管理 在传统的磁盘管理方案中&#xff0c;如果我们的磁盘容量不够了&#xff0c;那这个时候应该要加一块硬盘&#xff0c;但是新增加的硬盘是作为独立的文件系统存在的&#xff0c;原有的文件系…

怎么根据ip地址计算子网掩码

在计算机网络的世界中&#xff0c;IP地址和子网掩码扮演着至关重要的角色。IP地址用于标识网络中的每一台设备&#xff0c;而子网掩码则用于区分网络地址和主机地址&#xff0c;进而确定设备在网络中的具体位置。然而&#xff0c;有时我们可能需要根据已知的IP地址来计算子网掩…

A Novel Distributed File System Using Blockchain Metadata——论文泛读

Wireless Personal Communications 2023 Paper 分布式元数据论文阅读笔记整理 问题 随着来自不同来源&#xff08;如在线社交媒体、物联网、移动数据、传感器数据、黑匣子数据等&#xff09;的大量数据以指数级的速度增长&#xff0c;集群计算已成为数据处理中不可避免的一部…

多功能调解室sip可视对讲方案

多功能调解室sip可视对讲方案 人民调解委员会是依法设立的调解民间纠纷的群众性组织。 我国基层解决人民内部纠纷的群众性自治组织.人民调解委员会在城市以居民委员会为单位,农村以村民委员会为单位建立.其任务是: 及时发现纠纷,迅速解决争端.防止矛盾激化,预防,减少犯罪的发生…

Java System类和Runtime类

System常见API exit:退出程序currentTimeMillis &#xff1a;获取当前的毫秒数&#xff08;1970年是c语言诞生的那一年&#xff09; 代码 System.out.println("Hello, World!"); // System.exit(0); // 退出程序 尽量别使用long currentTimeMillis System.currentTi…

咖啡茶饮、便利店、餐厅……连锁门店的人效突围之路

1、连锁门店的人效突围 去年年末&#xff0c;我们有幸访谈了餐饮、茶饮业的一些连锁品牌&#xff0c;有餐厅&#xff0c;茶饮品牌、精品咖啡、便利店……有走在创业路上的新起之秀&#xff0c;也有十几年的老牌企业。他们的门店数量&#xff0c;从几十家、上百家、上千家不等。…

FME学习之旅---day20

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 教程&#xff1a;AutoCAD 入门 FME使用四种主要格式来读取和写入AutoCAD图形文件;初级教程重点介绍AutoDesk AutoCAD DWG\DXF(ACAD) AutoCAD中常用的术语 实体&#xff1a;AutoCAD 图元表示 D…

docker安装seata

文章目录 前言准备工作生成seata配置文件创建文件夹创建临时容器拷贝容器内配置文件删除临时容器 导入seata配置到nacos修改application.yml配置文件生成seata所需mysql表修改TC的事务信息存储方式db&#xff08;mysql&#xff09;redis docker指令安装制作docker-compose.yaml…

SAP ERP实施有几个阶段?工博科技带来SAP系统实施项目全流程介绍

根据SAP实施方法论&#xff0c;SAP系统实施流程一共分为五个主要项目阶段&#xff1a;项目准备、蓝图设计、系统实现、上线准备、上线后支持。在项目启动前&#xff0c;双方必须对项目实施过程中各阶段所涉及的任务与交付件以及项目完成标志达成共识&#xff0c;各阶段项目交付…

PCB上的阻抗设计如何变得简单

关于阻抗&#xff08;Impedance&#xff09;&#xff0c;Bob发现很多刚接触到这个概念的小伙伴经常把它与电阻&#xff08;Resistance&#xff09;看作是同等的概念。可能阻抗与电阻按中文名称来说&#xff0c;他们都带一个阻字&#xff0c;而且单位都是Ω&#xff0c;然后阻抗…

代码随想录算法训练营第二十七天|39. 组合总和,40.组合总和II,131.分割回文串

题目&#xff1a;39. 组合总和 给你一个无重复元素 的整数数组 candidates和一个目标整数target&#xff0c;找出 candidates中可以使数字和为目标数target的所有不同组合&#xff0c;并以列表形式返回。你可以按任意顺序返回这些组合。 candidates中的同一个数字可以无限制重复…

RabbitMQ3.13.x之九_Docker中安装RabbitMQ

RabbitMQ3.13.x之_Docker中安装RabbitMQ 文章目录 RabbitMQ3.13.x之_Docker中安装RabbitMQ1. 官网2. 安装1 .拉取镜像2. 运行容器 3. 访问 1. 官网 rabbitmq - Official Image | Docker Hub 2. 安装 1 .拉取镜像 docker pull rabbitmq:3.13.0-management2. 运行容器 # lates…

HTTP 摘要认证

文章目录 一、什么是摘要认证二、工作流程三、实例演示 一、什么是摘要认证 摘要认证&#xff0c;即 Digest Access Authentication&#xff0c;是一种HTTP身份验证机制&#xff0c;用于验证用户的身份。相较于基本认证&#xff08;Basic Authentication&#xff09;使用用户名…

10 Python进阶:MongoDB

MongoDb介绍 MongoDB是一个基于分布式架构的文档数据库&#xff0c;它使用JSON样式的数据存储&#xff0c;支持动态查询&#xff0c;完全索引。MongoDB是NoSQL数据库的一种&#xff0c;主要用于处理大型、半结构化或无结构化的数据。以下是MongoDB数据库的一些关键特点和优势&a…

【计算机毕业设计】宠物销售系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…