1️⃣ 首先,我们要知道什么是Git?
Git 是一个免费、开源的版本控制系统,它可以有效地跟踪文件的更改,协调多人在同一个项目上的开发,以及管理不同版本的代码。
Git 最初是由 Linus Torvalds 开发的,用于管理 Linux 内核的代码。
使用 Git,您可以将代码库(即代码的集合)保存在 Git 存储库中。
Git 存储库保存了有关代码的完整历史记录,包括所有修改、合并等详细信息。Git 提供了许多强大的功能,例如分支(branch)、合并(merge)、打标签(tag)、撤销更改(revert)、回滚版本(rollback)等。
Git 使用分布式版本控制系统,这意味着每个开发者都有一份完整的代码库副本,可以通过网络与其他开发者交换更改。这种模式可以更好地支持远程协作以及离线开发。
在开发过程中,Git 使开发人员能够掌握代码库的状态,跟踪分支之间的差异,并提供一致的修改历史记录。这使得当代码出现问题时,开发人员可以迅速定位问题、恢复到之前的版本或代码状态。因此,Git 是开发人员必备的工具之一。
2️⃣ 如何来理解版本?
4️⃣ 什么是集中式版本控制?
集中式版本控制(Centralized Version Control)是一种版本控制系统,在这种系统中,所有项目文件的历史记录都存储在一个中央服务器上。开发人员在工作时会从服务器上拉取最新的代码,并将其下载到自己的本地计算机上进行修改。修改后,开发人员将它们提交到中央服务器上,以便其他人可以查看和合并。
这种版本控制系统有一个中央服务器,所有的开发者必须连接服务器才能进行代码的提交、拉取、合并等操作。中央服务器扮演着一个“管理员”的角色,所有修改记录和版本控制信息都存储在服务器上。每个开发者都必须从服务器上检出最新的代码版本,并将自己的修改上传到服务器以进行合并。开发者之间的交流都是通过中央服务器传递的。
集中式版本控制系统的优点在于它们能够有效地管理较小的开发团队,并且易于管理。中央服务器可以控制哪些人有权访问项目,以及他们可以访问的内容。此外,集中式版本控制系统的工具和流程相对简单,易于学习和使用。
但是,集中式版本控制系统也存在一些缺点。最显著的缺点之一是当中央服务器出现故障或网络连接断开时,所有开发者都不能进行代码的提交和拉取,开发工作将完全停滞。此外,由于每个开发者都必须连接中央服务器,这种系统的性能和可扩展性会受到限制,并且在处理分支和合并等复杂任务时可能会遇到问题。
(1)VSS(Visual SourceSafe) 是一个集中式版本控制系统,早期使用非常广泛。
VSS 在处理文件冲突时,使用了添加锁定状态”的方法来解决冲突
在 VSS 中,当一个开发人员想要编辑某个文件时,他或她会在这个文件上添加一个“独占锁定”的状态,这意味着其他开发人员不能编辑该文件,直到该文件被解锁。这就有效地防止了其他开发人员在同一时间对同一文件进行更改,从而避免了文件冲突。
该方法的缺点是,如果某个开发人员忘记解锁文件,那么其他开发人员就无法编辑该文件。如果另一个人急需编辑该文件,则必须联系添加锁定状态的开发人员来解锁它。这也会导致工作流程上的延迟和阻塞。此外,如果多个开发人员需要编辑同一文件,则必须进行多个锁定和解锁过程,这可能会导致更多的延迟和工作阻塞
(2)SVN(Subversion) 是一个集中式版本控制系统,它也提供了一些方法来解决文件冲突。
当多个人对同一个文件进行修改时,SVN 会尝试自动合并这些修改。如果 SVN 可以确定如何合并文件的多个版本,则可以自动完成合并,合并后的结果是一个包含所有修改的新版本。然而,如果修改不能自动合并,则 SVN 将标记这个文件为“冲突状态”,并提示用户手动解决文件冲突。
在冲突状态下,SVN 会为开发人员提供需要合并的文件版本,以及包含开发人员本地更改的文件版本。开发人员可以在两个版本之间进行比较,并手动解决版本之间的不一致之处。在解决冲突后,开发人员将更改提交到服务器上,SVN 将会生成一个新的文件版本,包含开发人员的更改和他们之前手动解决的更改。
除了手动解决冲突,SVN 还提供了锁定机制来避免文件冲突的发生。开发人员在开始编辑文件时可以锁定文件,这样就可以防止其他人在同一时间更改该文件。使用锁定系统可以有效减少文件冲突,但是系统管理员需要确保正确管理锁定,以避免过度限制文件上的访问。
总之,SVN 提供了一些方法来解决文件冲突,包括自动合并和手动解决冲突。与 VSS 不同的是,SVN 的解决方法更加灵活,同时也可以通过锁定来更细粒度地管理文件上的访问。
5️⃣ 什么是分布式版本控制?
分布式版本控制(Distributed Version Control System,简称DVCS) 是一种用于跟踪和管理软件开发中的变更的技术,它可以帮助团队协作开发代码,并跟踪每个版本的变更历史。相比于传统的集中式版本控制系统(Centralized Version Control System,简称CVCS),分布式版本控制可以更方便、更灵活地协作开发,并且在一些情况下能够提供更好的性能和可靠性。
在一个分布式版本控制系统中,每个开发者的本地工作环境都包含了完整的代码库副本,这些副本都是相互独立、相互平等的,没有一份代码库是所有其他代码库的中心。这种分布式的架构让开发者可以离线地对代码进行修改和提交,而不需要连接到中心服务器。开发者之间可以相互推送(push)和拉取(pull)变更,也可以在自己的本地分支(branch)上进行开发和测试。这些分支可以并行存在,不会相互干扰。
常见的分布式版本控制系统包括Git、Mercurial、Bazaar等。这些系统都有各自的特点和优缺点,但总的来说,它们都可以帮助团队更高效、更协同地开发和维护代码。
添加文件
修改文件
删除文件:
在介绍分支操作之前,我们需要了解多人协作的相关内容
(1)对于不同的开发人员开发不同的功能,到最后汇总到一起,我们可以用下面这个图来表示
(2)让我们开发者不在同一个版本库里进行操作,而是创建多个库的副本
接下来我们演示如何通过客户端进行分支的一些相关操作:
当我们创建一个仓库时,默认只有一个分支(此处为 main[可以改名]),对应的是我们的仓库管理者wangwu
分支合并:先切换到我们的 mian 分支,点击 current branch -> 点击下面选择一个分支合并到我们的main分支
重复操作,将oder分支合并到mian分支,此时我们的 main 分支下就有了这两个分支仓库中的内容
如果在合并的多个分支中存在相同的文件怎么办?【分支文件冲突问题】
远程仓库一:GitHub
1️⃣ 登录 github 官网网站
2️⃣ 创建远程仓库 remote-test
3️⃣ 点击 Add file 为我们的仓库添加文件 【此处我们就创建一个 test.txt 内容为 123123】
4️⃣ 点击我们的 test.txt 然后通过右下角的铅笔按钮编辑,来完成文件的修改
7️⃣ 点击Settings 按钮,下拉到最下面,点击删除仓库,输入仓库名确定删除
9️⃣ 通过 File -> Clone a repository
来克隆我们GitHub远程仓库中的项目
远程仓库二:Gitee
2️⃣ 使用我们的 Git 客户端来克隆我们的 Gitee 项目
在克隆启动后会有一个弹窗,让我们输入 Gitee 的账户和密码
3️⃣ 在我们的本地仓库可以通过Publish branch按钮推送到我们的 Gitee 远程仓库
1️⃣ 使用客户端管理工具,可以在我们创建仓库的时候直接生成 README 文件
2️⃣ 客户端文件操作与图标的对应关系
1️⃣ 使用IDEA创建一个普通的Java空项目
2️⃣ 编写一个 a.txt 文件,将IDEA与github连接,然后再将我们的文件发送到远程仓库中
3️⃣ 文件修改后,可以通过 git -> commit Fiel -> Commit and Push 更新我们的远程仓库
4️⃣ 如果我们在远程仓库中修改了文件,可以通过 Git -> Pull 将远程仓库文件下载到本地与本地文件进行合并,就可以实现更新本地文件
5️⃣ 通过IDEA克隆我们GitHub中的项目 Git -> clone -> GitHub -> 选择我们要克隆的项目 【可以修改项目名和本地保存地址】
1️⃣ 创建一个新的空项目,创建文件 a.txt, 搜索插件gitee并安装,插件安装完成后,我们VCS选项下会多一个 Share Project on Gitee
2️⃣ 添加我们的 Gitee 账号 【就是将IDEA与Gitee远程仓库关联起来】
3️⃣ 修改我们本地文件,然后提交到我们本地仓库和远程仓库中
4️⃣ 在远程仓库更新了我们的文件,在IDEA中我们可以通过 Git -> pull 获取到远程文件并更新本地文件
5️⃣ 如果其他开发人员想要使用我们这个远程仓库,也可以克隆到本地
版本号可以在合并的时候避免冲突,也可以定位我们的文件
采用 2 + 38 的形式,前两位是文件夹、后三十八位是文件名
创建一个本地仓库,通过版本号定位到我们的文件
git cat-file -p 版本号
可以用来查看文件内容1️⃣ 通过这些文件我们可以知道与版本号之间的关系:
3️⃣ 修改文件
4️⃣ 删除文件 【我们并没有把文件真正的删除,只是文件状态不再指向我们存储的文件了】
5️⃣ 我们当前的分支是谁,我们 head 中文件地址就是谁
在Git客户端中的对比,就是 工作区域与暂存区进行比对,提交实际分为两步,只不过是被我们的客户端隐藏起来了
git init
初始化仓库,会为我们生成 .git 文件git clone
项目地址 克隆项目,在克隆到本地之前可以起个别名修改我们a.txt文件,然后重新 add commit,然后用 git log --oneline
查看日志
如果我们误删除了,如果这个文件之前已经存贮到了存储区域,我们可以通过git restore 文件名
命令进行恢复【我们以删除 a.txt 文件为例】
我们可以将数据库恢复到包含这个误删文件的时期,但是在这个时期之后的所有操作都会丢失
git reset 版本号
我们还可以将数据库还原到误删操作之前的那个时期
git revert 版本号
此处这个版本号为误删操作的版本号git checkout 分支名
可以切换分支git checkout -b 分支名
直接新建并切换到这个分支 【上面两个操作的结合】git branch -d 分支名
可以删除指定的分支git branch -v
可以查看我们的分支git merge 分支名
与master分支合并
git log 版本号
我们可以查看某个版本号之前的日志git tag 标签名 版本号
标签给当前这个commit起个别名git tag -d 标签名
删除标签git checkout -b addfile
`git remote add 远程仓库名 远程仓库地址
将当前这个本地项目绑定到我们的远程仓库git remote remove 远程仓库名
删除这个绑定git remote rename 远程仓库名 新名
来更改名字1️⃣ 将我们的 gitlab-ce-15.7.0.el7.x86_64.rpm 放到虚拟机中
报错:警告:/opt/module/software/gitlab-ce-15.7.0-ce.0.el7.x86_64.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID f27eab47: NOKEY
错误:依赖检测失败:
policycoreutils-python 被 gitlab-ce-15.7.0-ce.0.el7.x86_64 需要
yum install policycoreutils-python -y
sudo rpm -ivh /opt/module/software/gitlab-ce-15.7.0-ce.0.el7.x86_64.rpm
,成功安装sudo yum install -y curl policycoreutils-python openssh-server perl
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld
# sudo systemctl stop firewalld` 也可以不对防火墙进行设置,我们直接关闭防火墙
curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh
sudo EXTERNAL URL="https://centOS1" yum install -y gitlab-ce
【centOS1是我自己虚拟机的名字】sudo gitlab-ctl reconfigure
初始化5️⃣ 启动 GitLab
# 启动
gitlab-ctl start
# 停止
gitlab-ctl stop
6️⃣ 访问 GitLab