【Git教程】(二十一)与其他版本控制系统并行使用 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

news2024/11/24 19:07:58

Git教程 · 与其他版本控制系统并行使用

  • 1️⃣ 概述
  • 2️⃣ 使用要求
  • 3️⃣ 执行过程及其实现
      • 3.1 初始部署版本库
      • 3.2 得到中央版本控制管理中的更新修改
      • 3.3 将修改提交传输到中央本版控制系统

在这里插入图片描述

在许多企业和组织中,会统一管理版本控制工具和相关的流程。其中的个人和小团队无法选择使用一个与众不同的版本控制工具,比如Git 。企业级别的迁移到Git 会需要可行性研究、战略决策、迁移细化等。需要很多时间。

无论如何,都可以在本地开发环境使用Git 技术,再同步开发结果到中央版本库。本地使用Git 有这些优势如下所示。

  • 即使技术无法通信到中央版本库,也可以本地提交。
  • 可以细粒度地划分版本,即使开发中的中间产品。版本管理成为开发过程中的安全保障。
  • 可以专为产品原型和新功能开发工作一一分配对应的本地分支。
  • Git 更好的支持合并和变基操作。

本章的工作流演示了一个本地 Git 版本库如何和远程中央版本控制服务器一起工作。以实现:

  • 中央版本中的新变化可以被导入本地 Git版本库;
  • 本地提交的修改可以被传输到中央版本库中。

如果目的是互通互联 Subversion 管理的中央版本库,那么 git-svn 命令就可,不需要本章所述的操作过程。


1️⃣ 概述

为了描述 Git 如何和一个中央版本控制一起工作,以CVS 版本控制系统为例。同样的操作步骤可以适用于解决与其他版本控制系统合作。

下图显示了一个CVS 服务器和一个开发者本地版本库。

在这里插入图片描述
开发者有两个本地 Git 版本库。 一个是用来同步中央版本,称为同步版本库。另一个称为工作版本库,用来真正执行开发工作。

同步版本库链接到中央版本库 (CVS 目录), 并包含Git 对象(在 .git 目录)。中央版本同步配置在.cvsignore 文件中,可以配置忽略 Git 光管对象。Git 配置通过 gitignore 文件,可以忽略 CVS 元数据信息。

首先,在中央版本中的修改会被记录到同步版本库 (cvs update 命令), 然后在 cvs 分支创建一次提交,再在从工作版本库取得同步版本库中的修改 (fetch 命令), 最后合并 (merge 命令)。

将本地主分支上的修改同步到中央版本的方法是。将开发版本库上的新提交转移到同步版本库 (push 命令)。在同步版本库,将主分支上与 cvs 分支合并,最后将修改保存至中央版本控制服务器 (cvs commit 命令)。


2️⃣ 使用要求

  • 支持乐观锁:中央版本管理系统必须支持乐观锁,例如,文件可以被在不取得锁的情况下修改。
  • 支持忽略文件和文件目录:中央版本管理比较可以排除部分文件和文件目录到管理范围之外。
  • 项目目录的灵活性:开发工具(例如,创建编译工具)必须要不要求项目储存在文件系统固定的一个位置。

3️⃣ 执行过程及其实现

企业和组织可以使用中央版本控制系统,以此同时个人开发者可以在本地使用Git, 并将修改与中央版本控制之间同步。

需要先回答关于该中央本版控制服务的这些问题。

  • 如何从版本控制器中获得初始代码? -cvs checkout 命令
  • 版本控制系统中元数据是如何在何处存储的? -CVS 文件目录
  • 如何在版本管理中忽略某些文件? -.cvsignore 文件
  • 如何在中央版本管理中得到最新的修改? -cvs update 命令
  • 如何在中央版本管理中增加新文件? -cvs add 命令
  • 如何将修改提交到中央版本中? -cvs commit

3.1 初始部署版本库

接下来这些步骤演示了如何初始化创建同步版本库和工作版本库。开始时已有通过 cvs checkout.命令来创建的本地 CVS项目(cvsproject)。

  • 第1步:创建同步版本库
    首先,在CVS 文件目录创建一个新的 Git 版本库。

    > cd cvsproject
    > git init
    
  • 第2步:配置.gitignore 文件
    所有的文件,除了CVS 的元数据文件,都应该导入同步版本库中。因此 CVC 文件目录应该被列入 git 配置文件.gitignore 中。

    > echo CVS/ > .gitignore
    

    echo 操作创建了一个新的.gitignore 文件,包括 CVS 目录中的内容。

  • 第3步:配置.cvsignore 文件
    Git 版本库的管理元数据也不应该被中央版本控制管理,所以应该配置.git 目录 和.gitignore 文件在cvs 管理的范围之外。在 CVS 中,将它们加到.cvsignore 文件就可以实现这一目的。

    > echo .git >>.cvsignore
    > echo .gitignore >>.cvsignore
    

    如果.cvsignore 文件不存在,将会自动创建一个,新创建的文件必须通过cvs add 命令添加到中央版本管理中。

    > cvs add .cvsignore
    

    之后,可以通过cvs commit 命令将修改提交到CVS 服务器中。

    > cvs commit
    
  • 第4步:在同步版本库中增加文件
    现在所有的准备工作完成,可以将项目文件加入Git 同步版本库中。

    > git add.
    

    注意! 版本控制系统(包括 Git) 都有改编文本文件行末尾(LF 或 CRLF)的习惯。如果合作的其他版本控制系统和 Git有不一样的处理行末尾方式,那可以在 git 中停止对文件末尾 的处理,命令是 git config core.autocrlf false

    某些中央版本控制系统,包括 Subversion, 会使用一个全局的校对版本号。在这种情况下,将这个校对版本号加入到 Git 提交的注释中将有所帮助。这个校对版本号可以用来较为容易地记录跟踪,可以由此推断哪些步骤已被导入。不幸CVS 系统没有这样的校对版本号。

    >git commit -m "Initial import of CVS"
    
  • 第5步:在同步版本库中创建一个cvs 分支
    同步版本库的工作将在一个独立的分支cvs上展开。至此,这个分支还没有创建和激活。

> git checkout -b cvs
  • 第6步:创建工作版本库
    工作版本库将以同步版本库的克隆形式被创建。当创建克隆时,主分支会被自动设置为活动分支。

    > cd ..
    > git clone cvsproject gitproject
    

    至此,准备工作完成。

3.2 得到中央版本控制管理中的更新修改

这一章节将描述如何将中央版本控制中的新修改传输到同步版本库,再传输到工作版本库。

  • 第1步:将修改过的文件传输到同步版本库。
    同步版本库的工作区包括与中央版本对比的必要元数据信息。因此必须通过这个工作区来向CVS 服务器获取更新。

    > cd cvsproject
    > cvs update
    

    在此 cvs update 命令永不会造成 CVS 冲突。同步版本库的 CVS 分支始终是一个“干净” 的旧版中央版本。之后,通过CVS 分支在同步版本库上做的修改可以通过add 命令添加再提交到Git 中。

    > git add --all .
    

    这里的参数--all 指明添加新的修改过的文件到提交中,同时将删除文件操作也添加到提交中。

    > git commit -m "Changes from CVS"
    
  • 第2步:提交修改到工作版本库
    目前为止,CVS 端发生的修改只存在于同步版本库。因为工作版本库是同步版本库的克隆,其源版本库自动指向同步版本库。通过fetch 命令,工作版本库可以提取CVSs 上的修改。

    > cd gitproject
    > git fetch origin
    
  • 第3步:将修改应用到主分支
    在这个阶段,修改只在 cvs 分支上,还没有应用于主分支。这一步需要用到 merge 命令。 因此可能会遇到冲突,当同一个文件在本地开发和CVS 同时被修改是。常用Git 工具可以用来清理解决冲突(见图)。

    在这里插入图片描述

     > git merge origin/cvs
    

    经过这一步操作。当前中央版本控制中的最新版本已经与本地修改合并,在工作版本库中生效。

