【程序员必备技能】Git入门

news2025/1/18 7:40:34


目录

 🌈前言🌈

📁 Git的概念

 📂 版本控制

 📂 集中式 和 分布式 ​

📁 创建和配置本地仓库

📁 理解工作区,暂存区,版本库

📁 Git的基本操作

 📂 添加文件

 📂 查看

 📂 修改文件

 📂 撤销修改

 📂 删除文件

  📂 配置命令别名

📁 分支管理

 📂 理解分支

📂 查看分支

📂 创建分支

📂 切换分支

📂 合并分支

📂 删除分支

📂 分支策略

 📂 bug分支

📂 强制删除分支

📁 远程操作

 📂 创建远程仓库

📂 克隆远程仓库

 📂 向远程仓库推送​编辑

  📂 拉取远程仓库

 📂 忽略特殊文件

📁 标签管理

  📂 创建删除标签

  📂 推送标签

📁 总结


 🌈前言🌈

      Git作为程序员必备技能,重要程度可想而知。所以本期内容,我们将用一篇文章带你轻松入门Git,掌握使用Git。

        我将先带大家先了解Git的原理概念,再依次学习Git的各种操作,最后带大家了解公司中程序员是如何使用Git来多人协作的。

📁 Git的概念

        Git是目前主流的一个分布式版本控制系统版本控制就是一种记录文件内容变化,以方便将来查阅特定版本修改情况的系统。

 📂 版本控制

        版本控制其实最重要的就是记录文件修改记录,从而使用户能够查看历史版本,方便版本切换。

        例如,某天,上司让我们写一份设计文档,写完之后觉得不好,让你重写,你就拿回去修改,他又觉得不好,就这样,你拿着第三次设计文档找到他,他来了句不如第1版的,你把第1版的拿过来用吧。

        可是,我们是在原文档上进行修改的,第1版的部分内容早就修改没了,最后只能受到上司一顿职责。

        所以这就有了版本控制的概念,即将每次文件修改内容记录下来,让变日后的查看。

 📂 集中式 和 分布式 

        以上是集中式版本控制系统,我们只有一台服务器,将源代码上传到服务器中,如果有一天,服务器挂了,我们的源代码也就没了,所以这是非常危险的。

        而对于分布式版本控制,在我们本地上就有版本控制系统,如果有一天服务器挂了,日后我们也可以通过本地将资源再次上传到中央服务器。

📁 创建和配置本地仓库

我们首先创建一个文件夹,创建并初始化一个本地仓库

 git init 

        此外,本地仓库里,我们还要配置两个重要的内容,即name 和 email,方便日后的查询是谁提交的。

git config user.name  xxxxx
git config user.email  xxxxx

        我们下面这条指令来查看是否配置成功

git config -l

        如果我们不小心输错,可以使用下面这条指令来重置

git config --unset  user.name / user.email  : 重置

        此外,我们可以加上参数--global,将配置项作用与该机器下的所有git仓库。

git config --global xxx : 将配置项作用于该机器下所有的git仓库
git config --global --unset xxx : 

📁 理解工作区,暂存区,版本库

        如果想要实现文件版本控制,先来看看文件信息是怎么被记录的。

        我们创建了file文件,.git就是本地版本控制系统,它能否管理file文件呢。答案是不能。

        .git是不能手动修改的,即不能在.git中添加删除文件,所以我们只能在gitcode文件夹中创建修改文件,而这个文件夹就成为工作区,.git就是版本库(仓库) 

        在工作区创建修改文件操作时,都会写入到objects中,暂存区和master(主分支)中都寄存着git对象的索引(commit id),通过索引找到该对象。

        对于工作区的所有操作,添加,删除,修改都会保存在git对象中。通过维护git对象,来实现对文件的版本控制

📁 Git的基本操作

 📂 添加文件

1. git  add  . / 文件名

1)  .  : 将该目录下的所有文件添加到暂存区

2)  文件名 :指定文件添加到暂存区

2. git commit -m "提交信息"

  提交信息很重要,方便日后的查看

        通过以上两步,就将工作区文件添加到版本库中,完成对文件的版本控制。

 📂 查看

