我们给原来的数据打一个tag(标签),专业术语叫做“里程碑”,我们先不介绍里程碑的奥秘,只要知道里程碑无非也是一个引用而已。

[root@git demo]# pwd
/git/my/workspace/demo
[root@git demo]# git tag -m "bye to all previous practice" old_practive
[root@git demo]# ls .git/refs/tags/
old_practive

 查看一下版本库当前的状态,暂存区和工作区都包含修改:

[root@git demo]# git status -s
A hack-1.txt
M welcome.txt

 在这个暂存区和工作区都包含文件修改的情况下,使用删除命令更具有挑战性。删除命令有多重方法。

 本地删除并不是真正的删除,为什么这么说?我们来看一下:

[root@git demo]# ls
datached-commit.txt hack-1.txt new-commit.txt welcome.txt
[root@git demo]# rm -rf *.txt

通过git查看的命令git ls-files查看一下文件还存不存在

[root@git demo]# git ls-files
datached-commit.txt
hack-1.txt
new-commit.txt
welcome.txt

 从文件的状态来看,文件只是在本地进行了删除,尚未添加到暂存区中,也就是说直接再工作区中删除,对暂存区和版本库没有任何影响。

<1>执行git rm命令删除所有的文本文件

[root@git demo]# git rm datached-commit.txt hack-1.txt new-commit.txt welcome.txt

<2>查看一下现在的状态

[root@git demo]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: datached-commit.txt
# deleted: new-commit.txt
# deleted: welcome.txt

<3>此时删除动作加入了暂存区,这是执行提交动作,就从真正意义上执行了文件删除

[root@git demo]# git commit -m "delete all files"
[master b17424c] delete all files
1 files changed, 0 insertions(+), 2 deletions(-)
delete mode 100644 datached-commit.txt
delete mode 100644 new-commit.txt
delete mode 100644 welcome.txt

<4>不过不要担心,文件只是在版本库的最新提交中被删除了,在历史提交中尚在。。可以通过下面的命令查看历史版本的文件列表

[root@git demo]# git ls-files --with-tree=HEAD^
datached-commit.txt
new-commit.txt
welcome.txt

<5>也可以查看历史版本中尚在的删除文件内容

[root@git demo]# git cat-file -p HEAD^:welcome.txt
Hello.
welcome to beijing

 除上述方法删除之外,还可以使用git add -u快速标记删除

 在前面的git rm命令中,我们写下了所有的文件名,那能不能简化呢,实际上使用git add加上-u参数就可以,含义是将本地有改动的文件标记到暂存区。

<1>恢复一下我们删除之前的操作

[root@git demo]# git reset --hard HEAD^
HEAD is now at 1c314d6 Merge commit '88bba4e'

<2>删除本地文件,状态显示依然只是本地删除了文件,暂存区中文件仍在

[root@git demo]# rm -rf *.txt
[root@git demo]# git status -s
D datached-commit.txt
D new-commit.txt
D welcome.txt

<3>执行git add -u命令可以将本地文件的变更全部记录到暂存区

[root@git demo]# git add -u

<4>执行提交,删除文件

[root@git demo]# git commit -m "delete files"
[master 98bee65] delete files
1 files changed, 0 insertions(+), 2 deletions(-)
delete mode 100644 datached-commit.txt
delete mode 100644 new-commit.txt
delete mode 100644 welcome.txt

 前面说到了如何删除文件,那么删除后我要是想恢复删除的文件呢?我们看看应该怎么做

 前面已经说过执行了文件删除并提交,只是在最新的提交中删除文件,历史提交中文件仍然保留,可以从历史提交中提取文件,执行下面的命令可以从历史(前一次提交)中恢复welcome.txt文件。

[root@git demo]# git cat-file -p HEAD~1:welcome.txt > welcome.txt

或者

[root@git demo]# git show HEAD~1:welcome.txt > welcome.txt

还有比较简洁的命令

[root@git demo]# git checkout HEAD~1 -- welcome.txt

 上面命令中出现的HEAD~1相当于HEAD^都指的是HEAD的上一次提交。执行git add -A命令会将工作区中的所有改动及新增文件添加到暂存区,这也是一个常用的技巧,那我们将恢复回来的welcome.txt文件添加到暂存区。

[root@git demo]# git add -A
[root@git demo]# git status -s
A welcome.txt

执行提交操作,文件welcome.txt文件才算真正的回来

[root@git demo]# git commit -m "restore file:welcome.txt"
[master b8f0919] restore file:welcome.txt
1 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 welcome.txt

 接下来说以下git中文件的移动,通过将welcome.txt改名为README文件来测试下载Git中如何移动文件,可以使用git mv。

[root@git demo]# git mv welcome.txt README

 查看一下当前状态,可以看到改名的操作

[root@git demo]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: welcome.txt -> README

 提交改名操作,在提交中可以看到改名前后两个文件的额相似度

[root@git demo]# git commit -m "改名测试"
[master 82361f8] 改名测试
1 files changed, 0 insertions(+), 0 deletions(-)
rename welcome.txt => README (100%)

 从提交日志中出现的文件相似度可以看出,Git的改名操作得益于Git对文件追踪的强大支持。改名操作相当于对旧文件执行删除,对新文件执行添加。实际上可以不使用git mv命令,而是用git rm和git add两条命令,我们来测试一下是否可行?