3.3 将修改提交传输到中央本版控制系统

这一节将阐述如何将本地工作版本库的修改通过同步版本库传输到中央版本控制系统中。

  • 第1步:获得中央版本控制中最新的版本
    在本地修改传输到中央版本控制系统之前,首先要先得到中央的最新版本。要做到这一点只需要依次按上一章节所述步骤操作即可。

    通过升级到最近,可以尽可能减小提交修改到中央版本控制时遇到冲突的可能性。另外可以再次测试修改在最新的版本上是否功能完好。

  • 第2步:主分支上的修改传输到同步版本库
    在主分支上的本地修改必须先传输到同步版本库,因为同步版本库是克隆“源”,所以一个简单的 push 命令即可完成这一目的。

    > cd gitproject
    > git push
    
  • 第3步:在 cvs 分支上接受修改
    新的提交和修改的文件到了同步版本库的主分支。要把他们传输到中央版本控制系统中,需要把这些修改合并到cvs 分支。这不会引起冲突,因为cvs 分支上没有任何修改(见图)。

    在这里插入图片描述

    > cd cvsproject
    > git merge --no-commit --no-ff master
    

    merge 命令中用到的参数有如下两种。

    • --no-commit: 因为存在可能与cvs 上的后续修改冲突,这里尝试合并命令不包含最终提交。
    • --no-ff: 这一参数指定 Git 不采取快速合并。
  • 第4步:将修改传输到中央版本控制系统
    现在本地修改可以开始向中央版本控制系统传输了。根据是否有新增、删除、修改文件,
    采取不同的提交命令。例如 cvs commit 命令用于仅包含修改文件时:

    > cvs commit
    

    如果在cvs 提交时遇到冲突,意味着自从上次本地获取 cvs 最新更新后中央版本又有新的修改,这个时候需要重置当前合并尝试。

    > git reset --hard HEAD
    

    然后再次从第一步做起获取中央版本控制系统中最新的更新,与主分支上的修改合并。
    直到不再遇到冲突,完成了将本地修改传输到中央版本中,再进行下一步操作。

  • 第5步:从中央版本中获得更新
    有些版本控制系统会在提交的过程中或提交之后的第一个更新对文件有所修改。例如, 可以通过CVS 系统得到当前版本号或者在文件头(替换关键字)得到文件修改历史。因此,再次证明成功提交之后,有必要再从中央版本取得一次更新。

    > cvs update
    
  • 第6步:在cvs 分支执行提交操作
    这时候应该将CVS 上的更新提交并合并到Git 系统中。在此之前,先将CVS 行的更新用 add 命令添加到提交中。

    > git add
    > git commit -m "Changes from Git recorded"
    
  • 第7步:更新工作版本库的主分支
    通过上述步骤,现在同步版本库 cvs 分支有了一个新的提交。为了后续工作,需要将更 新传输到工作版本库,再将cvs分支合并到主分支。

    > cd  gitproject
    > git fetch origin
    

    接下来做一个合并,这应该是一个快速合并,因为主分支上不应该再有临时更新(上述步骤已将主分支全部更新同步到了cvs 分支)。

    > git merge origin/cvs
    

经过这些步骤,已经将本地的修改更新到了中央版本控制系统中,并且本地工作版本库版本包含了中央版本当前最新版。如图所示,所有的提交和分支操作流程。

在这里插入图片描述

为什么不选择一个 Git 版本库
这样一套流程在只有一个 Git 版本库时也可以实现。例如开发工作可以在同步版本库中 完成。那么只需根据正在只需同步工作还是开发工作在 cvs 分支和主分支之间切换即可。但是,这样会显得很难跟踪记录在何时何地采取如何操作。

