Git基础篇(六)——Git版本回退
Git基础篇(六)——Git版本回退前言: 人无完人,没有人能确保每次的修改都是完美的,即使提交是完美的需求也可能突然改变。版本回退是Git中重要且常用的操作之一。
1 Git版本回退 说到版本回退首先要知道Git是如何标识不同版本的。Git会为每次提交上去的版本记录快照并生成一串十六进制编号(Hash值),以这串编号作为当前版本的独一无二标识,按照时间线多次的提交就连成条”线“也即提交记录,每一条”线“就是一个分支,还存在一个HEAD指针指向其中一个版本也即其记录了某个版本的十六进制编号。原理就像数据结构中链表和节点指针的关系。
123commit 6574ac2446b82c86f2af107783b405032784303aAuthor: onlycalm <741089410@qq.com>Date: Fri Feb 12 00:05:22 2021 +0800
回退的目的是在旧版本基础上修改并重新提交,这个过程可以分为两步,第一步是版本回退到旧版本也即版本提交的回退,第二步是将旧的版本记录 ...
Git基础篇(四)——Git创建版本库
Git基础篇(四)——Git创建版本库前言: Git并不是对任意目录都能进行管理,首先管理的目录必须是Git创建的版本库,那么如何将项目目录创建为Git版本库进行管理呢?
1 创建Git版本库 在工程的根目录(可以是空目录)下执行“Git Bash”命令,或对工程根目录文件夹右键鼠标菜单中点击“Git Bash Here”弹出命令行窗口执行以下命令:
1.1 git init1git init
该命令会在根目录下自动创建文件夹”.git“(该目录默认是隐藏的),意味着Git把这个目录变为了Git可以管理的仓库了,”.git“目录中记录了Git对于该项目的所有版本管理记录,所以千万不要随意去修改它,你只需运行指令让Git自动管理这个目录。 另外,值得一提的是,Git擅长的是文字文本的版本管理,如果涉及图片、视频、pdf、硬件原理图等更复杂的文件,Git对齐的版本管理效果很差。
Git基础篇(二)——Git安装
Git基础篇(二)——Git安装前言: Git最初的版本是在Linux上开发的,因此在很长一段时间里Git只有Linux和Unix版本,目前它已经可以在Linux、Unix、IOS、Windows几大平台上运行。
1 Windows安装Git Git是免费开源的,我们直接在Git官网下载相应的Release版本安装即可。
按照默认,一路点“下一步”就行了。在开始菜单或鼠标右键中就可以看到“Git-Bash”,在其中即可输入Git指令执行。 在Git版本管理系统中,每个操作者都需要标识“身份”,Git中是通过用户名和邮箱地址进行“身份”标识的。在“Git-Bash”中输入以下指令配置自己的用户名和邮箱地址。
12git config --global user.name "Your Name"git config --global user.name "email@example.com"
Git基础篇(一)——认识Git
Git基础篇(一)——认识Git前言: Git是目前最主流的分布式版本管理系统。另外,Git也是开源的,高效的管理系统,从小到大的项目都可以使用Git轻松管理。目前它已经是使用最广泛的版本管理工具了。
1 Git发展史简述 2005年,Linux的缔造者Linus Torvalds用C编写了一个分布式版本控制系统用于对Linux系统源码的管理,自此Git正式登上历史舞台。自此Git迅速流行起来,直到2008年GitHub网站上线,免费为开源项目提供基于Git的存储,自此Git开始逐渐成为主流版本管理系统。
2 Git与其他版本管理系统有什么不同? Git与其他版本管理系统不同,它是分布式的,而CVS和SVN都是集中式版本管理系统。
2.1 集中式版本管理系统 集中式版本管理系统核心是必有一台中央服务器,其余电脑与这台服务器相连接,当需要开发项目时,必须先从服务器上获取相应的版本副本,修改完成后再将自己的副本推送到服务器端进行更新,其他人员则可从服务器端获取你最新的修改。 缺点是 ...
单片机存储分配
单片机存储分配前言: RAM和Flash是单片机重要的数据存储介质,在使用MDK编译时我们也会看到编译结果中会显示’Code、RO-data、RW-data、ZI-data’的使用大小。单片机到底是怎么划分这些存储区域,变量和代码是怎么存储的呢?
1 单片机存储区域的划分 单片机对地址的划分规则(按照地址排序)一般如下:高地址
地址划分区域
含义
命令行及环境参数(高地址)
main函数是可以有参数的,而传入的参数值将被存储在该区域。
STACK(栈)
由编译器决定分配和释放,存放函数的参数变量及局部非静态变量等。
HEAP(堆)
通常由程序员;申请和释放,若忘记释放则在程序结束时释放。
.bss段(未初始化数据段)
通常用来存放程序中未初始化的全局变量和静态变量,也称为.bss段(Block Started by Symbol),属于静态内存分配。
.data段(初始化数据段)
通常用来存放程序中已初始化的全局变量和静态变量,属于静态内存分配。
Code段
对应的存储介质为ROM。存储二进制程序执行源代码的区 ...
Vim基础篇(五)——搜索操作
Vim基础篇(五)——搜索操作前言: 代码编辑少不了搜索功能,而Vim的搜索功能十分强大。
1 *和#查找
[N]*正向查找(向下查找)第N次出现当前光标所处字符串的地方,将光标跳转到此处。
[#]反向查找(向上查找)第N次出现当前光标所处字符串的地方,将光标跳转到此处。
通过指令:noh可以取消搜索字符串的高亮。 查找后被查找的字符串会被高亮,此时可以使用n和N在搜索的字符之间跳转。
[N]n向下跳转到第N个搜索字符的字符串首。
[N]N向上跳转到第N个搜索字符的字符串首。
2 /和?查找1/{pattern}[/]<CR>
1?{pattern}[?]<CR>
向下查找第N次出现“pattern”的地方。N在输入/或?之前输入。
1/{pattern}/{offset}[/]<CR>
1?{patt ...
Vim基础篇(四)——标签页操作
Vim基础篇(四)——标签页操作前言: Window是显示Buffer的控件,而Tab是存放Window的控件。一个Tab内可以放多个Window,一个Vim可以运行多个Tab。掌握Tab的基本操作会使得编辑工作更得心应手。
1 Tab的创建或删除 在Vim启动时将自动为你创建一个Tab。 注意:Window、Tab、Buffer三者直接没有必然的一一对应关系。
1:tabnew {file}
新建Tab页,并且在新的Tab页中打开一个新的Window并且新建一个名为“file”的Buffer。如果未指定“file”,则新建一个无名缓存。
1:tabe[dit] {file}
新建Tab页,并且在新的Tab页中打开一个新的Window显示“file”文件内容,即将该文件内容读入缓存。如果未指定“file”,则打开一个无名缓存。
1:tabc[lose] {N}
关闭编号为N的Tab也,同时该Tab内的所有窗 ...
Vim基础篇(三)——缓存操作
Vim基础篇(三)——缓存操作前言: Buffer是一块内存缓冲区,Vim打开文件实际是把文件的内容读取到缓冲区中,未保存时修改内容实际是修改缓冲区中的内容,保存文件就是把缓存中的内容写入到文件中(文件是存储在硬盘)。对Vim的缓冲区有一定熟悉了解,并掌握一些基础的Buffer操作将会使我们的编辑过程更加随心所欲。
1 Buffer的创建或删除 Vim打开文件实质是将处于硬盘的文件内容读取到内存中,也即只要是打开文件的操作Vim都将为打开的文件创建一个缓存空间。例如vim file1 file2 file3即为同时打开三个文件,相应的创建了三个Buffer。 Buffer与窗口不是一一对应的关系,但Buffer必须借助Window才能显示。
1:w[rite][!] {file}
将当前缓冲区内容写入文件,也就是保存文件,如果设置了readonly则不能写入,如果加上!表示”强制“,即使只读也可强制写入文件。
1:wa[ll][!]
将当前所有窗口已 ...
Vim基础篇(二)——窗口操作
Vim基础篇(二)——窗口操作前言: 为了更高效的浏览内容,Vim的一大优势是方便快捷的支持多窗口操作。Vim的多窗口是动态的,可以在打开时就创建多窗口,也可以在编辑过程中新建或关闭窗口。
1 运行时创建多窗口 通过在命令行中输入指令启动Vim并打开文件,当同时打开多文件时我们可以指定窗口的划分方式。
12vim -o{N} {file}
启动Vim并打开文件file,可以同时指定多个文件,将按指定顺序从上到下打开。将窗口水平分割为n份。如果n大于指定的文件数,多余的窗口也会被打开,但会闲置。如果n小于指定的文件数,那么超出的文件不会在窗口中打开,但会在缓存中打开。n省略时效果等同于n等于文件数。例如:’vim -o5 file1.txt file2.txt’。如果文件不存在则新建。
12vim -O{N} {file}
启动Vim并打开文件file,可以同时指定多个文件,将按指定顺序从左到右打开。将窗口垂直分割 ...
Vim基础篇(一)——光标跳转
Vim基础篇(一)——光标跳转前言: Vim编辑文本之所以高效的一大原因是其灵活的光标跳转功能,无需鼠标参与,因此有必要熟练掌握Vim中的光标跳转。这篇文章将详细介绍Vim几种模式下的光标切换。
1 普通模式(Normal mode)1.1 窗口内移动1.1.1 行间移动
‘n’ + ‘k’光标向上移动n行,n默认为1
‘n’ + ‘j’光标向下移动n行,n默认为1
‘{n}’ + ‘gg’移动到第n行,n省略时移动到第一行的行首
‘{n}’ + ‘G’移动到第n行,n省略时移动到最后一行的行首
‘n’ + ‘%’跳转到n%处
‘n’ + ‘-‘向上移动n行至行首,n默认为1
‘n’ + ‘+’向下移动n行至行首,n默认为1
‘H’移动到屏幕可视有效行的第一行行首
‘M’移动到屏幕可视有效行的中间行行首
‘L’移动到屏幕可视有效行的最后一行行首
‘[‘
行首:一行的第一个非空白字符。行末:一行的最后一个非空白字符。
1.1.2 行内移动
‘n’ + ‘h’光标向左移动n列,n默认为1
‘n’ + ‘l’光标向右移动n列,n默认为1
‘n’ + ‘space ...