| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发工具 -> 【git】 -> 正文阅读 |
|
[开发工具]【git】 |
目录
摘要
??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用于控制复制的版本数,从而减少本地占用内存空间。不设置,默认复制所有版本。
图1. 下载代码
2.2更新代码2.2.1清空本地未被跟踪内容??git clean -dxf ??git checkout – ./ 2.2.2更新代码使之与库上同步??git pull 2.3修改??项目代码拉到本地,我们就可以在本地愉快地完成开发任务或debug了。 ??下面是几个常用的文本编辑工具。 2.3.1Vim??功能强大,自行学习
图2.vim键盘图
图3.vim命令1
图4.vim命令2
2.3.2Sed??情况一:出临时版本、正式版本都需要修改版本号,你当然可以选择通过vim一个文件一个文件地打开,再手动修改版本号,或者通过:%s/1.0.5/1.0.6/g将版本号从1.0.5修改为1.0.6。那如果每次出版本都需要修改5个,6个甚至10个文件,那是不是也需要每个文件一次打开,并手动修改呢?大可不必!
图5.修改版本号
??其实只需要一条指令就可以了(同时修改多个文件,只需在指令后接着加文件名即可),即 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(流编辑器)的缩写,简称流编辑器;用来处理文件的文本编辑工具。在不打开文件的情况下,即可对文件进行增、删、改、查操作。
图6.sed修改版本号
??情况二:软件送样给指定客户时,如客户不希望软件中出现关于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隐藏文件一并拷贝一份,就可以切分支使用了。此过程只需要一到两分钟。
图7.git隐藏文件
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。
图8.待修改历史记录
??执行[_ mayinrong ~/S204_I520x 14:25 173]$git rebase -i HEAD~3后,会自动打开交互式rebase界面。
图9.交互式rebase界面
??根据需要将第二行删掉,并保存。
图10.交互式rebase编辑
??我们再git log(我这边输入的gl,是起的别名,每次都输入给git log,git checkout – ./,git branch 也挺麻烦的,完全可以起个别名,如gl,gch-,gb等,会方便很多)看一下。不错,此时V2的提交已经消失不见了。
图11.修改后的历史记录
4.2.3多次rebase4.3撤销commit4.3.1 git reset??举例,本地增加文件1.c,生成版本V1,增加文件2.c,生成版本V2。
图12.待修改历史记录
??V1的commit id是7049b7c7dbb39a304acc434762ccfcad6959aba1,执行git reset 7049b7c7dbb39a304acc434762ccfcad6959aba1之后,本地版本会切回到V1,且在Untracked files中会看到V2的改动2.c。
图13.git reset
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,
图14.git reflog
??执行git reset 67d6be6e8,即可回退到commit id为67d6be6e8的版本。
图15.git reset –hard恢复
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/ |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/26 21:33:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |