git学习【持续更新中。。。】

git学习【持续更新中。。。】

文章目录

  • git学习【持续更新中。。。】
    • 一、Git基本操作
      • 1.创建本地仓库
      • 2.配置本地仓库
        • 1.局部配置
        • 2.全局配置
      • 3.认识工作区、暂存区、版本库
      • 4.添加文件
      • 5.修改文件
      • 6.版本回退
      • 7.撤销修改
      • 8.删除文件
    • 二、Git分支管理
      • 1.理解分支
      • 2.创建、切换、合并分支
      • 3.删除分支
      • 4.合并冲突
      • 5.合并模式
      • 6.分支策略
      • 7.bug分支
      • 8.强制删除分支
    • 三、Git远程操作

一、Git基本操作

1.创建本地仓库

mkdir gitcode
cd gitcode
git init  #初始化

image-20240917165451711

image-20240917165642779

2.配置本地仓库

git 配置项 name,email
git config user.name "ljh"
git config user.email "123123@qq.com"
git config -l # 查看配置项
git config --unset user.name # 删除配置项
git config --global user.name "ljh"
# 生效于所有的git仓库 因为往往我们的服务器上有很多git仓库# 注意不能直接重置
git config --global --unset user.name
1.局部配置

image-20240917171140901

image-20240917171243744

2.全局配置

image-20240917171446073

3.认识工作区、暂存区、版本库

​ 我们在gitcode目录下,创建一个文件,命名为ReadMe

image-20240917205413053

​ 目前情况下,Git能否管理ReadMe文件呢?是不行的!!这里这个.git 称为版本库(仓库),ReadMe称为工作区,图示如下:

image-20240917210658560

​ stage叫做暂存区/索引,也可以称为index

​ 对工作区的修改包括:新增、修改、删除

​ 在我们的版本库中存在一个objects区域:我们修改的工作区的内容会写入对象库的git对象中。

​ stage和master中存的都是索引,objects中存的才是对象。

image-20240917210817754

​ 注意:.git目录是不支持在该目录下进行手动修改的!!!

4.添加文件

git add ReadMe
git add . # 将当前目录下所有文件添加到暂存区
git commit -m "add first file" # 本次提交的细节信息
git log # 查看提交日志
# commit: 哈希计算的数字,十六进制
# Author:ljh <....qq.com>
# Date: 
# add first file
git log --pretty=oneline # 仅打印一行log

image-20240917211807751

cat .git/HEAD # ref:refs/heads/master
cat ./git/refs/head/master # 最新一次提交的commit号

image-20240917212453515

我们的commit号:前两位:文件号 后面:文件标识

image-20240917212816479

git cat-file -p commit号
# tree: 所有的commit
# parent: 上一次提交的commit号
# author
# committer: add 3 file commit的内容/更改的内容

image-20240917213158556

要记住!git追踪管理的其实是修改,而不是文件!

git status # 查看当前仓库的状态 哪些文件在工作区被修改了

image-20240917214506577

5.修改文件

如果要查看进行了哪些修改【查看暂存区和工作区文件的差异】

git diff ReadMe

image-20240917214553184

a/ :表示修改前 b/:表示修改后 根据上图可以发现 改动前后文件名没有变化

@@ -1 表示改动前一行 +1,2 表示改动后,连续两行

也可以 git diff HEAD - - [file] 查看版本库和工作区文件的区别

​ 总结:git status + git diff 的组合可以用来查看哪些内容发生了修改+修改了哪些内容

6.版本回退

​ 假如我们现在有两个版本的ReadMe,v1版本内容为git,v2版本内容为git world

git reset [ --soft | --mixed | --hard ] [HEAD]
# 本质是回退的版本库的内容,还可以回退到当前版本
工作区暂存区版本库
git worldgit worldgit world
git worldgit worldgit 【- -soft】
git worldgitgit 【- -mixed 默认】
gitgitgit 【- -hard 慎用】

具体使用方法:

  1. git log - -pretty=online 得到的结果如下:
    commit号1 (HEAD->master) modify ReadMe
    commit号2 add file5
    commit号3 add 3 file
    commit号4 add first file 我想要回退到这个版本
  2. 使用 git reset - -hard commit号4 (注意工作区也回退!!!)
    运行结果:HEAD is now at 58doaa3【commit号前几位】 add first file【commit 内容】
  3. 此时我们 la => .git ReadMe cat ReadMe => hello git
    我们输入 git log - -pretty=oneline => commit号4 ( HEAD-> master) add first file
  4. 如果反悔了,怎么办?我们刚刚打印出了最近一次修改的commit号1,此时我们使用 git reset - -hard commit号1,我们发现,所有的内容都回来了!log也回来了。为什么有反悔药可以吃呢?因为当前的终端还保留了之前的commit号,如果清掉屏幕/服务器关掉,再次使用git log 就拿不到之前的commit号了,那现在怎么办呢?
  5. 可以使用git reflog 这个指令记录每一次的提交命令,可以得到每次commit对应的短的commit号,使用这个短的commit号也可以进行恢复

