实验目的:通过实验理解三个区的区别,并练习如何对三个区的修改进行比对、如何撤销三个区的修改!
不考虑远程仓库,git本地目录中实际包括了三个区
https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E7%BD%AE%E6%8F%AD%E5%AF%86 文中对三个区的讲解非常通透,大家可以看一下
如果我们从远程仓库克隆到本地文件夹中时,本地仓库和远程仓库的内容一致。
同时,本地三个区内容可以保持一致。
即 本地仓库 == 暂存区 == 工作区
我们通过 git add 命令可以将新增 、修改 、删除的文件提交到暂存区
我们通过 git commit 命令可以将暂存区的内容提交到本地仓库
git status 显示的状态,就是比较工作区和暂存区的不同 、 比较 暂存区和本地仓库的不同。
点击账号后,点击【确认】按钮
此时,查看你的仓库,就可以看到这个新的仓库了
新建文件夹 week5
在week5的父目录上,右键点击“git bash here” 打开命令窗口
在命令窗口中输入命令:注意命令中的仓库地址要改为你自己fork的那个地址奥
git clone https://gitee.com/caohx666/cmo_week04.git week5\
克隆后结果如下,
这就是一个git工作区。在隐藏文件夹 .git 中有暂存区、本地仓库文件夹。
我们要实现的目标如下:
下面我们来实现上面的状态
(1) 新建012.txt,文件内容为1,
(2)在week5文件夹中点击右键菜单 git Bash here。。 打开命令行窗口。依次执行 提交到本地库
git add . 工作区文件提交到暂存区
git commit -m "yourname:xxxx add 001.txt --1 " 暂存区文件提交到工作区
(2) 再修改012.txt内容,追加一行内容为“2”后,提交 到暂存区
git add . 工作区文件提交到暂存区
用git status 可以看到系统提示绿色的012.txt,这就表示暂存区和本地仓库文件内容不一致
(3) 再修改012.txt内容,追加一行内容为“3”
此时三个区的文件状态达到目标状态。如下:
为了测试不同情况,大家可以将该文件夹复制四份,文件名合法即可
这里大家可以使用比较工具比较一下暂存区和工作区
git diff 比较工作区与暂存区的所有文件
git diff filename 比较工作区与暂存区的指定文件
git diff 版本号 比较工作区与指定版本
git diff --cached 文件名 比较暂存区与最新提交版本的文件的差别
git diff HEAD 文件名 比较暂存区、工作区的与最新提交之间的差别
git diff 版本号1 版本号2 文件名 比较两个版本号之间的指定文件的差别
详细区别大家可以参看博客https://blog.csdn.net/cherishlicoolboy/article/details/107840465
git 按行为单位管理文件
为了顺利执行一下操作,请先进入刚才复制的文件夹。通过右键菜单 “git Bash Here ..”打开git命令窗口
git diff 比较工作区与暂存区的所有文件
git diff filename 比较工作区与暂存区的指定文件
git diff 012.txt 比较工作区与暂存区的012.txt
git diff --cached 文件名 比较暂存区与最新提交版本的文件的差别
git diff --cached 012.txt 比较暂存区与最新提交版本的文件的差别
git diff HEAD filename 比较当前工作目录中的文件012.txt与最近的一次提交
git diff HEAD 012.txt 比较当前工作目录中的文件012.txt与最近的一次提交(即HEAD指向的提交)之间的差异,并
将差异输出到终端上。
比较不同版本的差别
git diff 版本号1 版本号2 文件名 比较两个版本号之间的指定文件的差别
为了能比较版本,你可以通过 git log --oneline 先查看日志、
git diff d50d0a8 e693478 比较版本d50d0a8 版本e693478之间的指定文件的差别
下面我们来实验如何进行不同区修改内容的回退。
进入刚才复制的一个文件夹,打开git命令窗口
git checkout -- filename 撤销工作区中对某文件的修改,回复到和暂存区一致
git checkout -- . 撤销工作区中对所有文件的修改,回复到和暂存区一致
git checkout -- 012.txt , 执行之后,工作区012.txt的内容回复为 12,和暂存区一致了
进入刚才复制的一个文件夹,打开git命令窗口
git reset HEAD :此命令将取消暂存指定文件的更改,从而使其退回到未暂存状态。
git reset HEAD 012.txt 暂存区额内容回复为1
有时我们刚提交到本地库了,但是又后悔了,或者最近几个提交我都不想要了,版本库和暂存区都想回到之前的状态。
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 查看日志情况
git reset HEAD^ 工作区和暂存区退回到上个版本,工作区保持不变
git reset 可以进行版本回退。
我们知道在开发的计算机上存在 git工作区、暂存区和本地仓库
当版本回退时。根据是否要让不同的区域回退,就出现了不同的不同的回退命令
a. git reset --hard 【索引】
本地仓库、暂存区、工作区全部回退到指定索引提交后的状态。
所有提交后的修改都被删除掉 。它本质上是撤销了工作区、暂存区以及提交,回退到指定版本
b. git reset --mix 【索引】 (缺省为mix,故可省略 --mix)
本地仓库、暂存区回退,工作区不回退。
git reset HEAD 用于对git add等命令的撤销。它本质上是撤销了提交以及暂存区的修改
c. git reset --soft 【索引】
本地仓库回退、暂存区、工作区不回退。
git reset --soft HEAD^ 它本质上是撤销了上一次 git commit 命令
当某次提交错误,想撤销重新修改后提交,则可以先用--soft回退版本,修改后 重新add修改的文件,然后重新commit。
假设我们之前提交的006.txt错误了,末尾少了一行代码“666”,我们现在可以回退,修改后,再次提交。
此时操作,就会在当前你修改的基础上,把006.txt也修改了
下面我们来实操,看看效果,
进入刚才复制的文件夹中,打开git命令窗口
git reset --soft 版本号 让版本库回退到指定版本 工作区和工作区不变
git log --oneline 查看提交日志
git reset --soft 97af44a 让版本看和暂存区回退到 97af44a版本 工作区和工作区不变
git status 查看状态
然后重新修改后,git add 后,git commit,
git reset --mixed命令可以起到净化提交历史的作用
当某次提交不正确,想重新提交,可以使用--soft撤销提交,重新修改后,commit。
git reset --soft HEAD^ 本质是撤销上一次commit提交
--mix是缺省的,不写就表示mix
--mix执行后,工作区不变,暂存区和本地仓库都回到该版本。
当某次提交错误,想撤销重新修改后提交,也可以先用--mix回退版本,修改后重新add,然后commit。
git reset --mix 97af44a
其中的 97af44a 是git log --oneline中看到的版本的索引
执行后,工作区不变,暂存区和本地仓库都回到该版本。
有时我们发现最近的的几次修改都是不对的,那么我们可以将本地仓库、暂存区、工作区全部回退到历史版本。
该命令是最为常用的命令。
git reset --hard 97af44a
其中的 97af44a 是git log --oneline中看到的版本的索引
执行后,工作区、暂存区和本地仓库都回到该版本。