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


目录

 🌈前言🌈

📁 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://xiahunao.cn/news/2808796.html

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

相关文章

如何增加层次厚度?

Q 老师,我在做一个斧头武器,如何在平面上增加厚度和层次呢? A 选中这几个线,点连接就会出现中线,把中线稍作调整即可~

Open3D 基于最小生成树的法线定向 (27)

Open3D 基于最小生成树的法线定向 (27) 一、算法介绍二、算法实现一、算法介绍 法线计算的方向通常都存在方向问题,用Open3D估计的点云法线,是在每个点的局部进行拟合,估计的法线方向并不一致,Open3D提供了使用最小生成树调整法线到统一方向的方法,下面是具体的实现代码…

LeetCode 热题 100 | 二叉树(二)

目录 1 543. 二叉树的直径 2 102. 二叉树的层序遍历 3 108. 将有序数组转换为二叉搜索树 菜鸟做题,语言是 C 1 543. 二叉树的直径 这道题和 124. 二叉树中的最大路径和 太像了 题眼:二叉树的 直径 是指树中任意两个节点之间 最长路径的长度 。…

174基于matlab的雷达数字信号处理

基于matlab的雷达数字信号处理。该程序具备对雷达目标回波的处理能力,能够从噪声中将目标检测出来,并提取目标的距离、速度、角度信息。有相应的试验文档。程序已调通,可直接运行。 174 雷达数字信号处理 目标检测出来 (xiaohongshu.com)

Apache DolphinScheduler 3.2.1 版本发布:增强功能与安全性的全面升级

近期,Apache DolphinScheduler 社区激动地宣布 3.2.1 版本的发布。此次更新不仅着力解决了前一版本(3.2.0)中遗留的问题,而且引入了一系列的功能增强和优化措施。 原先的问题主要源于部分重要代码在发布过程中未能成功合并&#x…

多表联合分页查询(二)---- springboot整合MybatisPlus分页代码

目录 一、分页配置代码解读(使用MP自带分页)二、Controller层代码解读三、service层代码解读四、Mapper层代码解读五、结果展示 一、分页配置代码解读(使用MP自带分页) package com.minster.yanapi.Config;import com.baomidou.m…

matlab 三质量-弹簧系统受激振力

1、内容简介 略 44-可以交流、咨询、答疑 建立系统运动方程,研究固有频率和对应主振型 2、内容说明 略 三质量-弹簧系统受激振力,并不考虑各自的阻尼。建立系统运动方程。 解:由于阻尼对固有频率没有影响,故本文不…

Sora将创造多少算力需求?

1.1 Sora 训练与推理算力需求初步测算 Sora发布表现亮眼,TransformerDiffusion架构或成为文生视频大模型新范式。据Sora技术报告,类似于LLM将不同文本数据统一为token,Sora可将不同类型的视频和图像等视觉数据统一为patches,具体…

IDA使用-2023CICSN华中赛区pwn题逆向为例

文章目录 相关字节标识导入函数和导出函数找程序入口函数选项设置重命名CISCN2023华中赛区分区赛AWDIDA源码main 构造结构体sub_141B() 打开局部变量类型的视图增加变量类型重新定义变量类型再次设置变量类型并重新定义再次设置变量类型并重新定义再次设置变量类型并重新定义 设…

【数据结构与算法】(20)高级数据结构与算法设计之 Greedy Algorithm 贪心算法 代码示例与详细讲解

目录 4.2 Greedy Algorithm1) 贪心例子DijkstraPrimKruskal 2) 零钱兑换问题有几个解(零钱兑换 II)Leetcode 518最优解(零钱兑换)- 穷举法 Leetcode 322最优解(零钱兑换)- 贪心法 Leetcode 322 3) Huffman …

线程池的常用实现及执行流程

线程池 线程池线程池接口线程池参数线程池分类动态数目线程池固定数目线程池单例线程池任务调度线程池 线程池的执行流程 线程池 线程池接口 线程池参数 1、corePoolSize:核心线程数,线程池中最少线程,核心线程不会被回收。 2、maximumPoo…

6-pytorch-神经网络搭建

b站小土堆pytorch教程学习笔记 1.神经网络骨架搭建:Containers 官方文档代码: import torch.nn as nn import torch.nn.functional as Fclass Model(nn.Module):def __init__(self):super().__init__()self.conv1 nn.Conv2d(1, 20, 5)self.conv2 nn.…

nccl2安装指南

https://developer.nvidia.com/nccl/nccl-download 旧版本安装: https://developer.nvidia.com/nccl/nccl-legacy-downloads 找到你对应的CUDA版本 我这里选择 deb 文件安装了 sudo dpkg -i nccl-local-repo-ubuntu2004-2.16.5-cuda11.8_1.0-1_amd64.debsudo cp /var/nccl-lo…

深度解析:Integer.parseInt() 源码解读

深度解析:Integer.parseInt() 源码解读 关键要点 解析字符:用于将字符转换为对应的数字值 Character.digit(s.charAt(i),radix) 确定limit:根据正负号分别设定 int limit -Integer.MAX_VALUE;【正】 limit Integer.MIN_VALUE;【负】 负数…

车载测试面试:题库+项目

车载测试如何面试(面试技巧)https://blog.csdn.net/2301_79031315/article/details/136229809 入职车载测试常见面试题(附答案)https://blog.csdn.net/2301_79031315/article/details/136229946 各大车企面试题汇总(含答案&am…

mac下使用jadx反编译工具

直接执行步骤: 1.创建 jadx目录 mkdir jadx2.将存储库克隆到目录 git clone https://github.com/skylot/jadx.git 3. 进入 jadx目录 cd jadx 4.执行编译 等待片刻 ./gradlew dist出现这个就代表安装好了。 5.最后找到 jadx-gui 可执行文件,双击两下…

为什么TestNg会成为Java测试框架的首选?还犹豫什么,看它!

上一篇自动化测试我们大概了解了测试的目标、测试的技术选型以及搭建平台的目标及需求,也确定了自动化测试方案以testNg作为整个测试流程贯穿的基础支持框架,那么testNg究竟有什么特点?本篇开始我们来详细的学习testNg这个测试框架。 为什么要…

基于Android的校园请假App的研究与实现

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

java面试题之mysql篇

1、数据库索引 ​​​​​​​ 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。 索引的一个主要…

protobuf简单使用(二)

介绍 上一节中,我们介绍了protobuf,简单来说,它是一种消息数据格式,其作用类似于json,但是比json的使用效率要高。 除此以外,我们介绍了protobuf的简单使用,也就是如何可以像使用json一样&…