当前位置: 首页 > news >正文

git原理与使用

目录

    • 引入
    • 基本操作
    • 分支管理
    • 远程操作
    • 标签管理

引入

假设你的老板要你设计一个文档,当你设计好了,拿给他看时,他并不是很满意,就要你拿回去修改,你修改完后,再给他看时,他还是不满意,经过多次修改,他觉得还是你之前的第三次修改后的文档好,最终决定采用第三次修改后的文档,但因为前面你都是在一个文档上修改的,意味着前面修改的文档内容都被覆盖了,也就无法完成老板的任务
同上,吸取了之前的教训后,你明白了要保存前面的副本,因为老板可能会采纳之前的文档,所以每一次修改,你都存一份副本,这样,就能在最终选用文档时,拿出成果。
同上,上面的想法听起来确实很合理,一般情况下,也能解决问题,但是,在软件开发中,随着版本的不断增多,维护好版本是很有挑战的,那就需要我们知道每个版本各自修改的内容,才能更好地维护,而上面的生成副本的方式无法知晓当前版本在上一个版本的基础上修改了哪些内容(内容很多的情形),这种方式也就不适用了!此时,git应运而生!!!
git,是一个版本控制器,它是记录每次的修改以及版本迭代的一个管理系统,比如在文本文件的某一行前面添加了一行内容,也能清楚的找出这种修改。

基本操作

创建本地仓库
仓库本质上就是进行版本控制的一个文件目录,用git init命令创建,下图中的.git是用来跟踪管理仓库的

在这里插入图片描述
配置git
用下面两个两个命令可以配置用户名和邮箱地址,这点很重要!!!其中的global表示全局,即带了这个选项,在所有仓库中都会使用你配置的这个用户名和邮箱地址,不带,则只在当前仓库有效
注意:命令必须在仓库内执行!!!
git config [–global] user.name “Your Name”
git config [–global] user.email “email@example.com”
查看配置
用git config -l命令查看配置信息
删除配置信息
git config [–global] --unset user.name
git config [–global] --unset user.email

在这里插入图片描述

认识工作区、暂存区、版本库
git关注的是修改,即增加、更新、修改,而修改的工作区内容会写入对象库的一个新的git对象中,文件要被git跟踪管理,就必须得进行add和commit操作,完成这两步后,文件才会被添加到仓库管理

在这里插入图片描述
add操作
git add 文件(文件名)/目录(目录名)/所有文件(.)
commit操作
git commit -m 日志信息,即提交暂存区的所有文件
commit后,可以用git log来查看提交的日志信息
如下图,是提交工作区的内容到版本库的示例流程,如果没有配置用户名和邮箱信息,就无法commit,会提示要你配置,配置完成后,再commit就可以了,而日志中的黄色的那一长串字符串,则是commit id

在这里插入图片描述
如果想看简单一些的日志,可以带–pretty=oneline选项

在这里插入图片描述
如下图,index就是暂存区,add后的内容都是添加到这里的

在这里插入图片描述
HEAD是默认指向master分支的指针

在这里插入图片描述
master保存的是当前最新的commit id

在这里插入图片描述
objects,保存了git维护的所有修改
如下图,查看object时,它由两部分构成,前两位是文件夹名称,后面的38位则是文件名称

在这里插入图片描述
在这里插入图片描述
用git cat-file -p commit id查看版本库对象的内容

在这里插入图片描述
修改文件
如下图,用git status查看工作区中状态,显示还没有添加和提交

在这里插入图片描述
三天前修改的文件,到今天,我们可能就已经不记得修改了哪些内容,此时就可以用到git diff来查看修改了哪些内容。a 和 b表示从之前的a文件,修改后变成了b文件,相当于同一个文件的不同版本,-1表示改动前第一行,+1,2表示改动后第一行起连续两行的内容

