一 Git 之 工作区/暂存区/版本库/远程仓库
二 Git本地分支与远程分支
三 Git走位技巧
/
一 Git 之 工作区/暂存区/版本库/远程仓库
1.1 Git本地有四个工作区
Git本地有四个工作区:
工作目录(Working Directory):工作区,就是我们平时存放项目代码的地方
暂存区(Stage/Index) :暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
资源库(Repository或Git Directory):仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
git仓库(Remote Directory):远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
四个区域的之间的关系如下:
1.2 Git的工作流程
Git的工作流程一般是这样的
1、在工作目录中添加、修改文件
2、将需要进行版本管理的文件放入暂存区域;
3、将暂存区域的文件提交到git仓库。
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
1.3 文件管理的四种状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified.如果使用git rm移出版本库, 则成为Untracked文件
Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过,返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存,文件状态为Modified
下面的图很好的解释了这四种状态的转变:
新建文件--->Untracked
使用add命令将新建的文件加入到暂存区--->Staged
使用commit命令将暂存区的文件提交到本地仓库--->Unmodified
如果对Unmodified状态的文件进行修改---> modified
如果对Unmodified状态的文件进行remove操作--->Untracked
二 Git本地分支与远程分支
2.1 创建本地仓库
git init
2.2 从远程仓库克隆代码:
从远程仓库克隆代码
git clone gitolite@192.168.2.2:repos/git/rk3128_6.0_mid
*此操作只能够克隆远程仓库的master分支,无法clone所有分支,并在本地自动生成一个本地master分支,对应远程仓库origin/master分支,他俩的代码是关联同步的。
通过 git branch -vv 查看验证本地master分支和远程仓库的origin/master分支对应关系如下:
*master 85cd054 [origin/master] Initialize rk3128 android 6.0 project list and xml
2.3 查看所有分支,寻找自己需要的分支
2.3.1 查看所有分支
*git branch --all
-如果远程仓库只有origin/master分支,那么此时只会打印如下两个分支
master[本地主分支]
origin/master[远程主分支]
-如果远程仓库有一系列分支,那么此时会有一系列分析显示出来,例如
* master //当前所在分支
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/1
remotes/origin/2
remotes/origin/3
3.3.2 切换到自己所需要的分支
git checkout -b 1 origin/1
切换到自己所需要的分支,假如需要切换到 1 分支,那么首先需要在本地创建一个同名分支,然后再关联到远程仓库的对应的同名分支
以上操作便可以将 远程仓库的目标分支克隆到本地
三 Git走位技巧
对于同一版本的系统有多个客户的情况,例如,基于Android6.0 系统有多个不同的主板,每个不同的主板又有对应客户不可兼容的需求。很多人一开始选择的方向是每一个客户对应一个系统文件,这样的话就要创建非常多的文件,耗时,而且维护起来非常麻烦。我的技巧是只创建一个系统目录,在该目录下以客户为单位创建分支。
假如基于 Android6.0 系统 某主板 有A客户 A客户有 A1方向需求 和 A2方向需求 两个方向的需求(比如A客户有LVDS接口屏需求 和 MIPI接口屏需求),那么我现在的通常做法是 创建一个 Android6.0 A客户的分支,所有代码的修改最终都要整合到该分支,而且该分支只用于出固件,不用于测试修改代码。那么在哪里测试修改代码呢?那就另外创建一个分支,专门用于修改代码,测试成功之后,整合到 Android6.0 A客户的主分支。具体例程改日贴。
工作分支 (顶 : 8ec59ce8e1548965a1df50cacecb6ff13d0a5841)
{
git clone gitolite@xxxxxx
git branch -av
//出固件主分支
git checkout -b xxx分支 remotes/origin/xxxx分支
//lvds 添加功能模块修改分支 用于修改代码 测试通过后合并到主分支
git checkout -b xxx分支+func 8ec59ce8e1548965a1df50cacecb6ff13d0a5841
//测试分支修改测试完成 保存add到本地仓库
git add / git commit
git log //查看测试分支提交id
//将测试分支修改内容 合并到主分支
首先从测试分支 切换回 主分支
单个commit只需要git cherry-pick commitid //此处的id 都是测试分支刚刚提交的id
多个commit 只需要git cherry-pick commitid1..commitid100
注意,不包含第一个commitid , 即 git cherry-pick (commitid1..commitid100]
}
技巧二:
基于补丁合并的开发模式:
{
commit 791456cf9c8e9776e88b62f8085fd9b5930b1033
Author: MahaoranGitlib <haoran_m@outlook.com>
Date: Mon Nov 19 14:02:57 2018 +0800
Add timing switch firmware default launcher is launcher3
commit aaaf3d85ea9c5aae11df8adfb11a98f424fc9af5
Author: MahaoranGitlib <haoran_m@outlook.com>
Date: Tue Nov 20 16:57:40 2018 +0800
patch build_rk3128_m125.sh.patch
commit 4a9a2597cf747de1da6453ee2db89757ee86a5d2
Author: MahaoranGitlib <haoran_m@outlook.com>
Date: Fri Nov 16 15:53:56 2018 +0800
offee machine launcher and adding Timing on and off
commit 8ec59ce8e1548965a1df50cacecb6ff13d0a5841
Author: leon <leon.yuan@3qvideo.com>
Date: Tue Oct 16 11:14:39 2018 +0800
revert uboot.img and loader.bin for loader
情景:将 commit aaaf3d85ea9c5aae11df8adfb11a98f424fc9af5 和 commit 791456cf9c8e9776e88b62f8085fd9b5930b1033 两个commit放在 commit 4a9a2597cf747de1da6453ee2db89757ee86a5d2 之后
git reset --hard 8ec59ce8e1548965a1df50cacecb6ff13d0a5841
git cherry-pick 791456cf9c8e9776e88b62f8085fd9b5930b1033
git cherry-pick aaaf3d85ea9c5aae11df8adfb11a98f424fc9af5
git cherry-pick 4a9a2597cf747de1da6453ee2db89757ee86a5d2
}
技巧3:
现有三个平台:
A.自己的本地开发分支 : fid3288_f1_r7_chensai_ceshi
B.本地最新代码分支 : fid3288_f1_r7_devel
C.公司代码远程仓库 : fid3288_f1_r7_devel
在A自己的本地开发分支修改代码,目的是push 到 C远程代码仓库。为了安全起见公司会在中间加一个 公司代码本地分支 用来统一同步 远程仓库代码分支。所以想要将A自己的代码分支的改动同步到C远程仓库的做法是:
第一步:先确认本地最新代码分支B是干净的,也就是说需要将本地工作区编辑过的文件添加到暂存区(git add .),或提交到本地仓库中(git commit)。然后同步远程代码到本地:
B.本地最新代码分支: C.公司代码远程仓库
git pull origin fid3288_f1_r7_devel:fid3288_f1_r7_devel
git log fid3288_f1_r7_devel //查看是否已经更新
第二步:将已经更新的本地最新代码分支B的代码合并到 自己的本地开发分支A,用于在本地统筹代码。
B B A
git rebase --onto=fid3288_f1_r7_devel fid3288_f1_r7_devel fid3288_f1_r7_chensai_ceshi
这个过程如果有合并冲突,需要另外处理,此处不细说
第三步:将 自己的本地开发分支A 上面整合好的代码 push 到 公司代码远程仓库C
git push origin fid3288_f1_r7_chensai_ceshi:fid3288_f1_r7_devel
技巧4
将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建。
git push origin master
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
$ git push origin :master
# 等同于
$ git push origin --delete master
技巧5
mhr@king:~/work/gitolite/r4/A18/hongwei/lcd_21_5/rk3188_4.4_mid$ git branch
master
* rk3188_4.4-A18_v1-devel
rk3188_r4_v205_devel_A18
查看 rk3188_r4_v205_devel_A18 分支 log
git log rk3188_r4_v205_devel_A18