【git】

news2024/11/25 4:24:16
目录
  • 第一章 简介
    • 1.1 版本控制
      • 1.1.1 本地版本控制
      • 1.1.2 集中式版本控制
      • 1.1.3 分布式版本控制
  • 第二章 基础篇
    • 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 法二创建软链接
  • 第四章 高级篇
    • 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快捷键
  • 参考资料
摘要

  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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通俗易懂的java设计模式(3)-观察者设计模式

什么是观察者设计模式 观察者模式主要应用在对象存在一对多关系的情况下,那么如果一个对象,依赖于另一个对象,那个被依赖的对象一旦被修改,依赖于他的那个对象也会被观察者所告知。 观察者模式又被称作为发布-订阅模式&#xff0c…

2022 UUCTF

目录 <1> Web (1) websign(禁用js绕过) (2) ez_rce(?>闭合 rce) (3) ez_unser(引用传递) (4) ez_upload(apache后缀解析漏洞) (5) ezsql(union注入) (6) funmd5(代码审计 %0a绕过preg_replace) (7) phonecode(伪随机数漏洞) (8) ezpop(反序列化字符串逃逸) …

[附源码]Nodejs计算机毕业设计教师业绩考核和职称评审系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

[附源码]Nodejs计算机毕业设计教务管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

燃尽图——项目管理中的必备工具

燃尽图可以使项目经理和团队可以快速查看其工作负荷的进度以及项目按计划完成的情况。 在项目管理中&#xff0c;通过燃尽图不仅能了解项目进度&#xff0c;还能分析出项目中问题&#xff0c;及时进行风险控制。 燃尽图是用于表示剩余工作量的工作图表&#xff0c;由横轴&…

WebDAV之葫芦儿•派盘+RS文件管理器

RS文件管理器 支持WebDAV方式连接葫芦儿派盘。 手机本地文件,网盘、共享文件,如何集中管理?推荐您使用Rs文件管理器,还支持WebDAV等功能。 Rs文件管理器是一款功能强大的手机文件管理器。有强大的本地和网络文件管理功能,让您更方便的管理你的手机、平板、电脑和网盘。…

MOMO CODE SEC INSPECTOR-Java项目静态代码安全审计idea插件工具

工具地址 https://github.com/momosecurity/momo-code-sec-inspector-java安装 1、确认IDE版本&#xff1a;Intellij IDEA ( Community / Ultimate ) > 2018.32、IDEA插件市场搜索"immomo"安装。使用方式 被动&#xff1a;装完愉快的打代码&#xff0c;一边它会提…

AI作画的背后是怎么一步步实现的?一文详解AI作画算法原理+性能评测

前言 “AI作画依赖于多模态预训练&#xff0c;实际上各类作画AI模型早已存在&#xff0c;之所以近期作品质量提升很多&#xff0c;可能是因为以前预训练没有受到重视&#xff0c;还达不到媲美人类的程度&#xff0c;但随着数据量、训练量的增多&#xff0c;最终达到了现在呈现…

无约束优化:线搜索最速下降

文章目录无约束优化&#xff1a;线搜索最速下降无约束优化问题线搜索最速下降精确线搜索非精确线搜索Armijo准则Goldstein准则Wolfe准则参考文献无约束优化&#xff1a;线搜索最速下降 无约束优化问题 线搜索最速下降 对于光滑函数f(x)f(x)f(x)&#xff0c;沿着函数负梯度方向…

入门力扣自学笔记215 C++ (题目编号:1971)

1971. 寻找图中是否存在路径 题目&#xff1a; 有一个具有 n 个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n - 1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi 之间…

安装 DbVisualizer pro 10.0.16,编辑器中文乱码的解决

DbVisualizer pro 10.0.16 双击安装&#xff0c; 选择下载 JRE运行后 选择 创建 桌面快捷方式 安装成功后 ping 报错无法连接到mysql &#xff0c; 驱动 所致 官方下载最新驱动 MySQL :: Download MySQL Connector/J (Archived Versions)https://downloads.mysql.com/archi…

springcloudAlibaba之seata的使用

1.seata的基础角色&#xff1a; TC(Transaction Coordainator):事务协调者&#xff0c;它维护全局和分支事务的状态&#xff0c;驱动全局事务提交和回滚 TM(Transaction Manager):事务管理器&#xff0c;它定义了全局事务的范围&#xff0c;主要包括开始全局事务、提交全局事务…

采用多层人工神经网络的能源消耗的时间序列预测(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 该项目为能源消耗的时间序列预测&#xff0c;在Matlab中实现。该预测采用多层人工神经网络&#xff0c;基于Kaggle训练集预测未…

【Python机器学习】梯度下降法的讲解和求解方程、线性回归实战(Tensorflow、MindSpore平台 附源码)

需要全部源码请点赞关注收藏后评论区留言私信~~~ 基本思想 迭代关系式是迭代法应用时的关键问题&#xff0c;而梯度下降&#xff08;Gradient Descent&#xff09;法正是用梯度来建立迭代关系式的迭代法。 机器学习模型的求解一般可以表示为&#xff1a; 其中&#xff0c;f(x)…

LSTM返向传播代码实现——LSTM从零实现系列(4)

一、前言 这个LSTM系列是在学习时间序列预测过程中的一些学习笔记&#xff0c;包含理论分析和源码实现两部分。本质属于进阶内容&#xff0c;因此神经网络的基础内容不做过多讲解&#xff0c;想学习基础&#xff0c;可看之前的神经网络入门系列文章&#xff1a; https://blog.…

IntelliJ IDEA建立SSM论文基本增删改查管理系统

IntelliJ IDEA建立SSM论文基本增删改查管理系统 1、启动IntelliJ IDEA程序 2、点击File----->New ------>Project建立项目 3、在弹出的对话框中&#xff0c;左边点击”maven”建立maven项目&#xff0c;右边的选择框不要选择&#xff0c;选择maven-archetype-webapp不能…

GAN2 ~

这也是第二季了 近年来&#xff0c;基于生成对抗式网络&#xff08;Generative Adversarial Network, GAN&#xff09;的图片生成研究工作取得了显著的进展。除了能够生成高分辨率、逼真的图片之外&#xff0c;许多创新应用也应运而生&#xff0c;诸如图片个性化编辑、图片动画…

C++ STL算法(一)利用STL算法解决很常见的一些子问题

文章目录next_permutationlower_bound 与 upper_boundpartial_sumsort 与 uniquenext_permutation cplusplus&#xff1a; next_permutation 作用&#xff1a;得到所有的全排列 例题&#xff1a; P1706 全排列问题 void test1() {int n;cin >> n;int* arr new int[n…

Oracle基础版

这是上上周的事情&#xff0c;我们甲方强烈要求使用oracle数据库&#xff0c;也就上学的时候玩过Oracle也忘得差不多了&#xff0c;所以一直不想弄&#xff0c;我们开会产品说要提测了&#xff0c;我还没弄&#xff0c;这不得哐哐开始干活&#xff0c;过程吧还算顺利&#xff0…

Java学习之第八章练习题-1

目录 第一题 题目 我的代码 Person类 错误 正确写法 输出结果 附加要求 代码 结果 第二题 题目 答案 第三题 题目 代码 总结不足 创建对象并运行 第四题 题目 运行结果​编辑 第五题 题目 第六题 题目 第一题 题目 我的代码 Person类 package com.hspedu…