image-20240918075753705

为什么每次回退的速度都很快呢?原因如下图:
image-20240918080420001

我们实际上回退的时候仅仅修改了master中的commit ID,所以速度很快

7.撤销修改

如果我们在我们的工作区写了很长时间代码,越写越写不下去,觉得自己写的实在是垃圾,想恢复到上一个版本

会出现下面几种情况

工作区暂存区版本库解决方式
1.xxx code1.手动撤销——不推荐,易出错
2.git checkout - - [filename] ——推荐
2.xxx codexxx codegit reset
3.xxx codexxx codexxx code前提条件:commit之后没有push,使用git reset - -hard HEAD^

​ 情况2的解决方案一:git reset HEAD ReadMe 【默认是 - -mixed 的】,HEAD表示回退到当前版本,HEAD^ 表示回退到上一版本,我们情况2的当前版本库为空。- -mixed 是暂存区和版本库回退,所以暂存区的 xxx code就清掉了,此时仅工作区有内容,就回到了情况1。之后我们再使用情况1的解决方案,git checkout - -Reade 即可

​ 情况3:版本库存在最新版本的代码 xxx code,但是上一版不包含 xxx code,我们通常使用git进行版本控制的流程如下:工作区->(git add)->暂存区->(git commit)->版本库->(git push)->远程仓库,我们情况3撤销的前提是在commit之后没有进行push,撤销的目的就是不要影响远程仓库的代码。此时我们直接使用指令 git reset - -hard HEAD^ 即可。

8.删除文件

我们删除一个文件通常有两种方式:

  1. 首先 rm file5 删除工作区的内容,然后 git add file5 将删除提交同步至 暂存区,最后再 git commit -m “delete file5” 将删除同步到版本库
  2. 首先使用git rm file5 将工作区,和暂存区的内容都删掉,最后使用git commit -m “delete xxx” 将删除提交到版本库即可。

二、Git分支管理

1.理解分支

我们首先来看一个例子以便于我们更好的理解git分支功能:
image-20240918084146599

HEAD可以指向其他分支,被指向的分支就是当前正在工作的分支。

image-20240918084725575

image-20240918085653722

2.创建、切换、合并分支

git branch # 查看当前本地有哪些分支

image-20240918091348283

git branch dev # 创建一个名为dev的分支
cat .git/refs/heads 

image-20240918091804437

并且可以发现他们俩指向的提交的commit号是相同的,此时的状态为:

image-20240918092107363

我们如何切换分支呢:

git checkout dev

此时状态变成了:
image-20240918092613745

注:在dev分支上修改代码,不会影响master分支【工作区、暂存区、版本库都是】

image-20240918092851902

我们在dev上提交代码,此时状态变为了:

image-20240918092907493

那我们如果让master和dev合并,master也保持最新状态呢?分为以下两步:

  1. git checkout master
  2. git merge dev

image-20240918093150351

我们此时再

cat .git/refs/heads/master

发现此时的master主分支的commit id和dev分支之前的commit id 是相同的

image-20240918093523377

3.删除分支

删除本地分支,为了节约资源,指令为:

git branch -d dev

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

4.合并冲突

​ git合并冲突是怎么造成的呢?

​ 假如我们原来:master分支和dev分支 上的内容都是 aaa on dev branch

​ 这时候我们将dev分支上的内容修改为 bbb on dev branch,并且将master分支上的内容修改为 ccc on dev branch,我们再使用git merge指令来合并,就会发生冲突!!!如何解决呢?

​ 我们先在我们的服务器上复现出来上面出现的这种情况,这里再介绍一个新的指令:

git checkout -b dev1
# 这条指令等于 git branch dev1 + git checkout dev1

image-20240918110225003

模拟完上面的状态后,此时git中的状态图为:
image-20240918110424372

我们再次切换到master分支上,然后尝试去合并

git merge dev1

image-20240918110746340

如何解决冲突呢?我们先看一下我们master分支下的ReadMe文件

image-20240918110958586

我们的解决方案是:手动 vim ReadMe,然后删除掉不需要的代码即可,再将修改后的文件进行add和commit就ok了。
image-20240918111649099

此时git中的状态就是:
image-20240918111720583

