【版本控制】git使用指南

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 仓库副本。它用于多个开发人员之间共享和协作代码,并作为代码的中央存储库。远程仓库通常托管在代码托管平台(如 GitHubGitLabGitee 等)或者公司内部的 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)
	# 上面这串数字是提交对象的哈希值

4、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" 分支,但也可以根据项目需求自定义其他名称的分支。分支名称通常用来表示项目的不同功能特性、开发版本或者修复补丁等。

本地会有一个HEAD标签,代表处于工作区的分支。

分支在 Git 中扮演了重要的角色,它们提供了一种轻松管理和组织项目开发的方式。通过分支,可以实现以下功能:

1. 并行开发:多个开发人员可以在不同的分支上同时进行工作,而不会相互干扰。

2. 功能开发:每个功能特性可以在独立的分支上进行开发,便于管理和跟踪功能的开发进度。

3. 版本控制:每个版本或发布可以在单独的分支上进行管理,使得可以方便地回溯历史版本或发布新版本。

4. 修复补丁:可以在分支上快速创建和提交修复程序,然后合并到主分支中。

5.实验性开发:可以在单独的分支上进行实验性的开发,不影响主分支或其他稳定分支。

分支的创建、切换、合并和删除等操作都可以通过 Git 提供的命令轻松完成。分支是 Git 版本控制系统中一个非常强大和灵活的特性,它使得团队能够更加高效地进行协作开发,并且更好地管理和组织项目的开发流程。

三、git的基本操作

Git 的基本操作涉及到对仓库的创建、配置、文件的添加、提交、查看状态、查看历史记录等操作。下面是一些常见的 Git 基本操作及其用法:

1. 初始化仓库
git init:在当前目录创建一个新的 Git 仓库。
git clone <remote-url>:从远程仓库克隆一个新的仓库到本地,并将远程仓库的地址保存为origin。也就是说这个origin是指向远程仓库的引用名。

2. 配置用户信息
git config --global user.name "Your Name":配置全局用户名。
git config --global user.email "your.email@example.com":配置全局用户邮箱。

3. 文件
git add <file>:将指定文件添加到索引中。
git add .:将当前目录下所有文件添加到索引中。
git reset HEAD <file_name>:将文件从暂存区回退到工作区
**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>:本地仓库创建一个新的分支。
git checkout <branchname>:本地仓库切换到指定分支。
git merge <branchname>:将指定分支合并到当前HEAD分支。
git checkout -b [local_branch_name] origin/[remote_branch_name] : 本地创建一个新的分支,更新到远程的一个分支,然后切换到这个新分支。
git branch --set-upstream-to=origin/master master :将本地的master分支和远程的master分支绑定

9. 远程操作
git remote add origin <remote-url>:添加远程仓库。
git push -u origin master:将本地仓库的更改推送到远程仓库。-u 会将本地分支与远程仓库同名分支关联起来,后续就只用git push了。
git pull origin master:从远程仓库拉取最新更改到本地仓库。如果分支关联起来了也只用git pull
git pull -- rebase:拉取远程分支,使用rebase方式
git push --set-upstream origin [name1]:[name2] :将本地name1分支推送到远程的name2分支,并关联起来
git ls-remote --tags origin : 显示远程仓库的分支的标签

10.文件比较
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 # 推入远端
# test4:绑定远程分支,pull并推送
git init # 新建一个git仓库,分支自动取名为master
echo "1" > 1.txt # 工作区模拟一次更改
git add . # 保存到暂存区
git commit -m "1" # 本地提交一笔log到本地仓库
git remote add origin git@gitee.com:****/git-demo.git # 将本地的仓库和远程的仓库关联起来
git branch --set-upstream-to=origin/master master # 将本地master分支和远程的master分支关联起来
git pull --rebase # 拉取远程分支,在远程分支的log基础上加上当前的这笔修改
git push # 推送到远程分支
test 5: 切换分支
git clone git@gitee.com:****/git-demo.git #下载远程仓库到本地,并关联master和远程的默认分支
git branch test # 新建一个test分支
git checkout test #切换到test分支
git echo "1" > 1.txt # 模拟一次更改
git add . # 保存到暂存区
git commit -m "1" # 提交一笔更改log到本地仓库
git push # 推入远程仓库默认分支

相关推荐

  1. 使用Git进行版本控制

    2024-03-30 01:24:03       13 阅读
  2. GitGit版本控制工具使用详解

    2024-03-30 01:24:03       35 阅读
  3. Git版本控制的艺术与GitLab实战指南

    2024-03-30 01:24:03       9 阅读
  4. [Git版本控制系统]

    2024-03-30 01:24:03       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-30 01:24:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-30 01:24:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-30 01:24:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-30 01:24:03       18 阅读

热门阅读

  1. js中遍历数组,map方法和reduce方法有什么区别?

    2024-03-30 01:24:03       16 阅读
  2. 为什么编码器-解码器结构能够保存空间信息

    2024-03-30 01:24:03       19 阅读
  3. <个人笔记>位运算

    2024-03-30 01:24:03       19 阅读
  4. Frida相关脚本代码样例(Windows下经过测试)

    2024-03-30 01:24:03       20 阅读
  5. 前端通用命名规范和Vue项目命名规范

    2024-03-30 01:24:03       16 阅读
  6. GIT使用小结

    2024-03-30 01:24:03       17 阅读
  7. 面试宝典:PHP中的Yac技术深度分析

    2024-03-30 01:24:03       16 阅读
  8. 什么是FLV

    2024-03-30 01:24:03       18 阅读
  9. 正则表达式

    2024-03-30 01:24:03       14 阅读
  10. 正则匹配/正则表达式

    2024-03-30 01:24:03       23 阅读