【Git原理与使用一】Git概念与基本操作
文章目录
- 1. Git 的概念
- 2. Git 的安装
- 3. Git 的认识
- 3.1 创建本地仓库
- 3.2 配置Git
- 3.3 认识工作区、暂存区、版本库
- 4. Git 的基本操作
- 4.1、认识几个指令
- 1)git add 添加命令
- 2)git commit 提交命令
- 3)git log 查看日志命令
- 4)git cat-file 打印命令
- 5)git status 查看状态命令
- 6)git diff 比较差异命令
- 7)git reset 版本回退命令
- 8)git reflog 记录本地每次命令
- 9)git checkout -- 恢复工作区文件命令
- 10)git rm 删除命令
- 4.2 添加文件
- 4.3 修改文件
- 4.4 再看.git
- 总结.git中几个特殊的文件或者目录
- 4.5 回退版本
- 4.6 撤销修改
- 情况1:
- 情况2:
- 情况3:
- 4.7 删除文件
1. Git 的概念
**提出问题: ** 在工作或者学习时,编写各种文档中,为了防止文档丢失或者更改失误,能使失误后恢复到某个版本,就需要复制一个副本。日积月累的情况下,版本数量会不断增多,那怎么清楚每个版本修改了什么呢?
解决方案: 版本控制器。所谓的版本控制器,通俗的讲就是一个可以记录工程的每一次改动和版本迭代的一个管理系统,同时也方便多人协同作业。
目前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的文件,对于我们开发人员来说,Git 最重要的就是可以帮助我们管理软件开发项目中的源代码文件!
注意事项:
所有的版本控制系统,包括Git ,只能跟踪文本文件的动,比如 TXT 文件,网页,所有的程序代码等等。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词 “Windows”。
而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,具体修改的内容无从知道。
2. Git 的安装
对于Linux环境下:
1)centos安装 Git并查看版本验证是否安装成功
sudo yum install -y git
git --version
2)ubuntu安装Git并查看版本验证是否安装成功
sudo apt install -y git
git --version
对于Windows环境下,进入Git官网进行下载安装包:Git - Downloads
更多安装步骤可以参考这篇mukes大佬mukes-CSDN博客的博客:Git 详细安装教程(详解 Git 安装过程的每一个步骤)_git安装-CSDN博客
3. Git 的认识
下面将在centos7环境下进行Git操作指令的使用和讲解:
3.1 创建本地仓库
仓库是进行版本控制的一个文件目录,要想对文件进行版本控制,就必须先创建一个仓库出来。创建一个 Git 本地仓库对应的命令如下:
git init
创建完成后会发现当前目录下多一个.git隐藏文件,该文件是用来追踪管理仓库的,不能手动修改这个目录文件,否则容易破坏仓库用tree .git查看目录结构,文件只有存入.git后才能被Git管理
3.2 配置Git
该配置是设置你的 用户名称 和 e-mail 地址,这是关乎仓库操作的重要环节。配置指令如下,其中–global 是一个可选项,使用这个选项表示该机器全部Git仓库都用此配置
# 把 Name 改成自己的昵称
# 把 email@example.com 改成邮箱的格式,只要格式正确即可
# 在配置时可以直接配置成自己的昵称和邮箱
git config --global user.name "Name"
git config --global user.email "email@example.com"
使用查看命令查看是否配置成功:
git config -l
如果需要进行删除或修改配置,可以用以下命令完成:
注意:如果使用了–global配置,则删除时也要使用该选项,否则无法删除
git config --global --unset user.name
git config --global --unset user.email
3.3 认识工作区、暂存区、版本库
工作区: 是在电脑上你要写代码或文件的目录。
暂存区: 英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,我们把暂存区有时也叫作索引(index)。
版本库: 又名仓库,英文名 repository 。工作区有一个隐藏目录 .git ,它不算工作区,而是 Git 的版本库。这个版本库里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
在当前目录下,新建文件后进行任何操作前,他们之间的关系如下:
因此,通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件。必须要通过使用 git add 和 git commit 命令才能将文件添加到仓库中进行管理!
4. Git 的基本操作
4.1、认识几个指令
首先,先认识几个命令的具体内容,然后再对指令组合进行各类操作:
1)git add 添加命令
将工作区中的文件添加到暂存区(stage/index)中,空目录是执行不了操作的
git add [file1] [file2] ... # 添加一个或多个文件到暂存区
git add [dir] # 添加指定目录到暂存区,包括子目录
git add . # 添加当前目录下的所有文件改动到暂存区
2)git commit 提交命令
将暂存区中文件提交到本地仓库中,一般会带上 -m 选项,这样后面就可以跟上 message 进行描述本次提交文件的细节,方便记录版本改动情况
git commit -m "message" # 提交暂存区全部内容到本地仓库中
git commit [file1] [file2] ... -m "message" #提交暂存区的指定文件到仓库区
3)git log 查看日志命令
可以查看从最近到最远的提交日志,并且可以看到我们 commit 时的日志消息。
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数简化,–decorate则是可以看到head的指向信息
git log --pretty=oneline --decorate
4)git cat-file 打印命令
对于git log中出现的一长串字符就是对象,可以用该进行查看对象,选择 -p 选项可以更加简洁显示出来,
其中, tree对象 是记录了当前提交对应的项目根目录结构,包括文件和子目录的信息;每个文件对应一个blob对象(存储文件内容),子目录则对应另一个tree对象(递归描述目录结构);通过这个 tree 对象,Git 可以完整重建提交时的目录和文件状态。
parent对象 则是上一次提交的对象。
git cat-file -p HEAD
5)git status 查看状态命令
查看上一次提交到现在是否对文件进行过修改
git status
6)git diff 比较差异命令
查看暂存区和工作区文件的差异,显示的格式是Unix通用的diff格式。也可以使用 git diff HEAD – [file] 命令来查看版本库和工作区文件的区别。
git add file
7)git reset 版本回退命令
用于回退版本,可以指定退回某一次提交的版本。“回退”本质是要将版本库中的内容进行回退,工作区或暂存区是否回退由命令参数决定:
–mixed 为默认选项,使用时可以不用带该参数。该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。
–soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
–hard 参数将暂存区与工作区都退回到指定版本。切记工作区有未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使用该参数前一定要慎重。
git reset [--soft | --mixed | --hard] [HEAD]
在上面对test进行了修改,第一次输入git,第二次再输入git2,现在以表格形式说明应该用什么选项进行回退。
说明 | 工作区 | 暂存区 | 版本库 | 操作选项 |
---|---|---|---|---|
当前版本 | git,git2 | git,git2 | git,git2 | 无 |
回退版本库 | git,git2 | git,git2 | git | –soft |
回退暂存区 | git,git2 | git | git | –mixed(默认选项) |
回退工作区 | git | git | git | –hard(慎用) |
HEAD说明:
1)可直接写成 commit id,表示指定退回的版本2)HEAD 进行选择
HEAD 表示当前版本
HEAD^ 上一个版本
HEAD^^ 上上一个版本
以此类推…
3)可以使用 ~数字表示:
HEAD~0 表示当前版本
HEAD~1 上一个版本
HEAD^2 上上一个版本
以此类推…
8)git reflog 记录本地每次命令
该命令可以记录本地操作中的每一次命令,从而可以查询各种命令的id,该id是commit id的一部分,比较短的,但和objects的对象id是相等的
git reflog
9)git checkout – 恢复工作区文件命令
将工作区的指定文件恢复到最近一次提交的状态(丢弃未提交的修改),如果文件已添加到暂存区,则不会影响暂存区内容,仅覆盖工作区
git checkout -- [file]
10)git rm 删除命令
用于从版本控制中删除文件的命令,它会同时从 Git 仓库(暂存区)和工作目录中移除文件
git rm [file]
4.2 添加文件
通过以下 git add 和 git commit 2个命令就可以将工作区的文件添加进本地仓库了
注意:一方面一定是先将工作区的文件添加到暂存区,然后再从暂存区添加进仓库;另一方面,在Git中,空目录不会被追踪,因此创建空目录进行2个命令操作,Git也会提示nothing to commit
git add .
git commit -m "add file"
使用 git log可以 查看提交记录
git log
4.3 修改文件
首先先对test文件添加多一行,接着可以先使用 git status 查看在上次提交之后是否有对文件进行过修改
上面告诉我们存在修改,但不知道哪些被修改的,因此可以使用 git diff test 命令进行对比
之后就是进行添加文件操作,完成修改。需要注意的是,进行git add 后,就看不到 no changes added to commit (use “git add” and/or “git commit -a”) 的消息了,接下来继续 git commit 即可
4.4 再看.git
3个区对应的.git文件如下图所示:
而我们知道 git log 可以看到提交信息,那么是否检验这些信息能够对应到.git的信息呢?
首先查看HEAD的指向,可以发现指向refs/heads/master,继续打印master的内容会出现一串字符,通过对比发现就是最新一次提交的字符串信息,而这个字符串其实就是对象,即objects存放的内容
这个对象是一个SHA1计算出来的非常大的数字,用十六进制表示;前面2位是目录名称,后面38位是文件名称
对象是经过安全哈希算法加密的,因此此时要用 git cat-file 命令操作进行查看,会显示tree、parent、提交的user和email,以及最新一次提交的信息。
其中,parent对象可以通过对比发现是上一次提交的对象,而tree对象是什么呢?继续用 git cat-file 命令操作进行查看
通过对比发现,tree对象其实就是当前提交对应的项目根目录结构
继续打印test对应的对象,就可以显示该文件最新的内容
总结.git中几个特殊的文件或者目录
1)index:暂存区, git add 后会更新该内容。
2)HEAD:默认指向 master 分支的一个指针。
3)refs/heads/master: 文件里保存当前 master 分支的最新commit id 。
4)objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改。
4.5 回退版本
用 --hard 选项进行演示,直接回退到第一次提交,用 git reset --hard [commit id] 完成回退,log也随之改变
这时如果后悔了怎么办?也可以继续用这个 git reset --hard [commit id] 指令,在commit id中写上最后一次的id就可以完成回退
那如果忘记了这个commit id要怎么办?这时就可以使用 git reflog查看,这时就可以查找较短的commit id,也就可以进行版本回退了。首先先回退到第一个版本,然后查询id,最后进行回退
为什么回退速度这么快?
因为 Git 在内部有个指向当前分支(此处是master)的HEAD 指针, refs/heads/master 文件里保存当前 master 分支的最新commit id 。当我们在回退版本的时候,Git 仅仅是给refs/heads/master 中存储一个特定的version,所以速度会很快
4.6 撤销修改
撤销的目的就是不影响远程仓库的代码。如果我们在我们的工作区写了很长时间代码,越写越写不下去,觉得自己写的实在是垃圾,想恢复到上一个版本。他们的基本场景有以下几项:
初始情况说明 | 工作区 | 暂存区 | 版本库 | 操作说明 |
---|---|---|---|---|
情况1:只在工作区中进行增加、修改、删除操作,未进行add | add code | 1、手动修改撤销,容易出错;2、推荐用 git checkout – test指令 | ||
情况2:添加到暂存区中未进行commit操作 | add code | add code | 1、git reset --hard test;2、先git reset test,然后用git checkout – test | |
情况3:已经commit但未进行push操作 | add code | add code | add code | git reset --hard HEAD^ |
情况1:
情况2:
情况3:
4.7 删除文件
1)先在工作区用rm删除文件,在进行add和commit操作,完成删除,因此使用的Git版本是2.0以下,所以删除操作要带上-A记录全部操作的选项
2)使用git rm命令删除文件,然后直接commit就可以完成删除了