【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 本地分支名:远程分支名

第三章 代码拷贝小技巧

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/

官网下载地址:https://git-scm.com/download

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值