笔记:Git学习之应用场景和使用经验

news2024/11/23 7:34:58

目标:整理Git工具的应用场景和使用经验

一、开发环境

Git是代码版本控制工具;Github是代码托管平台。

工具组合:VSCode + Git

需要安装的软件:vscode、Git

其中vscode需要安装的插件:GitLens、Git History

二、应用场景

工作场景:嵌入式开发,本地使用

三、使用总结

基础操作,参考廖雪峰的Git教程

Git教程 - 廖雪峰的官方网站

Git 基本工作流程

3.1 版本管理
3.1.1 更改提交

git commit

使用 git commit 将当前工作目录的更改保存到本地代码库。

每次提交(commit)都会创建一个新的提交对象,

避免将无关或不相关的修改混合在一起提交。

3.1.2 版本回退

两种方式:reset、revert

git reset

通过改变HEAD和分支指针指向的方式,进行版本回退,

该操作之后的提交记录不会被保留,并且不会创建新的提交;

git revert

通过创建一个新提交的方式来撤销某次操作,该操作之前和之后的提交记录都会被保留,

并且会将该撤销操作作为最新的提交;

在个人开发上,建议使用reset;但在团队开发中建议使用revert,

特别是公共的分支(比如master),这样能够完整保留提交历史,方便回溯。

3.2 分支管理

一个分支代表一条独立的开发线,使用分支可以从开发主线上分离开来,

不影响主线的同时继续工作。

注:未被放入代码库的文件会在分支切换时被抛弃,造成严重后果。

3.2.1 分支切换

git switch

使用git switch <branch_name> 来切换到指定的分支。

3.2.2 分支合并

两种方式:merge、rebase

相同点:都是从一个分支合并到当前分支。

注意:无论选择哪种方式,都应该谨慎处理可能产生的冲突,

并确保在操作前备份代码或创建临时分支以防意外。

git merge

自动创建一个新的commit,如果遇到冲突,仅需要修改后重新commit。

方式:git merge会将目标分支的提交历史合并到当前分支,形成一个新的合并提交。

这种方式被称为"合并提交"或"三方合并",因为它保留了每个分支的独立提交历史。

结果:合并后的提交历史会包含源分支和目标分支的所有共同提交以及合并提交。

场景:适用于合并公共分支、团队开发时的代码集成,或者希望保留分支独立性的情况。

合并稳定的公共分支,如主分支或发布分支。多人协作开发时,将各自的特性分支合并到开发分支。

git rebase

找公共的节点,直接合并之前commit历史,得到简洁的分支发展历史,去掉了merge commit。

方式:git rebase会将当前分支的提交"移动"到目标分支的最新提交之后,

然后将目标分支的提交历史应用到当前分支。这种方式被称为"变基",因为它改变了提交的基点。

结果:合并后的提交历史是线性的,没有合并提交,看起来更加整洁。

但是原始分支的提交历史会被修改,可能会导致冲突。

场景:适用于想要保持线性提交历史、清晰的提交记录,并希望将自己的提交"放到"目标分支上进行整合的情况。

最好不要在公共分支上使用rebase,如果前后基本上不会有别人改动你的分支,那么推荐rebase。

总结来说,在单人本地多分支开发中,使用变基操作来修复bug并更新所有分支是可行的,

可以确保所有分支都包含了最新的修复,并保持提交历史的线性和清晰。

但是仍然建议在执行变基操作之前,仔细考虑其可能带来的影响,并确保备份了代码。

3.3 标签管理

标签也是版本库的一个快照。

发布版本时,通常在版本库中打个标签(tag),则唯一确定打标签时刻的版本。

切换到某个标签,则相当于把打标签时刻的历史版本取出。

注意:标签总是和某commit挂钩。若该commit既出现在master分支,

又出现在dev分支,则在这两个分支上都可看到此标签。

3.3.1 标签切换

使用git checkout <tagname>可将git仓库的HEAD指针指向标签所在的提交,

如:git checkout v1.0

3.4 开发管理

