- 第一章 简介
- 1.1 版本控制
- 1.1.1 本地版本控制
- 1.1.2 集中式版本控制
- 1.1.3 分布式版本控制
- 1.1 版本控制
- 第二章 基础篇
- 2.1 下载代码
- 2.2 更新代码
- 2.2.1 清空本地未被跟踪内容
- 2.2.2更新代码使之与库上同步
- 2.3 修改
- 2.3.1 Vim
- 2.3.2 Sed
- 2.3.3 Awk
- 2.4 查看状态
- 2.5 保存代码
- 2.6 提交代码
- 第三章 代码拷贝小技巧
- 3.1 快速拷贝项目代码
- 3.1.1 举例
- 3.1.2 法一拷贝隐藏文件
- 3.1.3 法二创建软链接
- 3.1 快速拷贝项目代码
- 第四章 高级篇
- 4.1 引用
- 4.1.1 ^操作符
- 4.1.2 ~操作符
- 4.2移动提交记录
- 4.2.1git cherry-pick
- 4.2.2交互式rebase
- 4.2.3多次rebase
- 4.3撤销commit
- 4.3.1 git reset
- 4.3.2 git reset –hard
- 4.3.3 git reflog
- 4.4 git push 参数
- 4.4.1 -f
- 4.5常用快捷键
- 4.5.1终端快捷键
- 4.5.2vim快捷键
- 4.1 引用
- 参考资料
Git 是免费的开源分布式版本控制系统。现在大部分的开发团队都以 Git 作为自己的版本控制工具,需要对 Git 的使用非常的熟悉。本文档主要涉及一些项目开发中常用的git提交小技巧,给初次接触git和有一定基础的小伙伴提供指导。
第一章 简介
1.1版本控制
版本控制是一种记录文件内容变化,便于查阅管理历史版本的系统。简单来说,就是用于管理多人协同开发项目的技术。
版本控制,有利于解决软件开发过程中引入的诸多问题,如软件代码的一致性、软件内容的冗余、软件过程的事物性、软件开发过程中的并发性、软件源代码的安全性,以及软件的整合等。
1.1.1本地版本控制
本地版本控制 大都是采用某种简单的数据库来记录文件的历次更新差异。本地版本控制用于记录本地文件的更新,把版本信息放在你的自己的电脑里,对每一个版本做一个快照,要使用的时候,从你的计算机上获取即可,适合个人用,无法进行联网协作工作。其中最流行的一种叫做RCS。
1.1.2集中式版本控制
所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改。
在本地,用户只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS。
1.1.3分布式版本控制
分布式管理系统包括github(全球最大的版本管理系统)、gitee(基于gitlab开发的国内免费代码托管中心码云)、gtlab(开源自建代码托管平台)。git是目前世界上最先进的分布式版本控制系统(没有之一)。
分布式管理系统的优势:
1、便于多人协同办公。
2、可以离线状态下在本地提交,联网时再push到远程服务器。所有版本信息仓库全部同步到本地的每个用户,所以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。
3、便于服务器损坏或网络故障时,恢复所有数据,不会造成不能工作的情况。由于每个用户那里保存了所有的版本数据,只要有一个用户的设备没问题就可以恢复所有的数据。
分布式管理系统的劣势:
1、安全性隐患。每个用户都可以在本地保存所有数据,容易造成一些安全隐患。
2、本地存储空间增加。同样,由于每个用户都可以在本地保存所有的数据,这会造成本地存储空间的占用增加。
第二章 基础篇
2.1下载代码
从远处仓库将代码拷到本地git clone ssh://git@gitlab.sh.gj.com:10022/gwsw/S204.git [–depth=版本数],–depth用于控制复制的版本数,从而减少本地占用内存空间。不设置,默认复制所有版本。
2.2更新代码
2.2.1清空本地未被跟踪内容
git clean -dxf
git checkout – ./
2.2.2更新代码使之与库上同步
git pull
2.3修改
项目代码拉到本地,我们就可以在本地愉快地完成开发任务或debug了。
下面是几个常用的文本编辑工具。
2.3.1Vim
功能强大,自行学习
2.3.2Sed
情况一:出临时版本、正式版本都需要修改版本号,你当然可以选择通过vim一个文件一个文件地打开,再手动修改版本号,或者通过:%s/1.0.5/1.0.6/g将版本号从1.0.5修改为1.0.6。那如果每次出版本都需要修改5个,6个甚至10个文件,那是不是也需要每个文件一次打开,并手动修改呢?大可不必!
其实只需要一条指令就可以了(同时修改多个文件,只需在指令后接着加文件名即可),即
sed -i “s/1.0.5/1.0.6/g” 文件名(如app/product/gro100_i520xv2/fs/show_version)。
至此,版本号已从V1.0.5更新到V1.0.6。
Sed是Stream Editor(流编辑器)的缩写,简称流编辑器;用来处理文件的文本编辑工具。在不打开文件的情况下,即可对文件进行增、删、改、查操作。
情况二:软件送样给指定客户时,如客户不希望软件中出现关于ADTRAN的相关信息,需要改为TW。此时,如果你动了手动修改文件的念头,那将会是一个很庞大的工程。其实通过linux指令可以轻松解决。
grep -rl SF_CUSTOMER_ADTRAN | xargs sed -i ‘s/SF_CUSTOMER_ADTRAN/SF_CUSTOMER_TW/g’
可以将项目中出现的所有SF_CUSTOMER_ADTRAN,批量改为SF_CUSTOMER_TW。
grep参数:
-r:递归搜索
-l:将文件名返回给sed用
Xargs:
将返回值分段处理再传给sed
本部分只能带初学者入门,sed是一个优秀的文本编辑器,想熟练使用sed,还需靠各位平时多学多练。
2.3.3Awk
awk可以说是比较小巧的语言,他有自己的命令语法,功能强且使用复杂。
2.4查看状态
git status
git diff
2.5保存代码
git add . //add所有文件
git add 文件1路径 文件2路径 //add文件1、文件2
git commit //将已add后的代码删除一个本地版本,可以在git log中查看到历史记录
2.6提交代码
git push origin 本地分支名:远程分支名
从下载代码,到提交代码的具体细节,彭少华在《如何使用gitlab完成任务》中已经写得很清楚了,大家自行参考。这不是本文的重点,本文不再赘述。
第三章 代码拷贝小技巧
3.1快速拷贝项目代码
从204平台复制代码,大概需要一个小时。如果想本地建三个目录,分别保存三个项目的代码,那是不是就需要下载三次也就是三个小时呢?大可不必!其实只需要将拷贝下来的文件包括项目文件,.git和.gitignore隐藏文件一并拷贝一份,就可以切分支使用了。此过程只需要一到两分钟。
3.1.1举例
当前我们已经有了一份I520x的代码,本地想再放一份9607C的代码。
3.1.2法一拷贝隐藏文件
步骤1)可以使用指令[_ mayinrong ~/S204_I520x 12:46 82]$cp -r . ~/S204_9607C/,将I520x的项目代码拷贝到S204_9607C目录下
步骤2)用cp -r .git ~/S204_9607C/,cp -r .gitignore /S204_9607C/,将隐藏文件.git和.gitignore一并拷贝过去。至此,在/S204_9607C/目录下就可以用git branch切到9607C的分支了。
该方法只需要一到两分钟,效果等同于从远处仓库拷贝一份项目代码至本地目录~/S204_9607C/(需要一小时)。
分析:
为何该方法可行?其实我们需要先了解一下.git和.gitignore这两个隐藏文件。所有git相关的历史版本信息,远处仓库信息,本地分支,暂存区改动等等都包含着这两个文件中。故只需将其随项目代码一并拷贝一份,即可。
3.1.3法二创建软链接
由以上分析,最关键的是将.git和.gitignore复制过来即可,若您手抖误将.git删除,那不好意思,如果本地仓库被删除,那么本地所有提交(包括已保存和为保存的提交)都将消失不见。
解决:
其实可以将.git移动到一个安全的目录下,再在项目文件夹下创建软链接,链接到该,git文件即可。Linux指令ln -s .git路径 ~/S204_9607C/.git。
备注:
软链接 :相当于快捷方式,inode不同
硬链接:相当于文件别名,跟被链接文件是同一个文件,inode相同
复制: 产生一个全新的文件
ls -i 用来查看 inode号,所有文件都可以通过inode找到。
第四章 高级篇
4.1引用
在实际应用时,您不得不用 git log 来查查看提交记录的哈希值,再通过指定提交记录哈希值的方式在 Git 中移动,这操作起来不太方便。哈希值比较长,基于 SHA-1,共 40 位。例如7049b7c7dbb39a304acc434762ccfcad6959aba1。舌头都快打结了吧…
令人欣慰的是,Git 对哈希的处理很智能。您只需要提供能够唯一标识提交记录的前几个字符即可,并不需要提供完整的commit id。例如,输入git reset 7049,就可以切到commit id为7049b7c7dbb39a304acc434762ccfcad6959aba1的历史提交。
那除了通过哈希值指定提交记录,有没有什么更方便的方法了呢?肯定有!这边我们就要介绍一下相对引用。这个就很厉害了!
相对引用非常给力,这里我介绍两个简单的用法:
使用 ^ 操作符向上移动 1 个提交记录。
使用 ~ 操作符向上移动num个提交记录,如 ~3。
4.1.1 ^操作符
首先看看操作符 (^)。把这个符号加在引用名称的后面,表示让 Git 寻找指定提交记录的父提交。
main^ 相当于main分支的父节点。
main^^ 相当于main分支的第二个父节点。
通过git checkout projects/Realtek_RTL9601D/adtran_gpon_20210623^,就可以切换到本地分支projects/Realtek_RTL9601D/adtran_gpon_20210623的父节点。
我们可以一直使用 HEAD^ 向上移动。
4.1.2 ~操作符
在提交树中向上移动很多步,敲多个^也不太方便,基于此,git又引入了操作符~。
~操作符后面可以跟一个数字(可选,不跟数字时与^相同,向上移动一次),指定向上移动多少次。
例如,git checkout Head~4 ,回退四步。
~操作符还有另一个用途,强制修改分支位置。
使用相对引用最多的就是移动分支。可以直接使用 -f 选项让分支指向另一个提交。
例如,git branch -f main HEAD~3,会将 main 分支强制指向 HEAD 的第 3 级父提交。
4.2移动提交记录
4.2.1git cherry-pick
git cherry-pick //拉取指定commit提交
当你知道这些提交记录的哈希值时, 用 cherry-pick 非常方便。
如果不知道你想要拉取的提交记录的哈希值呢?那就得看一下下面的交互式的rebase了。
4.2.2交互式rebase
使用交互式rebase时,会自动打开一个vim文件,便于您根据自己的需求操作。
例如,图8是基于abe8056……保存的三个本地提交V1,V2,V3。现在我需要将V2的提交删除,应该怎么做呢?这就用到了交互式rebase。
执行[_ mayinrong ~/S204_I520x 14:25 173]$git rebase -i HEAD~3后,会自动打开交互式rebase界面。
根据需要将第二行删掉,并保存。
我们再git log(我这边输入的gl,是起的别名,每次都输入给git log,git checkout – ./,git branch 也挺麻烦的,完全可以起个别名,如gl,gch-,gb等,会方便很多)看一下。不错,此时V2的提交已经消失不见了。
4.2.3多次rebase
4.3撤销commit
4.3.1 git reset
举例,本地增加文件1.c,生成版本V1,增加文件2.c,生成版本V2。
V1的commit id是7049b7c7dbb39a304acc434762ccfcad6959aba1,执行git reset 7049b7c7dbb39a304acc434762ccfcad6959aba1之后,本地版本会切回到V1,且在Untracked files中会看到V2的改动2.c。
4.3.2 git reset –hard
若执行git reset –hard 7049b7c7dbb39a304acc434762ccfcad6959aba1,本地版本也会切回到V1,那更git reset有什么区别呢?区别就是,你在Untracked files找不到V2版本的改动了。
所以可以看到网上很多地方说,git reset –hard要谨慎使用。
那这是不是说您必须基于V1版本重新再开发一遍呢?大可不必!请看下面的指令。
4.3.3 git reflog
执行git reflog之后,你会看到所有的历史提交记录,前面一串黄色的字符串就是该历史记录对应的commit id,
执行git reset 67d6be6e8,即可回退到commit id为67d6be6e8的版本。
4.4 git push 参数
4.4.1 -f
强制将本地分支推送至远程分支。
4.5常用快捷键
4.5.1终端快捷键
Ctr + u:
删除光标处之前的所有内容
Ctr + k:
删除光标处之后的所有内容
Ctr + l:
清屏
4.5.2vim快捷键
gg:移动到文件头部位置
G:移动到文件末尾
num + →:移动到第num行
yy:复制当前行
p:粘贴
dd:删除本行
Git官网:Git - Book (git-scm.com)
github开源项目:https://learngitbranching.js.org/