但行好事
莫论前程❤

Git教程(10)—–Git基本操作

​ 之前的实践选取的示例都非常简单,基本上都是增加和修改文本文件,而实际情况要复杂得多,需要应对各种情况: 文件删除、文件复制、文件移动、目录的组织、二进制文件、误删文件的恢复,等等.

​ 本文要用一个更为真实的例子:通过对Hello World程序源代码的版本控制,来介绍工作区中其他的一些常用操作.首先我们会删除之前历次实践在版本库中留下的”垃圾”数据,然后再在其中创建一些真实的代码,并对其进行版本控制.

先来合个影

​ 马上就要和之前实践遗留的数据告别了.告别之前是不是要留个影呢?在Git里,”留影”用的命令叫作tag,更加专业的术语叫作”里程碑”(打tag,或打标签).”留影”操作如下:

$ cd /path/to/my/workspace/demo
$ git tag -m "Say bye-bye to all previous practice."  old_practice

​ 本文还不打算详细介绍里程碑的奥秘,只要知道里程碑无非也是一个引用,通过记录提交ID(或者创建Tag对象)来为当前版本库的状态进行”留影”.

$ ls .git/refs/tags/old_practice
.git/refs/tags/old_practice
$ git rev-parse refs/tags/old_practice
41bd4e2cce0f8baa9bb4cdda62927b408c846cd6

​ 留过影之后,可以执行git describe命令将最新提交显示为一个易记的名称.显示的时候会选取离该提交最近的里程碑作为”基础版本号”,后面附加标识距离”基础版本”的数字,以及该提交的SHA1哈希值缩写.因为最新的提交上 恰好被打了一个”里程碑”,所以直接显示”里程碑”的名称. 这个技术会在后面的示例代码中多次用到.

$ git describe 
old_practice

删除文件

​ 看看版本库当前的状态,暂存区和工作区都包含修改.

$ git status -s 
A hack-1.txt
M welcome.txt

​ 在这个暂存区和工作区都包含文件修改的情况下,使用删除命令更具有挑战性.删除命令有多种使用方法,有的方法很巧妙,而有的方法则需要更多的输入.为了分别介绍不同的删除方法,还要使用上一章介绍的进度保存(git stash)命令.

  • 保存进度
$ git stash
Saved working directory and index state WIP on master: 2b3lc19
Merge commit 'acc2f69'
HEAD is now at 2b31c19 Merge commit 'acc2f69'

​ 在恢复进度.注意不要使用git stash pop,而是使用git stash apply,因为这个保存的进度要被多次用到.

$ git stash apply
# On branch master
# Changes to be commited:
# (use "git reset HEAD <file>..."  to unstage)
# 
#   new file: hack- 1. txt 
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory) 
#
# modified: welcome. txt
#

本地删除不是真的删除

​ 当前工作区的文件有:

$ ls 
detached-commit.txt    #分离
hack-1.txt
new-commit.txt

​ 直接在工作区删除这些文件,会如何呢?

$ rm *.txt

​ 通过下面的命令.可以看到在暂存区(版本库)中的文件仍然存在,并未删除.

$ git ls-files
detached-commit.txt
hack-1.txt
new-commit.txt
welcome.txt

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

$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage) 
#
# new file: hack-1.txt 
#
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout --<file>..." to discard changes in working directory)
#
# deleted: detached-commit.txt
# deleted: hack-1.txt
# deleted: new-commit.txt
# deleted: welcome.txt
#

​ 从Git状态输出中可以看出,本地删除如果要反映在暂存区中应该用git rm命令,对不想删除的文件执行git checkout --<file>,可以让文件在工作区重现.

执行git rm 命令删除文件

​ 下面按照上面状态输出的内容,将所有的文本文件删除.执行下面的命令:

$ git rm detached-commit.txt hack-1.txt new-commit.txt welcome.txt
rm 'detached-commit.txt'
rm 'hack-1.txt'
rm 'new-commit.txt'
rm 'welcome.txt'

​ 再看一看状态:

$ git status
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# deleted: detached- commit. txt 
# deleted: new- commit. txt 
# deleted: welcome. txt 
#

​ 删除动作加入了暂存区.这时执行提交动作,就从真正意义上执行了文件删除.

$ git commit -m "delete trash files. (using : git rm)"
[master 483493a] delete trash files. (using: git rm) 
1 files changed, 0 insertions(+), 2 deletions(-) 
delete mode 100644 detached-commit.txt
delete mode 100644 new-commit.txt 
delete mode 100644 welcome.txt

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

$ git ls-files --with-tree=HEAD^
detached-commit.txt
new-commit.txt
welcome.txt

​ 也可以查看在历史版本中尚在的删除文件的内容.

$ git cat-file -p HEAD^:welcome.txt
Hello.
Nice to meet you.

命令git add-u快速标记删除

  • 丢弃之前测试删除的实验性提交
$ git reset --hard HEAD^
HEAD is now at 2b31c19 Merge commit 'acc2f69'
  • 恢复保存的进度.(参数-q使得命令进入安静模式)
git stash apply -q
  • 然后删除本地文件,状态显示出依然只是在本地删除了文件,暂存区中的文件仍在.
$ rm  *.txt
$ git status -s
D detached-commit.txt
AD hack-1.txt
D new-commt.txt
D welcome.txt
  • 执行git add -u命令可以将(被版本库追踪的)本地文件的变更(修改、删除)全部记录到暂存区中.
$git add -u
  • 查看状态,可以看到工作区删除的文件全部被标记为下次提交时删除.
$ git status -s
D detached-commit.txt
D new-commit.txt
D welcome.txt
  • 执行提交,删除文件.
$ git commit -m "delete trash files. (using: git add -u)" [master 7161977] delete trash files. (using: git add -u) 
1 files changed, 0 insertions(+), 2 deletions(-) 
delete mode 100644 detached-commit.txt
delete mode 100644 new-commit.txt 
delete mode 100644 welcome.txt
赞(0) 打赏
未经允许不得转载:刘鹏博客 » Git教程(10)—–Git基本操作
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