前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >git入门篇(4)--版本穿梭

git入门篇(4)--版本穿梭

作者头像
创译科技
发布2020-01-15 16:16:03
5560
发布2020-01-15 16:16:03
举报
文章被收录于专栏:Node开发

上一篇主要针对使用git add和git commit两个指令提交文件到本地版本库做了详细的介绍,其实提交文件到版本库无非就是两个步骤,先将文件添加到暂存区,所有要提交的文件全部添加完毕,统一提交到版本库。那我们每一次提交都会生成一个不同的版本,我们如何对这些不同的版本进行管理呢?本篇文章主要谈谈版本的管理,比如版本回滚,修改的管理删除等。

暂存区文件删除

我们都清楚,我们要更新版本库首先git add一个文件,这时候这个文件所做的修改就会添加到暂存区,但是这时候如果我们发现添加错文件了,我们如何删除暂存区的文件呢?这里一般来说有三种情况存在:

  • 暂存区存在一个文件hello.txt,我们需要从暂存区删除这个文件,但是工作区文件不能删除。
  • 暂存区存在一个文件hello.txt,我们需要从暂存区删除这个文件,并且同时删除工作区文件。
  • 我们暂存区有多个文件,需要同时清空整个暂存区。

只清除暂存区的某个文件

在git暂存区有多个文件,如果我们只想要从暂存区删除其中一个文件,那我们可以使用命令:

代码语言:javascript
复制
git rm --cached hello.txt

清空暂存区文件并且删除工作目录对应文件

在git暂存区有多个文件,如果我们只想要从暂存区删除其中一个文件,并且将这个文件同时从工作目录删除,那我们可以使用命令:

代码语言:javascript
复制
git rm -f hello.txt

清空暂存区

清空暂存区所有缓存文件,可以删除版本库的index文件,就可以达到清空暂存区的目的,可以使用命令

代码语言:javascript
复制
rm .git/index

我简单的录制了一个gif图演示清除缓存区的操作:

暂存区文件修改

比如我们有一个hello.txt文件,第一次插入了一句话,git add添加到暂存区,然后我们不使用git commit提交,而是选择继续更改工作区的hello.txt,这时候就导致暂存区的hello.txt文件和工作区的hello.txt不一致,那这时候选择git commit提交究竟提交的是暂存区的旧版本还是工作区的新版本呢?我们上一篇其实讲过一般情况下使用git commit -m只会提交暂存区的文件,所以说一般情况下就算工作区文件修改了也一样只会提交暂存区的旧版本,但是为何说一般情况呢?因为我们上篇也提到了git commit -a -m命令,使用这个命令如果之前我们已经将hello.txt文件提交到版本库,代表这个文件已经被Git进行版本管理,这时候使用git commit -a -m命令则会将工作区做了修改但是没有添加到暂存区的文件先添加到暂存区再提交,两步操作合二为一,但是我们一般情况不建议使用这个命令,特别新手更是应该分成两步操作确保不会出现问题。我也简单的录制了一个gif简单解析下这个过程:

可以看到,我先将文件添加到暂存区,然后修改文件新增一句话,再次使用git status命令查看暂存区状态提示hello.txt文件被修改,这时候我选择git commit提交,再次查看状态一样提示hello.txt文件被修改,所以证明我们工作区所做的修改并没有被真正提交,提交的一样是暂存区的旧版本。

撤销修改

有朋友看到这个标题撤销修改,会纳闷撤销修改不就是将文件从暂存区删除,刚才已经提到过了,但是如果我们需要撤销工作区的修改呢,也就是将hello.txt撤销修改回退到上一次提交的版本如何做呢?实际上我们git add后使用git status命令

代码语言:javascript
复制
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   hello.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        project/
        scoreInfo.txt

可以看到提示我们使用git restore --satged hello.txt可以从暂存区撤销这个文件,我们执行完这个命令再次执行git status

代码语言:javascript
复制
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   hello.txt


Untracked files:
  (use "git add <file>..." to include in what will be committed)
        project/
        scoreInfo.txt

可以看到再次提示可以使用git restore hello.txt撤销工作区的修改回退到上一次提交的版本,再次使用这个命令你个发现我们刚才工作区所做的修改果然全部丢失了。那如果我们想要放弃暂存区的修改并且同时回退工作区文件的修改,执行两次命令固然没问题,但是这时候我们可以使用一个命令直接实现:

代码语言:javascript
复制
git checkout -- hello.txt

使用这个命令一般有两种可能,hello.txt文件修改已经添加到暂存区,使用这个命令则会从暂存区删除hello.txt并且工作区文件版本同时回退。第二种可能文件工作区做了下盖,还未添加到暂存区,则直接回退工作区版本,所以使用这个命令可以直接将刚才的两个命令合二为一。

版本回退

刚才对版本做修改一直都是针对工作区和暂存区,那如果我们工作区版本修改出问题了废掉了,我们想要将版本回退到版本库某一个版本如何实现呢?首先我们需要先查看目前提交了几个版本,这时候可以使用git log查看不同版本的摘要信息:

可以看到我们一共提交了三次修改,生成了3个commit_id,我们可以看到每一次提交的备注,然后找到我们需要回退版本的commit_id,取到了commit_id之后我们就可以实现版本回退,使用命令:

代码语言:javascript
复制
git reset --hard HEAD^

使用这条命令可以成功将版本回退到上一个版本,比如我们要回退三个版本之前,我们可以使用这个命令你个连续执行三次,但是如果十个百个版本呢?实际上上面的命令完整是:

代码语言:javascript
复制
git reset --hard commit_id

也就是我们只需要传对应版本的commit_id就可以实现版本回退到对应的版本,而要查询旧版本的commit_id刚才说过了使用git log就可以实现。

我们可以看到我是用命令回退到上一个版本,再次git log查看版本log,发现我刚才的版本由于回退丢失了,如果我版本回退后悔了,要如何恢复到刚才的新版本呢?Git还提供了一个记录所有历史的命令:git reflog,我们可以使用git reflog查看所有版本历史,最后使用git reset指定刚才的commit_id进行恢复。

可以看到版本成功恢复到刚才的新版本了,所以使用git log,git reflog,git reset我们就可以在所有版本来回穿梭,不用担心回退导致版本丢失的问题。通过本篇文章讲到的命令,基本可以满足工作中对于版本库管理的一般要求了。下一篇开始将本地仓库接入远程仓库,实现将项目推送到第三方远程仓库存储,比如codding,码云,GitHub等。

推荐阅读 git入门篇(1)--初识Git git入门篇(2)--Git的安装

git入门篇(3)--更新文件到版本库

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿周先森 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档