git学习笔记 | 版本管理 - 分支管理

news2024/11/24 8:54:35

文章目录

  • git学习笔记
    • Git是什么
    • 仓库
      • 常见的命令
        • commit 备注规范
        • 在文件下设置git忽略文件 .gitignore
    • 版本管理
      • git log | git reflog 查看提交日志/历史版本
      • 版本穿梭 git reset
        • git reset HEAD <file>
      • git checkout -- fileName 丢弃工作区的修改
      • git revert
          • Git恢复之前版本的两种方法reset、revert
        • git 撤销merge | git revert
      • 总结
        • 1.在工作区的代码
        • 2.代码add到暂存区,没有commit提交
    • 分支管理
      • 分支说明
      • 常见分支指令
      • 分支管理规范
      • 分支合并
        • git rebase
        • git stash 临时存储当前的工作现场

git学习笔记

学习文章1
学习文章2
学习文章3

Git是什么

Git是开源分布式版本控制系统,版本控制是一种记录文件内容变化,查阅特定版本修订情况的系统。

仓库

说法1
在这里插入图片描述

说法2在这里插入图片描述

虽然有两种说法,但大概意思是相同的,前三个区域都在本地,只有远程仓库不在本地。

本地仓库 = 工作区 + 版本区

  • 工作区:本地磁盘上的文件集合
  • 版本区(版本库)即.git文件 , git init表示在本地区域创建一个.git文件,也就是创建版本区

版本区 = 暂存区 + 仓库区

  • 暂存区: .git目录下的index文件,通过git add可将工作区文件添加到暂存区
  • 仓库区: git commit可将暂存区的文件提交到仓库区,形成历史版本

常见流程案例

  1. git init 初始化,把这个文件变成Git可以管理的仓库。初始化后打开隐藏的文件可以看到有一个.git文件。
  2. git add . 把这个文件全部提交到暂存区。
  3. git commit -m "评论" 把暂存区的全部文件提交到本地仓库。
  4. git remote add origin 仓库地址 把本地的仓库与GitHub上的远程仓库连接起来。只需要连接一次,就可以一直使用。
  5. git push -u origin master 把本地仓库提交到远程仓库。

常见的命令

指令描述常见使用方法
git add将本地区文件添加到暂存区,可以多次像暂存区添加添加文件到暂存区:git add 文件名
添加所有文件到暂存区:git add .
添加变化的文件到暂存区:git add -A
删除暂存区的文件: git rm --cached 文件名
git commit将暂存区的全部文件提交到仓库区,形成历史版本提交文件: git commit -m ”版本日志信息" 文件名
提交所有文件: git commit -m ”版本日志信息”
git status查看仓库区(本地库)状态红色文件没有加入暂存区,绿色加入了暂存区
git show 提交hash值查看某次commit的修改内容
  • git commit --amend 回车 修改上次的提交信息,push后不会增加新的commit记录,但是会修改本次的commit的thash(可以理解为删掉了最新的一次commit,重新又提交了一次)
  • git commit -m "msg" --no-verify 强制提交不检查

commit 备注规范

开头备注
feat:新功能、新特性
fix:修改 bug
perf:更改代码,以提高性能(在不影响代码内部行为的前提下,对程序性能进行优化)
refactor:代码重构(重构,在不影响代码内部行为、功能下的代码修改)
docs:文档修改
style:代码格式修改, 注意不是 css 修改(例如分号修改)
test:测试用例新增、修改
build:影响项目构建或依赖项修改
revert:恢复上一次提交
ci:持续集成相关文件修改
chore:其他修改(不在上述类型中的修改)
release:发布新版本
workflow:工作流相关文件修改

在文件下设置git忽略文件 .gitignore

忽略哪些文件?
以vue项目为例,node_modules下载的依赖包是不用上传的,因为该文件太大了并且有包管理文件package.json,可以利用包管理文件在重新下载依赖。
忽略一些与项目实际功能无关,比如.vscode等IDE文件
目的
1.屏蔽IDE工具之间的差异
2.上传的文件尽可能小,别人下载的速度会更快,更好的体验

