实验一 修改内容回退
实验目的:通过实验理解三个区的区别,并练习如何对三个区的修改进行比对、如何撤销三个区的修改!
1.关于git本地文件夹结构
不考虑远程仓库,git本地目录中实际包括了三个区
Git - 重置揭密 文中对三个区的讲解非常通透,大家可以看一下
![](https://i-blog.csdnimg.cn/blog_migrate/d0ba195cedd288e0443fdd7c48b9a4ab.png)
如果我们从远程仓库克隆到本地文件夹中时,本地仓库和远程仓库的内容一致。
同时,本地三个区内容可以保持一致。
即 本地仓库 == 暂存区 == 工作区
我们通过 git add 命令可以将新增 、修改 、删除的文件提交到暂存区
我们通过 git commit 命令可以将暂存区的内容提交到本地仓库
git status 显示的状态,就是比较工作区和暂存区的不同 、 比较 暂存区和本地仓库的不同。
2.操作步骤
-
请大家使用自己的gitee账号登录gitee.com
- 请大家在计算机上设置git账号
git全局设置,配置用户名和邮箱(这些信息大家也可以可以从gitee上复制)
如果不设置,后期提交时,git仓库不知道是谁提交的。全局设置只需要设置一次,以后就不用再设置了,机房每次都会复原,所以大家每次都要设置一下。
在命令行中执行如下信息, 用户名 和 邮箱换成你的git账号的
git config --global user.name "xxxx"
git config --global user.email "xxxx@126.com"
-
fork 仓库 cmo_week04 到你的gitee上
![](https://i-blog.csdnimg.cn/blog_migrate/0b4018b4604f84826982f7c6edbc97d5.png)
点击账号后,点击【确认】按钮
![](https://i-blog.csdnimg.cn/blog_migrate/595b7297fdb1a11c5a9837e3d0c4b809.png)
此时,查看你的仓库,就可以看到这个新的仓库了
![](https://i-blog.csdnimg.cn/blog_migrate/47c82431a1d6db48c23418b1837e540a.png)
3.将你刚fork的仓库clone到本地
新建文件夹 week5
在week5的父目录上,右键点击“git bash here” 打开命令窗口
![](https://i-blog.csdnimg.cn/blog_migrate/2bba1a3d190d660cce0305fd3439e829.png)
在命令窗口中输入命令:注意命令中的仓库地址要改为你自己fork的那个地址奥
git clone cmo_week04: 软件配置管理 第四周课程练习仓库 week5\
![](https://i-blog.csdnimg.cn/blog_migrate/00ca3273e1564904e9aa3897a03e6503.png)
克隆后结果如下,
这就是一个git工作区。在隐藏文件夹 .git 中有暂存区、本地仓库文件夹。
![](https://i-blog.csdnimg.cn/blog_migrate/23da1c33d81a35a2e8ead11177d99036.png)
4. 新建012.txt 使其在不同区内容不同
我们要实现的目标如下:
![](https://i-blog.csdnimg.cn/blog_migrate/11ce5c45ff1133756d0081fa92689797.png)
下面我们来实现上面的状态
(1) 新建012.txt,文件内容为1,
(2)在week5文件夹中点击右键菜单 git Bash here。。 打开命令行窗口。依次执行 提交到本地库
git add . 工作区文件提交到暂存区
git commit -m "yourname:xxxx add 001.txt --1 " 暂存区文件提交到工作区
![](https://i-blog.csdnimg.cn/blog_migrate/1086899eda9a6d29fc30f94fba9fed7c.png)
(2) 再修改012.txt内容,追加一行内容为“2”后,提交 到暂存区
git add . 工作区文件提交到暂存区
用git status 可以看到系统提示绿色的012.txt,这就表示暂存区和本地仓库文件内容不一致
![](https://i-blog.csdnimg.cn/blog_migrate/993e62587a5abd03b6a6a34f361d9f20.png)
(3) 再修改012.txt内容,追加一行内容为“3”
![](https://i-blog.csdnimg.cn/blog_migrate/cd0340f172801268bd054354c276e7bd.png)
此时三个区的文件状态达到目标状态。如下:
![](https://i-blog.csdnimg.cn/blog_migrate/11ce5c45ff1133756d0081fa92689797.png)
5.文件夹复制6份
为了测试不同情况,大家可以将该文件夹复制四份,文件名合法即可
![](https://i-blog.csdnimg.cn/blog_migrate/8429a749beab0ed8b924df63a8aafd9d.png)
6.文件比较
这里大家可以使用比较工具比较一下暂存区和工作区
git diff 比较工作区与暂存区的所有文件
git diff filename 比较工作区与暂存区的指定文件
git diff 版本号 比较工作区与指定版本
git diff --cached 文件名 比较暂存区与最新提交版本的文件的差别
git diff HEAD 文件名 比较暂存区、工作区的与最新提交之间的差别
git diff 版本号1 版本号2 文件名 比较两个版本号之间的指定文件的差别
详细区别大家可以参看博客git diff 和 git diff –cached 和 git diff HEAD实际应用中的区别对比+详细解释_git diff 和git diff head-CSDN博客
git 按行为单位管理文件
(1) 比较工作区与暂存区
为了顺利执行一下操作,请先进入刚才复制的文件夹。通过右键菜单 “git Bash Here ..”打开git命令窗口
git diff 比较工作区与暂存区的所有文件
git diff filename 比较工作区与暂存区的指定文件
git diff 012.txt 比较工作区与暂存区的012.txt
![](https://i-blog.csdnimg.cn/blog_migrate/fea05e0c1da103e6717f95fcb200a219.png)
(2)比较暂存区和本地仓库
git diff --cached 文件名 比较暂存区与最新提交版本的文件的差别
git diff --cached 012.txt 比较暂存区与最新提交版本的文件的差别
![](https://i-blog.csdnimg.cn/blog_migrate/95d1c49629c72ea7e4615d0d8dba5af5.png)
(3)比较本地仓库最新版本和工作区
git diff HEAD filename 比较当前工作目录中的文件012.txt与最近的一次提交
git diff HEAD 012.txt 比较当前工作目录中的文件012.txt与最近的一次提交(即HEAD指向的提交)之间的差异,并
将差异输出到终端上。
比较不同版本的差别
![](https://i-blog.csdnimg.cn/blog_migrate/5793e65a8e8dea0a9d87353fddc6090c.png)
(4)比较不同版本的差别
git diff 版本号1 版本号2 文件名 比较两个版本号之间的指定文件的差别
为了能比较版本,你可以通过 git log --oneline 先查看日志、
git diff d50d0a8 e693478 比较版本d50d0a8 版本e693478之间的指定文件的差别
![](https://i-blog.csdnimg.cn/blog_migrate/c2db83355c6e02ac52dbcd4b9b039257.png)
7.撤销修改
下面我们来实验如何进行不同区修改内容的回退。
(1) 工作区修改的回退
进入刚才复制的一个文件夹,打开git命令窗口
git checkout filename 撤销工作区中对某文件的修改,回复到和暂存区一致
git checkout 撤销工作区中对所有文件的修改,回复到和暂存区一致
git checkout 012.txt , 执行之后,工作区012.txt的内容回复为 12,和暂存区一致了
![](https://i-blog.csdnimg.cn/blog_migrate/3bd43aa6243b918234ba63c26ee5ff37.png)
(2) 暂存区修改的回退
进入刚才复制的一个文件夹,打开git命令窗口
git reset HEAD :此命令将取消暂存指定文件的更改,从而使其退回到未暂存状态。
git reset HEAD 012.txt 暂存区的内容恢复为1
![](https://i-blog.csdnimg.cn/blog_migrate/cfb2698d8f227e61f9d175058c07775f.png)
(3)本地版本库提交的回退
有时我们刚提交到本地库了,但是又后悔了,或者最近几个提交我都不想要了,版本库和暂存区都想回到之前的状态。
git reset 版本号 本地仓库和暂存区退回到指定版本
git reset HEAD^ 本地仓库和暂存区退回到上个版本 ^表示父版本
git reset HEAD~3 本地仓库和暂存区退回到HEAD所指定的版本之前的第三个版本
git reset e2dd617 本地仓库和暂存区退回到指定版本e2dd617
在使用 Git 时,波浪线 (~) 和插入符号 (^) 都可以与 Git 中的版本号一起使用来指定提交历史记录中的特定版本。
波浪线和插入符号的主要区别在于它们如何选择版本。波浪线(~)表示“较早的提交”,而插入符号(^)表示“父提交”。
如果要父版本的父版本就用 git reset HEAD^^
当然也可以用波浪线 git reset HEAD~3 表示HEAD之前的第三个提交
我们可以使用git log --oneline 查看日志情况
![](https://i-blog.csdnimg.cn/blog_migrate/d3f428409d5d0feeaa837b2328c33a2e.png)
git reset HEAD^ 工作区和暂存区退回到上个版本,工作区保持不变
![](https://i-blog.csdnimg.cn/blog_migrate/c5c3db6d6138c5435e3ff104d47cbe8b.png)
(4) git reset 的 --soft --mix --hard 的区别
git reset 可以进行版本回退。
我们知道在开发的计算机上存在 git工作区、暂存区和本地仓库
![](https://i-blog.csdnimg.cn/blog_migrate/ec6a9cae75bcfb22f2bfe25797c4150c.png)
当版本回退时。根据是否要让不同的区域回退,就出现了不同的不同的回退命令
a. git reset --hard 【索引】
本地仓库、暂存区、工作区全部回退到指定索引提交后的状态。
所有提交后的修改都被删除掉 。它本质上是撤销了工作区、暂存区以及提交,回退到指定版本
![](https://i-blog.csdnimg.cn/blog_migrate/062bd73ec3d9b14fe09199b7bcffee57.png)
b. git reset --mix 【索引】 (缺省为mix,故可省略 --mix)
本地仓库、暂存区回退,工作区不回退。
git reset HEAD 用于对git add等命令的撤销。它本质上是撤销了提交以及暂存区的修改
![](https://i-blog.csdnimg.cn/blog_migrate/69190bfd47f020126a5d7986b0747544.png)
c. git reset --soft 【索引】
本地仓库回退、暂存区、工作区不回退。
git reset --soft HEAD^ 它本质上是撤销了上一次 git commit 命令
![](https://i-blog.csdnimg.cn/blog_migrate/7904538404026143fa8c6842340c7e77.png)
当某次提交错误,想撤销重新修改后提交,则可以先用--soft回退版本,修改后 重新add修改的文件,然后重新commit。
假设我们之前提交的006.txt错误了,末尾少了一行代码“666”,我们现在可以回退,修改后,再次提交。
此时操作,就会在当前你修改的基础上,把006.txt也修改了
(5)实操
下面我们来实操,看看效果,
(a) git reset --soft
进入刚才复制的文件夹中,打开git命令窗口
git reset --soft 版本号 让版本库回退到指定版本 工作区和工作区不变
![](https://i-blog.csdnimg.cn/blog_migrate/7904538404026143fa8c6842340c7e77.png)
git log --oneline 查看提交日志
git reset --soft 97af44a 让版本看和暂存区回退到 97af44a版本 工作区和工作区不变
git status 查看状态
![](https://i-blog.csdnimg.cn/blog_migrate/77400c1e5407a64b084a2c777409718c.png)
然后重新修改后,git add 后,git commit,
![](https://i-blog.csdnimg.cn/blog_migrate/fce16e4707147c2578fc8be19dced88d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/79631560b022202055f0784c95892dd5.png)
git reset --mixed命令可以起到净化提交历史的作用
当某次提交不正确,想重新提交,可以使用--soft撤销提交,重新修改后,commit。
git reset --soft HEAD^ 本质是撤销上一次commit提交
(b) git reset --mix
git reset --mix
--mix是缺省的,不写就表示mix
--mix执行后,工作区不变,暂存区和本地仓库都回到该版本。
![](https://i-blog.csdnimg.cn/blog_migrate/69190bfd47f020126a5d7986b0747544.png)
当某次提交错误,想撤销重新修改后提交,也可以先用--mix回退版本,修改后重新add,然后commit。
git reset --mix 97af44a
其中的 97af44a 是git log --oneline中看到的版本的索引
执行后,工作区不变,暂存区和本地仓库都回到该版本。
![](https://i-blog.csdnimg.cn/blog_migrate/8701b2a094670254733b837bfdeb6ebc.png)
(c) git reset --hard
有时我们发现最近的的几次修改都是不对的,那么我们可以将本地仓库、暂存区、工作区全部回退到历史版本。
该命令是最为常用的命令。
git reset --hard 97af44a
其中的 97af44a 是git log --oneline中看到的版本的索引
执行后,工作区、暂存区和本地仓库都回到该版本。
![](https://i-blog.csdnimg.cn/blog_migrate/d99d0fc64da5ab422f0d62819c892324.png)
8 git revert
适用情况:适合公有分支
它和 git reset 的不同之处在于,他的撤销,其实是增加一个相反的版本。实现撤销。
-
销提交到暂存区的修改
-
撤销commit 提交
-
git push 或撤销 提交