本节在不考虑分支的情况,以game文件夹为例,来实际演示git的实际操作,为了好理解,先只模拟代码的增和补,至于回退一类的逆向操作则放在下一节。
假如我们的项目是game,新建并进入game目录,我们先执行git status
命令,如图:
诶,严重错误:不是一个git仓库
执行git init
命令,再次git status
,如下:
有变化了,提示告诉我们已完成初始化,目前仓库还没有提交呢。
查看game目录里面,发现多了个隐藏文件夹:.git
里面的内容,则是git自动生成的
总结:
git init
用来初始化本地仓库,告诉git,这个文件夹需要版本控制啦。git status
用来查看文件状态的变化,在常用不过了。命令后跟文件名则是查看该文件的状态,若不加文件则显示目录下所有变更状态新建list.md文件,开始编写我的“代码”。新建文件后,马上使用git status
命令,可以看到list.md处于未追踪状态:
.DS_Store
是mac系统自动添加的,可以忽略,但是也被git检测到了。在日常使用中,IDE的一些配置文件、说明文件可以被加入到“忽略”列表中,告诉git此类文件无需管理。这点随后再总结。
编写我的“代码”,写入“全境封锁”四个字:
使用git add
命令,让文件进入暂存区,再次查看状态:
可以看到,list.md已经被暂存(变黄),命令行提示我们这个文件的变化即将被提交。
接下来使用git commit
来将暂存态的list,md提交版本库:
其中 -m 选项指的是在命令中直接编写提交说明。如果不加-m选项,则git会打开vim编辑器来让你编写提交说明,编写完毕后,需要使用:wq退出,才可完成提交,如图:
注:如果不写提交说明,是无法提交成功的!(别懒!提代码写log是好习惯啊!!!!)
之后继续编辑我的list.md,再提交,步骤如上所述,很简单!
使用git log
命令来查看提交的情况:
git log
加上 -c
选项,用来显示本次提交的变更内容:
这里可以看到加号则是文件增加的内容,减号则对应删除了,如果是修改一行,可以看到实际上是先删除,再新加(这个属于文本编辑器的动作)。
如果将“全境封锁”改为“全境封锁1”,则git log -c
如下图:
标题3中所用的git log
命令,仅适用于已将变更提交至版本库时的情况,如果文件修改后仅执行暂存。这时候的变化则使用git diff
命令来查看:
我在文件中加入了“全境封锁1-季票”:
执行 git diff list.md
,可以看到list.md的变化
git diff --staged
命令用来查看暂存后的变化
即:git add list.md 后,执行git diff
无内容,但执行git diff --staged list.md
则显示如上图。
以上两个命令我们没有后跟文件名,则会显示工程目录下所有文件的变化,如果我们还有一个cpu.md文件一起修改,则git diff
和 git diff --staged
会同时显示两个文件的所有变更:
这次我们要添加“全境封锁2”这个游戏,编辑list.md,提交,但是因为粗心,写成了“全境封锁3”,提交后,使用 git log -c
查看如下:
此时,我们完全可以重新来一次提交,提交时写提交日志:“修复手滑写错的全境封锁3”。
可是我偏偏不想再增加一个版本了,让人家看着很low,那么git commit --amend 可以帮你,修改错误,暂存,执行:git commit --amend -m '购买全境封锁2'
,执行git log -c
,比较之下可以看到上次错误的提交已被覆盖了:
好的,这下完美了。
PS:如果我觉得提交日志写的不好,需要重新写一下,那么更简单,仅修改 -m 后面的内容,执行命令即可。
使用--amend
,可以覆盖最新的提交,使用git log
看到,即使提交了多次,log中显示也只看到一次提交:
那么,类似这种覆盖提交的操作真的再也无据可查了嘛?使用 git log -g
即可:
可以发现第一次是错误的提交,第二次是--amend
的覆盖提交。
那么加上-c参数,可以看到多次--amend
提交的变化了,执行git log -g -c
如下:
可以看到,版本是从下到上递增的,第一次写的是“全境封锁3”,第二次则是“全境封锁2”了。
由此,可以看到,加上
--amend
参数后并没有删除最新的提交,而是新生成了一个提交,重新commit了一次而已。也是有据可查的。
如果真的很赖,不想写提交日志,在commit时使用 --allow-empty-message
参数即可:
在弹出的vim编辑器中直接:q退出,就提交成功了。
一些IDE的描述文件、class文件、mac系统自己添加的一些隐藏文件,在git status
的时候,总会提示,很烦人:
那么只要在我们的目录下新建.gitignore(这是一个隐藏文件)文件来告诉git:“不要多管闲事儿”,把需要忽略的内容(文件或某个文件夹)加到这个忽略文件中:
具体 .gitignore有自己的语法,可以自行baidu,以下是一个项目中的示例:
*是通配符,名称可以匹配单个文件或文件夹名。
好了,把.gitignore提交之后,我们再看git status
,爽多了!