起因
最近做项目的时候,代码量很多,而且经常要对代码进行修改,更纠结的是因为考虑到之前的代码可能还会有用,所以必须保存原先的代码,这样一个代码目录里就有好多版本不一样的代码,弄得很乱,到最后都不知道哪个代码对应哪个功能。
之前想过解决的办法,就是利用linux的符号连接,然后再代码目录里写出必要的README文件,但是当要运行之前的版本的时候,就必须一各个更改对应的符号文件,而且如果README记载的不是很详细,就不知道之前的版本到底应该对应哪个文件。所以这个时候就迫切需要版本管理的工具了。
git
以前听说过git版本管理,但是以前以为都是在github上做,但是后来偶然看到廖雪峰的博客关于git的教程,才知道原来git是可以做本地的版本控制的,而且功能很是强大。
关于git的使用这里就不再重复介绍了,廖雪峰的博客里都有详细介绍,这里主要说一下git在实际应用中可能遇到的问题。
怎么在git目录外部访问不同版本的文件
经常我们会遇到这样一个问题,我们只是把代码放在git中进行不同版本的管理,而我们经常在目录外部调用这些代码文件,那么该怎么实现版本1的外部程序使用的对应是版本1的代码呢,版本2使用的是版本2的代码。
很简单,当我们需要用到版本1的代码时,我们进入git管理的目录,输入如下命令:
git checkout branch_version1
然后git目录展示的就是对应version1的代码。
当我们需要版本2的代码时,我们同样进入git管理的代码目录,输入:
git checkout branch_version2
这样就可以解决问题了。
Bug修复
我们可能会遇到这样一种情况,就是我们可能正在编辑某个版本version1,但是由于临时要更改version2存在的bug,但是这个时候version1没法立即提交,因为还没有完成,这个时候切换到version2中新建bug分支,那么在version1中还没有提交的文件也会出现在你version2中,这个时候我们要到version1中使用
git stash
把version1未提交的文件暂时放到别处,这个时候再去version2中新建bug分支,解决bug。
解决完bug之后,我们要重新编辑version1,这个就切换到version1里面使用
git stash pop
把先前为提交的文件返回来重新编辑。
删除大文件
有些时候我们会误提交一些大文件,同时又没有在.gitignore里面限制忽略这些大文件,所以即使我们在某一个支路里删除对应的大文件,在.git/objects/目录下的对应的历史纪录的大文件也不会被删除掉,这里我们就需要彻底删除历史纪录里的大文件
# find big file
git verify-pack -v .git/objects/*.idx | sort -k 3 -n | tail -3
git rev-list --objects --all | grep ****
# delete the file
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch /path/to/big-file' --prune-empty --tag-name-filter cat -- --all
rm -rd .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=new
# check space
du ./ -d 1 -h
重要的是下次创建git的时候,记得在一开始就创建.gitignore文件,这样省得在以后做这样的处理