第五节《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 ...
随机推荐
- QT 设置应用程序名称和主窗口标题
1.设置应用程序名称 在工程文件.pro文件中,修改Target为想设置的名称 TARGET = MXEditer 2.设置主窗口标题,在main文件中,我的主窗口是MainWindow. int m ...
- Docker应用
1.tomcat容器创建 docker run -d --name Jdd_tomcat -p 8081:8080 tomcat [root@localhost etc]# docker run - ...
- MyBatis mapper parameterType
1. 传入简单类型 JAVA代码: public User get(Long id) { return (User) getSqlSession().selectOne("com.liu ...
- win8外包公司——技术分享:参数传递
页面之间传递参数 windows phone 的参数传递和web 差不多.用“?”号传递 多个参数的时候用 “&”做分隔. 我接着昨天的项目继续添加一个FourPage.xaml 在昨天的Th ...
- WIN8外包公司—长年承接WIN8(surface)应用外包—北京动点飞扬软件
WIN8外包公司—长年承接WIN8(surface)应用外包 一.我们长年专门承接WIN8外包.Surface外包. WPF 外包.HTML5外包.WindowsPhone 外包.Silverligh ...
- Javascript 字典应用实例
字典时一个很有用的工具,在之前C#项目中有经常使用,这篇博文主要讲解在Javascript中,字典的实际应用场景 首先在JS中,是没有Dictionary‘类的,我们需要实现键值(KEY) -- 数值 ...
- sigmod函数
#include <cmath> //math.h double sigmod(double x) { return 1/(1+exp(-x)); }
- 缺陷管理工具Jira安装参考
1安装简介 1.1方案/流程简介 需要依赖安装数据库,可以是mysql,orace或sqlserver.以mysql为例说明. 各模块各阶段安装任务说明如下: 安装模块 说明 jira 项目与事务 ...
- Android Vector曲折的兼容之路
Android Vector曲折的兼容之路 两年前写书的时候,就在研究Android L提出的Vector,可研究下来发现,完全不具备兼容性,相信这也是它没有被广泛使用的一个原因,经过Google的不 ...
- 为django项目创建虚拟环境
1. 先创建一个存放虚拟环境的目录 /opt/venl mkdir /opt/venl 2. cd 到该存放虚拟环境的目录下,并创建一个虚拟环境 virtualenv是如何创建“独立”的Python ...