在上一次的Git时间里,我们学习了关于Git最基本的用法,包括安装,创建代码仓库,以及提交本地代码。本届中我们将要学习更多的使用技巧,不过在开始之前要先把准备工作做好。
所谓的准备工作就是要给一个项目创建代码仓库。这里就选择在PlayVideoTest 项目中创建吧。打开终端界面,进入这个项目的根目录下面,然后执行git init 命令。
9.6.1 忽略文件
代码仓库现在已经创建好了,接下来我们应该去提交PlayVideoTest 项目中的代码。不过在提交之前,你也许应该考虑一下,是不是所有的文件都需要加入版本控制当中呢?
在第1章介绍Android 项目结构的时候我们提到过,build 目录下的文件都是编译项目时自动生成的,我们不应该将这部分文件添加到版本控制当中,那么如何才能实现这样的效果呢?
Git 提供了一种可配性很强的机制,允许用户指定的文件或目录排除在版本控制之外,它会检查代码仓库的目录下是否存在一个名为.gitignore 的文件,如果存在,就去一行行读取这个文件中的内容,并把每一行指定的文件或目录排除在版本控制之外。注意,.gitignore 中指定的文件或目录是可以使用 “*”通配符的。
神奇的是,我们并不需要自己去创建.gitignore 文件,Android Studio 在创建项目的时候会自动帮我们创建出两个.gitignore 文件,一个是在根目录下,一个在app 模块下。首先看一下根目录下面的.gitignore 文件:
这是Android Studio 自动生成的一些默认配置,通常情况下,这部分内容都不用添加到版本控制当中。我们来简单阅读一下这个文件,除了*.iml 表示指定任意以.iml 结尾的文件,其他都是指定的具体的文件名,上面配置中的所有内容都不会被添加到版本控制当中,因为基本是一些由IDE 自动生成的配置。
再来看一下app 模块下面的.gitignore 文件,这个就简单多了:
由于app 模块下面大多是我们编写的代码,因此默认情况下只有其中的build 目录不会被添加到版本控制当中。
当然,我们完全可以对以上两个文件进行任意修改,来满足特定的需求。比如说,app模块下的所有测试文件都只是给我自己使用的,我并不想把它们添加到版本控制中,那么就可以这样修改app/.gitignore 文件中的内容:
没错,只需添加这样两行配置即可,因为所有的测试文件都是放在这两个目录下的。现在我们可以提交代码了,先使用add 命令将所有的文件进行添加,如下所示:
git add .
ps: 后面是有个点的,表示全部
然后执行commit 命令完成提交,如下所示:
git commit -m "First Commit"
9.6.2 查看修改内容
在进行了第一次代码提交之后,我们后面还可能会对项目不断地进行维护或添加新功能等。比较理想的情况是,每当完成了一小块功能,就进行一次提交。但是如果某个功能涉及的代码比较多,有可能写到最后的时候我们就已经忘记了前面修改什么东西了。遇到这种情况时不用担心,Git 全部帮你记着呢! 下面我们就来学习一下如何使用 Git 查看自上次提交后文件修改的内容。
查看文件修改情况的方法非常简单,只需要使用status 命令就可以了,在项目的根目录下输入命令:
git status
然后Git 会提示目前项目中没有任何可提交的文件,因为我们刚刚提交过了。现在对PlayVideoTest 项目中代码稍微做一下改动,修改ManActivity 中的代码,如下所示:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
play.setOnClickListener {
if (!videoView.isPlaying){
videoView.start()
}
Log.d("MainActivity","video is playing")
}
...
}
}
这里我们仅仅是在play 按钮的点击事件中添加了一行日志打印。然后重新输入git status 命令,结果如下:
可以看到,Git 提醒我们MainActivity.kt这个文件已经发生了改变,那么如何才能看到更改的内容呢?这就需要借助diff 命令了,用法如下:
git diff
这样可以查看所有文件的更改内容,如果你只想查看MainActivity.kt这个文件的更改内容,可以在后面加上完成的文件路径:
git diff app/src/main/java/com/example/playvideotest/MainActivity.kt,执行命令结果如下:
这样文件所有的修改内容就都可以在这里查看了,一览无余。其中,变更部分最左侧的加号代表新添加的内容。如果有删除内容的话,会在最左侧用减号表示。
9.6.3 撤销未提交的修改
有时候我们的代码可能写的过于草率,以至于原本正常的功能,结果反而被我们改出了问题。遇到这种情况时也不用着急,因为只要代码还未提交,所有修改的内容都是可以撤销的。
比如上一小节中我们给MainActivity 添加了一行日志打印,现在如果想要撤销这个修改就可以使用checkout 命令,如法如下(Ps 这样操作后本地代码会真的被还原到上次提交哦):
git checkout app/src/main/java/com/example/playvideotest/MainActivity.kt
执行了这个命令之后,我们对MainActivity.kt 这个文件所做的一切修改就应该都被撤销了。重新运行git status 命令检查一下,结果如图 :
可以看到,当前项目中没有任何可提交的文件,说明撤销确实成功了。
不过,这种撤销的方式只适用于那些还没有执行过add 命令的文件,如果某个文件已经被添加过了,这种方式就无法撤销更改的内容。下面我们来做个实验瞧一瞧。
首先扔是给MainActivity 添加一行打印日志,然后输入命令:
git add .
这样就把所有修改的文件都进行了添加,可以输入git status 检查一下。结果如图:
现在我们再执行一遍checkout 命令,你会发现MainActivity 仍然处于已添加状态,所修改的内锅无法撤销掉。
这种情况应该怎么办?难道我们还没法后悔了?当然不是,只不过对于已添加的文件,我们应该先对其取消添加,然后才可以撤销提交。取消添加使用的是reset 命令,用法如下所示:
git reset HEAD app/src/main/java/com/example/playvideotest/MainActivity.kt
然后再运行一遍git status 命令,你就会发现MainActivity.kt 这个文件重新变回了未添加状态,此时就可以使用checkout 命令将修改的内容进行撤销了。
9.6.4 查看提交记录
当PlayVideoTest 这个项目开发了几个月之后,我们可能已经执行过上百次的提交操作了,这个时候估计你就已经忘记每次提交都修改了哪些内容。不过没关系,忠实的Git 一直都帮我们清清楚楚的记着呢!可以使用log 命令查看历史提交信息,如法如下所示:
git log
由于目前我们只执行过一次提交,所以能看到的信息很少,如图:
可以看到,每次提交记录都会包含提交Id、提交人、提交日期以及提交描述这4个信息。那么我们再次给MainActivity 添加一行日志打印,然后执行一次提交操作,如下所示:
git add .
git commit -m "Add log"
现在重新执行git log 命令,结果如下:
当提交记录非常多的时候,如果我们只想看其中一条记录,可以在命令中指定该记录的id:
git log c1e771ee6429737c7df7f0018c8fae6521144568
也可以在命令中通过参数指定查看最近几次提交,比如 -1 就表示我们只想看到最后一次的提交记录:
git log -1