最值得拥有且最详细的Git使用教程
liuian 2025-04-09 17:55 15 浏览
前言
这篇文章写于2022.02.24,那天是不寻常的一天。所有的人都在关注此事件时,我却在偷偷进行内卷,依然在写更文挑战文章。哈哈哈,沉迷于此,无法自拔,每天都会想写点什么
这次就聊聊平时工作中用于版本管理的工具——Git的介绍和使用方式。既然点进来了,就别走了,坐着慢慢地往下看,看完你一定会获得一些东西的,哪怕只有一点点,就是这一点点的存在才促成了此文存在的意义!
思考
为什么使用Git?
开发人员平时写个小程序,或者写一个只有几百行代码的小项目,不需要专门的代码管理工具,依靠自己的记忆就能把代码撸清楚。但是,一个巨大的项目,往往需要经过很多人协同工作数周乃至数月才能完成,因为代码量巨大;而在开发过程中,又会面临代码的增删查改、恢复等工作,开发人员又不太可能清楚地记得每次变化,这时就需要借助版本管理工具来跟踪代码的变化历程。
版本管理工具会给每个文件增加一个版本号,每次修改之后(哪怕只改动一个字母),版本管理工具都会精确地记录下来,并改变该文件的版本号。这样,每个版本号就会对应着文件的一次变化,依此可以进行文件的对比、恢复等操作。
所以,Git这个版本管理工具的出现就能帮助我们完美地解决上面出现的问题,这也就是我们要使用它的根本原因。
Git和SVN
SVN属于典型的集中式版本控制系统,集中式版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。若服务宕机了,那谁都无法提交更新、还原、对比等,也就无法协同工作。如果中央服务器的磁盘发生故障,并且没做过备份或者备份得不够及时的话,还会有丢失数据的风险;最坏的情况是彻底丢失整个项目的所有历史更改记录,这样的话就不能保证所有的数据都被提取出来。
而Git属于分布式版本控制系统,分布式版本控制系统中的客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这样任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。另外,因为Git在本地磁盘上就保存着所有当前项目的历史更新记录,并且Git中的绝大多数操作都只需要访问本地文件和资源,不用连网,所以处理起来速度飞快。用SVN的话,没有网络或者断开VPN就无法做任何事情;但用Git的话,没有网络也可以愉快地频繁提交更新,等到了有网络的时候再上传到远程的镜像仓库即可。
目录
一、GIT基础
1、Git简介
Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理;也是由Linux之父Linus为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
2、Git官网
Git官网地址:https://git-scm.com/,在官网上可以获取Git的安装软件和使用文档。
3、Git安装
在上述官网进入下载页面,根据各自的操作系统下载合适的安装包,然后一步步next安装完即可。如下图所示:
4、Git基本配置
安装完成之后,在任意目录下,鼠标右键选择Git Bash Here就会打开终端;然后输入全局配置邮箱和用户名的命令进行配置即可。命令如下图所示:
5、Git基本概念
接下来就聊聊Git的基本概念,弄清楚概念那后续的问题就不是问题了→
5.1、Git工作区域
Git有4个工作区域,分别为:工作区、版本库、暂存区和远程仓库。
- 工作区(Working Directory):就是我们项目的目录
- 版本库(Repository):工作区内有一个.git文件,它就是Git的版本库,存储了所有的版本信息
- 暂存区(Stage):就是一个保存了下次将提交的文件列表信息的文件,在Git仓库目录中
- 远程仓库(Remote Repository):就是我们在服务器上搭建的仓库。例如:Github、Gitlab、Gitee、Coding;工作中我们使用的是自己搭建的Gitlab服务,个人开发中我使用的是Coding和Github服务。
基本的Git工作流程如下:
- 在工作目录修改文件
- 暂存文件,将文件快照放入暂存区
- 提交更新,找到暂存区的文件,将快照永久性存储到到Git仓库区(本地)
- 将本地仓库的变更推送到远程仓库
5.2、Git分支
分支是为了将修改记录的整个流程分开存储,让分开的分支不受其它分支的影响,所以在同一个数据库里可以同时进行多个不同的修改。
Git自动创建的第一个分支叫主分支(也就是master),一般其它分支开发完成后都要合并到主分支上。
5.3、Git文件状态
在Git中,文件主要有四种状态:Untracked、Unmodify、Modified和Staged。如下图:
- Untracked:未跟踪, 文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged
- Unmodify(Committed):文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
- Modified:文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
- Staged:暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified
参考资料:Git文件的4种状态——作者:uTank
二、Git应用实践
接下来,就是用实际开发中的流程来加深对Git基础概念的理解了→
1、克隆项目
这里我将从github上克隆一个后台管理系统项目antd-admin用于演示,如下图所示:
2、代码管理
项目已经成功克隆,接下来开始开发,let's go!
2.1、创建分支
当我们成功克隆一个项目之后,会存在一个master分支,如上面的图所示。这时我们还要创建一个develop分支就需要使用命令:git branch develop,如下图:
可以通过命令:git branch列出当前分支清单;通过命令:git branch -a查看本地和远程所有分支。
2.2、切换分支
通过命令:git checkout develop切换到新建的develop分支。
2.3、添加文件到暂存区
在develop分支上更改README-zh_CN.md文件,然后将其修改添加到暂存区。首先通过命令:git status查看工作区状态;然后使用命令:git add .将更改添加到暂存区,然后再查看工作区状态。
2.4、提交修改到仓库
现在将暂存区的修改文件通过命令:git commit -m 'xxx'将其提交到仓库。
这里需要说一下,提交文本尽量遵循规范,这样一是便于后续若回滚时可快速定位提交记录,二是便于协作的同事快速了解我们的提交意图。
- feat:新功能
- fix:bug修复
- docs:文档变更
- style:样式相关的改动
- refactor:重构
2.5、推送修改到远程仓库
然后使用命令:git push origin develop将修改推送到远程仓库。在实际开发中,通常会在推送之前通过命令:git pull origin develop拉取远程仓库,以此来保证本地版本也是最新的,避免是落后时要解决冲突。这里我们演示的就只有我们自己开发,所以就没有先执行拉取命令了。
然后在远程仓库上就可以看到我们刚刚推送的记录信息。如下图所示;
如果在推送的时候出现以下弹窗,那是由于远程仓库的token过期了,需要先去github上创建新的token之后保存下新的token,然后执行推送时再弹出弹窗就将token作为密码输入完成后即可推送成功。
2.6、合并分支
实际开发中,我们都是先在自己的分支上开发,然后推送到自己的远程分支,最后将自己的分支合并到master之后再打包发布版本。要完成上述过程,就需要先将分支切换到master,然后通过命令:git merge develop将develop分支合并到master。
2.7、版本回退
如果发现这次提交不是想要的,可以通过命令:git reset --hard HEAD^回退到上一次提交。
2.8、打标签
如果要发布一个版本,可以通过命令:git tag publish/1.0.1给这次提交打一个标签。然后可以通过命令:git tag查看已打的标签信息。
可以看到我们fork的这个项目在我们fork之前就已经打了很多标签了。
三、Git常用命令
其实在日常开发中,使用到常用命令也就几个而已,以下就是我实际开发中常用的git命令。
git clone [url]
git add .
git commit -m 'xxx'
git pull origin [分支名]
git push origin [分支名]
git checkout -b [新分支名]
复制代码
话说回来,要想熟练使用,那就要记住更多命令了,下面就是常用的命令汇总。
1、初始化仓库
git init:在当前文件夹下创建一个.git文件夹
git clone [url]:克隆一个项目以及它的整个代码历史
复制代码
2、配置
git config list:显示git配置
// 全局设置提交代码时的用户信息
git config --global user.name 'xxx'
git config --global user.email 邮箱地址
复制代码
3、增加/删除文件
git status:查看当前工作区的文件状态
git add .:添加当前目录的所有文件到暂存区
git add [file1] [file2]:添加指定文件到暂存区,多个文件用空格隔开
git rm [file1] [file2]:删除工作区指定文件,多个文件用空格隔开
git rm --cached [file]:停止追踪指定文件,但该文件会保留在工作区
git mv [原始文件] [更名文件]:文件改名,并且放入暂存区
复制代码
4、代码提交
git commit -m 'xxx':提交代码到仓库区,没有-m会进入vim编辑器
git commit [file1] [file2]... -m 'xxx':提交指定文件到仓库区,多个文件用空格隔开
复制代码
5、分支
git branch:查看本地所有分支
git branch -a:查看本地和远程所有分支
git branch [新分支名]:新建一个分支并停留在当前分支
git checkout [分支名]:切换到指定分支
git checkout -b [新分支名]:新建一个分支并切换到该分支
git merge [分支名]:合并制定分支到当前分支
复制代码
6、标签
git tag:查看所以标签
git tab [xxx]:新建一个标签
git tag -d [标签名]:删除本地标签
git push origin :refs/tags/[标签名]:删除远程标签
git push [remote] [标签名]:提交指定标签
git checkout -b [新分支名] [标签名]:新建一个分支并指向某个标签
复制代码
7、查看信息
git status:显示有变更文件
git log:查看当前分支的版本历史
git diff:显示暂存区和工作区的差异
git show [commit]:显示某次提交的源数据和内容变化
git show [commit]:[filename]:显示某次提交时,某个文件的内容
git reflog:显示当前分支的最近几次提交
复制代码
8、远程同步
git clone [url]:克隆远程仓库
git fetch [remote]:下载远程仓库的所有变动
git remote -v:显示所有远程仓库
git remote add [仓库名] [url]:新增一个新的远程仓库并命名
git pull [remote] [分支名]:拉取远程分支并并与本地分支合并
git fetch [remote] 远程分支名x:本地分支名x:拉取远程分支并创建本地分支
git checkout -b [新分支名] [origin/远程分支名]:拉取远程分支并创建本地分支且切换到该分支
git merge [remote/分支名]:合并到当前分支
git push [remote] [分支名]:上传本地指定分支到远程仓库
git remote rm [remote]:删除和远程仓库的关联
复制代码
9、撤销
git checkout [file]:回复暂存区的指定文件到工作区
git checkout .:恢复暂存区的所有文件到工作区
git reset [file]:重置暂存区指定文件,与上次commit保持一致,但工作区不变
git reset --hard:重置暂存区与工作区,与上一次commit保持一致
git reset --hard HEAD^:回退到上一次提交
git reset --hard [commit]:重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git revert [commit]:新建一个commit,用来撤销指定commit;后者的所有变化被前者抵消并应用到当前分支
复制代码
至此,Git的相关知识和使用方法就介绍完了。不管你是前端还是后端,在实际开发过程中都会用到Git来管理版本,我们不只是要会使用,更要了解它是如何工作的,这样才会让自己今后在和同事的版本协作上更加得心应手。
好了,xdm看文至此,不要只收藏不点赞不评论呀,我相信这篇文章肯定值得你点个赞再走的,3Q^_^
往期精彩文章
后语
伙伴们,如果觉得本文对你有些许帮助,点个或者个关注再走呗^_^ 。另外如果本文章有问题或有不理解的部分,欢迎大家在评论区评论指出,我们一起讨论共勉。
相关推荐
- 深入解析 MySQL 8.0 JSON 相关函数:解锁数据存储的无限可能
-
引言在现代应用程序中,数据的存储和处理变得愈发复杂多样。MySQL8.0引入了丰富的JSON相关函数,为我们提供了更灵活的数据存储和检索方式。本文将深入探讨MySQL8.0中的JSON...
- MySQL的Json类型个人用法详解(mysql json类型对应java什么类型)
-
前言虽然MySQL很早就添加了Json类型,但是在业务开发过程中还是很少设计带这种类型的表。少不代表没有,当真正要对Json类型进行特定查询,修改,插入和优化等操作时,却感觉一下子想不起那些函数怎么使...
- MySQL的json查询之json_array(mysql json_search)
-
json_array顾名思义就是创建一个数组,实际的用法,我目前没有想到很好的使用场景。使用官方的例子说明一下吧。例一selectjson_array(1,2,3,4);json_array虽然单独...
- 头条创作挑战赛#一、LSTM 原理 长短期记忆网络
-
#头条创作挑战赛#一、LSTM原理长短期记忆网络(LongShort-TermMemory,LSTM)是一种特殊类型的循环神经网络(RNN),旨在解决传统RNN在处理长序列数据时面临的梯度...
- TensorBoard最全使用教程:看这篇就够了
-
机器学习通常涉及在训练期间可视化和度量模型的性能。有许多工具可用于此任务。在本文中,我们将重点介绍TensorFlow的开源工具套件,称为TensorBoard,虽然他是TensorFlow...
- 图神经网络版本的Kolmogorov Arnold(KAN)代码实现和效果对比
-
本文约4600字,建议阅读10分钟本文介绍了图神经网络版本的对比。KolmogorovArnoldNetworks(KAN)最近作为MLP的替代而流行起来,KANs使用Kolmogorov-Ar...
- kornia,一个实用的 Python 库!(python kkb_tools)
-
大家好,今天为大家分享一个实用的Python库-kornia。Github地址:https://github.com/kornia/kornia/Kornia是一个基于PyTorch的开源计算...
- 图像分割掩码标注转YOLO多边形标注
-
Ultralytics团队付出了巨大的努力,使创建自定义YOLO模型变得非常容易。但是,处理大型数据集仍然很痛苦。训练yolo分割模型需要数据集具有其特定格式,这可能与你从大型数据集中获得的...
- [python] 向量检索库Faiss使用指北
-
Faiss是一个由facebook开发以用于高效相似性搜索和密集向量聚类的库。它能够在任意大小的向量集中进行搜索。它还包含用于评估和参数调整的支持代码。Faiss是用C++编写的,带有Python的完...
- 如何把未量化的 70B 大模型加载到笔记本电脑上运行?
-
并行运行70B大模型我们已经看到,量化已经成为在低端GPU(比如Colab、Kaggle等)上加载大型语言模型(LLMs)的最常见方法了,但这会降低准确性并增加幻觉现象。那如果你和你的朋友们...
- ncnn+PPYOLOv2首次结合!全网最详细代码解读来了
-
编辑:好困LRS【新智元导读】今天给大家安利一个宝藏仓库miemiedetection,该仓库集合了PPYOLO、PPYOLOv2、PPYOLOE三个算法pytorch实现三合一,其中的PPYOL...
- 人工智能——图像识别(人工智能图像识别流程)
-
概述图像识别(ImageRecognition)是计算机视觉的核心任务之一,旨在通过算法让计算机理解图像内容,包括分类(识别物体类别)、检测(定位并识别多个物体)、分割(像素级识别)等,常见的应用场...
- PyTorch 深度学习实战(15):Twin Delayed DDPG (TD3) 算法
-
在上一篇文章中,我们介绍了DeepDeterministicPolicyGradient(DDPG)算法,并使用它解决了Pendulum问题。本文将深入探讨TwinDelayed...
- 大模型中常用的注意力机制GQA详解以及Pytorch代码实现
-
分组查询注意力(GroupedQueryAttention)是一种在大型语言模型中的多查询注意力(MQA)和多头注意力(MHA)之间进行插值的方法,它的目标是在保持MQA速度的同时...
- pytorch如何快速创建具有特殊意思的tensor张量?
-
专栏推荐正文我们通过值可以看到torch.empty并没有进行初始化创建tensor并进行随机初始化操作,常用rand/rand_like,randint正态分布(0,1)指定正态分布的均值还有方差i...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
python使用fitz模块提取pdf中的图片
-
《人人译客》如何规划你的移动电商网站(2)
-
Jupyterhub安装教程 jupyter怎么安装包
-
- 最近发表
-
- 深入解析 MySQL 8.0 JSON 相关函数:解锁数据存储的无限可能
- MySQL的Json类型个人用法详解(mysql json类型对应java什么类型)
- MySQL的json查询之json_array(mysql json_search)
- 头条创作挑战赛#一、LSTM 原理 长短期记忆网络
- TensorBoard最全使用教程:看这篇就够了
- 图神经网络版本的Kolmogorov Arnold(KAN)代码实现和效果对比
- kornia,一个实用的 Python 库!(python kkb_tools)
- 图像分割掩码标注转YOLO多边形标注
- [python] 向量检索库Faiss使用指北
- 如何把未量化的 70B 大模型加载到笔记本电脑上运行?
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- table.render (33)
- uniapp textarea (33)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- react-admin (33)
- vscode切换git分支 (35)
- vscode美化代码 (33)
- python bytes转16进制 (35)