第五节《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%了,因为我们再文件中又追加了内容的原因。