git   log 

 📂 修改文件

        通过以下指令,来查看上一次提交后,文件是否被修改。

git status

        如果,我们修改了文件,但还没有添加到暂存区,可以通过一下指令,查看最近一次提交,显示工作区和暂存区的不同

git   diff  文件名

git    diff  HEAD   --   文件名 :来查看 暂存区 和 版本库的区别。

 📂 撤销修改

        学习撤销修改前,先了解一下版本回退。

        执行 git reset 命令可以回退版本,可以指定退回某一次提交的版本,也可以退回到当前版本。

        版本回退的本质是要将版本库中的内容进行回退,工作区或暂存区是否回退有命令参数决定。

git    reset  [--soft] [--mixed] [--hard]  [HEAD 或 索引号]

--soft 只是回退版本库

--mixed(默认) 回退版本库 和 暂存区

--hard 工作区,暂存区,版本库都进行回退,慎用。

        前文有一个HEAD 这里的HEAD是一个指针,指向master,master中存放着最近一次的提交对象的索引。所以,版本回退就是修改指针指向的内容。

        了解了版本回退后,我们来看一下,如果文件总有要撤销修改的情况,如果处理;文件提交到暂存区,版本库中,如果撤销修改。

1. 工作区撤销修改

    (1)手动修改,不建议。

    (2)git   checkout   --   文件名



2. 工作区,暂存区撤销修改

        git   reset   [HEAD 或 索引号]   文件名 

      (HEAD^表示上个版本,HEAD^^表示前两个版本 )

        git   checkout   --   文件名



3. 工作区,暂存区,版本库都撤销修改

        git reset --hard [HEAD 或 索引号]

 📂 删除文件

git  rm  文件名

git  commit   -m    “…"

  📂 配置命令别名

git  config  --global  alias.别名  指令

        初学者还是建议多练习一下原指令。

📁 分支管理

 📂 理解分支

        

        master是主分支,通过一个master指针来维护,通过master指针来进行版本管理。

        我们不仅可以使用master分支,还可以使用其他分支 ,合并其他分支,来提高效率。

        HEAD指针不只指向master ,Head指向的分支就是工作分支。

📂 查看分支

git    branch

        当前我们只有master分支,也只有一个master指针。

📂 创建分支

git    branch    分支名

           我们创建了一个新的dev分支,有了一个dev指针。当前的工作分支是master。

        目前HEAD指针指向master,master是工作分支,dev是基于当前版本创建的一个分支,且没有进行任何操作,所以dev指针指向当前最新的提交

📂 切换分支

git    checkout    分支名

        切换完之后,HEAD指向dev分支,dev是工作分支。

📂 合并分支

git     merge      分支名

        如果,我们在dev分支上进行修改,但master并不会受影响,如果想要mater进行修改,需要在master分支上合并dev分支,合并分支后,master指向dev分支的最新提交。

1. 分支冲突

        例如,在master和dev分支都一个最新提交,merge合并时,Git不能知道保留保留哪一分支的代码。所以git在合并时出现问题,这就是合并冲突问题,需要手动解决。

        我们只能在工作区的源代码中手动删除不保留的代码,然后提交。例如只保留bbb的代码。

        在master分支修复合并冲突后,mater指向最新的提交,dev依旧指向它的提交,没有改变。

git    log    --graph    --abbrev-commit

2. 分支模式

    (1)Fast-forward (快速提交,简称ff ) : 在该模式下,删除分支后,查看分支历史时,会丢失分支信息,看不出最新的提交是merge进来的还是正常提交的。

    (2)no-ff (非ff模式) : 查看分支历史时,不会丢失分支信息。

        ff模式下是将master指向dev最新的提交,而no-ff是怎么产生提交的?

        在no-fff模式下,在merge时,进行提交。

git    merge    --no-ff     -m     "提交信息"     分支名

📂 删除分支

git    branch    -d     分支名

        不能在工作分支删除工作分支,只能在其他分支删除。

        因为创建,合并,删除分支非常快,所以Git鼓励使用分支或完成某个任务,合并再删掉该分支,这和直接在master分支上工作是一样的,但过程更加安全

