Git篇(一): 读懂 Git:从 Linux 安装到底层目录、版本回退完整拆解
如果说代码是程序员的作品,那 Git 就是守护作品的“时光机”与“协作桥”。日常开发中,我们反复修改代码、迭代功能、修复 bug,一旦出错需要回溯版本、多人协作需要合并代码、项目迭代需要区分不同版本,没有专业工具加持,只会陷入“代码备份1、备份2、最终版、最终版真不改了”的混乱困境。Git 的诞生,就是为了解决所有版本管理与协作难题。它无需复杂配置,轻便高效,既能帮个人开发者精准记录每一次代码变更,随时回溯任意版本;也能支撑大型团队多人并行开发,高效解决代码冲突、同步迭代进度。不管是编程初学者,还是入行不久的开发者,掌握 Git 都是提升编程素养、适配开发工作的第一步。
一.安装Git
Git 是开放源代码的代码托管工具,最早是在Linux下开发的。开始也只能应用于Linux平台,后面慢慢的被移植到windows下,现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。
1.Linux-Centos下安装
sudo yum install -y git可以输入命令
git --version来查看git的版本
2.Linux-Ubuntu下安装
sudo apt-get install git -y git --version //查看版本二.Git基本操作
1.创建Git仓库
要提前说的是,仓库是进行版本控制的一个文件目录。我们要想对文件进行版本控制,就必须先创建一个仓库出来。
git init //初始化仓库出现以上内容之后,就说明本地仓库已经创建完成了
1..git文件是什么
.git 是 Git本地仓库的核心数据库文件夹,存储项目全部提交历史、分支与远程配置,支撑所有版本管理功能,一旦删除则所有版本记录丢失,项目变为普通文件夹。
2.配置Git
git config [--global] user.name "Your Name" git config [--global] user.email "email@example.com" # 把 Your Name 改成你的昵称 # 把 email@example.com 改成邮箱的格式,只要格式正确即可。--global是配置全局Git环境(所有的仓库都会被配置),如果不加--global只会在当前目录下配置
1.查看配置命令
git config -l //查看全局配置 git config --local --list // 查看当前仓库2.删除配置
git config [--global] --unset user.name git config [--global] --unset user.email3.重置配置
# 重置当前仓库的user.name、user.email,换成你要重置的配置项即可 git config --unset user.name git config --unset user.email # 加上--global参数即可,比如重置全局的user.name git config --global --unset user.name git config --global --unset-all user.name git config --local --unset-all //清空当前本地仓库的所有配置 git config --global --unset-all //清空全局Git的所有配置三.认识工作区、暂存区、版本库
- 工作区:是在电脑上你要写代码或文件的目录。
- 暂存区:英文叫 stage 或 index。一般存放在
.git目录下的 index 文件(.git/index)中,我们把暂存区有时也叫作索引(index)。 - 版本库:又名仓库,英文名
repository。工作区有一个隐藏目录.git,它不算工作区,而是 Git 的版本库。这个版本库里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
下面这个图展示了工作区、暂存区和版本库之间的关系:
- 在创建 Git 版本库时,Git 会为我们自动创建一个唯一的 master 分支,以及指向master 的一个指针叫 HEAD。(分支和HEAD的概念后面再说)
- 当对工作区修改(或新增)的文件执行
git add命令时,暂存区目录树的文件索引会被更新。 - 当执行提交操作
git commit时,master 分支会做相应的更新,可以简单理解为暂存区的目录树才会被真正写到版本库中。
1.添加文件
1.add
在包含.git的目录下新建一个 ReadMe 文件,我们可以使用git add命令可以将文件添加到暂存区:
ReadMe(也译作自述文件)是软件开发、项目工程中位于项目根目录,用来介绍说明项目信息的入口文档,核心作用是帮助使用者快速了解、上手该项目。
添加一个或多个文件到暂存区:git add [file1] [file2] ... 添加指定目录到暂存区,包括子目录:git add [dir] 添加当前目录下的所有文件改动到暂存区:git add .2.commit
再使用git commit命令将暂存区内容添加到本地仓库中:
提交暂存区全部内容到本地仓库中: git commit -m "message" 提交暂存区的指定文件到仓库区:git commit [file1] [file2] ... -m "message"注意git commit后面的-m选项,要跟上描述本次提交的message,由用户自己完成,这部分内容绝对不能省略,并要好好描述,是用来记录你的提交细节,是给我们人看的。
1.查看文件状态
如果仓库中的文件和我们工作区的文件不同,如何查看当前仓库的状态呢?git status命令用于查看在你上次提交之后是否有对文件进行再次修改。
git status2.查看文件新增内容
通过上面操作我们只知道哪个文件被修改,但是并不知道文件修改的内容是什么
git diff 文件名 //查看文件修改内容3.查看历史提交记录
git log git log --pretty=oneline //行显示 更美观观察版本库变化
2.Git管理文件的本质
值得注意是Git追踪的是修改的内容,而不是文件
四.认识.git文件中的主要内容
1.index
index就是我们的暂存区,add 后的内容都是添加到这里的,暂存区负责暂存接下来要提交到版本库的内容,是Git分层管理提交流程的关键一步。
2.HEAD
HEAD:它是Git的当前版本指针,通常默认指向当前本地仓库的当前分支(默认分支一般是master),通过HEAD可以确定当前工作区基于哪个版本,提交后HEAD会自动移动指向最新的提交
3.objects
objects为 Git 的对象库,里面包含了创建的各种版本库对象及内容。当执行git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,就位于".git/objects"目录下
查找 object 时要将 commit id 分成2部分,其前2位是文件夹名称,后38位是文件名称。
git cat-file -p <commit id>五.版本回退
之前我们也提到过,Git能够管理文件的历史版本,这也是版本控制器重要的能力。如果有一天你发现之前的工作做的出现了很大的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本回退的功能了。
执行git reset命令用于回退版本,可以指定退回某一次提交的版本。要解释一下 “回退” 本质是要将版本库中的内容进行回退,工作区或暂存区是否回退由命令参数决定:
git reset [--soft | --mixed | --hard] [HEAD]--mixed为默认选项,使用时可以不用带该参数。该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。不带文件名:版本库 HEAD、暂存区,工作区不动 ;带文件名:只操作暂存区,完全不动版本库 HEAD--soft参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。--hard参数将暂存区与工作区都退回到指定版本。切记工作区有未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使用该参数前一定要慎重。
HEAD 说明:
可直接写成 commit id,
表示指定退回的版本
HEAD/HEAD~0 表示当前版本
HEAD^ /HEAD~1 上一个版本
HEAD^^ /HEAD~2上上一个版本
以此类推...
查看本地所有HEAD变动日志
git reflog1.仅回退工作区内容
git checkout -- 文件名这个命令是丢弃文件在工作区的所有未提交修改,将这个文件还原成版本库中当前HEAD指向的版本内容,命令执行成功就说明已经完成了文件还原。
2.仅回退版本库内容
git reset --soft HEAD^2.回退工作区和暂存区内容
git reset (--mixed) HEAD 文件名3.回退工作区、暂存区、版本库内容(慎用)
git reset --hard HEAD^六.删除文件
1.第一种情况
在 Git 中,删除也是一个修改操作,我们实战一下,如果要删除 file5 文件,怎么搞呢?如果你这样做了:
对于这种情况该如何解决呢?
我们只删除了工作区的文件。这时就需要使用 git rm 将文件从暂存区和工作区中删除,并且 commit:
git rm 文件名2.第二种情况
如果是误删,(删除也是修改)
git checkout -- 文件名