Git
merge和rebase
merge合并操作,会产生新的提交记录,同时各方历史提交记录将按照实际提交时间线穿插,优点是保留了完整的分支历史,易于分支的发展过程。缺点是如果分支经常合并,可能导致复杂的提交历史。
所以通常用于,合代码到公共分支(master/main)上,可以保留各个分支的独立历史记录,少合并次数,并明确哪些提交是从哪个分支合并而来的。
rebase变基操作,不会产生新的提交记录,同时会将分支上所有的提交记录放到目标分支的最末端,优点是更加线性、简洁的提交历史,便于追溯和理解更改,缺点是不谨慎使用,可能会导致提交历史的重写。
所以通常应用合代码到不那么重要的个人分支上,这样可以保持个人分支的提交历史干净整洁,没有多余的合并提交,便于后续代码审查和版本控制管理。
常用命令
git init:初始化 git 仓库。
git add:添加文件或目录到暂存区。
git commit:创建一个新的提交。
git status:查看工作区状态。
git log:查看提交日志。
git branch:查看、创建和删除分支。
git checkout:切换分支或恢复文件。
git merge:合并分支。rebase变基
git pull:从远程仓库拉取变更。
git push:将变更推送到远程仓库。
Git Flow
Gitflow 工作流程使用两个及以上并行的、长期运行的分支来记录项目的历史记录,帮助团队更好的协作和维护项目
分支类型有以下几种:
-
*主分支(Master Branch):代表生产就绪的代码,通常是稳定且经过测试的版本。
-
*开发分支(Develop Branch):作为开发的基础,所有的新功能和修复都在此分支上进行。
-
*功能分支(Feature Branches):从开发分支上分叉出来,用于开发新功能。
-
发布分支(Release Branches):从开发分支分叉出来,用于准备新版本的发布。
-
修复分支(Hotfix Branches):从主分支分叉出来,用于修复紧急问题。
再了解
-
官方定义
- Git 是一个分布式版本控制系统,用于高效地处理从很小到非常大的项目版本管理。它可以记录文件的修改历史,跟踪文件的变化,方便团队成员协作开发,并且能够在需要时恢复到之前的版本。
-
主要特点
- 分布式架构:与传统的集中式版本控制系统不同,Git 是分布式的。这意味着每个开发者的本地仓库都是一个完整的版本库,包含了项目的完整历史记录。这种架构使得开发者可以在本地进行版本控制操作,如提交、分支管理等,无需依赖中央服务器,并且即使中央服务器出现故障,本地仓库仍然可以正常工作。
- 速度快且高效:Git 在本地操作时非常快速。它通过对文件内容进行哈希计算来识别文件的变化,而不是比较文件的修改时间或文件名。这种方式使得 Git 能够快速地检测出文件的新增、修改和删除等情况。同时,Git 在存储文件版本时采用了一种高效的压缩算法,减少了仓库的存储空间占用。
- 强大的分支管理:Git 提供了强大的分支功能。分支可以理解为独立的开发线,开发人员可以轻松地创建、切换和合并分支。这使得团队可以同时进行多个功能的开发,或者针对不同的发布版本进行维护,而不会相互干扰。例如,可以为新功能开发创建一个分支,在该分支上进行开发、测试,当功能完成后再将其合并到主分支。
- 数据完整性保证:Git 使用哈希算法(如 SHA - 1)来确保数据的完整性。每个提交(commit)都有一个唯一的哈希值,这个哈希值是根据提交的内容(包括文件内容、作者信息、提交信息等)计算得到的。通过哈希值可以验证提交的内容是否被篡改,并且在传输过程中如果数据出现损坏,Git 可以通过哈希值检测到并报错。
-
主要用途及作用
- 代码版本管理:在软件开发过程中,Git 用于记录代码的每一次修改,包括修改的内容、时间、作者等信息。开发人员可以随时查看代码的历史版本,了解代码的演变过程。如果在开发过程中出现问题,可以方便地回滚到之前的某个稳定版本。
- 团队协作开发:方便团队成员之间的协作。多个开发人员可以同时在一个项目上工作,通过克隆(clone)中央仓库,在各自的本地仓库进行开发,然后将自己的修改推(push)送到中央仓库,或者从中央仓库拉(pull)取其他成员的修改。Git 能够有效地处理合并冲突,当不同成员对同一文件的同一部分进行不同的修改时,Git 会提示合并冲突,并提供工具帮助解决冲突。
- 项目发布管理:可以利用 Git 的分支和标签(tag)功能来管理项目的发布。例如,可以为每个发布版本创建一个标签,标记该版本对应的代码状态。同时,通过分支来维护不同阶段的开发,如开发分支、测试分支、生产分支等,确保项目的发布过程有序进行。
-
主要原理
- 快照式存储:Git 将项目的每个版本看作是一个完整的快照。每次提交时,Git 会对整个项目的文件状态进行打包存储,而不是只存储文件的差异。这种快照式存储方式使得恢复到任意版本都非常方便,因为每个版本都是独立完整的。
- 哈希索引:如前面提到的,Git 使用哈希算法为每个对象(包括提交、文件、树等)生成一个唯一的哈希值。这些哈希值就像对象的身份证一样,通过哈希值可以快速定位和检索对象。在 Git 仓库中,所有的对象都是通过哈希值进行索引和存储的,这保证了数据的完整性和高效的检索。
- 对象模型:Git 内部有一套复杂的对象模型,包括提交对象(commit)、树对象(tree)和文件对象(blob)。提交对象记录了每次提交的元信息,如作者、日期、提交信息等,以及指向树对象的指针。树对象则记录了项目的目录结构和文件的引用关系,文件对象存储了文件的实际内容。这种对象模型使得 Git 能够清晰地记录项目的版本历史和文件结构。
-
主要流程
- 仓库初始化:使用
git init
命令在本地创建一个新的 Git 仓库。这个仓库将用于存储项目的版本信息。 - 添加文件到暂存区:通过
git add
命令将需要纳入版本控制的文件添加到暂存区。暂存区是一个中间区域,用于准备下一次提交的文件。 - 提交文件:使用
git commit
命令将暂存区的文件提交到本地仓库。在提交时,需要提供一个提交信息,描述本次提交的内容。 - 克隆仓库:如果是团队协作,开发人员可以使用
git clone
命令从远程仓库(如 GitHub、GitLab 等平台上的仓库)克隆一份本地副本,这样就可以在本地进行开发了。 - 推送和拉取修改:在本地开发完成后,使用
git push
命令将本地仓库的修改推送到远程仓库,与其他团队成员共享。同时,使用git pull
命令从远程仓库拉取其他成员的修改,保持本地仓库与远程仓库的同步。 - 分支操作:使用
git branch
命令创建、查看和删除分支。例如,git branch new - feature
可以创建一个名为new - feature
的新分支。使用git checkout
命令切换分支,如git checkout new - feature
可以切换到新创建的分支上进行开发。当分支开发完成后,可以使用git merge
命令将分支合并到其他分支,如将new - feature
分支合并到主分支。
- 仓库初始化:使用
-
与主流技术的相似性和区别
- 与 Subversion(SVN)相似点和区别
- 相似点:都是用于版本控制的工具,都可以记录文件的修改历史,方便团队协作和项目管理。
- 区别:SVN 是集中式版本控制系统,它依赖于中央服务器来存储版本库。而 Git 是分布式的,每个本地仓库都是完整的。在分支管理方面,Git 的分支操作更加灵活和轻量级,创建和切换分支非常快速,而 SVN 的分支相对来说比较复杂。另外,Git 可以离线工作,因为本地仓库包含了完整的版本信息,而 SVN 在没有连接到中央服务器时,功能会受到很大限制。
- 与 Mercurial 相似点和区别
- 相似点:Mercurial 也是一种分布式版本控制系统,和 Git 在很多功能上相似,如都有本地仓库、克隆、推送和拉取操作,也都支持分支管理。
- 区别:在内部实现和一些细节操作上有所不同。例如,Git 使用快照式存储和哈希索引的方式更加复杂但功能强大,Mercurial 在存储和索引方面有自己的特点。在命令行使用上,两者的命令和参数也有一些差异,但总体目的都是为了进行版本控制。在社区支持和生态系统方面,Git 相对来说更广泛,有更多的工具和平台支持。
- 与 Subversion(SVN)相似点和区别