我们再去验证下dev分支下还是不是原来的数据:
image-20240918111957302

此外,git也是提供可视图的:

git log --graph --abbrev-commit

image-20240918112326813

5.合并模式

​ git merge的模式:fast-forward模式:看不出来最新的提交到底是merge进来的还是正常提交的

image-20240918152641150

介于fast-forward模式看不出来是否是合并而来的,所以合并可采用no-ff模式【很推荐,分别找锅】,即:

git merge --no-ff -m "merge dev2" dev2

此时提交后的状态图信息为:
image-20240918152923692

6.分支策略

image-20240918153039192

有了分支,就可以进行多人协作开发了
image-20240918153404842

7.bug分支

我们先模拟一下这个场景:
image-20240918154659567

这种情况是我们不能忍受的!

image-20240918155155525

​ 我们的解决方案是使用 git stash 指令,要注意的是,git stash只能存储被git管理的文件,使用git stash后,工作区的代码就被存入到stash中了,且此时切回master分支时,未提交的代码不会影响master分支的使用。

image-20240918161104874

image-20240918161344270

后续需要处理stash中存储的工作区的内容时,可以通过:

git stash list # 查看stash中存储了哪些内容
git stash pop  # 将stash中内容恢复到工作区 

​ 这个时候就可以转去master分支去修复bug了,dev1分支上工作区的内容不会影响到master分支,我们基于master分支的基础上再创建fix_bug分支,去修复bug,修复完成后合并到主分支。此时的状态图如下:
image-20240918163032074

​ 此时如果让master去合并dev 这个操作是不可取的!因为dev上的bug还未修复,会和master冲突。

image-20240918164432230

​ 正确的做法是:让dev去合并master,合并后就算有问题也可以在本地分支多次修改测试,不会影响master代码,此时的状态:
image-20240918164511004

image-20240918164541423

8.强制删除分支

​ 这个需求的场景如下:

image-20240918165350668

git branch -d # 不行,只能删被merge后的分支
git branch -D # 强制删除

三、Git远程操作

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

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

相关文章

AI 时代,大模型产业落地的八大思考

引言 在人工智能领域&#xff0c;大模型技术正逐渐成为推动行业进步的关键力量。随着技术的发展&#xff0c;大模型不仅在学术界引起了广泛的关注&#xff0c;也在产业界展现出巨大的应用潜力。然而&#xff0c;如何将这些强大的模型有效地应用到实际产业中&#xff0c;仍然是…

解决:Vue 中 debugger 不生效

目录 1&#xff0c;问题2&#xff0c;解决2.1&#xff0c;修改 webpack 配置2.2&#xff0c;修改浏览器设置 1&#xff0c;问题 在 Vue 项目中&#xff0c;可以使用 debugger 在浏览器中开启调试。但有时却不生效。 2&#xff0c;解决 2.1&#xff0c;修改 webpack 配置 通…

MySQL权限控制(DCL)

我的mysql里面的一些数据库和一些表 基本语法 1.查询权限 show grants for 用户名主机名;例子1&#xff1a;查询权限 show grants for heima%;2.授予权限 grant 权限列表 on 数据库名.表名 to 用户名主机名;例子2&#xff1a; 授予权限 grant all on itcast.* to heima%;…

Android Studio Menu制作

