简介
什么是Git?
Git是一个开源的分布式版本控制系统,用于跟踪代码的改变和协同开发。它最初由Linus Torvalds为了管理Linux内核开发而创建,现已成为开源软件开发中最流行的版本控制系统,没有之一。Git允许多人同时在不同的分支上工作,并能够合并不同的分支和代码版本。它具有高效的性能、灵活的分支管理和强大的合并工具,为多人协作开发团队提供了一种可靠的方式来协同开发和管理代码。Git还提供了本地版本控制,使开发人员可以在没有网络连接的情况下进行工作,并能够轻松地回溯和撤销代码更改。
版本控制系统(VCS)的历史和发展
回顾VCS的发展历程,总体上可以划分为三个阶段。
第一代VCS,包括SCSS和RCS。立足于对单个文件变化的跟踪,检出的文件一次只能由一个用户在本地进行编辑,用户通过自己的帐户登录到同一共享Unix主机方式实现。
第二代VCS,包括CVS和SVN。通过引入网络,从而形成了包含正式意义上的项目版本的集中式版本存储库。相比第一代VSC,有了实质性的发展,可以供多个用户同时检出并使用代码,但是他们都需要重新提交到同一中央存储库。存在的问题是严重依赖于中央存储库,对网络和实时性同步要求很大。
第三代VSC,包括Git和Mercurial。到现在发展成为了分布式VCS。在分布式VCS中,创建存储库的所有副本都是相同的,无需一个集中的中央存储库。无需通过网络实时同步内容,只需本地创建提交,分支和合并打开了路径,在合适时候再推送到远端库。
纵观历史,SVN和Git是VCS发展史上最具代表性的两大杰作。从功能上来讲,它们基本上是一致的。最大的区别在于:
- SVN是集中式版本管理系统,很多操作都需要依赖网络,使的它的发展受到了极大的约束。
- Git属于分布式版本管理系统,代码仓库拉取到本地之后,本地即保存了远程仓库的所有信息,包括所有分支、所有tag、所有commit,简单说本地仓库就是远程仓库的一个镜像,这就使的它的很多操作可以脱离网络在本地实现。
随着VCS的持续发展,Git已经一家独大,现已成为开源软件开发中最流行的版本控制系统,没有之一。所以学习版本控制,只需要学习Git就可以了。掌握了git的精髓,即使因为一些历史原因还需要去访问一些svn仓库,那也可以基于git的思想和经验,快速掌握svn的常见命令,甚至可以直接使用Git官方提供的git-svn工具(Git - git-svn Documentation)来操作svn。
Git的优势和用途
Git具有以下几个优势:
- 分布式版本控制:Git是一种分布式版本控制系统,每个开发者都拥有完整的代码仓库的副本。这意味着即使没有网络连接,开发人员仍然可以进行工作,并且可以轻松地与其他开发者进行代码合并和共享。
- 高效性能:Git的设计目标之一是提供高效的性能。Git使用了一些优化策略,如快速的提交和检出操作,以及**仅存储差异的方式(增量而非全量)**来减少存储空间。这使得Git能够处理大型项目和大量的代码变更,而不会造成性能问题。
- 强大的分支管理:Git的分支管理功能非常强大,允许开发人员创建和切换分支,独立开发新功能或修复bug,而不会影响主线代码。分支合并也非常容易,可以轻松地将不同分支的代码合并到一起。
- 版本控制和回溯能力:Git能够跟踪代码的每一次改动,并保留完整的历史记录。这使得开发人员可以轻松地回溯到任何一个特定版本的代码,并查看相关变更和提交信息。这对于排查问题、修复bug和进行代码审查非常有帮助。
- 丰富的生态系统:Git拥有庞大的开源社区和丰富的生态系统,有许多第三方工具和服务可供选择,如GitHub、GitLab和Bitbucket等。这些工具和服务提供了代码托管、协作开发、问题追踪和持续集成等功能,可以帮助开发人员更好地利用Git进行项目管理和协同开发。
Git的主要用途包括:
- 代码版本控制:Git最初是为了管理Linux内核开发而创建的,因此它被广泛用于软件开发中的代码版本控制。开发人员可以使用Git跟踪代码的变化、管理不同的代码分支,并轻松地进行合并、回溯和撤销代码的更改。
- 协同开发:Git的分布式特性使得多个开发人员可以同时在不同的分支上工作,并能够方便地合并彼此的代码变更。开发人员可以通过Git来协同开发新功能、修复bug,并通过代码审查来提高代码质量。
- 开源项目管理:Git被广泛应用于开源软件项目的管理。开源项目通常有许多贡献者,需要一个可靠的和高效的版本控制系统来管理代码的变化和合作开发。Git提供了强大的分支管理和合并功能,使得开源项目能够更好地组织和管理代码。
- 文档管理:Git不仅可以用于代码管理,还可以用于文档管理。开发人员可以使用Git来跟踪文档的变化、协同编辑和合并文档的改动。这对于团队合作编写文档、制定规范和撰写技术文档非常有帮助。
总之,Git是一个功能强大的版本控制系统,可以帮助开发人员更好地管理代码,提高协同开发效率,并保证代码的可追溯性和质量。
Git涉及的基本概念
仓库(repository)
Git三大本地工作区域之一,仓库就是Git的数据库,所有数据文件都存储在.git/目录下,Git使用仓库来存储代码和版本历史记录。仓库可以是本地的,也可以是远程的。本地仓库是存储在开发人员的计算机上,而远程仓库是存储在网络服务器上,用于协同开发和代码共享。
工作目录(Working Directory)
Git三大本地工作区域之一,指的是平时我们用来存放项目文件,看得见文件,打得开文件、改得了文件的地方。不管是本地创建的仓库还是从远程地址拉取下来的仓库,只要后面涉及文件的增删改,首先都是在工作区完成的。
暂存区(Stage/Index)
Git三大本地工作区域之一,它是介于工作区和仓库之间的一个临时区域,用来临时存放改动。本质上它只是一个特定格式的二进制文件(.git/index),主要保存即将提交到仓库里的文件列表等信息。git add命令的作用就是将工作目录中改动的文件添加到暂存区。
远程仓库(remote)
也是Git的一个重要工作区域,只是它是存储于网络服务器上的Git仓库,用于协同开发和远程代码共享。开发人员可以将本地仓库推送到远程仓库,也可以从远程仓库中拉取代码更新。常见的远程仓库服务有GitHub、GitLab、Gerrit等。
提交(commit)
提交是Git中记录代码变更的基本单位。每次对代码的修改都可以通过提交来保存和描述,包括修改的内容、作者、时间戳等信息。提交将代码的状态从未提交状态转换为已提交状态,从而使得代码变更可追溯和回溯。
HEAD指针
HEAD是Git中的一个特殊指针,它通常指向当前分支的最新提交。每当执行git commit或git checkout之类的操作时,HEAD引用的位置都会发生变化,这些变化过程会被记录在**.git/logs/HEAD**文件中。这样,Git就能够追踪HEAD引用的历史变化,从而能够回滚到之前的状态或执行其他与版本控制相关的操作。
文件状态
在Git中,文件主要有四种状态:
- Untracked:文件未被跟踪,这意味着文件存在于工作目录中,还没有跟git产生任何关联,因此不参与版本控制。如果要将文件添加到Git库,可以使用git add+git commit命令。
- Unmodified:文件已经被提交进git仓库,并且从最后一次提交以来未进行修改。这意味着git仓库中的文件与工作目录中的文件完全一致。如果文件被修改,它将变为Modified状态。如果文件被从版本库中移除,它将回到Untracked状态。
- Modified:文件已修改,但尚未进行其他操作。这意味着文件已经被修改,但改动尚未被提交到git库。可以通过git add命令进入暂存(staged)状态,然后再使用git commit命令将其提交到git仓库。或者通过git checkout命令将修改丢弃掉,使文件回到Unmodified状态。
- Staged:文件已经被添加到暂存区,准备被git commit命令提交到git仓库中。提交到git仓库之后,git仓库中的文件和本地文件将再次保持一致。
分支(branch)
分支是Git中独立存在的代码副本。开发人员可以创建和切换分支,以独立开发新功能或修复bug,而不会影响主线代码。分支可以并行地进行开发,并能够轻松地合并到其他分支或主线代码中。
合并(merge)
合并是将不同分支或代码版本的变更合并到一起的操作。当开发人员完成某个分支上的工作后,可以将该分支的代码合并到其他分支或主线代码中,以集成新的功能或修复到整体代码中。
标签(tag)
标签用于给特定的提交打上有意义的标记,如版本号或发布版本等。标签可以帮助开发人员快速定位和回溯到特定的版本的代码,方便版本发布和维护。
引用(ref)
引用(reference)本质上是一个指向某个提交对象(commit)的指针或别名。Git 使用引用来快速定位和访问存储库中的特定提交。引用通常存储在.git/refs
目录下,该目录下又包含了不同类型的子目录,如heads/
、tags/
和remotes/
,分别对应不同类型的引用:分支引用(Branch References)
、标签引用(Tag References)
、远程引用(Remote References)
。
以上是Git的基本概念,它们共同构成了Git的核心功能和特性,帮助开发人员进行代码版本控制、分支管理和协同开发。
git适合管理哪些文件
最适合哪些?
纯文本文件:txt
源代码文件:c、cpp、java、py、js等一切纯文本格式的源代码文件
项目文档:md等格式
不适合哪些?
1、doc、exe、elf、db、二进制数据等带有一定格式的非纯文本可读文件。
问题:无法diff,任何改动都只能更新整个文件,无法做到增量式更新
解法:将文档转化为markdown格式使用git来维护、文档使用语雀等知识库进行维护、其他二进制文件如果必须放在git,考虑git-lfs替代
2、大文件。
问题:不能把git仓库当网盘使用,容量有限&拖慢性能
解法:网盘、云存储(比如阿里云oss、腾讯云cos等)、考虑git-lfs替代
参考资料
- SVN,GIT版本控制系统简史
课后习题
- (单项选择题)目前开源软件开发中最流行的版本控制系统是哪个?_____
A. RCS
B. SVN
C. GIT
D. Mercurial
- (单项选择题)以下哪项不是Git的基本概念?____
A. 仓库
B. 分支
C. 引用
D. 元数据
- Git中的HEAD指针指向哪里?____
A. 指向所有分支中最新的一次提交
B. 指向当前分支的最新一次提交
C. 指向当前分支的第一次提交
D. 指向最近一次被git add的文件
- (不定项选择题)Git中文件状态有哪些?____
A. Untracked
B. Unmodified
C. Modified
D. Staged
- (不定项选择题)Git的本地工作区域有哪些?____
A. 仓库
B. 工作目录
C. 远程仓库
D. 暂存区
- (不定项选择题)以下哪个是Git的优点?_____
A. 集中式版本管理系统,需要依赖网络运行。
B. 分布式版本管理系统,代码仓库拉取到本地之后,本地即保存了远程仓库的所有信息,可以脱离网络查看本地的改动和其他分支的提交。
C. Git的分布式特性使得多个开发人员可以同时在不同的分支上工作,并能够方便地合并彼此的代码变更。
D. Git可以当做网盘使用,用来备份手机拍的照片。