公司建设网站申请报告,怎么用dw做响应式网站,海南论坛网站建设,网络服务怎么写文章目录 学习目标Ⅰ. 初始 Git#x1f4a5;注意事项 Ⅱ. Git 安装Linux-centos安装Git Ⅲ. Git基本操作一、创建git本地仓库 -- git init二、配置 Git -- git config三、认识工作区、暂存区、版本库① 工作区② 暂存区③ 版本库④ 三者的关系 四、添加、提交更改、查看提交日… 文章目录 学习目标Ⅰ. 初始 Git注意事项 Ⅱ. Git 安装Linux-centos安装Git Ⅲ. Git基本操作一、创建git本地仓库 -- git init二、配置 Git -- git config三、认识工作区、暂存区、版本库① 工作区② 暂存区③ 版本库④ 三者的关系 四、添加、提交更改、查看提交日志命令① 场景一查看 .git 文件变化② 场景二 五、修改文件① 查看工作目录和暂存区的状态 -- git status② 查看暂存区和工作区等之间的更改内容 -- git diff 六、版本回退 -- git reset git reflog① --mixed选项如何撤销版本回退❓❓❓② --hard选项各版本回退选项的总结为什么版本回退以及撤销的时候速度那么快❓❓❓ 七、撤销修改 -- git checkout -- [filena]情况一工作区的代码还未add情况二代码已经 add但还未 commit情况三代码已经 add 和 commit 8、删除文件 -- git rm 学习目标
掌握 Git 企业级应用深刻理解 Git 操作过程与操作原理理解工作区暂存区版本库的含义掌握 Git 版本管理自由进行版本回退、撤销、修改等 Git 操作方式与背后操作原理掌握 Git 分支管理从分支创建切换合并删除的整个生命周期灵活进行各种场景下的分支管理学习常见分支管理策略掌握 Git 远程仓库与本地仓库结合版本管理与分支管理做到基于分支级的个人级开发理解分布式版本控制系统学习远程仓库与本地仓库的交互操作掌握多人协作开发模式学习企业级常见分支策略master/release/develop/feature/hotfix 等理解不同公司不同环境下适合的分支模型。结合案例引入工程程师测试人员技术经理等角色展现项目开发过程的全貌深刻理解开发的整体流程俯视 Git 在其中的作用
另外还要明白我们 平时使用的 gitee、github 等平台其实只是基于 git 的托管平台相当于远程仓库要分清楚
Ⅰ. 初始 Git
不知道你工作或学习时有没有遇到这样的情况我们在编写各种文档时为了防止文档丢失更改失误失误后能恢复到原来的版本不得不复制出一个副本比如
“报告-v1”
“报告-v2”
“报告-v3”
“报告-确定版”
“报告-最终版”
“报告-究极进化版”
... 每个版本有各自的内容但最终会只有一份报告需要被我们使用。
但在此之前的工作都需要这些不同版本的报告于是每次都是复制粘贴副本产出的文件就越来越多文件多不是问题问题是随着版本数量的不断增多你还记得这些版本各自都是修改了什么吗
文档如此我们写的项目代码也是存在相同的问题
此时就引入了 版本控制器 的概念
为了能够更方便我们管理这些不同版本的文件便有了版本控制器。所谓的版本控制器就是能让你了解到一个文件的历史以及它的发展过程的系统。通俗的讲就是一个可以记录工程的每一次改动和版本迭代的一个管理系统同时也方便多人协同作业。
目前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的文件例如 doc、excel、dwg、dgn、rvt 等等。对于我们开发人员来说Git 最重要的就是可以帮助我们管理软件开发项目中的源代码文件
注意事项
还需要再明确一点所有的版本控制系统Git 也不例外其实只能跟踪 文本文件 的改动比如 TXT 文件网页所有的程序代码等等。版本控制系统可以告诉你每次的改动比如在第 5 行加了一个单词 “Linux”在第 8 行删了一个单词 “Windows”。
而 图片、视频这些二进制文件虽然也能由版本控制系统管理但 没法跟踪二进制文件的变化只能把二进制文件每次改动串起来也就是只知道图片从 100KB 改成了 120KB但到底改了啥版本控制系统不知道也没法知道。
Ⅱ. Git 安装
Git 是开放源代码的代码托管工具最早是在 Linux 下开发的。开始也只能应用于 Linux 平台后面慢慢的被移植到 windows 下现在Git 可以在 Linux、Unix、Mac 和 Windows 这几大平台上正常允许了。
这里就不细讲安装了比较简单可以上网查
Linux-centos安装Git
安装比较简单首先你可以试着输入 git看看系统有没有安装 git
[lirenVM-8-7-centos ~]$ git --version
git version 1.8.3.1 如果没有出现上述内容说明没有安装使用 yum 指令安装
sudo yum -y install git 其它操作系统安装也是类似的自行查阅资料
Ⅲ. Git基本操作
Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。对于下述出现的常见指令以及其它指令都会在后面介绍到
Git基本操作 图示说明
workspace工作区staging area暂存区/缓存区local repository版本库或本地仓库remote repository远程仓库
一、创建git本地仓库 – git init
要提前说的是仓库的本质是进行版本控制的一个文件目录。我们要想对文件进行版本控制就必须先创建一个仓库出来然后在这个仓库中对我们要追踪管理的文件进行管理
注意这里说的 本地仓库 和我们后面讲的 版本库 是不一样的
创建一个 Git 本地仓库对应的命令为 git init 注意命令要在文件目录下执行例如
[lirenVM-8-7-centos gitcode]$ pwd
/home/liren/gitcode
[lirenVM-8-7-centos gitcode]$ git init
Initialized empty Git repository in /home/liren/gitcode/.git/
[lirenVM-8-7-centos gitcode]$ ls -al
total 12
drwxrwxr-x 3 liren liren 4096 Jul 9 21:38 .
drwx------ 15 liren liren 4096 Jul 9 21:38 ..
drwxrwxr-x 7 liren liren 4096 Jul 9 21:38 .git
[lirenVM-8-7-centos gitcode]$ 我们发现当前目录下多了⼀个 .git 的隐藏文件 .git 目录是 Git 来跟踪管理仓库的不要手动修改这个目录里面的文件不然改乱了就把 Git 仓库给破坏了。
其中包含 Git 仓库的诸多细节随着我们学习的深入后面会挑重点来讲
[lirenVM-8-7-centos gitcode]$ tree .git
.git
|-- branches
|-- config
|-- description
|-- HEAD
|-- hooks
| |-- applypatch-msg.sample
| |-- commit-msg.sample
| |-- post-update.sample
| |-- pre-applypatch.sample
| |-- pre-commit.sample
| |-- prepare-commit-msg.sample
| |-- pre-push.sample
| |-- pre-rebase.sample
| -- update.sample
|-- info
| -- exclude
|-- objects
| |-- info
| -- pack
-- refs|-- heads-- tags9 directories, 13 files
[lirenVM-8-7-centos gitcode]$ 二、配置 Git – git config
当安装 Git 后首先要做的事情是设置你的 用户名称 和 邮箱地址这是非常重要的它相当于是我们操作 Git 的账号和密码那般重要。
添加配置命令 为
git config [--global] user.name Your Name # 把 Your Name 改成你的昵称
git config [--global] user.email emailexample.com # 把 emailexample.com 改成邮箱的格式只要格式正确即可 其中 --global 是一个可选项。如果使用了该选项表示这台机器上所有的 Git 仓库都会使用这个配置。如果你希望在不同仓库中使用不同的 名称 或 邮箱可以不要 --global 选项但要注意的是执行命令时必须要在仓库里。
查看配置命令 为
git config -l 下面我们举个例子给当前的仓库添加名称和邮箱
[lirenVM-8-7-centos gitcode]$ git config -l # 查看配置
core.repositoryformatversion0
core.filemodetrue
core.barefalse
core.logallrefupdatestrue[lirenVM-8-7-centos gitcode]$ git config --global user.name sharp-blade
[lirenVM-8-7-centos gitcode]$ git config --global user.email 2916776007qq.com[lirenVM-8-7-centos gitcode]$ git config -l # 查看配置多了两个配置
user.namesharp-blade
user.email2916776007qq.com
core.repositoryformatversion0
core.filemodetrue
core.barefalse
core.logallrefupdatestrue
[lirenVM-8-7-centos gitcode]$ 那我们要是想 删除对应的配置 的话则要用以下配置指令
git config [--global] --unset user.name
git config [--global] --unset user.email 注意如果 对应的配置使用了 --global 选项然后要删除的话也要加上 --global 选项才能删除
三、认识工作区、暂存区、版本库
我们先来理解下 Git 中 工作区、暂存区 和 版本库 概念
① 工作区
工作区就是当前 Git 仓库所在的目录。
在工作区中我们可以进行代码的修改、添加、删除等操作并且可以在工作区中直接进行提交。提交操作 add 会将工作区中的更改内容同步到暂存区中并将它们标记为已暂存状态。在提交时Git 会将暂存区中的内容提交到远程仓库中并创建一个新的提交对象。
需要注意的是工作区和暂存区都是相对于当前分支的因此 只有在当前分支中进行的操作才会影响它们。当切换到其他分支时工作区和暂存区也会随之改变。
举个例子我们和上面创建仓库的位置一样在 /home/liren/gitcode/ 目录就是我们的仓库此时里面的文件如下所示 ② 暂存区
暂存区实际上是一个位于工作区与版本库之间的临时区域是一个 二进制文件包含所有在工作区中修改的文件叫做 stage 或 index。其 一般存放在 .git 目录下的 index 文件.git/index中所以我们把暂存区有时也叫作索引index。
暂存区是位于版本库之上的一个特殊分支用于临时存储和管理代码更改。当使用 git add 命令将文件添加到暂存区时Git 会根据这些修改生成新的提交对象并将它们与版本库中的提交对象关联起来。并且可以使用 git commit 命令提交更改到对应版本分支下面 需要注意的是暂存区是一个独立、临时的区域它只存在于当前分支中。当你切换到其他分支时暂存区也将随之改变。此外当你的分支合并到主分支时暂存区也会受到影响。
举个例子我们用 tree 指令看一下还没有使用 git add 之前的版本库 .git 中对应暂存区 index 文件的位置 另外我们也可以看到工作区的内容也是不会显示在版本库中的说明它们是相互独立的
下面我们使用 git add 指令将工作区的内容提交到暂存区中再看看效果 后面我们再来讲这个 objects 目录是个什么鬼
③ 版本库
版本库Repository 是一个位于工作区之外的目录其中包含所有 Git 存储的数据如提交对象、分支、标签等。
在工作区中有一个 隐藏目录 .git它不算是工作区而是 Git 的版本库。这个版本库里面的所有文件都可以被 Git 管理起来每个文件的修改、删除操作Git 都能跟踪到以便任何时刻都可以追踪历史或者在将来某个时刻可以“还原”。
还是提醒一下切记不要在 .git 目录下手动修改文件不然很容易导致仓库不能用了
下面我们使用 git commit -m 指令将暂存区中的文件提交到默认的主分支 master 中 ④ 三者的关系
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系 图中左侧为工作区右侧为版本库。在版本库中标记为 index 的区域是 暂存区stage/index标记为 master 的是 master分支 所代表的目录树。HEAD 实际是指向 master 分支的一个游标。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。图中的 objects 标识的区域为 Git 的对象库实际位于 .git/objects 目录下里面包含了创建的各种对象及内容。
在创建 Git 版本库时Git 会为我们自动创建一个唯一的 master 分支以及指向 master 的一个指针叫 HEAD。分支和 HEAD 的概念后面再说当对工作区修改或新增的文件 执行 git add 命令时暂存区目录树的文件索引 index 会被更新。当执行提交操作 git commit 时master 分支会做相应的更新可以简单理解为暂存区的目录树才会被真正写到版本库中。
由上述描述我们便能得知通过新建或粘贴进目录的文件并不能称之为向仓库中新增文件而只是在工作区新增了文件其实质上并没有进入到仓库中被管理。所以 必须要通过使用 git add 和 git commit 命令才能将文件添加到仓库中进行管理
四、添加、提交更改、查看提交日志命令
添加 添加一个或多个文件到暂存区git add [file1] [file2] ...添加指定目录到暂存区包括子目录git add [dir]添加当前目录下的所有文件到暂存区git add . 提交更改 将当前工作目录中的所有更改提交到暂存区中git commit -a将当前工作目录中的更改提交到暂存区中并添加一个提交消息git commit -m commit message将指定文件中的更改提交到暂存区中并添加一个提交消息git commit -m commit message filename将当前工作目录中的更改提交到暂存区中并添加一个提交消息同时将提交记录添加到本地分支中git commit -m commit message -a -s 查看提交日志 查看最近一次提交到最近的提交之间的所有提交记录git log查看当前分支和远程仓库的 master 分支之间的所有提交记录git log master..origin/master查看 master 分支上的所有提交记录的详细差异git log -p master查看最近的 n 次提交记录git log -n查看所有分支的提交记录git log --all除此之外还可以通过设置其它不同的选项来查看不同的提交记录例如 git log --authorusername查看指定作者的提交记录。git log --greppattern查看包含指定模式的提交记录。git log --prettyoneline用于将提交记录以一行的形式输出这对于在某些情况下快速查看提交记录非常有用。git log --graph --abbrev-commit这两个选项一般用于查看提交日志时候用时间线的形式显示不同分支的提交情况看起来很直观……
下面我们分为两个场景来使用这三个指令
① 场景一
在包含 .git 的目录下新建一个 readme 文件使用 git add 命令可以将文件添加到暂存区再使用 git commit 命令将暂存区内容提交到本地仓库也就是版本库。
注意git commit 后面的 -m 选项要跟上描述本次提交的 message由用户自己完成这部分内容绝对不能省略并要好好描述是用来记录你的提交细节是给我们人看的。
[lirenVM-8-7-centos gitcode]$ ls -al
total 12
drwxrwxr-x 3 liren liren 4096 Jul 10 11:08 .
drwx------ 15 liren liren 4096 Jul 10 11:13 ..
drwxrwxr-x 7 liren liren 4096 Jul 10 11:08 .git[lirenVM-8-7-centos gitcode]$ touch readme
[lirenVM-8-7-centos gitcode]$ git add readme
[lirenVM-8-7-centos gitcode]$ git commit -m first add file:readme
[master (root-commit) cdc96e6] first add file:readme1 file changed, 0 insertions(), 0 deletions(-)create mode 100644 readme[lirenVM-8-7-centos gitcode]$ git commit 命令执行成功后会告诉我们有一个文件被改动就是我们新添加的 readme 文件插入了零行内容说明 readme 没有插入新内容。
我们还可以多次 add 不同的文件而只 commit 一次便可以提交所有文件是因为需要提交的文件是通通被 add 到暂存区中然后一次性 commit 暂存区的所有修改。如下所示
[lirenVM-8-7-centos gitcode]$ touch file1 file2 file3
[lirenVM-8-7-centos gitcode]$ git add file1 # 添加一个文件
[lirenVM-8-7-centos gitcode]$ git add file2 file3 # 添加多个文件
[lirenVM-8-7-centos gitcode]$ git commit -m add 3 files
[master 7eb10f5] add 3 files3 files changed, 0 insertions(), 0 deletions(-)create mode 100644 file1create mode 100644 file2create mode 100644 file3
[lirenVM-8-7-centos gitcode]$ 截至目前为止我们已经更够将代码直接提交至本地仓库了。我们可以使用 git log 命令来查看下历史提交记录
[lirenVM-8-7-centos gitcode]$ git log
commit 7eb10f50de9781d05a4a4af2134a8673352e89fa
Author: lirendada 2916776007qq.com
Date: Mon Jul 10 13:05:02 2023 0800add 3 filescommit cdc96e6d432ea74b61b4bf36de4dc19f07310eb0
Author: lirendada 2916776007qq.com
Date: Mon Jul 10 11:50:00 2023 0800first add file:readme[lirenVM-8-7-centos gitcode]$ 该命令显示从最近到最远的提交日志并且可以看到我们 commit 时的日志消息。如果嫌输出信息太多看得眼花缭乱的可以试试加上 --prettyoneline 参数
[lirenVM-8-7-centos gitcode]$ git log --prettyoneline
7eb10f50de9781d05a4a4af2134a8673352e89fa add 3 files
cdc96e6d432ea74b61b4bf36de4dc19f07310eb0 first add file:readme
[lirenVM-8-7-centos gitcode]$ 需要说明的是我们看到的一大串类似 7eb10……2e89fa 的是每次提交的 commit id 版本号Git 的 commit id 不是 123…… 递增的数字而是一个 SHA1 计算出来的一个非常大的数字用十六进制表示当然你看到的 commit id 和我的肯定不一样以你自己的为准
查看 .git 文件变化
首先来看一下 .git 的目录结构其实我们前面已经看过了
[lirenVM-8-7-centos gitcode]$ tree .git
.git
|-- branches
|-- COMMIT_EDITMSG
|-- config
|-- description
|-- HEAD
|-- hooks
| |-- applypatch-msg.sample
| |-- commit-msg.sample
| |-- post-update.sample
| |-- pre-applypatch.sample
| |-- pre-commit.sample
| |-- prepare-commit-msg.sample
| |-- pre-push.sample
| |-- pre-rebase.sample
| -- update.sample
|-- index
|-- info
| -- exclude
|-- logs
| |-- HEAD
| -- refs
| -- heads
| -- master
|-- objects
| |-- 27
| | -- 1d813417b08f049274d2dfda5211ec2ea2ec95
| |-- 7e
| | -- b10f50de9781d05a4a4af2134a8673352e89fa
| |-- cd
| | -- c96e6d432ea74b61b4bf36de4dc19f07310eb0
| |-- e6
| | -- 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
| |-- e8
| | -- 0ad49ace82167de62e498622d70377d913c79e
| |-- info
| -- pack
-- refs|-- heads| -- master-- tags17 directories, 23 files下面我们来介绍其中几个重要的 index 就是暂存区我们 add 之后的内容都是添加到这里的 HEAD 是默认指向当前分支也就是 master 分支最后一次提交内容的指针 [lirenVM-8-7-centos gitcode]$ cat .git/HEAD
ref: refs/heads/master 而此时的 master 分支其实就是 [lirenVM-8-7-centos gitcode]$ cat .git/refs/heads/master
7eb10f50de9781d05a4a4af2134a8673352e89fa 这串内容就是 当前分支最新的 commit id这可以在上面的 objects 对象文件中找到其中 7e 是目录名相当于是房间号而后面的那串就是更具体的提交内容文件 objects 为 Git 的对象库里面包含了创建的各种版本库对象及内容。当执行 git add 命令时暂存区的目录树被更新同时工作区修改或新增的文件内容被写入到对象库中的一个新的对象中就位于 .git/objects 目录下让我们来看看这些对象有何用处 [lirenVM-8-7-centos gitcode]$ ls .git/objects/
27 7e cd e6 e8 info pack 查找 object 时要将 commit id 分成两部分其 前两位是文件夹名称后 38 位是文件名称。找到这个文件之后一般不能直接看到里面是什么因为该类文件是经过 sha 安全哈希算法加密过的文件 好在我们可以使用 git cat-file 命令来查看版本库对象的内容 [lirenVM-8-7-centos gitcode]$ git cat-file -p 7eb10f50de9781d05a4a4af2134a8673352e89fa #-p选项表示美观的打印出来
tree 271d813417b08f049274d2dfda5211ec2ea2ec95
parent cdc96e6d432ea74b61b4bf36de4dc19f07310eb0
author lirendada 2916776007qq.com 1688965502 0800
committer lirendada 2916776007qq.com 1688965502 0800add 3 files
[lirenVM-8-7-centos gitcode]$ 我们一探究竟顺便将它的父亲节点还有根节点都看看到底存放着什么
总结一下在本地的 git 仓库中有几个文件或者目录很特殊
index就是暂存区git add 后会更新该内容HEAD默认指向 master 分⽀的⼀个指针refs/heads/master文件里保存当前 master 分支的 最新 commit idobjects包含了创建的各种版本库对象及内容可以简单理解为放了 git 维护的所有修改内容
后面在学习过程中最好能将常见的 git 操作与 .git 目录当中的结构内容变化对应起来这样有利于我们理解 git 细节流程
② 场景二
学习到这里我们已经清楚了如何向仓库中添加文件并且对于工作区、暂存区、版本库也有了一定的认识。那么我们再展示一种添加文件的场景能加深对工作区、暂存区、版本库的理解实例如下
[lirenVM-8-7-centos gitcode]$ touch file4 #新增file4
[lirenVM-8-7-centos gitcode]$ touch file5 #新增file5
[lirenVM-8-7-centos gitcode]$ git add file4 #添加file4到暂存区
[lirenVM-8-7-centos gitcode]$ git commit -m add file4 #提交更改
[master ced585b] add file41 file changed, 0 insertions(), 0 deletions(-)create mode 100644 file4
[lirenVM-8-7-centos gitcode]$ 提交后发现打印了 1 file changed, 0 insertions(), 0 deletions(-)意思是只有一个文件改变了这时我们提出了疑问不是新增了两个文件吗
其实学了上面的内容之后这里就不难理解了git add 是将工作区文件添加到暂存区 git commit 是将暂存区的内容添加到本地仓库中。由于我们并没有使用 git add file5 此时 file5 就不在暂存区中维护所以我们 commit 的时候其实只是把已经在暂存区的 file4 提交了而遗漏了工作区的 file5。
那如何提交 file5 呢很简单再次 add 然后 commit file5 即可这里就不演示了
五、修改文件
这里要强调一下git 追踪的其实是修改的内容而不是整个文件也就是说 git 不会每次都为整个文件创建 object 对象而是只对其中修改的内容进行创建对象管理这样子一来就能节省很大部分的空间这也就是为什么 Git 比其它版本控制器优秀的地方
什么是修改比如你新增了一行这就是一个修改删除了一行也是一个修改更改了某些字符也是一个修改删了一些又加了一些也是一个修改甚至创建一个新文件也算一个修改。
① 查看工作目录和暂存区的状态 – git status
下面我们做一些操作向之前的 readme 文件里面增添数据不进行 add 操作向之前的 file5 文件中增添数据并且进行 add 操作但不进行 commit 操作创建一个新文件 file6也向里面增添数据不进行 add 操作
[lirenVM-8-7-centos gitcode]$ echo lirendada readme
[lirenVM-8-7-centos gitcode]$ cat readme
lirendada[lirenVM-8-7-centos gitcode]$ echo liren file5
[lirenVM-8-7-centos gitcode]$ git add file5
[lirenVM-8-7-centos gitcode]$ cat file5
liren[lirenVM-8-7-centos gitcode]$ touch file6
[lirenVM-8-7-centos gitcode]$ echo lirendada file6
[lirenVM-8-7-centos gitcode]$ cat file6
lirendada 此时如何查看当前仓库的状态呢这就得使用 git status 命令
git status 命令用于显示工作目录和暂存区的状态。使用此命令能看到哪些修改被暂存到了哪些没有哪些文件没有被 Git 追踪到。git status 不显示已经 commit 到项目历史中去的信息。看项目历史的信息要使用 git log。
并且 git status 也不会显示具体修改的内容想要查看的话得通过 git diff 指令来查看这个下面会讲 在每次执行 git commit 之前先使用 git status 检查文件状态是一个很好的习惯这样能防止你不小心提交了不想提交的东西。 ② 查看暂存区和工作区等之间的更改内容 – git diff
git diff 命令用于显示提交和工作树等之间的更改此命令比较的是 已写入暂存区和已经被修改但尚未写入暂存区 文件的区别。
主要使用方式如下所示
git diff file # 比较当前文件和暂存区文件差异
git diff HEAD -- [file] # 查看版本库和工作区文件的区别git diff id1id2 # 比较两次提交之间的差异
git diff branch1 branch2 # 在两个分支之间比较git diff --staged # 显示暂存区和上一次提交commit的差异
git diff --cached # 显示暂存区和上一次提交commit的差异git diff --stat # 简单查看差异仅仅比较统计信息 下面我们以上面的 readme 文件为例查看一下它的差异
[lirenVM-8-7-centos gitcode]$ git diff readme
diff --git a/readme b/readme # a/readme表示比较的是当前工作目录下的而b/readme表示比较的是仓库中的readme文件
index e69de29..ff2fbef 100644 # 这一行显示了文件内容的差异。e69de29和ff2fbef是两个文件的哈希值用于比较它们之间的差异
--- a/readme # 显示了当前工作目录下的readme文件b/readme # 显示了仓库中的readme文件-0,0 1 # 显示了文件内容的差异。-0,0表示当前工作目录下的readme文件没有修改1表示仓库中的readme文件增加了一条新行
lirendada # 显示了仓库中的readme文件的新行即lirendada 知道了对 readme 做了什么修改后再把它提交到本地仓库就放心多了
下面我们对 readme 文件进行 add 操作看看变化
[lirenVM-8-7-centos gitcode]$ git add readme
[lirenVM-8-7-centos gitcode]$ git status
# On branch master
# Changes to be committed:
# (use git reset HEAD file... to unstage)
#
# modified: file5
# modified: readme
#
# Untracked files:
# (use git add file... to include in what will be committed)
#
# file6
[lirenVM-8-7-centos gitcode]$ 可以看到它已经被定义为 Changes to be committed 了下面我们继续对其进行 commit 操作
[lirenVM-8-7-centos gitcode]$ git commit -m change readme
[master c82c67b] change readme2 files changed, 2 insertions()
[lirenVM-8-7-centos gitcode]$ git status
# On branch master
# Untracked files:
# (use git add file... to include in what will be committed)
#
# file6
nothing added to commit but untracked files present (use git add to track)
[lirenVM-8-7-centos gitcode]$ 可以看到进行 commit 之后包括 file5 也被提交更新到版本库去了因为它们都是在暂存区中的
而对于 file6 来说只要我们不对其进行 add 操作那么它就只是在工作区操作罢了
此时我们将 file6 删除之后会发现 git 就不再管理到它了
[lirenVM-8-7-centos gitcode]$ git status
# On branch master
nothing to commit, working directory clean六、版本回退 – git reset git reflog
之前我们也提到过Git 能够管理文件的历史版本这也是版本控制器重要的能力。如果有一天你发现之前的工作出现了很大的问题需要在某个特定的历史版本重新开始这个时候就需要版本回退的功能了。
git reset 命令用于回退版本可以指定退回某一次提交的版本。
其语法格式如下
git reset [--soft | --mixed | --hard] [HEAD] 要解释一下 “回退” 本质是要将 版本库 中的内容进行回退而 工作区 或 暂存区 是否回退由命令参数决定 下面我们来介绍一下这些参数 --mixed 为 默认选项使用时可以不用带该参数。该参数将暂存区的内容退回为指定提交版本内容工作区内容保持不变。--soft 参数对于工作区和暂存区的内容都不变只将版本库回退到某个指定版本。--hard 参数将 暂存区与工作区都退回到指定版本。切记工作区有未提交的代码时不要用这个命令因为工作区回滚之后你没有提交的代码就再也找不回了所以 使用该参数前一定要慎重HEAD 常见用法 可直接写成 commit id表示指定退回的版本HEAD当前版本HEAD^上一个版本HEAD^^上上一个版本HEAD^^^上上上一个版本以此类推…… 也可以使用 数字 表示 HEAD~0表示当前版本HEAD~1上一个版本HEAD^2上上一个版本HEAD^3上上上一个版本以此类推…… 这样子干巴巴的说可能比较不好理解下面我们举 --mixed 和 --hard 选项来解释
① --mixed选项
我们先来看看之前我们操作时留下的 git 提交日志
[lirenVM-8-7-centos gitcode]$ git log --prettyoneline
c82c67bb370034ef67d0bde191252742fcc7d6f6 change readme
ac00e613b660a4d916a166d64ef518132d04bf34 add file5
ced585b446ebc42530ca850efc02195ae709cbad add file4
7eb10f50de9781d05a4a4af2134a8673352e89fa add 3 files
cdc96e6d432ea74b61b4bf36de4dc19f07310eb0 first add file:readme
[lirenVM-8-7-centos gitcode]$ 我们一开始创建 readme 文件的时候它是没有数据的而最后一次修改和提交的时候readme 里面是有一行文本为 lirendada那么此时我们就有一个版本回退的要求啦就是回到最开始的提交的那个版本我们就能得到 readme 文本是空的下面我们就来操作一下回退版本
我们先用默认选项 --mixed 来测试一下
[lirenVM-8-7-centos gitcode]$ git log --prettyoneline # 先打印提交日志
c82c67bb370034ef67d0bde191252742fcc7d6f6 change readme
ac00e613b660a4d916a166d64ef518132d04bf34 add file5
ced585b446ebc42530ca850efc02195ae709cbad add file4
7eb10f50de9781d05a4a4af2134a8673352e89fa add 3 files
cdc96e6d432ea74b61b4bf36de4dc19f07310eb0 first add file:readme[lirenVM-8-7-centos gitcode]$ git reset --mixed cdc96e6d432ea74b61b4bf36de4dc19f07310eb0 # 退到最开始的版本
Unstaged changes after reset:
M readme
[lirenVM-8-7-centos gitcode]$ git log --prettyoneline # 再次打印提交日志发现只剩最开始的版本
cdc96e6d432ea74b61b4bf36de4dc19f07310eb0 first add file:readme[lirenVM-8-7-centos gitcode]$ ls # 但是可以发现此时工作区的内容是不变的
d file1 file2 file3 file4 file5 readme
[lirenVM-8-7-centos gitcode]$ cat readme
lirendada如何撤销版本回退❓❓❓
如果说此时我们后悔了不想回退了那么其实也是有办法进行撤销版本回退的请记住撤销版本回退的 关键点 在于要有原来版本的 commit id如果找不到这个 commit id 了那么天皇老子来了也没用哈哈
所以说我们撤销版本回退的重点就是找到 commit id然后方法就是 再次使用之前我们进行版本回退的指令比如说我们使用了 git reset --mixed 旧版本commit id 的话那么我们也要使用 git reset --mixed 原来版本的commit id。
[lirenVM-8-7-centos gitcode]$ git log --prettyoneline #打印提交日志
cdc96e6d432ea74b61b4bf36de4dc19f07310eb0 first add file:readme[lirenVM-8-7-centos gitcode]$ git reset --mixed c82c67bb370034ef67d0bde191252742fcc7d6f6 #根据原来版本的commit id撤销回退[lirenVM-8-7-centos gitcode]$ git log --prettyoneline #再次打印提交日志发现我们已经回到原来的版本了
c82c67bb370034ef67d0bde191252742fcc7d6f6 change readme
ac00e613b660a4d916a166d64ef518132d04bf34 add file5
ced585b446ebc42530ca850efc02195ae709cbad add file4
7eb10f50de9781d05a4a4af2134a8673352e89fa add 3 files
cdc96e6d432ea74b61b4bf36de4dc19f07310eb0 first add file:readme
[lirenVM-8-7-centos gitcode]$ ls
d file1 file2 file3 file4 file5 readme 但是有一个问题啊如果此时我们版本回退之后服务器不小心重启了找不到原来的 commit id那该怎么办是不是就找不到那个 commit id 了❓❓❓
其实 git 早已给我们留了后路只需要使用 git reflog 指令就能找到我们以前所有的版本提交信息了如下所示
[lirenVM-8-7-centos gitcode]$ git reflog
cdc96e6 HEAD{0}: reset: moving to cdc96e6d432ea74b61b4bf36de4dc19f07310eb0
c82c67b HEAD{1}: reset: moving to c82c67bb370034ef67d0bde191252742fcc7d6f6
cdc96e6 HEAD{2}: reset: moving to cdc96e6d432ea74b61b4bf36de4dc19f07310eb0
c82c67b HEAD{3}: commit: change readme
ac00e61 HEAD{4}: commit: add file5
ced585b HEAD{5}: commit: add file4
7eb10f5 HEAD{6}: commit: add 3 files
cdc96e6 HEAD{7}: commit (initial): first add file:readme 但是可能因为项目的代码很复杂我们提交了很多日志此时我们要去找到原来版本的日志那是难上加难所以 建议给自己留条后路不要回退的太彻底
从上面的信息中可以明显看出 c82c67b 就是我们要找的原来版本的 commit id虽说变短了但是依然有效此时再次撤销版本回退
[lirenVM-8-7-centos gitcode]$ git reset --hard c82c67b
HEAD is now at c82c67b change readme[lirenVM-8-7-centos gitcode]$ git log --prettyoneline #查看提交日志发现都回来了
c82c67bb370034ef67d0bde191252742fcc7d6f6 change readme
ac00e613b660a4d916a166d64ef518132d04bf34 add file5
ced585b446ebc42530ca850efc02195ae709cbad add file4
7eb10f50de9781d05a4a4af2134a8673352e89fa add 3 files
cdc96e6d432ea74b61b4bf36de4dc19f07310eb0 first add file:readme
[lirenVM-8-7-centos gitcode]$ 注意上面出现了 --hard 选项是因为我又用了 --hard 去进行版本回退这点不需要关心太多
② --hard选项
这里和上面一样还是版本回退到第一个版本看看这次有什么不同
[lirenVM-8-7-centos gitcode]$ git log --prettyoneline #打印提交日志
c82c67bb370034ef67d0bde191252742fcc7d6f6 change readme
ac00e613b660a4d916a166d64ef518132d04bf34 add file5
ced585b446ebc42530ca850efc02195ae709cbad add file4
7eb10f50de9781d05a4a4af2134a8673352e89fa add 3 files
cdc96e6d432ea74b61b4bf36de4dc19f07310eb0 first add file:readme[lirenVM-8-7-centos gitcode]$ git reset --hard cdc96e6d432ea74b61b4bf36de4dc19f07310eb0 #版本回退三个区域都是
HEAD is now at cdc96e6 first add file:readme[lirenVM-8-7-centos gitcode]$ git log --prettyoneline #打印提交日志发现只剩第一个版本
cdc96e6d432ea74b61b4bf36de4dc19f07310eb0 first add file:readme
[lirenVM-8-7-centos gitcode]$ ls #工作区中的文件也只剩第一个版本中存在的文件
d readme
[lirenVM-8-7-centos gitcode]$ cat readme #并且文件中的内容也回退到空之前的空了
[lirenVM-8-7-centos gitcode]$ 接下来我们进行撤销版本回退
[lirenVM-8-7-centos gitcode]$ git reset --hard c82c67bb370034ef67d0bde191252742fcc7d6f6 #进行撤销版本回退
HEAD is now at c82c67b change readme[lirenVM-8-7-centos gitcode]$ git log --prettyoneline #可以看到信息变成原来的版本了
c82c67bb370034ef67d0bde191252742fcc7d6f6 change readme
ac00e613b660a4d916a166d64ef518132d04bf34 add file5
ced585b446ebc42530ca850efc02195ae709cbad add file4
7eb10f50de9781d05a4a4af2134a8673352e89fa add 3 files
cdc96e6d432ea74b61b4bf36de4dc19f07310eb0 first add file:readme
[lirenVM-8-7-centos gitcode]$ ls
d file1 file2 file3 file4 file5 readme
[lirenVM-8-7-centos gitcode]$ cat readme
lirendada
[lirenVM-8-7-centos gitcode]$各版本回退选项的总结 为什么版本回退以及撤销的时候速度那么快❓❓❓
值得说的是Git 的版本回退速度非常快因为 Git 在内部有个指向当前分支此处是master的 HEAD 指针 refs/heads/master 文件里保存当前 master 分支的最新 commit id 。当我们在回退版本的时候Git 仅仅是给 refs/heads/master 中存储一个特定的 version可以简单理解成如下示意图
版本回退前 版本回退后 当你使用 git reset 版本回退时回退的版本并不会被永久删除。相反回退命令会创建一个新的提交记录该记录指向你回退到的旧版本。这个新提交记录会成为你现在的 HEAD也就是当前工作目录所在的版本。
因此你可以通过 git reflog 命令查看你最近的操作记录包括回退操作以及你之前所处的版本。如果你想恢复到之前的版本你可以使用 git checkout 命令指定之前的提交记录的哈希值或分支名以切换到相应的版本。
需要注意的是如果你在回退之后对旧版本所在的分支进行了修改并提交了更改那么这些更改可能会被覆盖或丢失因为你的回退操作会将你的分支指向旧版本而不是新更改所在的版本。因此在 回退之前最好先将当前分支中的更改提交或保存到其他分支中以防止数据丢失。
七、撤销修改 – git checkout – [filena]
如果我们在我们的 工作区 写了很长时间代码越写越写不下去觉得自己写的实在是看不下去想恢复到上一个版本此时就要进行撤销修改操作了这和我们上面讲的版本回退是有关系的
主要分为以下三种情况我们一一解释
情况一工作区的代码还未add
此时有两种做法
直接对想撤销的代码手动进行撤销修改 – 不推荐这种做法如果代码量大的话可能会越改越乱背道而驰。使用 git checkout -- [filename] 指令 它可以将指定文件恢复为最近一次提交或添加到暂存区时的状态。在这种情况下双横线--用于区分文件名和分支名或提交哈希值并且 这个双横线不能省略省略了的话该命令就变成其它意思了需要注意的是该命令 会覆盖工作目录中的文件因此你应该确保你不再需要该文件中未提交的更改。
下面我们向 readme 文件中新增文本 “hello world”记得这个文件中本来还有一条 “lirendada” 的文本下面来实践一下
[lirenVM-8-7-centos gitcode]$ cat readme
lirendada
[lirenVM-8-7-centos gitcode]$ echo hello world readme #往文件中插入数据
[lirenVM-8-7-centos gitcode]$ cat readme
lirendada
hello world[lirenVM-8-7-centos gitcode]$ git checkout -- readme #想恢复为最近一次提交或添加到暂存区时的状态[lirenVM-8-7-centos gitcode]$ cat readme #查看文件内容变成原来的样子
lirendada
[lirenVM-8-7-centos gitcode]$ git status
# On branch master
nothing to commit, working directory clean情况二代码已经 add但还未 commit
此时依然是有两种做法
利用 git reset --mixed [filename] 指令撤销暂存区的内容然后变成情况一去解决 – 不推荐因为用下面的方法更方便利用 git reset --hard HEAD 指令一步到位直接版本回退到 HEAD 指针所指的最近一次 commit 的版本状态此时工作区和暂存区都会回退
下面我们向 readme 文件中新增文本 “hello world”记得这个文件中本来还有一条 “lirendada” 的文本然后进行 add 操作但是不进行 commit 操作这里只演示第二种做法
[lirenVM-8-7-centos gitcode]$ cat readme
lirendada
[lirenVM-8-7-centos gitcode]$ echo hello world readme
[lirenVM-8-7-centos gitcode]$ cat readme
lirendada
hello world
[lirenVM-8-7-centos gitcode]$ git add readme
[lirenVM-8-7-centos gitcode]$ git status
# On branch master
# Changes to be committed:
# (use git reset HEAD file... to unstage)
#
# modified: readme
#[lirenVM-8-7-centos gitcode]$ git reset --hard HEAD # 直接回退到最近一次commit的版本工作区和暂存区都会回退
HEAD is now at c82c67b change readme[lirenVM-8-7-centos gitcode]$ cat readme # 可以看到内容都已经回退了
lirendada
[lirenVM-8-7-centos gitcode]$ git status
# On branch master
nothing to commit, working directory clean
[lirenVM-8-7-centos gitcode]$ 情况三代码已经 add 和 commit
首先我们要明白出现这种情况的大前提是要和远程仓库这种概念联系起来才有意义因为一般来说我们在公司写代码的时候公司的仓库对于我们来说就是远程仓库我们都是在本地先形成仓库然后用 push 操作推送到远程仓库中去的
如果此时说我们不小心用 push 把我们不需要的东西推送到了远程仓库中那就真的惨了……
在这种大前提下我们才有必要说去回退到前一个版本其实并不难懂了上面两种这种就知道怎么做了
使用 git reset --hard HEAD^ 指令回退到 HEAD 所指的最近一次 commit 版本的上一个版本也就是 HEAD^并且 --hard 是对 工作区和暂存区都会有回退影响的达到了我们的目的
下面我们向 readme 文件中新增文本 “hello world”记得这个文件中本来还有一条 “lirendada” 的文本然后进行 add 操作并且进行 commit 操作然后进行回退操作
[lirenVM-8-7-centos gitcode]$ cat readme
lirendada
[lirenVM-8-7-centos gitcode]$ echo hello world readme
[lirenVM-8-7-centos gitcode]$ cat readme
lirendada
hello world
[lirenVM-8-7-centos gitcode]$ git add readme
[lirenVM-8-7-centos gitcode]$ git commit -m modify readme readme
[master 8cf3a74] modify readme1 file changed, 1 insertion()[lirenVM-8-7-centos gitcode]$ git reset --hard HEAD^ # 进行版本回退使用--hard撤销工作区和暂存区的内容
HEAD is now at c82c67b change readme[lirenVM-8-7-centos gitcode]$ cat readme # 可以看到版本已经回退了
lirendada
[lirenVM-8-7-centos gitcode]$ git log --prettyoneline
c82c67bb370034ef67d0bde191252742fcc7d6f6 change readme
ac00e613b660a4d916a166d64ef518132d04bf34 add file5
ced585b446ebc42530ca850efc02195ae709cbad add file4
7eb10f50de9781d05a4a4af2134a8673352e89fa add 3 files
cdc96e6d432ea74b61b4bf36de4dc19f07310eb0 first add file:readme
[lirenVM-8-7-centos gitcode]$8、删除文件 – git rm
删除文件其实也有指令但是如果我们不用指令直接删掉工作区的文件比如下面文件中的 readme
[lirenVM-8-7-centos gitcode]$ ls
file1 file2 file3 file4 file5 readme
[lirenVM-8-7-centos gitcode]$ rm readme #删除工作区文件
[lirenVM-8-7-centos gitcode]$ ls
file1 file2 file3 file4 file5[lirenVM-8-7-centos gitcode]$ git checkout -- readme #尝试恢复发现是可以的[lirenVM-8-7-centos gitcode]$ ls
file1 file2 file3 file4 file5 readme
[lirenVM-8-7-centos gitcode]$ cat readme
lirendada
[lirenVM-8-7-centos gitcode]$ 其实这是没删干净因为我们只是删了工作区的文件此时可能暂存区或者版本库中还有对应的文件那这可不算是什么删除文件
其实删除完之后我们可以用 git status 指令就会告诉我们已经删除了什么文件如下所示
[lirenVM-8-7-centos gitcode]$ rm readme
[lirenVM-8-7-centos gitcode]$ git status
# On branch master
# Changes not staged for commit:
# (use git add/rm file... to update what will be committed)
# (use git checkout -- file... to discard changes in working directory)
#
# deleted: readme
#
no changes added to commit (use git add and/or git commit -a) 所以如果想真的删除的话我们就得用 git commit 指令将此时这个删除信息也推送到版本库中此时才算是删除完成
这里就不使用这种方式了我们直接使用 git rm 指令下面是其一些常见选项
将文件从暂存区和工作区中删除git rm file如果删除之前修改过并且已经放到暂存区域的话则必须要用强制删除选项 -fgit rm -f file如果想把文件从暂存区域移除但仍然希望保留在当前工作目录中git rm --cached file
使用该指令之后我们 依然得用 git commit 指令推送到版本库中版本库才能知道此时需要删除该文件啦
[lirenVM-8-7-centos gitcode]$ ls
file1 file2 file3 file4 file5 readme[lirenVM-8-7-centos gitcode]$ git rm readme #删除工作区和暂存区中该文件
rm readme[lirenVM-8-7-centos gitcode]$ ls
file1 file2 file3 file4 file5
[lirenVM-8-7-centos gitcode]$ git status
# On branch master
# Changes to be committed:
# (use git reset HEAD file... to unstage)
#
# deleted: readme
#[lirenVM-8-7-centos gitcode]$ git commit -m delete readme #需要commit后版本库才会知道需要去删除
[master 3131533] delete readme1 file changed, 1 deletion(-)delete mode 100644 readme 那要是我们不小心删错文件了怎么办❓❓❓
很简单呀此时就 转变为了上面基本操作的第七点撤销修改的问题 了这里就不多解释了具体参考上面