Git学习笔记——超详细
Git笔记
安装git:
apt install git
创建版本库:
git init
添加文件到版本库:
git add 文件
提交文件到仓库:
git commit -m “注释”
查看仓库当前的状态信息:
git status
查看修改内容和之前版本的区别,在git add之前可以看到
git diff 文件
查看提交的历史记录
git log 加上 --pretty=oneline 一行输出
版本回退:往前回退多个版本用HEAD^^ 100的话使用HEAD~100
git reset --hard HEAD^
回到指定版本:
git reset --hard 版本号的前几位
查询之前执行的命令:历史命令,帮助回到之前的版本
git reflog
git add 文件到暂存区 git commit 提交到工作区,commit的是已经在暂存区的内容,将暂存区里的所有内容提交
**场景1:**当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
**场景2:**当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
git当删除工作区的文件text.txt后,第一个场景,删除版本库中的该文件,git rm test.txt 然后 git commit -m "remove test.txt " ;第二个场景,恢复工作区的文件从版本库,执行 git checkout – test.txt
创建新的ssh密钥添加到github:
以下是重新生成 SSH 密钥并将其添加到 GitHub 帐户的步骤:1. 打开终端并输入以下命令:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
2. 按 Enter 键三次,接受默认文件名和位置。3. 输入以下命令将新生成的 SSH 密钥添加到 ssh-agent:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
4. 复制新生成的 SSH 公钥。您可以使用以下命令将其复制到剪贴板:
pbcopy < ~/.ssh/id_rsa.pub
5. 转到您的 GitHub 帐户设置页面,选择“SSH 和 GPG 密钥”,然后单击“新 SSH 密钥”按钮。6. 在“标题”字段中输入一个描述性标题,然后将剪贴板中的 SSH 公钥粘贴到“密钥”字段中。7. 单击“添加 SSH 密钥”按钮。现在,您应该能够使用新生成的 SSH 密钥访问您的 GitHub 存储库。
添加远程仓库:
$ git remote add origin git@github.com:github账户名/仓库名.git origin:远程库的名字
推送本地库的内容到远程库:
git push -u origin master #第一次推送master所有的内容,加上-u,保证本地和远程的分支关联起来
$ git push origin master #之后提交
删除远程库:
git remote rm origin
删除远程库之前建议使用git remote -v查看远程库信息:
$ git remote -v
origin git@github.com:github账户名/learn-git.git (fetch)
origin git@github.com:github账户名/learn-git.git (push)
克隆远程仓库:
git clone git@github.com:github账户名/仓库名.git
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>或者git switch <name>
创建+切换分支:git checkout -b <name>或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
解决冲突:
准备新的feature1分支,继续我们的新分支开发:
$ git switch -c feature1
Switched to a new branch 'feature1'
修改readme.txt最后一行,改为:
Creating a new branch is quick AND simple.
在feature1分支上提交:
$ git add readme.txt$ git commit -m "AND simple"
[feature1 14096d0] AND simple1 file changed, 1 insertion(+), 1 deletion(-)
切换到master分支:
$ git switch master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.(use "git push" to publish your local commits)
Git还会自动提示我们当前master分支比远程的master分支要超前1个提交。
在master分支上把readme.txt文件的最后一行改为:
Creating a new branch is quick & simple.
提交:
$ git add readme.txt
$ git commit -m "& simple"
[master 5dc6824] & simple1 file changed, 1 insertion(+), 1 deletion(-)
现在,master分支和feature1分支各自都分别有新的提交,变成了这样:
HEAD││▼master││▼┌───┐┌─▶│ │
┌───┐ ┌───┐ ┌───┐ │ └───┘
│ │───▶│ │───▶│ │──┤
└───┘ └───┘ └───┘ │ ┌───┐└─▶│ │└───┘▲││feature1
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
果然冲突了!Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件:
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.(use "git push" to publish your local commits)You have unmerged paths.(fix conflicts and run "git commit")(use "git merge --abort" to abort the merge)Unmerged paths:(use "git add <file>..." to mark resolution)both modified: readme.txtno changes added to commit (use "git add" and/or "git commit -a")
我们可以直接查看readme.txt的内容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:
Creating a new branch is quick and simple.
再提交:
$ git add readme.txt
$ git commit -m "conflict fixed"
[master cf810e4] conflict fixed
现在,master分支和feature1分支变成了下图所示:
HEAD││▼master││▼┌───┐ ┌───┐┌─▶│ │───▶│ │
┌───┐ ┌───┐ ┌───┐ │ └───┘ └───┘
│ │───▶│ │───▶│ │──┤ ▲
└───┘ └───┘ └───┘ │ ┌───┐ │└─▶│ │──────┘└───┘▲││feature1
用带参数的git log也可以看到分支的合并情况:
$ git log --graph --pretty=oneline --abbrev-commit #查看分支合并图
* cf810e4 (HEAD -> master) conflict fixed
|\
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/
* b17d20e branch test
* d46f35e (origin/master) remove test.txt
* b84166e add test.txt
* 519219b git tracks changes
* e43a48b understand how stage works
* 1094adb append GPL
* e475afc add distributed
* eaadf4e wrote a readme file
最后,删除feature1分支:
$ git branch -d feature1
Deleted branch feature1 (was 14096d0).
合并分支时,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息
首先,仍然创建并切换dev分支:
$ git switch -c dev
Switched to a new branch 'dev'
修改readme.txt文件,并提交一个新的commit:
$ git add readme.txt
$ git commit -m "add merge"
[dev f52c633] add merge1 file changed, 1 insertion(+)
现在,我们切换回master:
$ git switch master
Switched to branch 'master'
准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.readme.txt | 1 +1 file changed, 1 insertion(+)
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
合并后,我们用git log看看分支历史:
$ git log --graph --pretty=oneline --abbrev-commit
* e1e9c68 (HEAD -> master) merge with no-ff
|\
| * f52c633 (dev) add merge
|/
* cf810e4 conflict fixed
...
可以看到,不使用Fast forward模式,merge后就像这样:

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动,但是需要git stash命令保存现场,再git cherry-pick ,最后再 git stash pop,此时可能会有冲突,需要处理冲突;
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。
多人协作:
-
查看远程库信息,使用
git remote -v; -
本地新建的分支如果不推送到远程,对其他人就是不可见的;
-
从本地推送分支,使用
git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交; -
在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致; -
建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name; -
从远程抓取分支,使用
git pull,如果有冲突,要先处理冲突。
rebase
- rebase操作可以把本地未push的分叉提交历史整理成直线;git rebase
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
tag
-
命令
git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id; -
命令
git tag -a <tagname> -m "blablabla..."可以指定标签信息; -
命令
git tag可以查看所有标签。 -
git show <tagname> 查看标签详细信息 -
命令
git push origin <tagname>可以推送一个本地标签; -
命令
git push origin --tags可以推送全部未推送过的本地标签; -
命令
git tag -d <tagname>可以删除一个本地标签; -
命令
git push origin :refs/tags/<tagname>可以删除一个远程标签。
相关文章:
Git学习笔记——超详细
Git笔记 安装git: apt install git 创建版本库: git init 添加文件到版本库: git add 文件 提交文件到仓库: git commit -m “注释” 查看仓库当前的状态信息: git status 查看修改内容和之前版本的区别&am…...
Locust负载测试工具实操
本中介绍如何使用Locust为开发的服务/网站执行负载测试。 Locust 是一个开源负载测试工具,可以通过 Python 代码构造来定义用户行为,避免混乱的 UI 和臃肿的 XML 配置。 步骤 设置Locust。 在简单的 HTTP 服务上模拟基本负载测试。 准备条件 Python…...
关闭mysql,关闭redis服务
1. 关闭redis服务: 查询redis安装目录: whereis redis which redis find / -name redis 关闭redis服务: redis-cli -h 127.0.0.1 -p 6379 auth 输入密码 shutdown 关闭redis服务 2. 关闭mysql服务: 查询mysql安装目录&…...
微机原理:汇编语言语句类型与格式
文章目录 壹、语句类型1、语句分类2、常用伪代码和运算符2.1数据定义伪指令2.1.1字节定义伪指令DB(8位)2.1.2字定义伪指令DW(16位)2.1.3双字节伪指令DD2.1.4 多字节定义DF/DQ/DT(了解) 2.2 常用运算符2.2.1…...
iOS Flutter Engine源码调试和修改
iOS Flutter Engine源码调试和修改 1. 前提:2. 步骤:3. 参考资料 1. 前提: 已将成功安装deop_tools工具已经通过gclient命令同步好flutter engine源码 2. 步骤: 进入engine/src目录 创建flutter engine构建文件 真机文件debug模式: ./flu…...
Java日志系统之Log4j
目录 Log4J Log4j的简单使用 日志级别 Log4j的组件 Loggers Appenders Layout Layout格式 设置配置文件加载 配置文件解析 Log4J 是Apache下开源的日志框架 Log4j的简单使用 Testpublic void testLog4J(){Logger logger Logger.getLogger(Log4jTest.class);logger…...
Windows11系统安装WSL教程
WSL,全称Windows Subsystem for Linux,是微软官方提供的可以在Windows上直接运行的Linux环境,包括大多数命令行工具、程序和应用,由系统底层虚拟机平台支持。 开启相关服务 1、控制面板-启用或关闭Windows功能 2、勾选以下两个…...
总结一下vue中v-bind的常见用法
文章目录 🐕前言:🏨简述一下v-bind命令🧸其它写法1.还是当成字符串🦓其它写法2.当成对象来使用 🐕前言: 本篇博客主要总结一下v-bind命令在vue中的常见用法(看完即懂) …...
全面超越AutoGPT,面壁智能联合清华NLP实验室开源大模型「超级英雄」XAgent
近日,国内领先的人工智能大模型公司面壁智能又放大招,联合清华大学 NLP 实验室共同研发并推出大模型「超级英雄」——XAgent。 通过任务测试,XAgent 在真实复杂任务的处理能力已全面超越 AutoGPT。 现已在 GitHub 正式开源,地址 …...
springBoot--web--http缓存机制测试
springBoot--web--http缓存机制测试 前言1、多端内容适配基于请求头内容协商(默认开启)基于请求参数内容协商(需要开启) 2、默认返回json数据3、设置返回xml数据导入jackson-dataformat-xml包在类文件中添加注解 JacksonXmlRootEl…...
免费活动】11月4日敏捷武林上海站 | Scrum.org CEO 亲临现场
活动介绍 过去的几年里,外界的风云变幻为我们的生活增添了一些不一样的色彩。在VUCA世界的浪潮里,每一个人都成为自己生活里的冒险家。面对每一次的变化,勇于探索未知,迎接挑战,努力追逐更好的自己。 七月࿰…...
VSCode搭建ESP32 ESP-IDF开发环境-Windows
陈拓 2023/10/09-2023/10/14 1. 安装Windows系统下的ESP32 ESP-IDF开发环境 见《Windows系统安装ESP32 ESP-IDF开发环境》 Windows系统安装ESP32 ESP-IDF开发环境-CSDN博客Windows系统安装ESP32 ESP-IDF开发环境。https://blog.csdn.net/chentuo2000/article/details/1339225…...
Java可重入锁(GPT编写)
Java可重入锁是Java并发编程中常用的一种锁机制,它可以允许同一个线程多次获取同一个锁,从而避免死锁和其他并发问题。在本篇博客中,我们将对Java可重入锁的源码进行分析,以便更好地理解它的实现原理和使用方法。 Java可重入锁的…...
京东数据平台:2023年9月京东净水器行业品牌销售排行榜!
鲸参谋监测的京东平台9月份净水器市场销售数据已出炉! 根据鲸参谋平台的数据显示,今年9月份,京东平台净水器的销量为64万,环比下滑约9%,同比下滑约16%;销售额为5.2亿,环比下滑约12%,…...
skiaSharp linux 生成验码字体显示不出来
一、拷贝windows下的字体如:C:\Windows\Fonts 设置字体的地方: var fontPath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Fonts", "TAHOMA.TTF");最终效果:...
WuThreat身份安全云-TVD每日漏洞情报-2023-10-12
漏洞名称:curl SOCKS5 堆溢出漏洞(CVE-2023-38545) 漏洞级别:高危 漏洞编号:CVE-2023-38545,CNVD-2023-75809 相关涉及:cURL libcurl >7.69.0,<8.3.0 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-25382 漏洞名称:Apache H…...
sobel边缘检测算法
Sobel边缘检测算法是一种常用的图像处理技术,用于检测图像中的边缘和轮廓。该算法基于离散卷积操作,通过对图像进行滤波来寻找图像中灰度值的变化。Sobel算子是一种常用的卷积核,用于检测图像中的垂直边缘和水平边缘。以下是Sobel边缘检测算法…...
Kotlin中抽象类与接口
Kotlin 中的抽象类和接口是面向对象编程中的重要概念,它们提供了一种用于定义和组织代码的方式。在下面的代码示例中,我们将介绍 Kotlin 中的抽象类和接口,并给出相应的示例。 抽象类 抽象类是一种不能被实例化的类,它仅用作其他…...
解决osg绘制场景时因Z冲突导致重影或闪烁等不正常情况
目录 1. 问题的提出 2. Z冲突(z-fighting)简介 2.1. Z冲突(z-fighting)产生的原因 2.2. 如何消除Z冲突(z-fighting) 3. 代码实现 1. 问题的提出 今天绘制了一个棋盘格,鼠标在棋盘格上单击…...
adb 获取 Android 设备中已安装的 apk 文件
前言 今天发现手机上一个应用在应用商店已经搜索不到了,想把其推荐给朋友使用,发现不知道从哪里找原始的 apk 安装文件,记录一下。 如何提取 apk 两种方法 MT管理器导出 可以使用 MT管理器(Android 平台逆向神器),它有个 安装…...
零代码部署GME多模态向量:小白也能玩转图文跨模态搜索
零代码部署GME多模态向量:小白也能玩转图文跨模态搜索 1. 为什么选择GME多模态向量模型 在日常工作和生活中,我们经常遇到这样的困扰:明明记得某张图片的内容,却怎么也找不到它;或者需要根据一段文字描述,…...
告别while死等!用STC15单片机定时器搞定按键短按长按(附完整代码)
STC15单片机定时器中断实现按键短按长按检测实战指南 在嵌入式开发中,按键处理是最基础却最容易出问题的环节之一。很多初学者都会遇到这样的困扰:按下按键后程序"卡死"了,数码管显示停滞、通信中断,直到松开按键才恢复…...
OpenGL新手必看:glUniformMatrix4fv参数transpose为什么必须用GL_FALSE?
OpenGL矩阵传递的底层逻辑:为什么glUniformMatrix4fv的transpose必须设为GL_FALSE? 第一次接触OpenGL着色器编程时,很多人都会对glUniformMatrix4fv函数中那个看似多余的transpose参数感到困惑。为什么这个参数在99%的情况下都必须设置为GL_F…...
SchoolCMS:开源教务管理系统的技术架构创新与实践价值
SchoolCMS:开源教务管理系统的技术架构创新与实践价值 【免费下载链接】schoolcms 中国首个开源学校教务管理系统、网站布局自动化、学生/成绩/教师、成绩查询 项目地址: https://gitcode.com/gh_mirrors/sc/schoolcms SchoolCMS作为中国首个开源的学校教务管…...
用YOLOv5s训练自己的FPS游戏数据集:从截图标注到模型部署的完整避坑指南
YOLOv5实战:从零构建FPS游戏目标检测模型的完整技术手册 在游戏开发与计算机视觉的交叉领域,目标检测技术正掀起一场革命。想象一下,当你沉浸在FPS游戏的激烈对抗中,是否曾好奇AI如何识别屏幕上的敌人、武器和道具?本文…...
Activiti 7.x 实战:用 TaskListener 实现审批流程的自动抄送与通知(Spring Boot 集成)
Activiti 7.x 实战:用 TaskListener 实现审批流程的自动抄送与通知(Spring Boot 集成) 在企业的日常运营中,审批流程无处不在。从简单的请假申请到复杂的项目立项,每个环节都需要高效、准确的审批机制。传统的审批流程…...
避开这些坑!用STM32定时器主从模式精准控制松下伺服电机转指定圈数
STM32定时器主从模式在伺服电机精确控制中的实战应用 工业自动化领域对运动控制的精度要求越来越高,尤其是需要精确控制电机转动圈数或移动距离的场景。传统的中断计数或软件延时方法在实时性和精度上往往难以满足苛刻的工业需求。本文将深入探讨如何利用STM32定时器…...
机器人控制系统中工控机的选型要点(2026新版)
阿强带你了解机器人控制系统中工控机的选型要点。机器人控制系统是机器人的核心,而工控机又是机器人控制系统的核心。工控机的选型直接决定了机器人控制系统的性能、稳定性和可靠性。很多人在选型的时候,往往只关注处理器的主频和核心数,忽略…...
RT-Thread下用u8g2库驱动0.96寸OLED(SSD1306)显示中文,从环境搭建到字体制作全流程
RT-Thread实战:u8g2库驱动0.96寸OLED显示中文全流程解析 在嵌入式开发中,OLED屏幕因其高对比度、低功耗和体积小巧等优势,成为人机交互界面的热门选择。而要在资源有限的嵌入式系统中实现中文显示,往往让开发者感到棘手。本文将手…...
手把手教你用分光光度法测植物叶片SOD/POD/CAT活性(附数据处理与避坑指南)
手把手教你用分光光度法测植物叶片SOD/POD/CAT活性(附数据处理与避坑指南) 实验室里那盆萎蔫的拟南芥,让我第一次意识到抗氧化酶测定的重要性。去年夏天,当我发现对照组和处理组的SOD活性数据出现反常交叉时,整整两周的…...
