Git 初识
一.Git的定义
简单来说,Git 是一个分布式版本控制系统。
我们来拆解一下这个定义:
版本控制:就像玩 RPG 游戏时的“存档”。写代码、写文档时,你可能会不断地修改。版本控制就是帮你把每一次重要的修改都“存档”下来。你可以随时查看历史记录、知道每次改了什么地方、是谁改的,并且可以随时“读档”,恢复到任何一个之前的版本。
系统:它是一个工具,一套软件。
分布式:这是 Git 最核心的特点。每个参与项目的人电脑里都拥有整个项目的完整历史记录(一个完整的仓库),而不只是最新的文件。这意味着你可以在本地工作(比如提交代码、查看历史),而无需联网。这也意味着每个人的电脑都是一个完整的备份。
一个生动的比喻:
Git 就像一台 “时间机器” 。你可以乘着它回到项目历史上的任何一个时间点,看看当时是什么样子,或者从那个时间点开始一个新的方向,而不会影响主线发展。
如果没有Git?
我们玩游戏只能一条路走到黑,一旦出现问题就真的gameover了。。。
Git的出现正是解决了这个痛点。在Git的版本控制功能下,每一个版本的文件如何更改都会被记录下来,如果出现一些特殊情况,可以及时读档——获取历史版本,这样管理不同版本的文档就安全又高效。
二.Git的工作方式
1.下载并安装Git
要介绍Git的工作方式,我们不妨先把Git安装到当前主机。
首先可以通过该指令查看当前主机有没有下载Git
git --version
结果如下:可以看到我当前的主机是下载并安装了Git的。
wujiahao@VM-12-14-ubuntu:~$ git --version
git version 2.34.1
如果没有显示版本信息,那么可以用该指令下载并安装(这里用ubuntu系统为例)
sudo apt-get install git -y
2.Git基本操作
我们不妨现在当前家目录下创建一个gitcode目录
wujiahao@VM-12-14-ubuntu:~$ pwd
/home/wujiahao
wujiahao@VM-12-14-ubuntu:~$ ls
gitcode
接着我们对这个目录进行初始化,出现下列的提示信息则代表初始化成功。
git init
wujiahao@VM-12-14-ubuntu:~$ ls
gitcode
wujiahao@VM-12-14-ubuntu:~$ cd ./gitcode
wujiahao@VM-12-14-ubuntu:~/gitcode$ git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /home/wujiahao/gitcode/.git/
然后,我们来看一下gitcode初始化之后是什么样的。
tree .git
wujiahao@VM-12-14-ubuntu:~$ cd ./gitcode
wujiahao@VM-12-14-ubuntu:~/gitcode$ tree .git
.git
├── branches
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-merge-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ ├── push-to-checkout.sample
│ └── update.sample
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs├── heads└── tags9 directories, 17 files
最后来配置一下本地仓库的个人信息:姓名,邮箱。
wujiahao@VM-12-14-ubuntu:~/gitcode$ git config user.name "wjh"
wujiahao@VM-12-14-ubuntu:~/gitcode$ git config user.email "xxx@qq.com"
wujiahao@VM-12-14-ubuntu:~/gitcode$ git config -l
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.name=wjh
user.email=xxx@qq.com
根据这个目录结构,我们再来谈谈Git的工作方式。
3.Git的工作方式
Git是版本控制工具,并且可以管理控制任意类型的文件,但只有它们在仓库下才可被进行管理。而.git就是这个追踪管理仓库。
问题1:当文件在gitcode中,可以被进行版本控制吗?
回答1:不能,因为它并不在“仓库”中。
问题2:那么把文件mv到.git中,就可以被进行版本控制了吗?
回答2:不能,.git目录不允许任何手动的操作或修改,这可能会导致Git无法正常使用。
那么一个(批)文件究竟该怎样才能被Git进行版本控制呢?请看下图:
1.工作区
Git整个工作的区域可以看作以上图,工作区就是我们上面创建的gitcode(.git虽然在gitcode目录下,但.git并不是工作区,注意区分)。工作区主要用于存放我们将要进行处理的文件。
2.版本库
版本库中有许多内容,但我们主要拿这三个出来说:暂存区stage(也叫index),对象库objects,和master分支。
暂存区:英⽂叫 stage 或 index。⼀般存放在 .git ⽬录下的 index ⽂件(.git/index)中,我们把暂存区时也叫作索引(index)
对象库:这里真正存储着版本控制的git对象,修改的工作区内容会写入对象库的一个新的对象,而暂存区实际上存储的是这些修改对象的索引(这也是暂存区被称为index的原因),这也有轻量化的需求。
HEAD:一个指针,对应拿到master的一个分支
3.工作流程(简易版)
在创建 Git 版本库时,Git 会为我们⾃动创建⼀个唯⼀的 master 分⽀,以及指向 master 的⼀个指针叫 HEAD。(分⽀和HEAD的概念后⾯再说)。
当工作区的文档发生了修改并执行了git add指令,暂存区的目录树就会发生更新。
当执行提交操作git commit时,才会真正将暂存区的目录树写入master分支中。
因此由上得知,只有我们执行了git add指令和git commit指令后才能将文件添加至代码仓库进行管理,单纯地将文件新建或者粘贴到工作区是无法进行管理的。