怎么忽略
1.创建忽略规则文件 xxx.ignore , 建议是git.ignore
为了便于让~/.gitconfig文件(.git里)引用,建议与它放在一个目录下,或者可以直接修改~/.gitconfig

git.ignore文件模板,以vue项目为例

.DS_Store
node_modules/
/dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln

.gitconfig里引用

// 注意斜线的方向
 excludesfile = 绝对路径/git.ignore

版本管理

看了一篇很有意思的文章,感觉对版本控制的理由有帮助:Git之撤销修改 git checkout – file、git reset HEAD file 的使用

git log | git reflog 查看提交日志/历史版本

若多屏显示控制方式:空格向下翻页 b向上翻页 q退出

查看完整历史版本:git log

D:\work_code\demo\vue3_test>git log
commit eca39ce053d6a6c7650c10c6ab80d174cbbe3fcd (HEAD -> master)
Author: Ranan <ranan>
Date:   Fri Aug 25 19:20:25 2023 +0800

    modify

commit 36d5ec0bfa96ba0beb59e765de03024f383c9ae9
Author: Ranan <ranan>
Date:   Fri Aug 25 18:44:37 2023 +0800

    init

返回的信息中包含提交的UUID(commit 完整版本号)、当前分支、作者、日志和描述信息。

查看精简历史版本:git reflog

HEAD@{移动到当前版本需要多少步},前面的数字表示本次版本的哈希值。

D:\work_code\demo\vue3_test>git reflog
eca39ce (HEAD -> master) HEAD@{0}: commit: modify
36d5ec0 HEAD@{1}: commit (initial): init

区别
git reflog会记录每一次命令,可以查看所有分支的所有操作记录。
git log不会显示回溯版本之后提交的版本也不能查看已经删除的记录。

版本穿梭 git reset

本质:操作HEAD的指针,HEAD指针默认是指向最近的版本。
命令:git reset 强度 局部hash(推荐用法)

强度头指针恢复已经add的缓存区工作区代码描述
--soft commithash不丢失不变从commithash之后的提交回退到暂存区
--mixed commithash丢失不变
--hard commithash丢失恢复到穿梭的版本

如果穿梭git reset在旧版本后,使用git push会把报错,因为本地仓库HEAD指向的版本比远程库旧。
解决办法:git push -f强制推,该版本之后的新版本全部消失。

常见使用场景
执行commit后,还没执行push时,想要撤销这次的commit:git reset --soft HEAD^

其他用法

git reset --hard head #当前版本
git reset --hard HEAD^ #回退到上一个版本
git reset --hard HEAD^^ #回退到上上一个版本
git reset --hard HEAD~3 #回退到往上3个版本
git reset --hard HEAD~10 #回退到往上10个版本

使用案例

先使用git reflog查看本地库的版本情况以及对应的局部hash值,在使用git reset --hard 局部hash回溯版本

// 案例: 回到版本36d5ec0 
D:\work_code\demo\vue3_test>git reset --hard 36d5ec0
HEAD is now at 36d5ec0 init

D:\work_code\demo\vue3_test>git reflog
36d5ec0 (HEAD -> master) HEAD@{0}: reset: moving to 36d5ec0
eca39ce HEAD@{1}: commit: modify
36d5ec0 (HEAD -> master) HEAD@{2}: commit (initial): init

D:\work_code\demo\vue3_test>git log
commit 36d5ec0bfa96ba0beb59e765de03024f383c9ae9 (HEAD -> master)
Author: Ranan <ranan>
Date:   Fri Aug 25 18:44:37 2023 +0800

    init

版本前进

// 案例: 前进到modify版本

D:\work_code\demo\vue3_test>git reset --hard eca39ce
HEAD is now at eca39ce modify