<1>撤销之前的操作

[root@git demo]# git reset --hard HEAD^
HEAD is now at b8f0919 restore file:welcome.txt

<2>新的改名操作不使用git mv命令,而是直接在本地改名

[root@git demo]# mv welcome.txt README
[root@git demo]# git status -s
D welcome.txt
?? README

<3>顺便测试一下Git的内容追踪能力,修改下改名后的文件

[root@git demo]# echo "Bye-Bye" >> README

<4>执行git add -A命令,再查看状态也可以看到文件重命名的操作

[root@git demo]# git add -A
[root@git demo]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: welcome.txt -> README

<5>执行提交

[root@git demo]# git commit -m "README is form welcome.txt"
[master 06e5df8] README is form welcome.txt
1 files changed, 1 insertions(+), 0 deletions(-)
rename welcome.txt => README (76%)

 注意此时相似度不是100%了,因为我们再文件中又追加了内容的原因。

第五节《Git基本操作》的更多相关文章

  1. git第五节--git branch--分支管理

    @git branch :查看当前仓库所有分支,及当前所处的分支 @git branch XXX:创建分支XXX @git checkout XXX:切换到分支XXX下 @git checkout - ...

  2. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  3. 第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误,

    第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误, 注意:版本,不然会报错 Docker >=1.11Compose >1.6.0 通过d ...

  4. 《Linux内核分析》 第五节 扒开系统调用的三层皮(下)

    <Linux内核分析> 第五节 扒开系统调用的三层皮(下) 20135307 一.给MenusOS增加time和time-asm命令 给MenuOS增加time和time-asm命令需要 ...

  5. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  6. android内部培训视频_第五节(1)_OA实战之登录界面

    第五节(1):OA实战之登录界面  一.登录界面布局 1.背景图片 2.文本框 3.checkbox 4.按钮 暂未实现点击切换图片效果 <RelativeLayout xmlns:androi ...

  7. 基于Extjs的web表单设计器 第五节——数据库设计

    这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...

  8. JAVA GC之标记 第五节

    JAVA GC之标记  第五节 OK,我们继续昨天最后留下的问题,什么是标记?怎么标记? 第一个问题相信大家都知道,标记就是对一些已死的对象打上记号,方便垃圾收集器的清理. 至于怎么标记,一般有两种方 ...

  9. 第五节 面向连接传输:TCP

    第五节 面向连接传输:TCP   TCP概述RFCs:793,1122,1323,2018,2581   点对点:   一个发送方,一个接收方   可靠,按序的字节流:   无“报文边界”,无结构但有 ...

  10. VUE2.0实现购物车和地址选配功能学习第五节

    第五节 单件商品金额计算和单选全选功能 1.vue精髓在于操作data模型来改变dom,渲染页面,而不是直接去改变dom 2.加减改变总金额功能: html:<div class="c ...

随机推荐

  1. Webpack与其他打包工具的区别

    webpack是一个模块化加载器兼打包工具,它同时支持AMD.CMD等加载规范.与其他模块化加载器相比,它有这些优势: 1.代码分割 webpack支持两种依赖加载:同步和异步.同步的依赖会在编译时直 ...

  2. 2_Linux操作系统和基础命令行

    非图形页面下执行程序GUI接口CLI接口 #输入命令,给出执行文件的路径 命令提示符,prompt(表示可以立即输入命令了) 命令提示符通过bash(shell)运行程序来展示的 #:root #就是 ...

  3. mysql utf8mb4 设置

    [mysqld]collation-server=utf8mb4_general_ciinit-connect='SET NAMES utf8mb4'character-set-server=utf8 ...

  4. CSS实现输入框宽度随内容自适应效果

    有时候我们会遇到如下需求:输入框的宽度随内容长度自适应,当输入框宽度增大到一定值时,里边的内容自动隐藏. 面对这种需求,我们首先想到的是使用input元素标签,但是发现input标签的宽度默认设定的是 ...

  5. 6月19 使用tp框架生成验证码及文件上传

    ThinkPHP中自带能生成验证码的类:ThinkPHP/Library/Think/Verify.class.php 默认情况下,验证码的字体是随机使用 ThinkPHP/Library/Think ...

  6. css3实现好看的边框效果

    1.html结构 <div class="box">box</div> <br> <div class="border1&quo ...

  7. Python文件读写(open(),close(),with open() as f...)

    Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件读写,也需要注意编码问题 ...

  8. LAMP架构(三)

    第十九课 LAMP架构(三) 目录 一.配置防盗链 二.访问控制Directory 三.访问控制FilesMatch 四.限定某个目录禁止解析php 五.限制user_agent 六.php相关配置 ...

  9. Problem B: 类的初体验(II)

    Description 定义一个类Data,只有一个double类型的属性和如下3个方法: 1.   带1个参数的构造函数——初始化属性值为参数值. 2.   double getValue()——获 ...

  10. 2018 ICPC 区域赛 焦作场 D. Keiichi Tsuchiya the Drift King(计算几何)

    http://codeforces.com/gym/102028/problem/D 题意:根据题中给的那个图,然后题目给你 a,b,r,d,让你求出最小的满足矩形通过弯道的w 思路: