实验八 版本控制
一、实验目的
掌握Git基本命令的使用。
二、实验内容
1.理解版本控制工具的意义。
2.安装Windows和Linux下的git工具。
3.利用git bash结合常用Linux命令管理文件和目录。
4.利用git创建本地仓库并进行简单的版本控制实验。
三、主要实验步骤
1.下载并安装合适的git版本。https://git-scm.com/(注意:已安装或配置完可忽略本步骤或下边相关步骤,教程可参考https://gitee.com/all-about-git)
一、实验准备:安装 Git(Ubuntu 已预装,可跳过)
bash
检查 Git 是否安装
打开终端(Ctrl+Alt+T),输入:
bash
git --version

如果输出类似 git version 2.34.1,说明已安装,直接进入下一步;否则继续安装。
二、实验步骤 3:配置 Git & 初始化仓库
设置用户名和邮箱
bash
bash
git config --global user.name "李海宁" # 你的姓名git config --global user.email "[email protected]" # 你的邮箱

bash
检查配置:
bash
cat ~/.gitconfig # 查看全局配置

检查配置:
bash
cat ~/.gitconfig # 查看全局配置
bash
创建工作目录并初始化仓库
bash
mkdir ~/zhangsangit # 创建目录
cd ~/zhangsangit # 进入目录
git init # 初始化本地仓库

此时目录下会生成隐藏的 .git 文件夹(用 ls -a 查看)。

三、实验步骤 4:创建文件 & 提交入库
bash
创建 4 个文件
touch zs1 zs2 zs3 zs4 # 创建4个空白文件

编写 zs1 脚本(倒序输出参数)
用文本编辑器打开 zs1:
bash
nano zs1 # 或用vim等编辑器
bash
输入以下内容(保存后按 Ctrl+O,回车,Ctrl+X 退出):
bash
#!/bin/bash
echo "倒序参数:$(echo "$" | tr ' ' '\n' | tac | tr '\n' ' ')"
赋予执行权限:
bash
chmod +x zs1
忽略 zs4 文件
创建 .gitignore 文件并添加内容:
bash
echo "zs4" > .gitignore # 直接写入忽略名单
提交到仓库
bash
git add . # 添加所有文件(zs4会被忽略)
git commit -m "首次提交:创建zs1、zs2、zs3,忽略zs4" # 提交并备

四、实验步骤 5:修改文件 & 再次提交
修改 zs1:添加输出当前时间
编辑 zs1,在末尾添加:
bash
echo "当前时间:$(date)"
保存后提交:
bash
git add zs1 # 只添加修改的文件
git commit -m "修改zs1:增加输出当前时间"
修改 zs3:写入当前日期到文件
bash
echo "当前日期:$(date)" > zs3 # 重定向日期到zs3
git add zs3
git commit -m "修改zs3:写入当前日期"

五、实验步骤 6:删除 zs3 & 写入 zs2
删除 zs3 文件
bash
rm zs3 # 删除文件
git rm zs3 # 告诉Git删除该文件(加入暂存区)
写入当前日期到 zs2
bash
echo "当前日期:$(date)" > zs2 # 重定向到zs2
git add zs2
git commit -m "删除zs3,写入日期到zs2"

六、实验步骤 7:恢复 zs3 并改名
恢复 zs3(从历史版本)
先查看历史提交(找到删除 zs3 前的提交 ID):
bash
git log # 记录,例如 abc123
git checkout abc123 -- zs3 # 从历史版本恢复zs3
复制恢复的 zs3 并改名:
bash
cp zs3 zsapple # 复制为zsapple
git add zsapple # 添加新文件
git commit -m "恢复zs3并改名zsapple"
七、实验步骤 8:创建分支 & 修改文件
创建分支并切换
bash
bash
git branch zhangsanbranch # 创建分支
git checkout zhangsanbranch # 切换到新分支
或用简写:git switch -c zhangsanbranch
修改 zs2:追加系统版本信息
bash
echo "系统版本:$(lsb_release -a)" >> zs2 # 追加内容到zs2
git add zs2
git commit -m "分支修改:追加系统版本到zs2"