D:\work_code\demo\vue3_test>git reflog
eca39ce (HEAD -> master) HEAD@{0}: reset: moving to eca39ce
36d5ec0 HEAD@{1}: reset: moving to 36d5ec0
eca39ce (HEAD -> master) HEAD@{2}: commit: modify
36d5ec0 HEAD@{3}: commit (initial): init

D:\work_code\demo\vue3_test>git log
commit eca39ce053d6a6c7650c10c6ab80d174cbbe3fcd (HEAD -> master)
Author: Author: Ranan <ranan>
Date:   Fri Aug 25 19:20:25 2023 +0800

    modify

commit 36d5ec0bfa96ba0beb59e765de03024f383c9ae9
Author: Author: Ranan <ranan>
Date:   Fri Aug 25 18:44:37 2023 +0800

    init

git reset HEAD

命令:git reset HEAD <file>
说明: 拉取最近一次提交到版本库的文件到暂存区,不影响工作区

从版本库中 拉取file到 暂存区。当我们把工作区的某个文件弄乱了 ,就可以使用该命令把版本库中的同名文件拉到暂存区,然后在拉回工作区。

这里HEAD是版本指针,也可以是其他版本地址的哈希值。

// 1.工作区修改age为15 add src/App.vue 文件进暂存区
D:\work_code\demo\vue3_test>git add -A

在这里插入图片描述

// 2.将仓库区最新版本的该文件拉到暂存区,不影响工作区age还是15
D:\work_code\demo\vue3_test>git reset HEAD src/App.vue
Unstaged changes after reset:
M       src/App.vue

在这里插入图片描述

todo 这里感觉和git rm --cached 文件名删除暂存区的文件很像,之间的差异暂时通过看文章没有感觉出来,等工作中使用积累后更新

git checkout – fileName 丢弃工作区的修改

命令:git checkout -- fileName 放弃指定文件工作区的修改 | git checkout .放弃工作区所有文件的修改
说明:可以理解撤销add的内容(基于上一次add),把该文件在工作区的修改全部撤销(没办法恢复!)

案例说明
1.add之后(比如 one),工作区代码修改(添加two),使用git checkout -- fileName恢复命令,工作区代码从暂存区拉出来(只有one)
2.先add添加后commit提交(比如 one),工作区代码修改(添加two),使用git checkout -- fileName恢复命令,工作区从仓库区恢复(只有one)

关于是从暂存区还是仓库区拉取,这里有争议。我暂时的理解是先走暂存区,暂存区没有再走仓库区。

使用说明
-- 选项的作用是表明内容是目录或文件,而不是分支名,避免有文件名和分支名一样而出错的情况,因为 git checkout 后面直接加分支名就成了切换分支了,在保证不会混淆的情况下,可以直接使用git checkout <file>

git revert

命令:git revert -n 版本号
本质:git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。
举例:commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert -n 版本二的版本号 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。
说明: 生成一个新的提交来覆盖旧的提交,被撤销的提交 和新的提交记录都会保存
在这里插入图片描述

Git恢复之前版本的两种方法reset、revert
命令原理适用场景
git reset修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本恢复到之前某个提交的版本,且该版本之后提交的版本都不需要了
gir revert用于“反做”某一个版本,以达到撤销该版本的修改的目的。想撤销之前的某一版本,又想保留该目标版本后面的版本,记录下这整个版本变动流程

git 撤销merge | git revert

git revert取消指定的某次提交内容时需要考虑两种commit

  • 常规的commit git commit提交,只有一个parent commit
  • merger commit git merge合并两个分支后,会得到一个新的merge commit,有两个parent commit

使用git show查看merge commit

git show bd86846
commit bd868465569400a6b9408050643e5949e8f2b8f5
Merge: ba25a9d 1c7036f
#  merge commit bd86846是从 ba25a9d 和 1c7036f 两个 commit 合并过来的。