在这里插入图片描述
版本回退
如果你发现之前做的工作,出现了一些问题,需要解决,就得回到某一个历史版本,这时,就能用到git reset [–soft || --mixed || --hard] [HEAD]
HEAD,表示当前版本
HEAD^,表示上一个版本
HEAD^^,表示上上一个版本
也能直接使用commit id,表示回退到指定版本
mixed,表示回退到某个历史版本的暂存区,版本库也变了,但工作区不变,且这是个默认选项,即不指定时,就是mixed

soft,表示回退到某个历史版本的版本库,工作区和暂存区不变
hard,表示回退到某个历史版本的工作区,暂存区和版本库都变,慎重使用这个选项,因为是回退工作区,可能内容就找不回来了
以hard为例,进行讲解
如下图,从version3回退到version2了,工作区文件的内容也回退了

在这里插入图片描述
假如我突然后悔了,想回到version3版本,但发现根本做不到,因为我们没有version3的commit id,此时,只能借助git reflog命令来尝试补救了
如下图,我们借助git reflog命令找到了version3的部分commit id,但也能代表目标版本!!!

在这里插入图片描述
从下图,可以看出,版本回退非常的迅速,只需要修改指针即可!

在这里插入图片描述
撤销修改
当我们觉得当前写的代码太糟糕了,想恢复到上一个版本,这时就需要用到类似于word等工具的撤销功能,分为三种情形
没有add,可以直接用git checkout – 文件名进行撤销

在这里插入图片描述
已经add,但没有commit,可以使用git reset HEAD 文件名,将add的回退到工作区,然后再用如上的方式撤销

在这里插入图片描述
已经add,已经commit,则能采用git reset --hard HEAD^,前提是你没有push到远程仓库
删除文件
用git rm命令,可以删除工作区和暂存区中的内容,然后再commit提交即可

在这里插入图片描述

分支管理

假设你能创建自己的分身,那你就可以让自己的分身去做与自己不同的事情,比如它去学习Java,而你学习C++,在某个时间点,你们俩合并,此时,你就能既学会了Java,也学会了C++,极大地提高了你的学习效率。分支便是如此,便于团队协作,提高工作效率!!!
创建分支
用git branch来查看分支,git branch 分支名来创建分支,* 在哪儿表示HEAD指针当前指向哪一个分支,最后的cat,证明两个分支指向同一个提交

在这里插入图片描述
在这里插入图片描述

如下图,也可以用git checkout -b 分支名命令来创建并切换分支

在这里插入图片描述

切换分支
用git checkout 分支名来切换分支

在这里插入图片描述
如下图,在dev分支上创建了ReadMe文件,并写入hello world,但在master分支上却看不到,这是因为创建新分支后,master分支和dev分支是相互独立的,就如同,你并不知道你的分身干了什么事情!要想知道,就必须得将dev合并到master上

在这里插入图片描述
在这里插入图片描述

合并分支
用git merge 要合并到当前分支的分支名,fast-forward代表快进模式,也就是直接把master指向dev的当前提交

在这里插入图片描述
在这里插入图片描述

删除dev分支
当合并完成后,dev分支也就没用了,如下图,用git branch -d 分支名来删除分支,注意,不能在当前分支下删除当前分支!!!

在这里插入图片描述
如果dev分支没有被合并
可以用git branch -D 命令来删除dev分支

在这里插入图片描述

合并冲突
分支在合并时,是有可能发生冲突的,如下图所示,dev分支,将11111写入ReadMe文件,并添加提交,master分支,将2222写入ReadMe文件,并添加提交,将dev分支合并到master分支时,就发生了冲突,因为git无法确定要保存哪一个,就如同C++中的菱形继承中的二义性问题

在这里插入图片描述
要想解决合并冲突问题,就需要我们手动修改冲突的内容,选择其中一个,然后再添加提交即可!

在这里插入图片描述
在这里插入图片描述
用git log --graph --pretty=oneline --abbrev-commit命令可以查看合并情况

