Android Git 专题

Android Git 专题

零蚀

  • Git 简介

    • Git简介

    git是由本地仓库和远程仓库组成的,远程仓库是远端服务器,通常是公司服务器或者是开源的远程服务器(Github,Gitee)。

    【题外话】(git用代码好还是用界面好,其实都一样)

    • 本地仓库

    结构如下:

    本地仓库
    工作区
    暂存区
    版本库
    1. git init会创建本地仓库,.git文件就是本地仓库
    2. 工作区,是.get文件的父文件下的所有的非.get内容
    3. 暂存区,git add 后会出现一个index文件,而这index文件又叫暂存区,用来暂时存储需要提交信息
    4. 版本库,git commit 之后会出现一个objects这个objects可以叫做版本库。

    工作流程:

    本地仓库
    创建或者修改本地文件
    add
    commit
    工作区
    暂存区
    版本库

  • Git 代码方式简介

    • sudo apt -get install git -core [安装git]

    • git config (……所有打印信息功能命令列表)

      • git config --global user.name ‘xxx’ 配置用户名xxx
      • git config --global user.name。 查看用户名
      • git config --global user.email ‘xxx’ 配置邮箱
      • git config --global user.email。 查看邮箱
    • git init 创建git仓库(在项目路径下,直接用terminal最简)

    • git clone 地址 (newProjectName)

    • git add (build.gradle) 添加文件or文件夹

    • git add . 添加当前文件(代码库)下所有的文件

    • git commit -m ‘First commit’ 命令 -m 指提交的信息

    • git status 查看文件修改情况,提示更改的文件名

    • git diff 查看所有文件修改内容。git diff 绝对路径 例如:git diff app路径/workspace/android/temp/BaseJavaDemo/app/src/main/java/com/example/basejavademo/MainActivity.java 。查看单独某个类的修改情况。

    • git checkout 撤销最近的修改。 git checkout app路径/workspace/android/temp/BaseJavaDemo/app/src/main/java/com/example/basejavademo/MainActivity.java 。撤销某个类的修改。(适用于没有add的数据)

    • git checkout branchName 切换分支

    • git reset app路径/workspace/android/temp/BaseJavaDemo/app/src/main/java/com/example/basejavademo/MainActivity.java 。针对某个已经add之后的类进行撤销操作,恢复成未加载之前的情况。

    • git log (–graph)打印提交历史记录(显示分支)

    • git branch 查看当前所有的分支

    • git branch BranchName 创建一个名叫BranchName的分支

    • git push origin master提交到远程master分支。

    • git pull origin master从远程master分支上拉代码。

    • git fetch origin master执行这个命令,会从远程master分支拉数据,类似于pull,但是它不像pull不会和任何分支合并,而是保存在一个origin/master 的分支上,只是我们可以通过diff来查看到底远程修改了什么。

    • git diff origin/master 之后用merge将origin/master分支合并到master分支即可。

    • git merge origin/master

    • 忽略文件
      忽略文件在as中指的是.gitignore,忽略文件指在版本空中中需要被忽略的内容,比如:忽略掉测试内容的提交,只需要在.gitignore文件中添加 /src/test 和 ***/src/androidTest***就可以在git commit -m ‘’ 时忽略掉标示的内容。


  • 代码托管到GitHub上

    • git 托管(本地仓库和远程仓库独立

      1. 首先创建项目,可以添加忽略文件和证书(关于许可证书的官方文档
      2. 创建完成后你的项目库git地址就是clone or download,可以下载到本地。
      3. 将路径切换到本地工程项目Application目录,然后git clone进行下载,这样下载的project就在我们本地的project中
      4. 将下载的project内容全部移动到上层/本地的project中,注意的是这里有四个文件:证书,ReadMe,.gitignore,.git。后两个文件都是隐藏的,不能漏了,显示隐藏文件快捷键(command+shift+.)
      5. .gitignore 下载的文件基本包含本地文件的内容。
      6. git status 状况查对好,commit后进行git push origin master
    • 代码方式托管方式二
      7. git remote add origin (远程仓库地址)将远程仓库和本地仓库建立连接
      8. git push -u origin master


  • Git 流程剖析

    • clone -->project
      我们过去远端仓库的内容都会用到clone,他会直接把仓库拿下来(.git),然后把远端的最新的commit下载到本地。而commit是各个差异,并不是全部文件,clone是从第一个commit开始下,将下载后,按照原先的顺序一个一个将commit从远端拿下。

    • add->暂存区

    • commit->working tree:
      提交相当于把仓库当前的状态记录,当前提交只是和上一个仓库状态变化,而8ddxxxxbc3fce69fa82792907e1f4ecd96xxxx0f是记录commit的Hash,这是当前的commit的唯一指纹。而commit提交的内容会进入working tree(工作空间/本地仓库)。

    //git log
    commit 8ddxxxxbc3fce69fa82792907e1f4ecd96xxxx0f (HEAD -> master, origin/master, origin/HEAD)
    Author: baicha <1602134xxx@qq.com>
    Date:   Sun Jan 5 00:22:01 2020 +0800
    
    structure_of_game_step1
    

    本地仓库会记载工作空间所有的改动,但是不会记录本身的改动,不然就死循环了。所以划分工作区间一般是去除.git的所有文件。

    • 引用

    指向某个指针的指针, HEAD -> HEAD引用是最特殊的,用于指向当前的位置,而我们每次更新位置,或者新的提交,HEAD都会重新定位,所以log时候只有最新的commit上面才会有HAED。其中master,origin/master, origin/HEAD同时指向他们的Hash。

    //commit info 引用
    (HEAD -> master, origin/master, origin/HEAD)
    
    • branch–>分支

    ⚠️分支是引用,并不是我们视觉上的默认分支master,master_step1-master_step2-master_step3/new_breach或者master_step2-master_step3/new_breach。
    我们常用的master默认分支,是指远端仓库的HEAD默认指向的分支,
    ⚠️以下是错误的视图:

    master_step1
    master_step2
    master_step3
    new_breach

    当我们提交新的commit之后HEAD会针指向最新的commit。

    创建新分支时候会在当前的内容下添加新的breach指针指向最新的commit,这样保证了git的轻量级,

    圆形代表指针
    master_step1
    master_step2
    master_step3
    master_poin
    HEAD
    new_breach

    当我们切换分支 时会有以下的变化

    master_step1
    master_step2
    master_step3
    master_poin
    new_breach_point
    HEAD

    新的分支做提交之后:

    master_step1
    master_step2
    master_step3
    feature_step4
    master_poin
    new_breach_point
    HEAD
    • merge–>合并

    合并分支指令,将目标分支合并到当前分支上。

    git merge 目标分支
    //CONFLICT(content):Merge conflict in 冲突文件
    

    合并之后,会创建一个新的commit,将两个父commit做标记,将冲突解决方案记录在新的commit之中。而原先的new_branch_point 还是指向原先的breach。

    • 镜像

    当我们从remote获取到代码时,我们的HEAD是不会因为其他branch的变化而出现变化的,我的的指针信息都会保留着自己的信息,所以当我们获取代码时,就会从远端拿下来一个镜像,这个镜像包含了远端分支的信息。这个新的分支拥有origin/branch,origin/HEAD等固定的指针信息

    • push

    首先把HEAD所指向的commit信息同步到远程,然后将之后所有缺乏的commit都同步到远程。推送到远端,如果当前分支没有需要指定,git push origin new_feature

    • pull

    git pull = git fetch + git merge origin/xxxx。git fetch只是将镜像同步下来。

    • checkout

    将HEAD指向某一个commit或者一个引用。

    • git branch --detach

    如果通过一个分支指向commit,会直接解绑并指向commit

    • rebase

    当log中的分支出现新分支又合并的情况,如下图所示,如果我们希望合并分支,这时候就会运行rebase,

    *   commit fc8015afa99144bddb16524c556 (HEAD -> master, origin/master, origin/HEAD)
     |\  Merge: efb5b85 f06bf70
     | | Author:| | Date:   Mon Jan 6 13:28:17 2020 +0800
     | | 
     | |     Merge pull request #1 from 18856627751/feature_bullet
     | |     
     | |     只是关于一个review的测试
     | | 
     | * commit 0bff6c21050b0117015a8e0ce615f1386e (origin/feature_bullet, feature_bullet)
     |/  Author: baicha 
     |   Date:   Mon Jan 6 13:01:40 2020 +0800
     |   
     |       只是关于一个review的测试
     | 
     * commit 055f6f9def3e1249d93d2c9098e80b
     | Author: baicha 
     | Date:   Mon Jan 6 01:04:47 2020 +0800
     | 
     |     tank_move
     | 
    
    

    我们可以在feature上git rebase master,将feature的commit(共同父类之后的commit)放在master之上,准确说是复制feature的commits添加到master之后。

    master_step1
    master_step2
    master_step3
    feature
    rebase_feature
    HEAD
    • git rebase -i HEAD~n(修改至最近父类的第几个commit)
     pick efb5b85 tank_move
     pick f06bf70 只是关于一个review的测试
    
     # Rebase 8dd6046..ec5030c onto 8dd6046 (2 commands)
     #
     # Commands:
     # p, pick <commit> = use commit
     # r, reword <commit> = use commit, but edit the commit message
     # e, edit <commit> = use commit, but stop for amending
     # s, squash <commit> = use commit, but meld into previous commit
     # f, fixup <commit> = like "squash", but discard this commit's log message
     # x, exec <command> = run command (the rest of the line) using shell
     # b, break = stop here (continue rebase later with 'git rebase --continue')
     # d, drop <commit> = remove commit
     # l, label <label> = label current HEAD with a name
     # t, reset <label> = reset HEAD to a label
     # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
     # .       create a merge commit using the original merge commit's
     # .       message (or the oneline, if no original merge commit was
     # .       specified). Use -c <commit> to reword the commit message.
    
    

    rebase的指定方法做交互式rebase,可以按照自己的想法来设计自己的rebase,完成后rebase --countinue(直接删除commit命令行,就会删除commit信息)

    • revert

    针对已经push过的,想删除这个commit则用git revert commitHash,本地仓库的commit会被删除。然后push

    (base) ➜  TankGame git:(master) git revert  a7e8ed5 
     [master 13324b2] Revert "temp"
     1 file changed, 1 deletion(-)
     (base) ➜  TankGame git:(master) 
    
     Revert "temp"//baicha
    //baicha committed 2 minutes ago
    //This reverts commit a7e8ed5.
    
    • reset

    git reset --hard 分支,将HEAD和当前分支指向目标节点,并会丢弃文件差异,以目标内容为准,git reset 分支,是有diff的,他会保存多有的diff并不会去除他们的diff

    • add

    交互式add。

    (base) ➜  TankGame git:(master) git add -i
             staged     unstaged path
     1:    unchanged        +2/-0 README.md
     
     *** Commands ***
     1: status       2: update       3: revert       4: add untracked
     5: patch(补丁)   6: diff         7: quit         8: help
     What now> 5
             staged     unstaged path
     1:    unchanged        +2/-0 README.md
     Patch update>> 1(选择目标文件)
             staged     unstaged path
     * 1:    unchanged        +2/-0 README.md
     Patch update>> 
     diff --git a/README.md b/README.md
     index c2f1e20..8ab1b9a 100644
     --- a/README.md
     +++ b/README.md
     @@ -1,3 +1,5 @@
      # <font color='lig-blue' size=6>Python初见9--- 坦克大战</font>
    
      一无所有的文档      
     +
     +
     Stage this hunk [y,n,q,a,d,e,?]? ?
     y - stage this hunk
     n - do not stage this hunk
     q - quit; do not stage this hunk or any of the remaining ones
     a - stage this hunk and all later hunks in the file
     d - do not stage this hunk or any of the later hunks in the file
     e - manually edit the current hunk
     ? - print help
    
    
    

    可以用git diff --cached 看缓存区的改动。git commit -a -m ‘name’,-a 将所有追踪的都add进来。

    • tag
      git tag tag_name。tag 不能改变位置,且不能被指向,一般用于打版本号,git tag v1.0。可以gco tag_name,给tag添加标签:git tag tag_name -a 然后类似git commit,填写信息。
    commit 112343243543 (HEAD -> master, tag: t1, origin/master, origin/HEAD)
    
    • reflog

    默认查看HEAD引用的移动历史。可以用gco HEAD@{6}切换到当时的内容。git reflog(分支)查某个分支的HEAD指针的引用。

    • cherry-pick

    git cherry-pick commit1 commit2 commit3(hash),可以将其他分支的多个commit内容摘过来。


  • Git Review

    • pull request

    远端仓库拉取我本地的内容。
    在这里插入图片描述

提供出review
在这里插入图片描述

在这里插入图片描述
可以在commit中进行评论(所说的话需要担责,如果有问题,review)
在这里插入图片描述

当review结束,便可以合并
在这里插入图片描述

//merged commit xxxxx into master

这里的merge会产生一个commit,他调用的命令是git merge branchA --no-ff,无论怎样都会创建一个commit。


Git Flow

  • Git Flow

    • git flow简介

    git 在早期人们对它的认知还不健全,所以有人设计了一个工作流,让灵活的git变成了一个板正的工具,并使用脚本让他更加方便使用,并发到了github,并起名git flow,是广泛应用的一个工作流,后期github 也借鉴做了一个更加简洁的github flow。git flow针对复杂项目。

在这里插入图片描述

* master
master 只是记录版本
* develop
快速发布版,用于发布小版本
* feature
用于功能开发
* release 
用于bug 修复
* hotfix
紧急bug修理

🔗 GitHub 中的Git flow

抄抄文档就可以开始一个git flow的旅程了~init


🔗 前言
🔗 Android 专题列表
🔗 Android 项目架构 专题
🔗 Android 组件化&插件化 专题
🔗 Android Gradle 专题
🔗 Android 热更新 专题
🔗 Annotation Processing 专题
🔗 Android RecyclerView 专题
🔗 Android JavaIO NIO OKIO 专题
🔗 Android kotlin 专题
🔗 Android 全埋点 专题列表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

零蚀zero eclipse

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

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

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

打赏作者

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

抵扣说明:

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

余额充值