1.0 前言

1.1 何为分布式版本管理?

在探讨什么是分布式版本管理前,我们先了解什么是版本管理系统:版本管理系统(Version Control System,VCS)是一种帮助软件开发者管理代码变更的工具。它记录了项目文档或源代码文件的所有修改历史,允许团队成员查看项目的任何版本、恢复到以前的状态,或者在不同版本之间进行比较。这有助于提高开发效率,确保即使在多人协作时也能保持工作的组织性和可追踪性。

而在了解了何为版本管理系统之后,现在主流的版本管理系统大致可以分为两类:集中式和分布式。

集中式版本控制系统(Centralized Version Control Systems, CVCS)如Subversion (SVN),有一个单一的服务器存放所有的版本数据,客户端从这个中心仓库拉取最新代码,并提交更新回服务器。它的优点是简单直接,但缺点是一旦服务器出现问题,可能会导致无法访问历史版本。

分布式版本控制系统(Distributed Version Control Systems, DVCS)如Git,没有单一的中心仓库;相反,每个用户的工作副本也是一个完整的仓库,包含了全部的历史版本信息。这意味着即使没有网络连接,开发者也可以提交更改、查看历史记录等。DVCS提供了更高的灵活性和可靠性,因为数据分布在多个节点上,减少了单点故障的风险。

1.2 在项目中引入版本管理的好处

通常在开发项目的时候,事由团队若干人配合完成的,而团队内不同开发者之间的项目版本不一,在统一开发进度和成员互相交流之间都是一件麻烦的事情,版本管理系统提供了若干功能,极大的提升了协作开发效率:

  • 历史记录和回滚:版本控制系统记录了每一次变更的详细信息,包括谁做了更改、何时做的更改以及为什么做这些更改(通过提交消息)。如果最新代码出现了问题,可以方便地回滚到之前的稳定版本。
  • 分支管理:开发者可以在不影响主线(主分支)的情况下创建新的分支进行功能开发、实验或错误修复。这使得多个开发者可以同时在一个项目上工作而不会相互干扰,并且在完成工作后可以将分支合并回主线。
  • 协同工作:允许多个开发者同时处理同一项目的不同部分,并且能够有效地合并各自的工作。这样大大提高了团队合作的效率,减少了由于代码覆盖或丢失所造成的风险。
  • 版本控制和发布管理:帮助团队更好地组织软件的开发周期,明确区分哪些功能属于哪个版本,便于规划发布计划。同时,在需要时可以快速定位并恢复特定版本的代码。
  • 提高代码质量:通过代码审查(Code Review)等实践,鼓励团队成员之间互相检查代码,有助于发现潜在的问题,提高整体代码质量。
  • 备份和恢复:版本控制系统本身也是一种形式的备份机制。即使本地环境出现问题,也可以从远程仓库中恢复项目的所有历史版本。

2.0 Git 配置

在正式使用 Git 进行版本控制之前,需要先对其进行配置;Git 提供了一个命令 git config 其可以用来配置和读取对应的工作环境变量,这些环境变量决定了 Git 在各个环节的具体工作方式和行为。

2.1 用户信息

配置用户名称和电子邮件地址,方便在每次提交代码时记录提交者的信息。

git config --global user.name "JRNitre"
git config --global user.email "email@email.com"

使用该 config 命令即可配置用户名和电子邮件地址,其中通过增加 --global 命令可以使当前配置作用于全局,反之配置则会仅对当前 Git 仓库生效。

2.2 文本编辑器

Git 默认使用的文本编辑器是 Vi 或者 Vim,可以通过如下命令进行配置。

git config --global core.editor "code --wait"

2.3 差异分析工具

此部分复制于 菜鸟教程

还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:

git config --global merge.tool vimdiff

Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息。

当然,你也可以指定使用自己开发的工具。

2.4 查看配置信息

使用 git config --list 命令查询:

2.5 生成 SSH 密钥

如果你需要通过 SSH 对远程进行 Git 操作,可是生成 SSH 密钥并添加到你的 Git 托管服务中。

ssh-keygen -t rsa -b 4096 -C "email@email.com"

3.0 创建 Git 仓库

3.1 git init 初始化

Git 的大部分命令需要在 Git 仓库中进行,在想要创建仓库的目录内使用 git init 命令初始化一个仓库。

或者指定需要创建仓库的目录 git init neorepo

初始化后,目标目录下会出现一个名为 .git 的目录(默认系统状态不显示),Git 的所有资源和数据都存储在这个目录中。

3.2 git clone 从现有的仓库中拷贝

git clone <repo>

这里的目录也可以是远程仓库目录:

git clone git://github.com/xxx/xxx.git

如果需要克隆至指定的目录 <directory>

git clone <repo> <directory>

4.0 Git 的提交与修改