在这里插入图片描述
分支管理策略
fast-forward模式合并,删除分⽀后,查看分⽀历史时,会丢掉分⽀信息,看不出来最新提交到底是merge进来的还是正常提交的,但在合并冲突部分,解决合并冲突,就能知道是merge进来的还是正常提交的!
要想不以fast-forward模式合并,可以采用 git merge --no-ff -m “日志信息” 分支名,来合并

在这里插入图片描述
当我在dev分支上开发时,突然发现master分支上有个bug需要解决,而我才开发到一半,没办法提交,这时,就需要保存工作区现场,可以用git stash命令,来讲工作区信息隐藏,用git stash list可以查看刚才的隐藏信息保存在哪个分支上,用git stash pop命令来恢复现场信息,并将stash删除

在这里插入图片描述
建议:当我们建立分支去写代码要合并时,可以先将master分支合并到当前分支,如果发生合并冲突,就可以在当前分支解决,从而不会影响master

远程操作

远程仓库
如下图,是在gitee上新建远程仓库的步骤,Readme文件是一些说明,可以自己去填写,便于别人使用,比如软件的安装步骤等等,而Issue则可以用来提bug等等,Pull Request在远程合并分支时使用, 比如你在dev分支开发完,需要合并到master分支,就需要填写Pull Request申请单

在这里插入图片描述
而要想本地与远程建立联系,就必须先将仓库拷贝到本地,即使用git clone 下面的url

在这里插入图片描述
在本地查看远程仓库,可以用git remote命令,想查看详细信息,可以带-v选项,远程仓库的默认名称是origin,下面显示了拉取和推送的地址,表明可以向远程仓库推送信息,也能获取远程仓库的信息

在这里插入图片描述
向远程仓库推送,可以用git push <远程主机名> <本地分⽀名>:<远程分⽀名>来推送,如果本地分支名和远程分支名相同,则可以省略冒号及它后面的,如下图,我删除了本地仓库的文件,同时也想把远程的也给删掉,就用到了push操作

在这里插入图片描述
在这里插入图片描述
拉取远程仓库

拉取远程仓库内容和推送一样,只不过要把push改为pull,如下图,先在远程仓库创建了一个file.txt文件,并写入hello world,在本地pull后,就能把远程仓库的内容拉取到本地仓库中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置Git
在上面创建仓库时,有一个添加ignore文件,可以勾选,就会在远程仓库生成该文件,该文件用于添加提交文件时,可以忽略指定的部分文件,比如写入了账号密码信息的文件,我不想推送,让别人看到,我就不提交,但文件太多了,add 指定文件太麻烦,就只能add . ,所以就有了ignore文件的产生,直接在该文件中写入你想忽略的文件即可,如下图所示。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果是使用的*.txt,来忽略所有txt后缀文件,而又要某个.txt文件不被忽略,就能在该文件前面加个!xxx.txt,表示不忽略。git add -f可以强制添加文件,但不建议使用
给命令配置别名
如下图,这条命令太长了,写起来太麻烦,就可以对其起别名

在这里插入图片描述
如下图,用git config --global alias.别名 ‘命令’

在这里插入图片描述

标签管理

因为commit id太长了,很难记住,所以我们可以用标签来作为commit的别名,这样也方便后续使用
可以用git tag 标签名来创建一个标签,git tag查看标签

在这里插入图片描述
如下图,可以看出,默认打的标签是打在最新的一次commit上的

在这里插入图片描述
如下图,给指定commit打标签,用git tag 标签名 commit id

在这里插入图片描述
如下图,用git show 标签名查看标签信息

在这里插入图片描述
如下图,可以带-a选项,对标签进行说明

在这里插入图片描述
在这里插入图片描述
如下图,可以用-d选项,来删除标签。

在这里插入图片描述
如下图,要推送至远程,可以用git push origin 标签名

在这里插入图片描述
在这里插入图片描述
如下图,删除标签,先在本地删除,再推送至远程仓库

在这里插入图片描述
在这里插入图片描述

相关文章:

git原理与使用