涉及到多人协作,如果没有清晰的流程和规划,每个人都提交一堆杂乱无章的 commit,

项目很快就会变得难以协调和维护。Git 版本管理同样需要一个清晰的流程和规范。

3.4.1 Git flow

Git flow的优点是清晰可控,缺点是相对复杂,需要同时维护两个长期分支。

该模式是基于"版本发布"的,目标是一段时间以后产出一个新版本。

长期分支:主分支master、开发分支develop。

前者用于存放对外发布的版本,任何时候在这个分支拿到的,都是稳定的分布版;

后者用于日常开发,存放最新的开发版。

短期分支:功能分支(feature branch)、补丁分支(hotfix branch)、发布分支(release branch)。

3.4.2 Github flow

Github flow 是Git flow的简化版,专门配合"持续发布"。

3.4.3 Gitlab flow

Gitlab flow 是 Git flow 与 Github flow 的综合。

它吸取两者的优点,既有适应不同开发环境的弹性,又有单一主分支的简单和便利。

四、经验总结
4.1 文件未修改,但出现在工作区

修改文件权限可修复该异常。

项目修改:git config core.filemode false
全局修改:git config --global core.filemode false

如果在Linux和windows之间传递代码,可能出现该异常。

修改换行符转换设置,可修复该异常。

git config --global core.autocrlf false
git config --global core.filemode false
git config --global core.safecrlf true

4.2 如何使.gitignore中新增设置对之前的文件生效
$ git rm -r --cached .                #清除缓存 -r 表示递归删除(如果有文件夹的话) . 表示所有文件
$ git add .                           #重新trace file
$ git commit -m "update .gitignore"   #提交和注释

$ git status --ignored                #查看状态,包括忽略的文件
4.3 导出历史提交记录

git log --pretty=format:"%ai , %an: %s" >> ./commit.log

在项目根目录下执行命令,导出 git 提交记录到桌面

git log --pretty=format:"%ai , %an: %s" --since="100 day ago" >> ./commit.log
如果想导出某些提交者的提交记录,可以用grep过滤,比如我想导出zen这个人在项目中的提交记录:

git log --pretty=format:"%ai , %an: %s" --since="126 day ago" | grep "zen" >> ./commit.log
当然也可以导出成 Excel 文件

git log --date=iso --pretty=format:'"%h","%an","%ad","%s"' >> ./commit.log

%ai: 表示提交的时间,格式为 ISO 8601 标准的时间(例如 2024-04-16 14:30:00)。
%an: 表示提交者的名字。
%s: 表示提交时填写的概要或简短描述。
选项说明

-p

按补丁格式显示每个提交引入的差异。

--stat

显示每次提交的文件修改统计信息。

--shortstat

只显示 --stat 中最后的行数修改添加移除统计。

--name-only

仅在提交信息后显示已修改的文件清单。

--name-status

显示新增、修改、删除的文件清单。

--abbrev-commit

仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。

--relative-date

使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。

--graph

在日志旁以 ASCII 图形显示分支与合并历史。

--pretty

使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。

--oneline

--pretty=oneline --abbrev-commit 合用的简写。

选项说明

%H

提交的完整哈希值

%h

提交的简写哈希值

%T

树的完整哈希值

%t

树的简写哈希值

%P

父提交的完整哈希值

%p

父提交的简写哈希值

%an

作者名字

%ae

作者的电子邮件地址

%ad

作者修订日期(可以用 --date=选项 来定制格式)

%ar

作者修订日期,按多久以前的方式显示

%cn

提交者的名字

%ce

提交者的电子邮件地址

%cd

提交日期

%cr

提交日期(距今多长时间)

%s

提交说明

%ai表示提交的时间,格式为 ISO 8601 标准的时间

资料整理自网络

Git 历史提交日志导出到文件中 | 张益铭的博客 (zhangyiming748.github.io)

Git - 查看提交历史 (git-scm.com)

git日志导出命令 - xh_Blog - 博客园 (cnblogs.com)

