上一节最后留了三个问题,本节我们就Git的版本回退和gitignore做一个详细介绍。
本节内容预告:
- git版本回退
- gitignore介绍以及使用
- 总结回顾
1.git版本回退
日常开发中,我们可能会遇见的一个问题是提交错了内容,不管是提交到了暂存区,还是提交到了版本库,都需要涉及到版本的回退,如果不熟悉这些操作导致误操作,可能会关联引发一系列的问题,很影响工作效率,所以通过本节课学习,希望读者能掌握版本回退常见问题以及解决办法,而不是每次遇见问题就去百度。
- 已经被git跟踪但是工作区有修改没保存到暂存区的文件想丢弃工作区的内容怎么做?
可以看到,上面先是修改了一个已经被git追踪的文件test.txt ,然后Git status查看当前状态,git 提示有没保存到暂存区的文件,此时如果使用命令git checkout -- 文件名
,将会丢弃工作区的变更。此时,工作区和暂存区的内容保持一致。
一个文件可以通过指定文件名回滚,如果很多文件呢?不能一个一个回滚吧?多个文件可以通过命令git checkout -- .
实现当前工作区全部回滚。 - 已经保存到暂存区,但是没提交到版本库的内容,怎么回滚?
上面我们修改文件后将文件添加到了暂存区,使用命令git reset HEAD test.txt
就会将当前在缓存区的test.txt 文件移出到工作区。移出后使用git status
,会发现文件已经到了暂存区。
一个文件可以通过文件名指定回滚,如果很多文件呢?逐个指定文件名回滚会很影响效率,通过命令git reset HEAD *
可以回滚所有文件到工作目录。
- 对已经提交到版本库的内容,想要回滚怎么办?
上面图片可以看到,刚开始本地有两个文件有变更,然后提交到版本库,git log
显示提交日志如下,可以看到最新的提交日志就是刚才提交的内容,现在如果想回滚刚才的提交怎么办?
先q
键退出查看日志模式,然后使用命令git reset --hard HEAD^
可以看到:最新的提交已经不在,当前HEAD指向前一个提交。
使用命令git log
显示,当前最新的是上一次提交内容,最新的提交记录已经看不到了。
刚才的命令可以回滚一次,如果有要回滚到两个,三个提交之前的怎么实现?
第一种命令方式是git reset HEAD^^
(会将变更回滚到工作区),git reset --hard HEAD
(会强制覆盖本地内容)通过在HEAD后面加几个符号^
,可以实现回滚到哪几个提交之前
第二种命令方式是git reset HEAD~2
(会将变更回滚到工作区),git reset --hard HEAD~2
(会强制覆盖本地内容)通过在HEAD后面加数字,实现往前回滚几个提交
这两种方式可以本地自己实践,这里就不重复操作了。
这里简单强调一下回滚命令加的参数–hard有风险,回滚需谨慎,(实际上就算hard也可以恢复的,后面会提到)
第三种方式是指定提交id,即使用命令git reset COMMITID
,实现回滚到指定的提交id
至此,git提交到暂存区,版本库的回滚操作基本都有了解决办法,那么有个问题是这样子的,如果你回滚错了怎么办?比如刚开始你以为自己要回滚,结果回滚后发现这部分代码实际上是需要的,这时候你想恢复回去,如果你记得以前回滚之前的提交id的话,是可以的,通过git reset 提交id
可以实现恢复,但是不记得呢?
细心的同学会发现,回滚后git log
是不会显示已经回滚掉的提交id的,那么有没有办法可以看到我们的已经回滚调的提交id么?
git给我们提供了一个命令git reflog
,git log里面保存的是我们每次提交的提交id,git reflog 保存的是操作日志,git reflog
可以看到每次分支切换或者在某个提交基础上做的提交或者回滚操作,这样就能通过命令指定提交id回滚
比如gitlog显示当前提交为:
我们通过命令git reset HEAD^
回滚到上一个提交,使用git log
,最新的提交已经回滚,并且看不到他的提交id
这时候我们想恢复回滚的话,使用git reflog
找到丢失的提交id
然后使用命令git reset 提交id
,恢复回滚内容
2. gitignore
我们在开发过程中项目经常会自动生成一些与你本地环境相关的文件,比如idea的.idea文件和eclipse生成的.eclipse,还有一些文件是你只想自己本地使用不想提交到版本库的等等,这些文件实际上是不需要也不应该提交到git的版本库中的,因为不同电脑环境不同,提交上去,多人协作的话可能会出各种环境问题。
这部分文件我们也可以通过人为的方式控制不提交,但是这样每次变更就要留意这部分变动,很花精力而且容易出错,所以Git提供给我们一种方式处理这种情况。
通过在当前git仓库根目录加一个名称为.gitignore
的文件,放在这里面的文件实际上是不会被git追踪的。
配置语法
以斜杠“/”开头表示目录;
以星号“*”通配多个字符;
以问号“?”通配单个字符
以方括号“[]”包含单个字符的匹配列表;
以叹号“!”表示不忽略(跟踪)匹配到的文件或目录。
注意: git 对于 .gitignore配置文件是按行从上到下进行规则匹配的
如下面截图:这里需要留意如果你创建.gitignore文件之前就push了某一文件,那么即使你在.gitignore文件中写入过滤该文件的规则,该规则也不会起作用,git仍然会对该文件进行版本管理。
可以看到.gitignore
文件添加了一个文件ignoretest.txt 文件,然后我们修改这个文件,发现git没有跟踪到这个变更
3.总结回顾
本节刚开始引入了两个问题:
- 如果提交错了需要回滚怎么办?这里涉及到工作区,暂存区,版本库的回滚。并针对每种情况的处理方式做了说明。包括一个文件和多个文件的回滚,后面提到一种情况是你回滚错了怎么办?针对已经保存到版本库的内容,回滚错了可以通过 git reflog找到对应的提交id实现恢复回滚。
针对保存到暂存区的内容,如果回滚到了本地工作区的话,可以重复提交,重新添加到暂存区,工作区内容如果回滚覆盖,因为还没有被git记录,可能会出现丢失无法恢复。但是如果用IDEA开发的话,idea会缓存你的代码痕迹,可以通过历史记录恢复这部分内容,这个后面说到idea和git结合使用会提到。 - 第二个问题是针对项目运行的环境相关文件以及编译的文件,这部分代码是不需要也不应该提交到版本库中的,git提供了一个git ignore的功能,可以通过在.gitignore 实现提交忽略这部分文件。具体规则就不展开陈述了,有问题可以留言一起讨论。
本节内容暂时告一段落,下一节我会就Git分支管理和git分支之间代码合并等做一个简单介绍。
最后,感谢阅读,如有错误,请不吝指正