命令:git revert -m 选项 需要撤销的merge哈希值
-m 选项接收的参数是一个数字,数字取值为 1 和 2,也就是 Merge 行里面列出来的第一个还是第二个。

经典的案例:https://www.cnblogs.com/bescheiden/articles/10563651.html

总结

1.在工作区的代码

git checkout -- 文件名 #丢弃某个文件的修改
git checkout . #丢弃全部

丢弃全部包括:新增的文件会删除,删除的会恢复,修改的会回去。变化的地方是基于上一次add或commit。

2.代码add到暂存区,没有commit提交

git reset HEAD <file> #从最近的版本将该文件拉取到暂存区
git reset HEAD .

仅改变暂存区,不改变工作区。

分支管理

程序员将自己的工作从开发主线上分离开来,开发自己的分支不会影响主线分支的运行。

优势

  • 同时并行推进多个功能开发,提高开发效率
  • 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可

git branch 查看当前工作在哪个分支
HEAD指针指向当前工作的本地分支,可以理解为当前分支的别名。

分支说明

  • 分支切换会改变你工作目录中的文件
    在切换分支时,一定要注意工作目录里的文件会被改变。 如果是切换到一个较旧的分支,你的工作目录会恢复到该分支最后一次提交时的样子。 如果Git不能干净利落地完成这个任务,它将禁止切换分支。
  • 如果不指定从哪个分支(源分支)上创建的新分支(目的分支),默认是从master分支上创建。目的分支创建时会继承此时源分支的所有提交。

常见分支指令

命令名称作用
git branch 分支名在当前所在的提交对象上创建一个指针,指针名为分支名。
git branch -v查看分支
git checkout 分支名切换分支,修改HEAD指针的指向
git checkout -b 分支名以当前分支为基准,创建并切换到指定分支
等于git branch 分支名 + git checkout 分支名
git merge 分支名把指定的分支合并到当前分支上
git branch -D 分支名删除本地分支,需要在其他分支上进行
git push origin -D [branchName]删除远端分支

比如创建一个dev分支
在这里插入图片描述

分支管理规范

参考文章:https://juejin.cn/post/6844903945245048846

  • 开发人员在 develop 分支上实现新功能
  • feature 分支
    • 开发一个独立的新特性(完成时,需合并到 develop 分支)
    • 技术研究与尝试(若失败,可随时删除 feature 分支)
    • 提前实现下一个版本需要开发的特性(可不在本次迭代中发布)

分支合并

合并分支时,如果没有冲突,并且分支是单向一条线路继承下来的,git会使用fast forword模式,但是有些快速合并不能成功,又没有冲突时,就会触发分支管理策略,git会自动做一次新的提交

  • git merge [branchName] --squash 将branchName合并到当前分支,并将branchName上的所有提交合并成一次提交

git rebase

参考文章:https://blog.csdn.net/weixin_42310154/article/details/119004977

结论摘要:不推荐使用
拉公共分支最新代码——rebase,也就是git pull -rgit pull --rebase
好处是提交记录会比较简洁。
缺点是rebase以后不知道当前分支最早是从哪个分支拉出来的了,因为基底变了。

git stash 临时存储当前的工作现场

使用场景
正在修改A分支的某个功能时,优先级更高的任务出现了,但是该任务在B分支。
①提交后切换,代码保存在A分支,但是产生了无意义的提交。

在分支A上做的修改如果没有add或者commit,切换分支之后修改会被携带。

git stash 将当前修改(未提交的代码)存入暂存区,切换分支B修改完成后,在git stash pop取出。

git stash暂存后,工作区代码会恢复到最后一次提交时的代码。

常见命令

