IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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多次rebase

4.3撤销commit

4.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/

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 11:29:10  更:2022-12-25 11:31:35 
 
开发: 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年11日历 -2024/11/9 16:12:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码