会经常发生命令执行错分支的情况,尤其是执行同步操作时候。
另外一个问题就是容易使中央版本库的元数据在开发过程中被不慎删除,例如在重构项目时不慎删除 CVS 文件目录。


温习回顾上一篇(点击跳转)
《【Git教程】(二十)外包长历史记录 — 概述及使用要求,执行过程及其实现,替代解决方案 ~》

继续阅读下一篇(点击跳转)
《》

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

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

相关文章

服务器数据恢复—服务器raid5上层zfs文件系统数据恢复案例

服务器数据恢复环境&故障: 一台某品牌X3650M3服务器,服务器中有一组raid5磁盘阵列,上层采用zfs文件系统。 服务器未知原因崩溃,工作人员排查故障后发现服务器的raid5阵列中有两块硬盘离线导致该阵列不可用,服务器内…

Scikit-Learn随机森林分类

Scikit-Learn随机森林分类 1、随机森林分类1.1、随机森林分类概述1.2、随机森林分类的优缺点2、Scikit-Learn随机森林分类2.1、Scikit-Learn随机森林分类API2.2、Scikit-Learn随机森林分类初体验(葡萄酒分类)2.3、Scikit-Learn随机森林分类实践(鸢尾花分类)2.4、参数调优与…

1.Vue2使用ElementUI-初识及环境搭建

目录 1.下载nodejs v16.x 2.设置淘宝镜像源 3.安装脚手架 4.创建一个项目 5.项目修改 代码地址:source-code: 源码笔记 1.下载nodejs v16.x 下载地址:Node.js — Download Node.js 2.设置淘宝镜像源 npm config set registry https://registry.…

获取东方财富网股票的实时数据股票的数据,并保存到Excel文件中

可以运行python文件获取东方财富网:【序号,代码,名称,最新价,涨跌幅,涨跌额,成交量,成交额,振幅,最高,最低,今开,昨收,量比,换手率,市盈率-动态,市净率,总市值,流通市值,涨速,5分钟涨跌,60日涨跌幅,年初至今涨跌幅,】数据,保存到Excel文件中。 import pandas as pd import re…

在Cisco Packet Tracer上配置NAT

目录 前言一、搭建网络拓扑1.1 配置PC机1.2 配置客户路由器1.3 配置ISP路由器 二、配置NAT2.1 在客户路由器中配置NAT2.2 测试是否配置成功 总结 前言 本篇文章是在了解NAT的原理基础上,通过使用Cisco Packet Tracer 网络模拟器实现模拟对NAT的配置,以加…

09.爬虫---正则解析爬取数据

09.正则解析爬取数据 1.目标网站2.具体实现3.正则表达式分析4.完整代码并存入表格 1.目标网站 直达目标网站 https://movie.douban.com/chart 2.具体实现 我们来拿取一下上面网页的代码如下: from urllib import requesturl https://movie.douban.com/chart headers {Us…

Java心跳检测机制

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 心跳检测的定义 心跳检测是一种监控机制,在Java编程和分布式系统中具有广泛的应用。心跳检测,顾名思义,就像心跳一样,是一种…

计算机网络-数制转换与子网划分

目录 一、了解数制 1、计算机的数制 2、二进制 3、八进制 4、十进制 5、十六进制 二、数制转换 1、二进制转十进制 2、八进制转十进制 3、十六进制转十进制 4、十进制转二进制 5、十进制转八进制 6、十进制转十六进制 三、子网划分 1、IP地址定义 2、IP的两种协…

【二】线控底盘

GB/T 43947-2024 低速线控底盘通用技术要求 线控协议 转向 功能子功能信号描述性能要求分辨率线控转向功能转向控制使能人工切自驾标志位上升沿0-1,有效-线控转向功能转向控制电机输出转向轴的转角。目标方向盘转角范围(deg) -500~500,右负,左正响应延…

easyexcel将csv转为excel处理数字问题