文章目录 一、创建菜单在Activity上新建onCreateOptionsMenu新建menu目录及资源文件新建Menu一级菜单在Activity上加载Menu测试效果 二、菜单点击事件 一、创建菜单 在Activity上新建onCreateOptionsMenu Overridepublic boolean onCreateOptionsMenu(Menu menu) {return supe…

Pytest配置文件pytest.ini如何编写生成日志文件?

1、新建pytest.ini文件 [pytest] log_clitrue log_leveLNOTSET log_format %(asctime)s %(levelname)s %(message)s %(filename)s %(funcName)s %(lineno)d log_date_format %Y-%m-%d %H:%M:%Slog_file ./logdata/log.log log_file_level info log_file_format %(asctime…

深入探究HTTP网络协议栈:互联网通信的基石

在我们日常使用互联网的过程中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;扮演着至关重要的角色。无论是浏览网页、下载文件&#xff0c;还是进行在线购物&#xff0c;HTTP协议都在背后默默地支持着这些操作。今天&#x…

数据结构与算法——顺序表期末复习五大经典题型

目录 一&#xff1a;顺序表-移除元素 二&#xff1a;顺序表-删除有序数组中的重复项 三&#xff1a;顺序表-合并两个有序数组 四&#xff1a;顺序表-旋转数组 五&#xff1a;顺序表-数组形式的整数加法 一&#xff1a;顺序表-移除元素 题型链接&#xff1a;27. 移除元素 -…

玖逸云黑系统源码 v1.3.0全解无后门 +搭建教程

功能带有卡密生成和添加黑名单等&#xff0c;反正功能也不是很多具体的自己看程序截图即可。 搭建教程 完成 1.我们先添加一个站点 2.PHP选择7.3 3.上传源码解压 4.导入数据库 5.配置数据库信息config.php 源码下载&#xff1a;https://download.csdn.net/download/m0_6…

10年408考研真题-数据结构

23.[2010统考真题]若元素 a,b,c,d,e,f 依次进栈&#xff0c;允许进栈、退栈操作交替进行&#xff0c;但不允许连续3次进行退栈操作&#xff0c;不可能得到的出栈序列是(D)。 A.dcebfa B.cbdaef C.bcaefd D.afedcb 解析&#xff1a;直接看D选项&#xff0c…

VUE实现刻度尺进度条

一、如下图所示效果&#xff1a; 运行后入下图所示效果&#xff1a; 实现原理是用div画图并动态改变进度&#xff0c; 二、div源码 <div style"width: 100%;"><div class"sdg_title" style"height: 35px;"><!--对话组[{{ dialo…

用Python画一个五星红旗

#codingutf-8 import turtle import mathdef draw_polygon(aTurtle, size50, n3): 绘制正多边形args:aTurtle: turtle对象实例size: int类型&#xff0c;正多边形的边长n: int类型&#xff0c;是几边形 for i in range(n):aTurtle.forward(size)aTurtle.left(360.0/n)de…

Linux--守护进程与会话

进程组 概念 进程组就是一个或多个进程的集合。 一个进程组可以包含多个进程。 下面我们通过一句简单的命令行来展示&#xff1a; 为什么会有进程组&#xff1f; 批量操作&#xff1a;进程组允许将多个进程组织在一起&#xff0c;形成一个逻辑上的整体。当需要对多个进程…

下载Kafka 3.0.0教程

1、Kafka 3.0.0下载地址 Apache Kafka 2、往下拉&#xff0c;查找3.0.0版本点击下载

【C++前后缀分解 降维】2906. 构造乘积矩阵|2074

前后缀分解 C前后缀分解 LeetCode2906. 构造乘积矩阵 给你一个下标从 0 开始、大小为 n * m 的二维整数矩阵 grid &#xff0c;定义一个下标从 0 开始、大小为 n * m 的的二维矩阵 p。如果满足以下条件&#xff0c;则称 p 为 grid 的 乘积矩阵 &#xff1a; 对于每个元素 p[…

数据结构之‘栈’

文章目录 1.简介2. 栈的初始化和销毁3. 进栈和出栈3.1 进栈3.2 出栈3.3 栈的打印 1.简介 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行&#xff08;数据插入和删除操作&#xff09;的一端称为栈顶&#xff0c;另一端称为栈底。压栈&#xf…

C语言之预处理详解(完结撒花)

目录 前言 一、预定义符号 二、#define 定义常量 三、#define定义宏 四、宏与函数的对比 五、#和## 运算符 六、命名约定 七、#undef 八、条件编译 九、头文件的包含 总结 前言 本文为我的C语言系列的最后一篇文章&#xff0c;主要讲述了#define定义和宏、#和##运算符、各种条件…

W25QXX系列Flash存储器模块驱动代码

目录 W25QXX简介 硬件电路 W25Q128框图 Flash操作注意事项 驱动代码 W25QXX.h W25QXX.c W25QXX简介 W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器&#xff0c;常应用于数据存储、字库存储、固件程序存储等场景 存储介质&#xff1a;Nor Flash&#xff0…

算法入门-贪心1

第八部分&#xff1a;贪心 409.最长回文串&#xff08;简单&#xff09; 给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回通过这些字母构造成的最长的回文串 的长度。 在构造过程中&#xff0c;请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串…

如何通过 PhantomJS 模拟用户行为抓取动态网页内容

引言 随着网页技术的不断进步&#xff0c;JavaScript 动态加载内容已成为网站设计的新常态&#xff0c;这对传统的静态网页抓取方法提出了挑战。为了应对这一挑战&#xff0c;PhantomJS 作为一个无头浏览器&#xff0c;能够模拟用户行为并执行 JavaScript&#xff0c;成为了获…

Android RecycleView 深度解析与面试题梳理

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 引言 在 Android 开发中&#xff0c;列表和网格布局是非常常见的界面元素&#xff0c;它们用于展示大量数据集合。RecyclerView 是 Android 提…