📂 分支策略

        master分支应该是非常稳定的,也就是仅用来发布新版本,平时不在上面干活;干活是在dev分支上,也就是说dev分支是不稳定的,每个人都有自己的分支,时不时往dev分支上合并就可以了。

 📂 bug分支

        在新分支上进行开发,开发时发现master分支上有bug,需要解决,在Git中,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

        例如,有一个新分支dev进行开发,master分支通过fix_bug分支修复完成合并。dev合并master,在dev分支中解决分支冲突,冲突在dev中解决,master再合并dev分支。

不想工作区中dev分支影响到master分支:

git     stash                   将新的修改保存到stash文件中

git     stash    pop       将stash文件中的修改恢复到分支中。

📂 强制删除分支

        如果,我们创建了个分支,提交文件到版本库中,git不会删除这个分支,除非强制删除分支。

git     branch     -D

📁 远程操作

 📂 创建远程仓库

        目前主流的远程仓库平台有GitHup ,Gitee 。由于GitHup连接不稳定,所以教学使用Gitee,但并没有什么本质区别。

     

        点击创建,我们就创建了一个远程仓库。我们先来一步步了解里面的内容。

        仓库名称就是我们的项目名称,输入名称,下面就有有一个仓库链接了。

        设置模版中有三个文件,分别有什么含义呢?

        Readme文件,就是一个介绍文件,其中包含了该项目的一些介绍等信息。

        Issues就是一个提交问题的讨论帖,如果项目中你觉得有问题,或者可以改进,可以发一篇issue,提交给管理者。

        Pull Requests作用就是,将分支合并请求发送给管理者。在远程仓库中,并不是想合并就可以合并的,开发者要提一个PR合并申请单,说明合并理由,管理员同意,才可以进行merge操作。

📂 克隆远程仓库

        克隆远程仓库,需要一份协议,常用的有HTTPS,和SSH。SSH主要优点是公钥加密和公钥登录,需要将公钥先保存到Git仓库中,而HTTPS则没有任何要求。

1. HTTPS

git    clone     HTTPS链接

        注意不能在本地仓库所在目录下使用该命令。

git    remote  :查看远端仓库

git    remote  :查看远程仓库的权限

push是推权限,fetch是拉权限。有了这两个权限,我们就可以和远端仓库进行交互。

2. SSH

        使用SSH方式克隆仓库,由于我们没有添加公钥到远程仓库端中,服务器会拒绝我们的clone链接。需要我们设置:

        第一步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa 和  id_rsa.pub这两个文件,如果有了,可以直接跳到下一步。如果没有需要创建SSH Key。

git    clone    SSH链接
cd  .ssh

执行一下代码,创建公钥和私钥内为Gitee的邮箱。

ssh-keygen -t rsa   xxxx@xxx

查看公钥

cat  id_rsa.pub

        第二部:在Gitee上添加公钥。将公钥全部粘贴复制到公钥中,点击确定即可。

 📂 向远程仓库推送

        本地我们有一个file.txt文件,如何将它从本地推送到远程呢?

git  push   origin  本地分支:远程分支(名字一样,可以写成一个)

  📂 拉取远程仓库

        如果本地仓库想要看到远程仓库的内容需要进行pull操作。

git  pull  origin  远端分支:本地分支(名字一样,可以写成一个)

        拉取和推送都是分支分支之间的操作,所以远端仓库与本地仓库的分支必须有联系,而master分支之间在克隆的时候就建立了练习,那么其他分支如何确立联系呢?

 📂 忽略特殊文件

        在日常开发中,有些文件不想或者不应该被提交到远端,比如保存了数据库密码的配置文件,那怎么让Git知道呢?在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

        Gitee在创建仓库是就可以自动为我们生成,不过需要我们主动勾选:

        如果当初没有选择,也可以在工作区中创建.gitignore文件

查看被忽略原因的命令:

git  checkignore -v  文件名

