Git

一 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值