Git 教程|极客教程 (geek-docs.com)

Git 历史提交日志导出到文件中_eclipse导出git提交记录-CSDN博客

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

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

相关文章

【NLP学习笔记】load_dataset加载数据

除了常见的load_dataset(<hf上的dataset名>)这种方式加载HF上的所有数据外&#xff0c;还有其他custom的选项。 加载HF上部分数据 from datasets import load_dataset c4_subset load_dataset("allenai/c4", data_files"en/c4-train.0000*-of-01024.js…

PowerBi 获取指定时间间隔的日期的方法

获取指定时间间隔的日期&#xff0c;比如我们想得到2024年5月31日后的第三天。 网络上的教程一般是使用DATEADD()函数。 但是这个函数返回的是表。假如我们的需求是不做汇总等计算&#xff0c;只是把它作为一个计算列&#xff0c;或者度量值&#xff0c;那么我更推荐用DATE(&…

webstorm 高效查看不同分支差异 摒弃你的git diff手动操作

背景 每次代码冲突或者版本发生异常时&#xff0c;排查不同版本时就是一个头大的问题&#xff0c;头大的点在于用 vscode 的 git diff 一点点地排查和比较&#xff0c;耗时耗力&#xff0c;版面展不开&#xff0c;commit 差异看不出来&#xff0c;每个页面的代码不同也不能快速…

【Java08】方法(上)

从面向对象的角度来看&#xff0c;Java中的方法是类或对象行为的抽象。但和C不同&#xff0c;Java中”剔除“了C中”残留“的结构化编程。具体地说&#xff0c;Java中的方法必须在类中定义&#xff0c;没有独立存在的函数。 也有人把结构化编程&#xff0c;叫做”面向函数的编程…

Linux基础指令介绍与详解——原理学习

前言&#xff1a;本节内容标题虽然为指令&#xff0c;但是并不只是讲指令&#xff0c; 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法&#xff0c; 很抱歉&#xff0c; 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的&#xff0c;…

基于FPGA的DDS信号发生器

前言 此处仅为基于Vivado实现DDS信号发生器的仿真实现&#xff0c;Vivado的安装请看下面的文章&#xff0c;这里我只是安装了一个标准版本&#xff0c;只要能够仿真波形即可。 FPGA开发Vivado安装教程_vivado安装 csdn-CSDN博客 DDS原理 DDS技术是一种通过数字计算生成波形…

Linux shell编程学习笔记61: pstree 命令——显示进程树

0 前言 在 Linux shell编程学习笔记59&#xff1a; ps 获取系统进程信息&#xff0c;类似于Windows系统中的tasklist 命令https://blog.csdn.net/Purpleendurer/article/details/139696466?spm1001.2014.3001.5501 中我们研究了ps命令。在Linux中&#xff0c;通过ps命令&am…

William Yang:从区块链先锋到艺术平台创始人

在区块链技术和加密货币市场飞速发展的今天&#xff0c;William Yang无疑是这一领域的佼佼者。他不仅在学术和媒体领域取得了显著成就&#xff0c;更在创业之路上不断探索&#xff0c;成为了业内知名的KOL&#xff08;关键意见领袖&#xff09;。今天&#xff0c;我们有幸采访到…

排序算法系列一:选择排序、插入排序 与 希尔排序

目录 零、说在前面 一、理论部分 1.1&#xff1a;选择排序 1.1.1&#xff1a;算法解读&#xff1a; 1.1.2&#xff1a;时间复杂度 1.1.3&#xff1a;优缺点&#xff1a; 1.1.4&#xff1a;代码&#xff1a; 1.2&#xff1a;插入排序 1.2.1&#xff1a;算法解读&#x…

mysql-sql-第十五周

学习目标&#xff1a; sql 学习内容&#xff1a; 41.查询没有学全所有课程的同学的信息 select *from students where students.stunm not in (select score.stunm from score group by score.stunm having count(score.counm) (select count(counm) from course)) 42.查询…

【C++/STL深度剖析】stack和queue的详细概念和使用(图文详解,初学者必看!!)