📁 标签管理

        标签tag,可以理解为针对某次commit的一个标识,相当于起一个别名。例如,在项目发布某个版本的时候,针对最后一次commit起一个v1.0这样一个标签来标识里程碑的意义。

        有什么用呢?相比于难以记住的commit id,tag很好的解决了这个问题,因为tag一定要给一个容易记住,且有意义的名字。当我们回退到某个重要版本时,直接使用标签能很好的定位。

  📂 创建删除标签

//查看标签
git  tag 
//创建标签
git  tag  标签名    [commit id]

git  tag  -a  标签名  -m  "描述信息"  [commit id]

//查看标签描述
git  show  标签名

//删除标签
git  tag  -d  标签名

  📂 推送标签

git  push  origin  标签名

//推送所有标签
git  push  origin  --tags

//本地删除远端标签
git  tag  -d  标签名
git  push origin : 标签名

📁 总结

        以上,就是Git的所有操作了,其中讲解了什么是Git,Git的基本操作,分支管理,远程操作,以及标签管理。

        理论的内容全部讲解完毕,剩下的只是实操了,大家可以在日常中,将自己写的代码进行Git,提交到远程仓库。

        如果感觉本期内容对你有用,欢迎点赞,收藏,关注。Thanks♪(・ω・)ノ

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

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

相关文章

如何做到三天内完成智能直流伺服电机系统开发?

适应EtherCAT/CANopen协议三相伺服电机直流伺服电机直线伺服音圈电机 如何开发高性能直流伺服电机驱动控制器? 需要熟悉高性能单片机(至少是ARM或DSP水平的),需要掌握空间磁场矢量控制FOC,需要掌握运动轨迹算法……此…

Order By Limit不稳定性

文章目录 前置解决不确定性场景1 Order By索引1.1 背景1.2 不确定性产生原因1.2.1 正常情况下1.2.2 但是 1.3 补充1.4 场景1总结 场景2 Order by id2.1 背景2.2 不会产生不确定性原因1原因2 2.3 推荐使用方式 场景3 filesort3.1 背景3.2 不确定性产生原因3.3 内存排序和磁盘临时…

【监控】grafana图表使用快速上手

目录 1.前言 2.连接 3.图表 4.job和path 5.总结 1.前言 上一篇文章中,我们使用spring actuatorPrometheusgrafana实现了对一个spring boot应用的可视化监控。 【监控】Spring BootPrometheusGrafana实现可视化监控-CSDN博客 其中对grafana只是打开了一下&am…

【前端素材】推荐优质后台管理系统Welly平台模板(附源码)

一、需求分析 后台管理系统(或称作管理后台、管理系统、后台管理平台)是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成,为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

Vue3 学习笔记(Day4)