目录 引入基本操作分支管理远程操作标签管理 引入 假设你的老板要你设计一个文档&#xff0c;当你设计好了&#xff0c;拿给他看时&#xff0c;他并不是很满意&#xff0c;就要你拿回去修改&#xff0c;你修改完后&#xff0c;再给他看时&#xff0c;他还是不满意&#xff0c;…...

【C语言题解】将一句话的单词进行倒置,标点不倒置。

题目描述&#xff1a;将一句话的单词进行倒置&#xff0c;标点不倒置。比如 “I like beijing.”&#xff0c;经过处理后变为&#xff1a;“beijing. like I”。 文章目录 原题目题目描述&#xff1a;输入描述&#xff1a;输出描述&#xff1a;题目链接&#xff1a; 整体思路分…...

Postman 的简单使用

什么是Postman 在程序开发中用于调试网络程序或者跟踪网页请求。可以对网页进行简单的基本信息调试。Postman最早是作用chrome浏览器插件存在的&#xff0c;但是2018年初Chrome停止对Chrome应用程序的支持。所以现在Postman提供了独立的安装包&#xff0c;不再依赖于Chrome浏览…...

在CentOS7安装部署GitLab服务

CentOS 7 安装 Gitlab 官方安装教程&#xff1a;https://about.gitlab.com/install/ 参考安装教程&#xff1a;https://developer.aliyun.com/article/74395 安装配置 Step1&#xff1a;配置yum源 vim /etc/yum.repos.d/gitlab-ce.repo存入以下内容&#xff1a; [gitlab-c…...

订单系统就该这么设计,稳的一批~

订单功能作为电商系统的核心功能&#xff0c;由于它同时涉及到前台商城和后台管理系统&#xff0c;它的设计可谓是非常重要的。就算不是电商系统中&#xff0c;只要是涉及到需要交易的项目&#xff0c;订单功能都具有很好的参考价值&#xff0c;说它是通用业务功能也不为过。今…...

Agents改变游戏规则,亚马逊云科技生成式AI让基础模型加速工作流

最近&#xff0c;Stability AI正式发布了下一代文生图模型——Stable Diffusion XL 1.0这次的1.0版本是Stability AI的旗舰版生图模型&#xff0c;也是最先进的开源生图模型。 在目前的开放式图像模型中&#xff0c;SDXL 1.0是参数数量最多的。官方表示&#xff0c;这次采用的…...

详细教程:如何搭建废品回收小程序

废品回收是一项环保举措&#xff0c;通过回收和再利用废弃物品&#xff0c;可以减少资源浪费和环境污染。近年来&#xff0c;随着智能手机的普及&#xff0c;小程序成为了推广和运营的重要工具。本文将详细介绍如何搭建一个废品回收小程序。 1. 进入乔拓云网后台 首先&#xf…...

什么是双亲委派机制?

什么是双亲委派机制&#xff1f; Parent Delegation Model &#xff0c;直译过来可能叫做父级委托模型更容易理解 类的加载过程 Java 编译器将 Java源文件编译成.class 文件再由 JVM 加载 .class 文件到内存中JVM 装载完成后得到一个 Class 字节码对象拿到字节码对象之后 &a…...

Mageia 9 RC1 正式发布,Mandriva Linux 发行版的社区分支

导读Mageia 9 首个 RC 已发布。公告写道&#xff0c;自 2023 年 5 月发布 beta 2 以来&#xff0c;Mageia 团队一直致力于解决许多顽固问题并提供安全修复和新特性。 新版本的控制中心添加了用于删除旧内核的新功能&#xff0c;该功能在 Mageia 9 中默认自动启用&#xff0c;用…...

ChatGPT: 人机交互的未来

ChatGPT: 人机交互的未来 ChatGPT背景ChatGPT的特点ChatGPT的应用场景结论 ChatGPT ChatGPT是一种基于大数据和机器学习的人工智能聊天机器人模型。它由国内团队发明、开发&#xff0c;并被命名为Mental AI。ChatGPT的目标是通过模拟自然对话的方式&#xff0c;提供高效、智能…...