目录 一、前言 二、stack 的详细解析 &#x1f525; stack的介绍&#x1f525; &#x1f525; stack的构造&#x1f525; &#x1f525; stack的常用接口&#x1f525; &#x1f4a7;push &#x1f4a7;top &#x1f4a7;pop &#x1f4a7;empty &#x1f4a7;size…

违规停放智能监测摄像机

对于现代城市管理来说&#xff0c;违规停放智能监测摄像机正逐渐成为解决交通拥堵和城市管理难题的重要工具。这类摄像机通过先进的视觉识别和数据分析技术&#xff0c;有效监控和管理道路上的车辆停放行为&#xff0c;对提升城市交通运行效率和改善市民出行环境具有显著的意义…

pytorch-ResNet18简单复现

目录 1. ResNet block2. ResNet18网络结构3. 完整代码3.1 网络代码3.2 训练代码 1. ResNet block ResNet block有两个convolution和一个short cut层&#xff0c;如下图&#xff1a; 代码&#xff1a; class ResBlk(nn.Module):def __init__(self, ch_in, ch_out, stride):su…

锻炼 读书笔记 番外 身体激素及神经递质

最近在读《锻炼》的时候&#xff0c;对于各种激素很感兴趣&#xff0c;多巴胺、内啡肽、荷尔蒙、肾上腺素、褪黑素、皮质醇、糖化、氧化等等。索性认真梳理下它们是什么&#xff0c;思考当处于心流状态时&#xff0c;人体发生什么样的变化&#xff0c;分泌什么激素&#xff1f;…

Milvus ConnectionRefusedError: how to connect locally

题意&#xff1a;怎样在本地连接到 Milvus 数据库。连接 Milvus 数据库被拒绝的错误 问题背景&#xff1a; I am trying to run a RAG pipeline using haystack & Milvus. 我正在尝试使用 haystack 和 Milvus 运行一个 RAG&#xff08;检索增强型生成&#xff09;管道。 …

10 - Python文件编程和异常

文件和异常 在实际开发中&#xff0c;常常需要对程序中的数据进行持久化操作&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词&#xff0c;可能需要先科普一下关于文件系统的知识&#xff0c;对于这个概念&#xff0c;维基百科上给出…

重温被Mamba带火的SSM:HiPPO的一些遗留问题

©PaperWeekly 原创 作者 | 苏剑林 单位 | 科学空间 研究方向 | NLP、神经网络 书接上文&#xff0c;在上一篇文章《重温被Mamba带火的SSM&#xff1a;线性系统和HiPPO矩阵》中&#xff0c;我们详细讨论了 HiPPO 逼近框架其 HiPPO 矩阵的推导&#xff0c;其原理是通过正交…

MySQL的Geometry数据处理之WKB方案

MySQL的Geometry数据处理之WKT方案&#xff1a;https://blog.csdn.net/qq_42402854/article/details/140134357 MySQL的Geometry数据处理之WKT方案中&#xff0c;介绍WTK方案的优点&#xff0c;也感受到它的繁琐和缺陷。比如&#xff1a; 需要借助 ST_GeomFromText和 ST_AsTex…

Gradio 教程四:Building Generative AI Applications with Gradio

文章目录 一、使用interface构建NLP应用1.1 构建文本摘要应用1.1.1 设置API密钥1.1.2 调用文本摘要API1.1.3 运行本地模型获取响应1.1.4 使用interface构建应用 1.2 构建命名实体识别应用1.2.1 调用NER任务API1.2.2 使用interface构建应用1.2.3 加入额外函数&#xff0c;合并to…

C语言实战 | 用户管理系统

近期推出的青少年防沉迷系统&#xff0c;采用统一运行模式和功能标准。在“青少年模式”下&#xff0c;未成年人的上网时段、时长、功能和浏览内容等方面都有明确的规范。防沉迷系统为青少年打开可控的网络空间。 01、综合案例 防沉迷系统的基础是需要一个用户管理系统管理用户…