八、实验步骤 9:合并分支到主分支
切换回主分支(默认是 main 或 master)
bash
git checkout main # 或git switch main
合并分支
bash
git merge zhangsanbranch # 合并分支
如果无冲突,直接完成;若有冲突(后续作业五会用到),按提示解决(见下方作业五示例)。
四、思考题
集中式和分布式版本控制系统有什么区别?各有哪些代表性的工具。
四、思考题
集中式和分布式版本控制系统的区别:
-
数据存储方式
- 集中式:所有版本数据存储在中央服务器(如SVN的Repository),本地仅保存工作副本,不保存完整历史记录。
- 分布式:每个用户本地都有完整的版本库(包括所有提交历史和元数据),无需依赖中央服务器即可进行提交、分支等操作。
-
离线操作能力
- 集中式:必须联网连接中央服务器才能提交代码、获取更新,离线时只能进行本地修改,无法提交或同步。
- 分布式:支持离线操作,所有操作(如提交、分支、合并)均可在本地完成,联网后再与远程仓库同步。
-
分支与协作
- 集中式:分支创建和管理依赖中央服务器,成本较高,协作时容易出现分支冲突,且权限控制较严格(需服务器端配置)。
- 分布式:分支创建轻量(仅本地文件操作),支持并行开发,协作时通过分支合并解决冲突,灵活性更高。
-
容灾与安全性
- 集中式:中央服务器是单点故障,若服务器损坏或数据丢失,可能导致所有历史记录丢失。
- 分布式:每个节点都有完整备份,即使中央仓库损坏,也可从任意一个本地仓库恢复数据,安全性更高。
-
依赖关系
- 集中式:高度依赖中央服务器,网络延迟会影响操作效率。
- 分布式:本地操作优先,网络仅用于同步,对网络环境要求较低。
代表性工具:
-
集中式版本控制系统
- SVN(Subversion):开源、广泛用于企业项目,支持版本控制、事务性提交,但分支管理较繁琐。
- CVS(Concurrent Versions System):早期流行的集中式工具,功能较基础,现已逐渐被SVN取代。
- Perforce(P4):商业软件,适合大型团队和二进制文件管理,权限控制严格。
-
分布式版本控制系统
- Git:开源、目前最流行,支持高效的分支管理、分布式协作,广泛用于GitHub、GitLab、Gitee等平台。
- Mercurial:开源、轻量,语法简洁,适合个人或小型团队,代表项目如Python官方仓库。
- Bazaar:开源、支持分布式和集中式模式,用户友好,曾用于Ubuntu系统开发。
总结
集中式系统适合对权限控制严格、网络环境稳定的场景,而分布式系统因其离线能力、高可靠性和灵活的分支管理,成为现代软件开发的主流选择(如Git占据绝对主导地位)。
作业五
Git当中开启分支后,修改了某文件aa,与此同时主分支也修改了某文件aa,设计实验如何处理这种冲突,最终实现分支的合并。
作业五:处理分支冲突(实验设计)
场景:
bash
主分支(main)和分支(dev)同时修改了文件 aa,需要合并时解决冲突。
步骤:
创建测试文件并提交
bash
echo "初始内容" > aa # 创建aa文件
git add aa && git commit -m "添加aa文件"
创建分支并修改 aa
bash
git branch dev && git checkout dev # 新建dev分支
echo "分支修改:添加一行" >> aa # 修改aa
git commit -a -m "dev分支修改aa"
主分支同时修改 aa
bash
git checkout main # 切回主分支
echo "主分支修改:删除一行" >> aa # 修改aa(与分支冲突)
git commit -a -m "main分支修改aa"
bash
合并分支,触发冲突
bash
git merge dev # 合并时会提示冲突
解决冲突
打开 aa 文件,会看到冲突标记:
plaintext
<<<<<<< HEAD
bash
主分支修改:删除一行
=======
分支修改:添加一行
bash
>>>>>>> dev
删除冲突标记,保留正确内容(例如合并两行),保存后:
bash
git add aa # 标记冲突已解决
git commit -m "解决aa文件冲突" # 提交合并结果