使用easyexcel可以将csv格式的文件转为.xlsx文件,但是csv中有很多数字,比如:"123","12.34","-111",默认情况下会将其作为字符串写入.xlsx文件,就如同下面一样,字符类型的数字…

transformers 阅读:BERT 模型

前言 想深入理解 BERT 模型&#xff0c;在阅读 transformers 库同时记录一下。 笔者小白&#xff0c;错误的地方请不吝指出。 Embedding 为了使 BERT 能处理大量下游任务&#xff0c;它的输入可以明确表示单一句子或句子对&#xff0c;例如<问题&#xff0c;答案>。 …

单元测试之CppTest测试框架

目录 1 背景2 设计3 实现4 使用4.1 主函数4.2 测试用例4.2.1 定义4.2.2 实现 4.3 运行 1 背景 前面文章CppTest实战演示中讲述如何使用CppTest库。其主函数如下&#xff1a; int main(int argc, char *argv[]) {Test::Suite mainSuite;Test::TextOutput output(Test::TextOut…

Vue.js ECharts使用

一、介绍 ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求。ECharts 提供了丰富的图表类型和交互能力&#xff0c;使用户能够通过简单的配置生成各种各样的图表&#xff0c;包括但不限于折线图、柱状图、散点图、饼图、雷…

【Java毕业设计】基于JavaWeb的洗衣店管理系统

文章目录 摘要ABSTRACT目 录1 概述1.1 研究背景及意义1.2 国内外研究现状1.3 拟研究内容1.4 系统开发技术1.4.1 SpringBoot框架1.4.2 MySQL数据库1.4.3 MVC模式 2 系统需求分析2.1 可行性分析2.2 功能需求分析 3 系统设计3.1 功能模块设计3.2 系统流程设计3.3 数据库设计3.3.1 …

[每周一更]-(第100期):介绍 goctl自动生成代码

​ 在自己组件库中&#xff0c;由于部分设计会存在重复引用各个模板的文件&#xff0c;并且基础架构中需要基础模块内容&#xff0c;就想到自动生成代码模板&#xff0c;刚好之前有使用过goctl&#xff0c;以下就简单描述下gozero中goctl场景和逻辑&#xff0c;后续自己借鉴将自…

【uni-app】申请高德地图key,封装map.js,实现H5、iOS、Android通过getlocation获取地图定位信息

文章目录 map组件基础使用封装map.js&#xff0c;实现定位1、使用第三方地图&#xff1a;高德&#xff0c;申请对应平台key1、申请H5 key2、申请微信小程序 key3、申请android key查看证书详情&#xff0c;可以看到SHA1查看/设置Android包名 4、申请ios key 2、封装map1、lib/m…

【阿里YYDS】通义千问正式开源 Qwen2

Qwen2–72B正式开源&#xff0c;性能全面超越开源模型Llama3-70B&#xff0c;也超过文心4.0、豆包pro、混元pro等众多中国闭源大模型。 在过去一段时间里&#xff0c;Qwen系列模型从Qwen1.5升级到Qwen2&#xff0c;Qwen2分5个尺寸&#xff0c;包括Qwen2-0.5B、Qwen2-1.5B、Qwen…

启动信息全掌握,Android 15 重磅 API:ApplicationStartInfo

前言 App 进程启动的时候&#xff0c;开发者很难获悉到本次启动的详细信息&#xff0c;比如&#xff1a; 是冷启动的、暖启动的、还是热启动的&#xff1f;是被 Broadcast 拉起来的、Activity 拉起来的、还是 ContentProvider 拉起来的&#xff1f; 针对这些 pain-points&am…

ssm物流管理系统-计算机毕业设计源码44323

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

解决:DevToolsActivePort file doesn‘t exist的问题

DevToolsActivePort file doesn’t exist 报错信息&#xff1a;解决办法&#xff1a;直接把sandbox禁用了。 chromeOptions.addArguments("--headless"); //设置为 headless 模式 chromeOptions.addArguments("--disable-gpu");//谷歌文档提到需要加上这…