Linux 常用操作命令

Linux简介及Ubuntu安装 Linux&#xff0c;免费开源&#xff0c;多用户多任务系统。基于Linux有多个版本的衍生。RedHat、Ubuntu、Debian 安装VMware或VirtualBox虚拟机。具体安装步骤&#xff0c;找百度。 再安装Ubuntu。具体安装步骤&#xff0c;找百度。 常用指令 ls  …...

24届近5年重庆邮电大学自动化考研院校分析

今天给大家带来的是重庆邮电大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、重庆邮电大学 学校简介 重庆邮电大学简称"重邮"&#xff0c;坐落于直辖市-重庆市&#xff0c;入选国家"中西部高校基础能力建设工程”、国家“卓越工程师教育培养计划…...

如何对oracle和mysql进行 分区分表

前提&#xff1a;使用自带的分区和分表机制进行操作 oracle,mysql分区分表 分区 分区是一种将一个大的表或索引分割成多个小的部分的技术&#xff0c;每个部分称为一个分区。分区可以提高数据的管理和查询效率&#xff0c;因为可以根据不同的条件对不同的分区进行操作&#x…...

Windows下安装Sqoop

Windows下安装Sqoop 一、Sqoop简介二、Sqoop安装2.1、Sqoop官网下载2.2、Sqoop网盘下载2.3、Sqoop安装&#xff08;以version&#xff1a;1.4.7为例&#xff09;2.3.1、解压安装包到 D:\bigdata\sqoop\1.4.7 目录2.3.2、新增环境变量 SQOOP_HOME2.3.3、环境变量 Path 添加 %SQO…...

Chrome 谷歌浏览器,自动填充密码,提示需要输入电脑开机密码问题

我们在使用浏览器访问各个网站时&#xff0c;经常会保存密码。在下一次访问时&#xff0c;直接使用保存的密码填充&#xff0c;简单方便。 但是突然有一天&#xff08;怀疑是谷歌浏览器更新导致的&#xff09;&#xff0c;每次使用密码填充时&#xff0c;都有如下拦截 拦截提…...

Java技术整理(3)—— 多线程并发篇

1、Java 线程实现/创建方式 &#xff08;1&#xff09;继承Thread类 Thread类本质上是实现了Runnable接口的实例&#xff0c;代表一个线程的实例&#xff0c;通过start()启动&#xff0c;自动执行run()方法。 &#xff08;2&#xff09;实现Runnable接口 Runnable是一个没有…...

2023热门跨境电商平台哪个入驻条件适合新手?

一、 Shopee 1.平台简介&#xff1a;东南亚最大跨境电商平台&#xff0c;覆盖新加坡、马来西亚、菲律宾、泰国、越南、巴西等十余个市场。 2.平台优势&#xff1a;流量大、物流快、东南亚市场前景好 3.入驻要求&#xff1a;企业或个体营业执照其他电商平台经验 4.平台费用&…...

【MFC】05.MFC第一大机制:程序启动机制-笔记

MFC程序开发所谓是非常简单&#xff0c;但是对于我们逆向人员来说&#xff0c;如果想要逆向MFC程序&#xff0c;那么我们就必须了解它背后的机制&#xff0c;这样我们才能够清晰地逆向出MFC程序&#xff0c;今天这篇文章就来带领大家了解MFC的第一大机制&#xff1a;程序启动机…...

小程序动画 animation 的常规使用

公司小程序项目比较多&#xff0c;最近正好有时间看一下小程序的动画&#xff0c;同时记录一下我的学习过程&#xff1b;看到这个文章的&#xff0c;我建议你之间去小程序后台&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/wx.createAnimati…...

Swift 周报 第三十四期

文章目录 前言新闻和社区iPhone Pro 要提价&#xff01;新款 iPhone 或会使用 USB-C 充电器&#xff0c;边框更薄与 App Store 专家会面交流让你的 App 和游戏在 visionOS 模拟器外更进一步 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swif…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...