Git 是一个免费、开源的分布式版本控制系统,最初由 Linus Torvalds 于2005年创建。它旨在管理项目的源代码,并提供了跟踪更改、协作开发、版本控制、分支管理等功能。
一、版本控制概念
版本控制系统(Version Control System,VCS)是一种用于管理项目文件和源代码版本的软件工具。它记录了文件的历史更改,并允许开发者查看、比较和恢复不同版本的文件。
1、版本追踪:版本控制系统跟踪文件的所有更改,并记录每个版本的详细信息,如修改人、时间、提交注释等。这使得开发者可以了解每个文件的历史更改记录。
2、并行开发:多个开发者可以同时在同一个项目上进行工作,每个人都可以在独立的分支上进行修改,然后将更改合并到主分支中。这样可以提高团队的协作效率。
3、版本回滚:版本控制系统允许开发者轻松地回滚到之前的任何版本,即使在文件被意外修改或删除后也可以恢复到之前的状态。
4、分支管理:版本控制系统支持创建和管理分支,开发者可以在不影响主线开发的情况下进行特性开发、bug 修复等工作。这使得开发过程更加灵活和可控。
5、协作开发:版本控制系统提供了一种方便的方式来协作开发项目。开发者可以共享代码库,并通过提交和合并请求来协作开发、审查代码,方便多人合作开发项目。
6、备份和恢复:版本控制系统充当了项目的备份工具,可以确保项目的所有历史版本都得到了保存。即使出现了数据丢失或损坏的情况,也可以通过版本控制系统来恢复数据。个人开发时也可以存多个版本log,用于备份恢复。
7、跟踪变更:版本控制系统可以记录每个文件的详细更改,包括新增、修改和删除操作。这使得开发者可以了解每个文件的修改历史,方便进行代码审查和错误排查。
二、git的工作原理
Git 的工作原理涉及到几个重要的概念和组件,包括仓库(Repository)、对象数据库(Object Database)、索引(Index)和分支(Branch)。下面是 Git 的工作原理的简要介绍:
2.1 仓库(Repository)
Git 将项目的所有文件和历史版本存储在一个称为仓库的目录中。每个仓库包含项目的完整历史记录和所有文件的当前状态。
Git 仓库通常分为本地仓库
(Local Repository)和远程仓库
(Remote Repository)两种类型。
本地仓库 :本地仓库是存储在本地计算机上的 Git 仓库副本。它包含了完整的项目历史记录、分支、提交等信息。本地仓库通常用于开发人员在本地进行代码的修改、提交、版本控制等操作。您可以在本地仓库中创建分支、合并分支、提交更改等操作,所有这些操作都不需要网络连接,而是在本地进行的。
远程仓库:远程仓库是存储在远程服务器上的 Git 仓库副本。它用于多个开发人员之间共享和协作代码,并作为代码的中央存储库。远程仓库通常托管在代码托管平台(如 GitHub
、GitLab
、Gitee
等)或者公司内部的 Git 服务器上。开发人员可以将本地仓库中的更改推送(push)到远程仓库,或者从远程仓库拉取(pull)最新的代码更改。
2.2 对象数据库(Object Database)
在 Git 中,对象数据库(Object Database)是一个存储 Git 版本库中所有数据对象的重要组成部分。它通常位于 .git/objects
目录下。
Git 中的对象是指存储在版本库中的数据实体,主要包括以下几种类型的对象:
1、Blob 对象(文件内容对象):
Blob 对象存储的是文件的内容。在 Git 中,每个文件的内容都被存储为一个 Blob 对象。Blob 对象通过 SHA-1 校验和
来标识,并且它们是不可修改的,即一旦创建就不能修改。
2、Tree 对象(目录对象):
Tree 对象存储的是文件和子目录的列表以及它们的权限和文件名等信息。每个提交对象都包含一个指向根 Tree 对象的引用,通过 Tree 对象可以构建整个目录结构。
3、Commit 对象(提交对象):
Commit 对象包含了一次提交的元数据信息,包括作者、提交者、提交时间、提交信息等。每个提交对象都包含一个指向对应的 Tree 对象的引用,以及可能存在的一个或多个父提交对象的引用(如果是合并提交的话)。
$ git log# commit 8c99d09c27215262526763862d44626ccd7c5875 (HEAD -> master)# 上面这串数字是提交对象的哈希值
- Tag 对象(标签对象):
Tag 对象用于给某个特定的提交打标签,标识出一个重要的里程碑或版本号。Tag 对象通常包含了标签名称、标签信息、标签创建者等信息,以及指向被标记的提交对象的引用。
这些对象被存储在 Git 的对象数据库中,每个对象都有一个唯一的 SHA-1 校验和作为其标识符。Git 使用对象数据库来管理和存储所有的项目数据,包括文件内容、目录结构、提交历史等。
对象数据库是 Git 版本控制系统的核心组件,它提供了高效的数据存储和检索功能,确保了版本库的完整性和可靠性。
2.3 索引(Index):
索引是一个暂存区域
,用于存储当前工作目录中的更改,记录了当前工作目录中文件的状态和更改,但尚未提交到仓库中。索引是一个中间状态,介于工作目录和仓库之间。
当对文件进行修改并使用 git add
命令将这些更改添加到索引中时,Git 会根据文件的路径和内容生成一个校验和(checksum)来标识这些更改,用于确定文件内容是否发生了变化。
当执行 git commit
命令时,Git 会使用当前索引中的文件状态创建一个新的提交对象,并为该提交对象分配一个唯一的 SHA-1 校验和
作为其标识符。因此,每个提交对象都有一个唯一的 ID。
索引与当前工作目录和提交历史相关联,用于暂存和准备提交更改。提交对象具有唯一的标识符,用于标识每次提交的内容。
2.4 分支(Branch):
在 Git 中,分支(Branch)是指向 Git 仓库中的一个提交对象
的可变指针。它实际上是一个轻量级的指针
,指向了项目提交历史中的某一个提交对象。分支可以看作是一系列提交的引用,它们按照提交顺序形成了一个分支的历史记录。
每个分支都有一个名称,可以通过这个名称来引用分支。在 Git 中,默认的主分支通常被称为 "master"
分支,但也可以根据项目需求自定义其他名称的分支。分支名称通常用来表示项目的不同功能特性、开发版本或者修复补丁等。
分支在 Git 中扮演了重要的角色,它们提供了一种轻松管理和组织项目开发的方式。通过分支,可以实现以下功能:
1. 并行开发:多个开发人员可以在不同的分支上同时进行工作,而不会相互干扰。
2. 功能开发:每个功能特性可以在独立的分支上进行开发,便于管理和跟踪功能的开发进度。
3. 版本控制:每个版本或发布可以在单独的分支上进行管理,使得可以方便地回溯历史版本或发布新版本。
4. 修复补丁:可以在分支上快速创建和提交修复程序,然后合并到主分支中。
5.实验性开发:可以在单独的分支上进行实验性的开发,不影响主分支或其他稳定分支。
分支的创建、切换、合并和删除等操作都可以通过 Git 提供的命令轻松完成。分支是 Git 版本控制系统中一个非常强大和灵活的特性,它使得团队能够更加高效地进行协作开发,并且更好地管理和组织项目的开发流程。
三、git的基本操作
Git 的基本操作涉及到对仓库的创建、配置、文件的添加、提交、查看状态、查看历史记录等操作。下面是一些常见的 Git 基本操作及其用法:
1. 初始化仓库:
git init
:在当前目录创建一个新的 Git 仓库。git clone <remote-url>
:从远程仓库克隆一个新的仓库到本地。
2. 配置用户信息:
git config --global user.name "Your Name"
:配置全局用户名。git config --global user.email "your.email@example.com"
:配置全局用户邮箱。
3. 添加文件:
git add <file>
:将指定文件添加到索引中。git add .
:将当前目录下所有文件添加到索引中。
4.提交更改:
git commit -m "Commit message"
:将索引中的更改提交到本地仓库,并附上提交信息。git commit --amend
: 将索引中的修改合并到最新的提交上。
5. 查看状态:
git status
:查看工作区和索引的状态,了解文件的修改状态。
6. 查看历史记录:
git log
:查看提交历史记录。
7.撤销回退:
git checkout -- <file>
:撤销对文件的修改,将文件恢复到最近一次提交的状态。git reset HEAD <file>
:将文件从索引中移除,取消添加到暂存区的更改。git reset [commitId]
:回退到commitId,改动全部返还给工作区git reset [commitId] --hard
:回退到commitId,但是会删除全部的改动
8. 创建分支:
git branch <branchname>
:创建一个新的分支。
9.切换分支:
git checkout <branchname>
:切换到指定分支。
10.合并分支:
git merge <branchname>
:将指定分支合并到当前分支。
11. 远程操作:
git remote add origin <remote-url>
:添加远程仓库。
git push -u origin master
:将本地仓库的更改推送到远程仓库。-u 会将本地分支与远程仓库同名分支关联起来,后续就只用git push
了。
git pull origin master
:从远程仓库拉取最新更改到本地仓库。如果分支关联起来了也只用git pull
12.文件比较:
git diff [commit1]
:查看暂存区和commit1
(提交对象的哈希值)提交之间的差异
git diff [commit1][commit2]
:查看commit2
相对commit1
提交而言的差异。
四、git实战
# test1 : 初始化git仓并链接到远程分支
git config --global user.email "***.***.com" # 配置全局邮箱
git config --global user.name "***" # 配置全局用户名
git init # 将当前文件夹变成git文件夹
echo "123" > 1.txt # 生成一个txt文件,写入"123"
git add . # 将修改全部添加到暂存区(索引)
git commit -m "***" # 将暂存区中的修改添加到本地仓库 PS:必须commit一次
git remote add origin https://gitee.com/***/git-demo.git # 链接远程仓库
git push -u origin master # 推入远程分支并于同名分支相关联
# test2 :推入另一个分支,假设远程有test分支,现在本地只有master
git branch test # 本地创建test分支
git checkout test # 本地切换分支到test分支
echo "123" > 2.txt # 生成一个txt文件,写入"123"
git add .
git commit -m "2"
git push -u origin test # 将本地test分支推入远程同名分支并关联
# test3 : 多人合作,假如远程有你没有的文件,需要先拉取远程pull同步
echo "123" > 3.txt
git add .
git commit -m "3"
git push # error:提示远程有你没有的文件
git pull --rebase origin master # 拉取远程提交历史到本地,再合并,即本地的修改最新
git status # 解冲突,建议用vscode。
# 如果没有冲突,直接 git push
git add . # 补充解冲突而修改的文件
git commit --amend # 将本次修改合并到上个提交对象
git push # 推入远端