我们给原来的数据打一个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. 3、基于多播、安全认证的corosync集群(VIP、Httpd、Filesystem)

    Messaging Layer --> CRM --> RA systemd:/usr/lib/systemd/system     systemd有一个特性,即便一个服务开机启动,但是在 ...

  2. [笔记] SQL性能优化 - 避免使用 IN 和 NOT IN

    WHY? IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢? 1.效率低 可以参看我之前遇到的一个例子([小问题笔记(九)] SQL语句Not IN 效率低,用 NOT EXISTS试试 ...

  3. MySQL安装指南(转)

    MySQL安装指南   安装MySQL sudo apt-get install mysql-server 这个应该很简单了,而且我觉得大家在安装方面也没什么太大问题,所以也就不多说了,下面我们来讲讲 ...

  4. 代码覆盖率-JaCoCo

    代码覆盖率 在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%. JaCoCo Jacoco从多种角度对代码 ...

  5. Ruby on Rails Tutorial 第一章笔记

    搭建开发环境 作者介绍了 Cloud9\ Coding.net 这样的云端开发环境 安装 Rails 1. 新建 rails 应用 首先,调用 rails new 命令创建一个新的 Rails 应用, ...

  6. pytorch构建自己的数据集

    现在需要在json文件里面读取图片的URL和label,这里面可能会出现某些URL地址无效的情况. python读取json文件 此处只需要将json文件里面的内容读取出来就可以了 with open ...

  7. Grafana + Prometheus 监控PostgreSQL

    效果图 部署环境 服务器名称 IP地址 部署业务 备注 部署agent sht-sgmhadoopcm-01 172.16.101.54 PostgreSQL 监控服务器.被监控服务器 node_ex ...

  8. Starting MySQL....The server quit without updating PID file[失败]/lib/mysql/ip12189.pid). 错误一例

    [root@ip12189 etc]# service mysqld startStarting MySQL....The server quit without updating PID file[ ...

  9. nodeJS总结day1

    1.概念:nodeJS是基于chromeV8引擎的Javascript运行环境,使用了一个事件驱动非阻塞的i/o模式,使其轻量又高效.适合做高效又并发的项目.除此之外遵循的是COMMONJS规范. 2 ...

  10. mysql5.5大数据量下表结构升级

    升级一张4万多行(增加一个字段),且包含blob字段的表(blob字段包含100KB左右的数据),运行alter语句:ALTER TABLE `imgdetail` ADD COLUMN  `uplo ...