基于Git的代码工程管理——学习记录一

news2024/11/29 0:56:14

一、Git简概[1]

        Git是一个分布式版本控制系统,它跟踪任何一组计算机文件的更改,通常用于在软件开发过程中协调协作开发源代码的程序员之间的工作。其为实现快速、数据完整性以及分布式非线性工作流程(在不同计算机上运行数千个并行分支)服务。

        Git最初由Linus Torvalds于2005年编写,用于Linux内核的开发,其他内核开发人员也为Git最初的开发做出了贡献,自2005年以来,Junio Hamano一直是核心维护者。相比于大多数其它分布式版本控制系统,与大多数Client-server(客户端-服务器)系统不同,每台计算机上的每个Git目录都是一个成熟的repository(存储库),具有完整的历史记录和完整的版本跟踪能力,独立于访问网络或中央服务器。Git是在GPL-2.0-only license许可下的共享免费开源软件。

二、Github、Gitee与GitLab

        Github(Ⅰ)是一个Microsoft(微软)旗下的面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故命名为Github。Github于2008年4月10日正式上线,除了Git代码仓库托管及基本的Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱、代码片段分享等功能。目前,Github托管代码项目版本数量非常之多,而且不乏知名开源项目[2]。

        Gitee (Ⅱ)为开源中国旗下,国内第一大研发效能平台&全球第二大开源代码托管平台,主要产品为社区版、企业版、专业版、高校版、旗舰版。 Gitee 自2013 年上线以来共服务了 1000 万开发者用户,累计托管仓库超过 2500 万个,是国内首屈一指的开源软件技术交流平台; Gitee 企业版 & 专业版共服务了 26 万家企业,包括了 1200 家中大型私有化部署企业。

        GitLab(Ⅲ)是由GitLab公司开发的、基于Git的集成软件开发平台,更是最全面的人工智能驱动的DevSecOps平台(Development和Operations的混成词,是一种重视软件开发人员和IT运维技术人员之间沟通合作的文化或惯例)。GitLab具有Wiki以及在线编辑、issue跟踪、CI/CD等功能。GitLab CI/CD是GitLab内置的一款工具,用于通过持续方法论(页面存档备份)的软件开发,该持续方法论包含三个部分持续集成(Continuous Integration,CI)、持续交付(Continuous Delivery,CD)以及持续部署(Continuous Deployment,CD)[3]。

三、Git代码项目管理实践

        本实践依托于Git-2.41.0.3Github代码项目托管平台。需要注意的是,公开仓库可以免费多人开发,而私人仓库仅限五人及以下开发。

使用Git操作文件时,文件的状态有以下三种[4]:

* 已修改(modified):修改了文件,但还没保存到本地数据库中。

* 已暂存(staged):对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

* 已提交(committed):数据已经安全地保存在本地数据库中。

针对Git文件的三种状态,从而引出了Git项目的三个工作区域[4]:

* 工作区(Working):对项目的某个版本独立提取出来的内容。简单的理解为在电脑里能看到的目录及文件内容,比如自己创建的本地项目。

* 暂存区(Staging):保存了下次将要提交的文件列表信息。按照Git的术语叫做“索引”。

* Git仓库(.git):工作区有一个隐藏的.git目录(在文件夹“查看”中勾上隐藏的项目即可显示),这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是暂存区,还有Git自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

Git常用命令[5][4]:

* git config --list                            查看配置信息

* git init                                        在工作文件夹下初始化Git管理

* git clone + 项目网页地址           克隆Github/Gitee上的开源项目到本地

* git status    查看工作区所有文件所处状态(已修改/已暂存/已提交)并提示文件跟踪状态

* git add + 文件名                         添加跟踪的新文件(即放入暂存区)

* git commit -m  + 提交日志名(版本名)提交暂存区的文件

* git diff         查看所有未暂存跟踪文件的修改差异(“-”表示修改前,“+”修改后)。若想查看具体文件,则后追加文件名。

* git diff --staged(或--cached)    查看所有已暂存跟踪文件的修改差异,具体文件同上。

git reset (+ 文件名)                重置命令,可以重置上一次操作(如移除暂存区)

   git reset --soft或--mixed或--hard + 版本可识别的独立哈希串前几位标识

   --soft     移动HEAD指针,仅回退到某个版本,保留工作区和暂存区,只回退commit信息

   --mixed  移动HEAD指向当前快照的内容来更新暂存区。回退到某个版本,只保留工作区,回退commit和add信息

   --hard    工作目录和暂存区全更新一致。彻底回退到某个版本,工作区也会变为上一个版本内容

* git restore --staged +文件名        移除暂存区文件(如日志文件、忽略文件)

  git restore + 文件名                     移除未暂存区文件(如日志文件、忽略文件)

* git log                                          查看提交日志(可获取版本标识哈希串)

  git log --pretty=oneline                 提交日志一行显示化

  git reflog                      查看引用日志(reflog保存的版本信息完整,只能自己拥有)

* git checkout -- + 文件名              从Git仓库中将上一次提交的内容检出覆盖到本地 

* git rm -f + 文件名                        强制删除未纳入版本库。同时本地与暂存区删除

  git rm + 文件名          删除已纳入版本库但未修改文件(该方式可以通过restore恢复文件)

  git rm --cached  + 文件名            移除暂存区文件但保留工作区本地文件

* git show HEAD@{reflog版本序列号}   了解具体版本变化信息

  git show HEAD~祖先迭代数        查看祖先版本,”~“和”\Lambda“为版本祖先字符

* git revert -n +  版本可识别的独立哈希串前几位标识      重做一个新版本,这个版本的内容与我们要回退的目标版本一样,但是HEAD指针是指向这个新版本,而不是目标版本。最后,需要手动commit

git revert -n 版本可识别的独立哈希串前几位标识-1~.. 版本可识别的独立哈希串前几位标识                                                           系列版本重做。起始版本不包括,即左开右闭

git revert --abort                          撤销版本重做

* git remote add 项目别名 + 远程仓库网址    添加远程仓库(先添加才能推送)

* git remote -v                                 查看远程仓库信息

* git push 远程仓库名 分支名(主支为master)  向远程仓库推送项目

* git remote rm + 远程仓库名           移除远程仓库

(一)本地Git项目对远程仓库的推送实践

        1、Github创建并添加远程仓库

        首先,初始化并提交(commit)新版本项目;然后,在项目托管平台创建好远程仓库;继而,基于”git remote add 项目别名 + 远程仓库网址“在本地添加远程仓库。

        2、Github与本地主机的认证授权(ssh)

        Github与本地主机认证授权有三种方式,分别为。选择其中一种授权认证即可,认证成功后,可在”控制面板-用户账户-凭据管理器-Windows凭据“查看网页ssh普通凭据。

        3、本地连接推送远程仓库

        基于”git push 远程仓库名 分支名(主支为master)“推送至远程仓库即可。

        4、移除远程仓库

        基于”git remote rm + 远程仓库名“移除远程仓库即可。

(二)本地克隆Github开源项目

        本实践以开发者yanx27提交的“Pointnet_Pointnet2_pytorch”开源项目为例进行(感谢yanx27无私伟大的开源精神),具体实践步骤如下:

        首先创建一个空的文件夹作为Git工作区,然后open Git Bash here,再者查找到开源项目的Local Clone HTTPS,最后执行命令“git clone + Local Clone HTTPS”即可。

(三)Git时光穿梭机实践(提交版本回溯)

        采用git_reset方式回溯版本,会使HEAD指针往回移动,从而丢失之后提交的信息;采用git_revert方式可以重做一个新的版本,这个版本内容与我们要回溯的目标版本一样,但是HEAD指针是指向这个新的版本的,而不是目标版本。

        实验过程中,使用revert重做版本时,我遇到了文件Conflict的报错,查阅了较多资料并未找到有效的解决方案,待后续学习进一步思考。

        值得注意的是,①修改后的文件需要加入暂存区再提交,这样保存的版本才是修改后的版本;②HEAD指针的切换会影响log记录;③在代码项目托管平台下载的代码仅能看到log文件,而没有reflog文件。

常用的远程仓库:

Ⅰ GitHub: Let’s build from here · GitHub

Ⅱ Gitee - 基于 Git 的代码托管和研发协作平台

Ⅲ The DevSecOps Platform | GitLab(托管控制、合规性检查、完整的数据和源代码隔离、数据驻留和专用网络,一般用于公司内网/自建服务器)

参考资料:

[1] https://en.wikipedia.org/wiki/Git

[2] 还不会使用 GitHub ? GitHub 教程来了!万字图文详解 - 知乎

[3] https://zh.wikipedia.org/wiki/GitLab

[4] 8_08-Git设计理念-三种状态三个区域_ev_哔哩哔哩_bilibili(张奇MAX)

[5] Git - Documentation

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

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

相关文章

搬运工让你分分钟了解Web接口测试

01、什么是接口 百度说:接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式 上面这句有点抽象,网上的…

跨语种「AI同传」颠覆语音翻译!Meta谷歌连发重大突破

Meta谷歌接连放出重磅成果!Meta开源无缝交流语音翻译模型,谷歌放出无监督语音翻译重大突破Translation 3。 就在Meta AI成立10周年之际,研究团队重磅开源了在语音翻译领域的突破性进展——「无缝交流」(Seamless Communication&a…

python中的输入输出

文章目录 输入函数input()例子1.如何输入获得两个字符串?(若输入abc def或abc,def)2.如何输入获得两个整数?(若输入34,567)3.如何输入后获得一个元素均为数值型的列表?(若输入12,3.4,567或[12,3.4,567]) 输出输出函数print()pr…

第十六届山东省职业院校技能大赛 中职组网络建设与运维赛项样题

第十六届山东省职业院校技能大赛 中职组网络建设与运维赛项样题 赛题说明 一、竞赛项目简介 “网络建设与运维”竞赛共分为以下三个模块: > 网络理论测试: > 网络建设与调试; > 服务搭建与运维。 模块 比赛时长 分值 模块一 网络…

【恋上数据结构】二叉堆学习笔记

二叉堆 需求分析 Top K 问题 什么是 Top K 问题? 从海量数据中找出前 K 个数据。 比如:从 100 万个整数中找出最大的 100 个整数Top K 问题的解法之一:可以用数据结构 “堆” 来解决。 堆 堆是一种【完全二叉树】,可以分为【…

Hadoop学习笔记(HDP)-Part.07 安装MySQL

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

手动创建spring bean并注入

文章目录 前言一、jar包中,相同class不同类加载器加载的时候是同一个class嘛?二、利用ConfigurableListableBeanFactory手动注册bean注册bean,并自动注入依赖bean根据类型获取注入的bean,两个bean是一个吗? 三、同一份字节码,class隔离,bean隔离总结 前言 注入一个…

Linux的IO模型——阻塞IO

当要读数据recvfrom时,其实就需要两个阶段,一是将硬盘数据读到内核缓冲区,二是将内核缓冲区数据拷贝到用户缓冲区。而阻塞IO就是在两个阶段中用户进程都必须阻塞等待。

ES通过抽样agg聚合性能提升3-5倍

一直以来,es的agg聚合分析性能都比较差(对应sql的 group by)。特别是在超多数据中做聚合,在搜索的条件命中特别多结果的情况下,聚合分析会非常非常的慢。 一个聚合条件:聚合分析请求的时间 search time a…

网页开发 CSS

目录 CSS 概述 CSS 引入方式 CSS 选择器 基本选择器 组合选择器 伪类选择器 样式继承 选择器优先级 CSS 属性操作 文本属性 背景属性 边框属性 列表属性 dispaly属性 盒子模型(重点) float属性(重点) CSS 概述 C…

基于go文件同步工具的升级迭代

介绍 同样,该工具适用于多个项目不同版本的维护,文件更新和新增的同步(自动创建目录),支持自动提交svn。 升级迭代 之前的文件同步工具,依赖chrome和http包,有时候js加载页面不太稳定,所以有空闲就升级迭…

leetcode115.从中序与后序遍历序列构造二叉树,手把手带你构造二叉树(新手向)

构造二叉树是树问题中的难点(相对于遍历二叉树),一开始做的读者会感觉无从下手,这道题在训练营专栏里讲过,是四道题一起讲的,但是现在看来讲的并不全面、具体,所以想单独出一期再来讲一下如何构…

老师怎样克服公开课的心理恐惧?

公开课是老师进修学习和交流教学经验的必要手段,但是,很多老师在面对公开课时会出现心理恐惧,在讲台上发挥不自如,影响教学效果。下面就是一些克服公开课心理恐惧的方法: 一、充分准备 准备充分是心理恐惧的最好解决方…

2023.12.4 关于 Spring Boot 统一异常处理

目录 引言 统一异常处理 异常全部监测 引言 将异常处理逻辑集中到一个地方,可以避免在每个控制器或业务逻辑中都编写相似的异常处理代码,这降低了代码的冗余,提高了代码的可维护性统一的异常处理使得调试和维护变得更加容易,通…

deepflow本地部署过程

本地服务器配置,32C,48G内存 整个过程需要配置k8s,安装helm, 安装grafana, 安装deepflow以及deepflow-ctl,以及部署demo 在采用sealos进行ALL-IN-ONE部署之前, grafana 先安装它 wget -q -O /usr/share/keyrings/gr…

VSCode + gdb + gdbserver调试ARM程序

在开发ARM嵌入式端C/C程序时,一般会在PC上编写代码,在Linux服务器上编译,然后将程序复制或挂载到ARM开发板上运行。如果程序出了问题,在不使用gdb的情况下,经常在代码中添加打印,编译,然后在开发…

nodejs+vue+ElementUi小区社区公寓宿舍智能访客预约系统

该系统将采用B/S结构模式,前端部分主要使用html、css、JavaScript等技术,使用Vue和ElementUI框架搭建前端页面,后端部分将使用Nodejs来搭建服务器,并使用MySQL建立后台数据系统,通过axios完成前后端的交互,…

内网渗透Dump Hash之NTDS.dit

Ntds.dit 在活动⽬录中,所有的数据都保存在域控的ntds.dit⽂件中。 ntds.dit是⼀ 个⼆进制⽂件,⽂件路径为域控的%SystemRoot%\ntds\ntds.dit。NTDS.dit 包 含不限于⽤户名、散列值、组、GPP、OU等活动⽬录的信息。系统运维⼈员可以使⽤VSS实 现对该⽂件…

金蝶云星空单据编辑界面,不允许批量填充操作【分条件】

文章目录 金蝶云星空单据编辑界面,不允许批量填充操作【分条件】前提说明案例演示开发设计测试填充值清空值 金蝶云星空单据编辑界面,不允许批量填充操作【分条件】 前提说明 上一个文章的设计,不管是填充值,还是清空值都一律不…

【matlab程序】matlab画螺旋图|旋转图

%% 数学之美====》螺旋线 % 海洋与大气科学 % 20231205 clear;clc;close all; n=10; t=0:0.01:2pin; R=1; xx=nan(length(t),1);yy=nan(length(t),1); for i=1:length(t) xx(i)=Rcos(t(i)); yy(i)=Rsin(t(i)); R=R+1; end figure set(gcf,‘position’,[50 50 1200 1200],‘col…