文章目录
1. 前言
更多内容请查看android生态之应用篇
我下面有空的话会一一从android生态之应用篇一文中的学习路线来写博客,不仅仅是对之前的学习的回顾,也是对自己意志的磨砺。首先要说的是版本控制。版本控制常用的几种为git,svn,个人项目使用腾讯工蜂以及CODING,开源项目使用github。
2. git
git,svn操作和功能大体相同,这边以github使用为例,从git原理,初始化,上传,下载,合并,恢复,以及一些注意事项说明,如果想详细学习git这边建议可以阅读《ProGit》。
3. 原理
3.1 四个区域
四个区域分别是工作区域,暂存区域,本地仓区域,远程仓区域。
3.2 四个状态
1、已修改 --> Git 的工作目录
2、已暂存 -->暂存区域
3、已提交本地 -->本地仓库
4、已提交远程 -->远程仓库
4. 目录结构
branches/ # 新版的Git已经不再使用这个目录,所以大家看到它 #一般会是空的
hooks/ # 默认的“hooks” 脚本文件
info/ # 里面有一个exclude文件,指定本项目要忽略的文件 #,看一下这里
logs/ # 各个refs的历史信息
objects/ # 这个目录非常重要,里面存储都是Git的数据对象。包括:提交(commits), 树对象(trees),二进制对象 #(blobs),标签对象(tags)。
refs/ # 标识着你的每个分支指向哪个提交(commit)。所有分支的命名信息保存在“.git/refs/heads”中
COMMIT_EDITMSG # 保存着上一次提交时的注释信息
config # 项目的配置信息
description # 项目的描述信息
HEAD # 项目当前在哪个分支的信息。cat HEAD回显ref: refs/heads/master,说明当前是master分支
index # 索引文件,git add 把要添加的项暂存到这里,暂存区也叫索引文件,是一个在你的工作目录(working tree)和项目仓库间的暂存区域(staging area),索引是一个二进制格式的文件,里面存放了与当前暂存内容相关的信息,包括暂存的文件名、文件内容的SHA1哈希串值等。
5. 常见命令
- git branch
查看现在工作所在分支 - git branch -a
查看所有远程分支与工作分支 - git fetch
同步所有分支信息 - git diff
比较修改 - git status
查看本地修改,只能查看修改的文件,如果想要查看修改详情的话需要使用git diff - git checkout branchname
切换分支的利器 - git checkout .
撤销工作区间所有修改 - git reset
git reset --mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
git reset --soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
git reset --hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,此命令 慎用!
基于本地的修改,不影响远程仓库 - git revert
git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销
作为一次最新的提交- git revert HEAD 撤销前一次 commit
- git revert HEAD^ 撤销前前一次 commit
- git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去
直接操作远程仓库
- git pull
等同于git fetch+git merge - git log
查看提交日志
6. 一次完整提交
git add .
git commit -m "commit msg"
git push origin branchname
7. 新建远程分支
git checkout -b dev //新建本地为dev的分支并切换至dev分支
git push origin dev:dev //将本地dev分支推送至远程dev分支
8. 删除远程分支
git checkout dev
git push origin :dev//将一个空分支推送到远程即为删除
9. commit msg
多行注释可以通过单引号’ '来换行,如下所示:
git commit -m '
1.line one
2.line two
'
单行注释一般用双引号",如下所示:
git commit -m "commit msg"
10. 合并分支过程
git checkout master //切分到master分支
git merge dev //将指向master分支的指针重定向到dev分支,达到master分支合并dev分支的效果
注意:
–no-ff:强行关闭fast-forward方式,并产生新的提交 不需要commit,直接push
–ff:使用fast-forward,不会产生新的commit不需要commit,直接push
–squash:使用squash方式合并,把多次分支commit历史压缩为一次。需要commit后push
merge原理:
那么git merge dev 命令将会把在master分支上二者共同的节点(E节点)之后分离的节点(即dev分支的A B C节点)重现在master分支上,直到dev分支当前的commit节点(C节点),并位于master分支的顶部。并且沿着master分支和topic分支创建一个记录合并结果的新节点,该节点带有用户描述合并变化的信息。
11. repo与git
AOSP:本质上是一堆使用git进行版本控制的project。
repo:针对AOSP大量git仓库的管理工具。可以执行批量git同步,更新,提交等操作。
原理:通过读取manifest.git里维护的manifests.xml文件当中配置的projects的git仓库地址,分支等信息执行git操作。将服务器上按照特定目录结构保存的project原封不动的同步到本地。
关系:repo基于git,让超大型的项目代码管理更有效率。
12. 其他
通常使用git容易出现问题的是上传的时候产生冲突问题,有冲突则消灭冲突,还有就是记得commit之后一定要push,我有遇到不push的同学导致我这边集成失败的。还有开发的时候一定要重视版本控制,一个版本发布之后要打一个tag,这样的话可以方便后面追踪问题。还有需要提一下的就是一般一个项目会存在两个分支,一个master,另外一个为dev分支,master为稳定分支,dev为开发分支,当dev上测试通过之后会合入到master分支上,并且需要一个专门的人审核提交。