Git
Git是分布式的版本管理器与集中式的版本管理器有很大区别。
集中式版本管理器的版本是集中存放在中央服务器的,所以工作时要先从中央服务器中下载最新版本,工作结束后再将版本上传到中央服务器,因此对工作网速有极高要求,且因为所有版本都存放在中央服务器中安全性较低。
分布式版本管理器没有中央服务器(为了方便推送修改可以设置一台充当中央服务器的电脑),每一个人的电脑上都有一个完整的版本库,这样工作时可以不连接网络,而且即使电脑出了问题数据不能回复,也可以从别人那里去拷。除此之外,Git还有强大的分支管理。
一、管理修改:
git init 将当前目录初始化为Git管理的版本库
版本库内所有文件的修改与删除都会被Git追踪
添加文件到版本库有俩个步骤:
1)git add filename 将文件从工作区提交到暂存区
2)git commit –m “” 将文件从暂存区提交到版本库里的当前分支 –m后添加的是对本次commit的说明
需要注意:一次添加过程中add可以多次使用,commit只能使用一次如果在commit之后在add修改 该次add无法被commit提交
git status 查看当前版本库状态 文件被修改没有add 文件被add没有commit
git diff 查看修改内容
需要注意如果是之前没有被add过的新文件 gitstatus无法知道它的状态
git log 查看提交历史与各版本的版本号
git reset --hard commit_id 回到版本号为commit_id的那个版本
git reflog 查看命令历史 用于回到找不到版本号的版本
需要注意:head指针指向的是当前版本 转换版本只是移动了头指针的指向
git checkout --filename 撤销工作区的修改 回到最近一次add 或者 commit 之后
git reset – filename 撤销暂存区的修改 即把撤回add操作 注意撤销了暂存区的修改后要对工作区再次进行修改
git rm file name 用于删除文件删除之后要commit
git checkout –filename 用最新版本库里的文件恢复被删除的文件
注意:checkout的实质是用最新版本库里的版本替代工作区的版本
二、远程库:
1.现有本地库添加远程库
首先创建一个仓库
1)登录GitHub
2)找到右上角中的按钮“create a newrepo”
3)在Repository name中填入远程库名
4)最后点击下方的按钮“Createrepository”
1)git remote add origin git@github.com:GitHub账号名/远程库.git 关联远程库
2)git push –u origin master 在第一次把本地库的内容推送到远程库时要使用-u参数 让本地的master分支与远程库的master分支关联起来,为以后的推送提供便利。在以后本地的版本库进行了修改并提交了只要通过指令git push master就可以进行内容推送
需要注意:第一次进行clone和push操作时,会受到警告:已经将这个GitHub的公钥加入本机的信任列表。这个公钥用于SSH连接。(1.远程主机收到用户的登录请求,把自己的公钥发给用户。2.用户使用这个公钥,将登录密码加密后,发送回来。3.远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。)
2.没有本地库,就先创建远程库,再克隆一个本地库。
创建远程库流程:
1)登录GitHub
2)找到右上角中的按钮“create a newrepo”
3)在Repository name中填入远程库名
4)将下方勾选放到Initialize thisrepository with a README(使GitHub自动创建一个README。md)
5)最后点击下方的按钮“Createrepository”
git clone git@github.com:GitHub账号名/远程库.git (只开放http端口可以使用https://github.com/GitHub账号名/远程库.git )克隆一个本地仓库
三、分支管理:
git checkout –b branchname 创建并切换到创建的分支
git branch branchname 创建分支
git checkout branchname 切换分支
git branch 查看当前分支(所有分支都会被列出,当前分支前面会有一个*)
git merge branchname 将分支的操作结果合并到master分支上去
git branch –d branchname 删除分支
当master分支也被修改,git无法自动合并分支时需要手动修改分支合并冲突。
1)用git merge branchname 尝试合并
2)如果提示有冲突,先用git status 找出有冲突文件
3) 在打开该文件手动修改冲突
4)修改完成后用add和commit提交
分支合并的记录:
git merge --no-ff –m ””branchname 在合并分支后生成一个新的commit –m后面添加的是对本次提交的说明 –no-f表示禁止使用Fast forward目的是为了留下合并的历史
需要注意:在实际开发过程中不应该在master上面操作,应该建立自己的分支来进行操作以保证master分支的稳定。
Bug的临时分支:
当前分支的任务还没完成时,需要在其他分支修复bug,可以用git stash 保存分支当前工作内容然后切换到需要修复bug的分支为bug创建临时分支。当bug修复合并bug的临时分支后,再次切换一开始工作的分支,用gitstash pop恢复现场
Repo
Repo 是为了管理多个Git库而开发的Python脚本,是以Git为基础的代码管理工具,其目的是为了让Android开发者更有效的利用git。Repo 命令是一段可执行的 Python脚本,用于既能保证庞大项目的子项目之间相互独立,避免子项目之间的相互影响。
相关概念:AOSP(Android开源项目):非常庞大的项目,由不同子项目R1,R2,…Rn组成,
相关指令:
Repo init 在当前目录下安装Repo
参数理解:
-u:指定Manifest库的Git访问路径。
-m: 指定要使用的Manifest文件。(Manifest是一个目录文件提供了需要下载的代码的路径)
-b: 指定要使用Manifest仓库中的某个特定分支。
–repo-url:指定要检查repo是否有更新的远端repoGit库的访问路径。
–no-repo-verify:指定不检查repo库是否需要更新。
如:repo init -u git://android.git.kernel.org/platform/manifest.git
Reposync [project-list]
下载最新本地工作文件,更新成功,这本地文件和repository 中的代码是一样的。 可以指定需要更新的project ,如果不指定任何参数,会同步整个所有的项目。
如果是第一次运行 repo sync ,则这个命令相当于 git clone ,会把 repository 中的所有内容都拷贝到本地。如果不是第一次运行 repo sync , 则相当于 git remoteupdate ; git rebase origin/branch . repo sync 会更新 .repo 下面的文件。 如果在merge 的过程中出现冲突, 这需要手动运行 git rebase –continue
如果不想手动可以代码目录下建立一个sh文件(Linux脚本文件)
在repo sync异常退出后自动重新执行repo sync的.sh文件
#!/bin/bash
echo ¨================startrepo sync===============¨
repo sync -f -j10
while [ $? == 1 ]; do
echo ¨================syncfailed, re-sync again=============¨
sleep 3
repo sync -f -j10
done
为了降低网络带来的影响可以应先可以在repo sync之前,输入
export http_proxy="http://你的代理IP:代理端口/"