命令描述
git stash临时存储当前未commit的工作现场
git stash save “message”临时存储当前未commit的工作现场,并添加描述。
在多个stash的时候推荐
git stash show查看刚才暂存的修改
git stash show -p stashname显示指定的贮藏文件具体改动
git stash pop切换到临时存储现场的分支后,弹出栈顶的stash
git stash apply stash@{X}换到临时存储现场的分支后,取出相应的暂存。X可使用命令git stash list查看,省略stash@{X}表示最近一次。
git stash drop stash@{X}将记录表中取出的对应暂存记录删除。X可使用命令git stash list查看,省略stash@{X}表示最近一次。
git stash list查看存储区的所有暂存修改记录

使用步骤

  1. 切换分支B前保存现场,git stashgit stash save "message"
  2. 修改完后,切换分支A再恢复现场,git stash popgit stash apply stash@{X}恢复现场

存储位置说明

  • .git/refs/stash 中,存储的是最后一个 stash 对应的节点指针
  • .git/log/refs/stash 中,可以看到全部的 stash 记录信息

说明
git stash 只能将修改项藏匿,并能将新增项藏匿。
解决办法:
①先 git add,在 git stash,成功藏匿了新增和修改。
git stash -u

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

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

相关文章

海格里斯HEGERLS高密度料箱式四向穿梭车存储系统有哪些显著优势?

近些年仓储货架向着自动化、智能化发展&#xff0c;因此市面上出现很多不同类型的智能自动化仓储货架。其中&#xff0c;最受企业青睐的便是四向穿梭车货架。四向穿梭车货架根据其载重不同可分为托盘式和料箱式两大类。这两种不同类型的四向穿梭车货架在结构形式和控制方式上基…

Ubuntu20.04下安装google输入法

Ubuntu20.04下安装google输入法 1、添加中文语言支持 打开 系统设置——区域和语言——管理已安装的语言——在“语言”tab下——点击“添加或删除语言” 弹出“已安装语言”窗口&#xff0c;勾选中文&#xff08;简体&#xff09;&#xff0c;点击应用 回到“语言支持”窗…

日本橙皮书数据库—《医疗用医药品质量情报集》

日本橙皮书是一份关于医疗用医药品质量情报的汇总报告&#xff0c;由日本厚生劳动省发布。它主要涵盖了药品的品质再评价信息&#xff0c;特别是针对特定历史阶段的产品&#xff0c;笔者总结信息如下&#xff1a; ①日本橙皮书数据库包含了一系列药品的详细信息&#xff0c;如…

一句话画出动漫效果

链接&#xff1a; AI Comic Factory - a Hugging Face Space by jbilcke-hfDiscover amazing ML apps made by the communityhttps://huggingface.co/spaces/jbilcke-hf/ai-comic-factory 选择类型&#xff1a; Japanese 输入提示词&#xff1a; beauty and school love st…

视频云存储/安防监控/视频AI智能分析网关V3:消防器材缺失检测功能详解

在我们的日常生活中&#xff0c;消防器材是必不可少的&#xff0c;无论是在学校、园区还是工厂里&#xff0c;都需要摆放消防器材&#xff0c;做好防范措施&#xff0c;降低安全隐患。但有时也需防备消防器材被人为挪动甚至破坏&#xff0c;在危急时刻无法发挥作用。TSINGSEE青…

【kubernetes】Argo Rollouts -- k8s下的自动化蓝绿部署

蓝绿(Blue-Green)部署简介 在现代软件开发和交付中,确保应用程序的平稳更新和发布对于用户体验和业务连续性至关重要。蓝绿部署是一种备受推崇的部署策略,它允许开发团队在不影响用户的情况下,将新版本的应用程序引入生产环境。 蓝绿部署的核心思想在于维护两个独立的环…

lv3 嵌入式开发-1linux介绍及环境配置

目录 1 UNIX、Linux和GNU简介 2 环境介绍 3 VMwareTools配置 4 vim配置&#xff1a; 1 UNIX、Linux和GNU简介 什么是UNIX? unix是一个强大的多用户、多任务操作系统&#xff0c;支持多种处理器架构 中文名 尤尼斯 外文名 UNIX 本质 操作系统 类型 分时操作系统 开…

数据结构入门 — 栈

本文属于数据结构专栏文章&#xff0c;适合数据结构入门者学习&#xff0c;涵盖数据结构基础的知识和内容体系&#xff0c;文章在介绍数据结构时会配合上动图演示&#xff0c;方便初学者在学习数据结构时理解和学习&#xff0c;了解数据结构系列专栏点击下方链接。 博客主页&am…

一百七十、Linux——Crontab定时任务调度Kettle脚本

一、目的 由于用海豚调度器调度从Kafka到HDFS的kettle任务时发现有点问题&#xff0c;如果不设置定时调度&#xff0c;这个kettle任务会一直跑&#xff0c;而如果设置定时调度&#xff0c;隔天后就会生成多个任务&#xff0c;而且每个任务都在跑&#xff0c;不会停下&#xff…

stable diffusion实践操作-提示词

本文专门开一节写提示词相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 正文 提示词是SD中非常重要&#xff0c;你生成的图片质量&#xff0c;基本就取决于提示词的好坏&#xff0c;提示词分为正向提示词和反向提示词。 模板…

激光切割机自动调焦技术详解加图解

激光切割机在切割不同材料的过程中&#xff0c;激光束的焦点必须根据要求位于材料的不同位置。 因此&#xff0c;在切割不同材料的物料时&#xff0c;需要调整激光切割机的焦点位置。在以前的生产激光切割机中&#xff0c;普遍采用手动调焦的方法进行调焦。现在&#xff0c;许多…

【Docker】用Dockerfile制作个人的镜像文件

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

stable diffusion实践操作-常见lora模型介绍

本文专门开一节写Lora相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 模型分两种&#xff0c;一种是sd大模型&#xff0c;一种是类似Lora的小模型 国内的是&#xff1a;https://www.liblibai.com 国外的是&#xff1a;https:/…

企业数字化建设-采购平台规划方案PPT(附数字化建设方案300份)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除&#xff0c;更多浏览公众号&#xff1a;智慧方案文库 46页《智慧书店数字化转型解决方案》.pdf8页德勒数字化智能制造解决方案.pdf24页数字化智能化车间规模与建设.pdf数字化校…

【C++】C++11新特性(下)

上篇文章&#xff08;C11的新特性&#xff08;上&#xff09;&#xff09;我们讲述了C11中的部分重要特性。本篇接着上篇文章进行讲解。本篇文章主要进行讲解&#xff1a;完美转发、新类的功能、可变参数模板、lambda 表达式、包装器。希望本篇文章会对你有所帮助。 文章目录 一…

【整数列表求三的倍数】

问题描述: 给定一个从1到n的整数列表&#xff0c;从第一个数字开始计数&#xff0c;遇到3的倍数时&#xff0c;将该数从列表中删除&#xff0c;直至列表末尾。 在剩下的数字中&#xff0c;从第一个数字开始&#xff0c;继续之前的计数值&#xff0c;同样遇到3的倍数时&#xff…

插值法修正排斥能

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由5张二值化的图片组成&#xff0c;让A中有3个点&#xff0c;B全为0&#xff0c;排列组合A&#xff0c;统计迭代次数并排序。 其中的7组数据 差值结构 迭代次数 构造平均列 L E 0 1…

Jmeter的自动化测试实施方案

前言&#xff1a; Jmeter是目前最流行的一种测试工具&#xff0c;基于此工具我们搭建了一整套的自动化方案&#xff0c;包括了脚本添加配置、本地配置和运行、服务器配置等内容&#xff0c;完成了自动化测试闭环&#xff0c;通过这种快捷简便高效的方式&#xff0c;希望可以解…

【云原生之Docker实战】使用Docker部署flatnotes笔记工具

【云原生之Docker实战】使用Docker部署flatnotes笔记工具 一、flatnotes介绍1.1 flatnotes简介1.2 flatnotes特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载flatnotes…