「写在前面」 本文为尚硅谷禹神 Vue3 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. Vue3 学习笔记(Day1) 2. Vue3 学习笔记(Day2&…

探索Java11新世界:JDK 11新特性详解

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

高频面试题整理(一)

文章目录 平台无关性如何实现?JVM如何加载 .class文件?什么是反射?谈谈ClassLoader谈谈类的双亲委派机制类的加载方式Java的内存模型?JVM内存模型-jdk8程序计数器:Java虚拟机栈局部变量表和操作数栈: Java内存模型中堆和栈的区别…

153.寻找旋转排序数组中的最小值(二分查找)

一、题目 . - 力扣&#xff08;LeetCode&#xff09; 153. 寻找旋转排序数组中的最小值 二、代码 class Solution { public:int findMin(vector<int>& nums) {int left 0;int right nums.size()-1;int mid (leftright)/2;while(left<right){if(nums[mid]>…

ROS 2的前世今生 | ROS 2学习笔记

自2015年底首次踏入ROS&#xff08;Robot Operating System&#xff09;的世界以来&#xff0c;我在机器人领域的旅程已近九年。这段历程始于团队几位志同道合的朋友在业余时间的自发学习&#xff0c;逐渐演变成成立了一个致力于英特尔硬件平台与ROS框架集成优化的专业团队&…

Curator基本使用

文章目录 1. 基本操作1.1 建立连接1.2 创建结点1.3 查询结点查询数据查询子结点查看结点信息 1.4 修改结点普通修改带乐观锁的修改 1.5 删除删除单个结点删除带子结点的结点必须成功的删除带回调函数的删除 2. 监听器事件2.1 NodeCache单一结点连续监听2.2 PathChildrenCache监…

2024.2.25 在centos8.0安装docker

2024.2.25 在centos8.0安装docker 安装过程比较简单&#xff0c;按顺序安装即可&#xff0c;简要步骤&#xff1a; 一、更新已安装的软件包&#xff1a; sudo yum update二、安装所需的软件包&#xff0c;允许 yum 通过 HTTPS 使用存储库&#xff1a; sudo yum install -y …

VIO第2讲:IMU标定实验

VIO第2讲&#xff1a;IMU标定实验 文章目录 VIO第2讲&#xff1a;IMU标定实验5 IMU标定实验5.1 仿真数据产生5.1.1 c代码分析5.1.2 生成ros包数据 5.2 Allan方差实验&#xff08;港科大imu_utils&#xff09;5.2.1 安装5.2.2 运行 5.3 Allan方差实验&#xff08;matlab代码kali…

内网设备如何在互联网上能访问

应用场景 设备安装到了客户现场&#xff0c;如果要调试设备&#xff0c;当前的处理方式是技术人员出差到客户现场、让客户开通VPN、让客户安装远程工具&#xff0c;远程到客户计算机上进行调试等方法。人不在家里想远程家里的电脑&#xff0c;当前处理方式就是在家里电脑上安装…

搜索专项---IDA*

文章目录 排书回转游戏 一、排书OJ链接 本题思路:先考虑每一步的决策数量&#xff1a;当抽取长度为 i 的一段时&#xff0c;有 n−i1 种抽法&#xff0c;对于每种抽法&#xff0c;有 n−i 种放法。另外&#xff0c;将某一段向前移动&#xff0c;等价于将跳过的那段向后移动&am…

【DataTable.js】02.DataTable参考

一、Option 1.1 Features 属性类型默认值描述autoWidthbooleantrue是否自动调节单元格宽度&#xff0c;若传入了columns.width&#xff0c;可禁用该选项orderingbooleantrue是否支持排序pagingbooleantrue是否支持分页scrollXbooleanfalse是否支持横向滚动条scrollYstring启用…

USB Micro引脚及相应原理图绘制

前言&#xff1a;博主为实现绘制USB Micro输入口原理图&#xff0c;首先在 GD32F103XX的数据手册中找到引脚的功能描述&#xff0c;找到USBDM与USBDP功能&#xff0c;分别为引脚PA11与引脚PA12。然后进行相应的原理图绘制。 * USBDM。USBDM 引脚是与通用串行总线 (Universal Se…

计算机操作系统-笔记

现代操作系统阅读笔记 第一章 引论 1. 操作系统定义 操作系统是运行在内核态的软件&#xff0c;它执行两个基本上独立的任务。 隐藏计算机底层硬件的实现&#xff0c;为用户及应用程序提供一个资源集的清晰抽象。 管理计算机硬件资源。 任何操作系统的核心是它可处理的系…

Java基础常见八股文学习总结1

Java基础常见八股文学习总结1 SPI SPI 即 Service Provider Interface &#xff0c;字面意思就是&#xff1a;“服务提供者的接口”&#xff0c;我的理解是&#xff1a;专门提供给服务提供者或者扩展框架功能的开发者去使用的一个接口。SPI 将服务接口和具体的服务实现分离开来…

vue项目的前端工程化思路webpack(持续更新中)

写在前面&#xff1a;现在的前端网页功能丰富&#xff0c;特别是SPA&#xff08;single page web application 单页应用&#xff09;技术流行后&#xff0c;JavaScript的复杂度增加和需要一大堆依赖包&#xff0c;还需要解决Scss&#xff0c;Less……新增样式的扩展写法的编译工…

C++ //练习 8.7 修改上一节的书店程序,将结果保存到一个文件中。将输出文件名作为第二个参数传递给main函数。

C Primer&#xff08;第5版&#xff09; 练习 8.7 练习 8.7 修改上一节的书店程序&#xff0c;将结果保存到一个文件中。将输出文件名作为第二个参数传递给main函数。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /********…