第五节《Git基本操作》
我们给原来的数据打一个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基本操作》的更多相关文章
- git第五节--git branch--分支管理
@git branch :查看当前仓库所有分支,及当前所处的分支 @git branch XXX:创建分支XXX @git checkout XXX:切换到分支XXX下 @git checkout - ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- 第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误,
第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误, 注意:版本,不然会报错 Docker >=1.11Compose >1.6.0 通过d ...
- 《Linux内核分析》 第五节 扒开系统调用的三层皮(下)
<Linux内核分析> 第五节 扒开系统调用的三层皮(下) 20135307 一.给MenusOS增加time和time-asm命令 给MenuOS增加time和time-asm命令需要 ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- android内部培训视频_第五节(1)_OA实战之登录界面
第五节(1):OA实战之登录界面 一.登录界面布局 1.背景图片 2.文本框 3.checkbox 4.按钮 暂未实现点击切换图片效果 <RelativeLayout xmlns:androi ...
- 基于Extjs的web表单设计器 第五节——数据库设计
这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...
- JAVA GC之标记 第五节
JAVA GC之标记 第五节 OK,我们继续昨天最后留下的问题,什么是标记?怎么标记? 第一个问题相信大家都知道,标记就是对一些已死的对象打上记号,方便垃圾收集器的清理. 至于怎么标记,一般有两种方 ...
- 第五节 面向连接传输:TCP
第五节 面向连接传输:TCP TCP概述RFCs:793,1122,1323,2018,2581 点对点: 一个发送方,一个接收方 可靠,按序的字节流: 无“报文边界”,无结构但有 ...
- VUE2.0实现购物车和地址选配功能学习第五节
第五节 单件商品金额计算和单选全选功能 1.vue精髓在于操作data模型来改变dom,渲染页面,而不是直接去改变dom 2.加减改变总金额功能: html:<div class="c ...
随机推荐
- 3、基于多播、安全认证的corosync集群(VIP、Httpd、Filesystem)
Messaging Layer --> CRM --> RA systemd:/usr/lib/systemd/system systemd有一个特性,即便一个服务开机启动,但是在 ...
- [笔记] SQL性能优化 - 避免使用 IN 和 NOT IN
WHY? IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢? 1.效率低 可以参看我之前遇到的一个例子([小问题笔记(九)] SQL语句Not IN 效率低,用 NOT EXISTS试试 ...
- MySQL安装指南(转)
MySQL安装指南 安装MySQL sudo apt-get install mysql-server 这个应该很简单了,而且我觉得大家在安装方面也没什么太大问题,所以也就不多说了,下面我们来讲讲 ...
- 代码覆盖率-JaCoCo
代码覆盖率 在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%. JaCoCo Jacoco从多种角度对代码 ...
- Ruby on Rails Tutorial 第一章笔记
搭建开发环境 作者介绍了 Cloud9\ Coding.net 这样的云端开发环境 安装 Rails 1. 新建 rails 应用 首先,调用 rails new 命令创建一个新的 Rails 应用, ...
- pytorch构建自己的数据集
现在需要在json文件里面读取图片的URL和label,这里面可能会出现某些URL地址无效的情况. python读取json文件 此处只需要将json文件里面的内容读取出来就可以了 with open ...
- Grafana + Prometheus 监控PostgreSQL
效果图 部署环境 服务器名称 IP地址 部署业务 备注 部署agent sht-sgmhadoopcm-01 172.16.101.54 PostgreSQL 监控服务器.被监控服务器 node_ex ...
- 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[ ...
- nodeJS总结day1
1.概念:nodeJS是基于chromeV8引擎的Javascript运行环境,使用了一个事件驱动非阻塞的i/o模式,使其轻量又高效.适合做高效又并发的项目.除此之外遵循的是COMMONJS规范. 2 ...
- mysql5.5大数据量下表结构升级
升级一张4万多行(增加一个字段),且包含blob字段的表(blob字段包含100KB左右的数据),运行alter语句:ALTER TABLE `imgdetail` ADD COLUMN `uplo ...