4.1 git add 将文件纳入版本控制系统

通过 git add 指定需要的文件,即可将文件纳入版本控制系统中,此时 Git 会追踪这些文件的变化。

git add *.c
git add README.md

git add 命令可以一次提交多个文件到暂存区中:

git add file1 file2

或者添加指定目录到暂存区:

git add [dir]

或者直接将当前目录下所有文件添加到暂存区中:

git add .

4.2 git commit 提交暂存区文件到本地仓库

在添加需要纳入版本控制系统的文件后,使用 git commit 命令即可提交到仓库中。

git commit -m [message]

这里的 [message] 可以是一些信息。

在 Linux 中提交信息使用单引号,Windows 中使用双引号。

还可以指定文件进行提交:

git commit [file1] [file2] -m [message]

通过 -a 参数可以跳过 git add 直接提交修改:

git commit -a

4.3 git status 查看仓库状态

使用 git status 命令可以查看仓库状态,其可以查看到距离上次提交后是否有文件修改。

通过追加 -s 命令可以获得更简短的输出。

4.4 git reset 回退版本

如果当前版本的开发出现了问题等,需要回退到版本库中指定的版本时,可以使用 git reset 命令回退至指定的版本。

git reset [--soft&--mixed&--hard] [HEAD]

其中 --mixed 为默认参数可以不加,这类参数功能我们先按下不表,通常可以如下方法使用该命令:

# 回退到上一个版本
git reset HEAD^
# 回退指定文件到上一个版本
git reset HEAD^ hello.md
# 回退到指定版本
git reset 052e

其中默认的 --mixed 参数意为:用于重置暂存区的文件与上一次提交保持一致,工作区文件内容保持不便。

4.4.1 --soft 参数

而通过 --soft 命令可以回退到指定的提交版本,它仅对提交历史(commit)有影响、,不会影响当前工作区的文件;例如在从工作区向暂存区提交代码后,此时如果新增加了文件,并且发现了某一次 commit 的内容发现了错误需要修改则可以使用 --soft 命令:

如下,创建了 3 个文件并且提交三次:



此时如果增加了第四个文件并且发现第二次提交的文件有问题需要修改,此时可以使用 git reset --soft 进行版本回退:

git reset --soft [版本号]



此时提交状态便回到了第二次提交的状态中,对文件进行修改并再次提交:

--soft 的根本作用相当于告诉 HEAD 指针移动到指定的版本,并对其进行修改,后续的提交是基于此版本的新分支。

5.0 Git 分支管理

Git 的分支实际上是指向快照的指针,通过分支系统,可以在不干扰主线的同时进行开发。

5.1 git checkout 基本分支管理

5.1.1 切换分支

通过基本的 checkout 命令即可实现不同分支之间的切换:

git checkoout <branchName>

当切换了不同的分支后,git 会自动将工作目录替换为切换的分支最后提交的快照。

5.1.2 -b 创建分支

通过 -b 参数,可以创建一个分支:

git checkout -b <branchName>

5.2 git branch 查询分支

5.2.1 git branch 查询所有分支

通过基本的 branch 命令即可查询当前仓库的所有分支:

git branch

5.2.2 -r 查询远程分支

git branch -r

5.2.3 -a 查询所有本地分支和远程分支

git branch -a

5.3 git branch 删除分支

5.3.1 -d 删除本地分支

git branch -d <branchName>

5.3.2 -D 强制删除未合并的分支

git branch -D <branchName>

5.3.3 删除远程分支

git push origin -delete <branchName>

5.4 git merge 合并分支

将指定的分支合并至当前分支:

git merge <branchName>

解决合并冲突 [待编写]

6.0 Git 远程仓库操作

6.1 添加远程仓库

通过 remote 命令,可以指定一个简短的名字用于替代远程仓库地址。

git remote add [shortName] <url>

6.2 查看当前正在使用的远程仓库

git remote

加上 -v 命令可以查询到每个别名所对应的链接地址。

git remote -v

使用 remove 可以删除已有的远程仓库地址。

git remote remove <name>

6.3 提取远程仓库

6.3.1 git fetch 从远程仓库下载新分支与数据

git fetch

6.3.2 git merge 从远程仓库提取数据并尝试合并到当前分支

git merge

6.3.3 实际操作中两指令的用法

通常,想在已经配置好的远程仓库中获取数据,可以首先执行 git fetch 获取本地没有的资源,然后使用 git merge 将更新合并到当前分支。

6.4 git pull 推送远程分支

git pull [shortName] [branchLocel]:[branchServer]

上述命令可以将本地指定分支推送到远程指定分支。

X.0 Git 其他命令用法

END 声明

文章参考菜鸟教程 | Git

其他参考网址/附件下载

文章声明

  • 文章部分内容采用 AI 辅助生成