Android Git在bash环境和Android Studio工具中的使用

一 、认识Git

1.Git

Git是 Linus Torvalds 开发的一个开放源码的版本控制软件, 是一个快速的分布式版本控制系统,拥有强大的分支管理。

Git 与 SVN 区别

它和SVN的区别在于,SVN是存储每次提交之间的差异,而Git正好与之相反,它会把每次提交的文件的的全部内容都记录下来。

如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应Git提供的一些概念和特征。

Git 与 SVN 区别点:

  • Git是分布式的,SVN不是,这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别;

  • Git把内容按元数据方式存储,而SVN是按文件,所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里;

  • Git分支和SVN的分支不同,分支在SVN中一点不特别,就是版本库中的另外的一个目录。

核心概念

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念,接下来我们来理解下Git 工作区、暂存区和版本库的概念 。

  • 工作区(Working Directory)

    就是你在电脑里能看到的目录 。

  • 版本库(Repository)

    版本库又名仓库(repository),你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

    工作区有一个隐藏目录.git,这个其实是Git的版本库。

    Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

Android Git在bash环境和Android Studio工具中的使用_第1张图片
img

我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

Git的工作流程

一般工作流程如下:

  • 克隆 Git 资源作为工作目录。
  • 在克隆的资源上添加或修改文件。
  • 如果其他人修改了,你可以更新资源。
  • 在提交前查看修改。
  • 提交修改。
  • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

2.gitlab

GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。

我们所有的工作都是在本地机器上完成的,而项目组内已经创建好了代码托管服务GitLab,等到推送代码时我们要做的就是将本地项目Push到远程仓库,或者提出merge request进行分支合并,其他人就可以访问到你的代码更新。

二、安装, 配置Git

1.安装

在Windows下安装Git是很简单的,访问 git官网下载页面,选择Download for Windows,然后按默认选项安装即可 。安装成功后,AS一般会自动地引入git环境。

打开setting–>Version Control–>Git–>Path to Git executable,看到git.exe已经被设置好了,点击Test按钮,会提示AS已经成功引入了git环境。

2.配置

使用Git的第一件事就是设置你的用户名和email,这些就是你在提交commit时的签名。

  • 使用AS

    在AS中,当你打开菜单栏的VCS->Git->Clone,输入仓库信息后,这时候就会要求你输入名字和email,输入即可。

  • 使用bash(或AS的terminal工具,下同)

    打开git bash 工具,执行下面的命令之后,就设置好了用户名称和邮箱。

    $ git config --global user.name "you name"
    $ git config --global user.email "you email"
    

需要注意的是,--global表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以不用这个选项,直接进入某个仓库的目录为其指定不同的用户名和Email。

三、基本用法

1.获取git仓库

使用 git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。

如果你需要与他人合作一个项目,或者想要复制一个项目,看看代码,你就可以克隆那个项目。

为了得一个项目的拷贝(copy),我们需要知道这个项目仓库的地址(Git URL)。Git能在许多协议下使用,所以Git URL可能以ssh://, http(s)://,git://为前缀。

我们需要从gitlab上的Git仓库拷贝项目(类似 svn checkout) ,这里采用gitlab上的git项目,使用其http协议的URL来拉取仓库代码。

  • 使用AS

    打开菜单栏的VCS->Git->Clone,输入Git URL和本地要放的目录,目录默认为仓库名,也可以修改。点击Clone,AS就会下载该仓库的代码并导入工程。

  • 使用bash

    克隆仓库的命令格式为:

    git clone  
    

    参数说明:

    • repo:Git 仓库。
    • directory:本地目录,不填代表当前目录

    例如:

$ git clone http://*.*.*.*/practice/git-demo.git

将项目克隆到本地之后,我们就可以开始工作啦。

2.正常工作流程

把文件添加到仓库

git add不但是用来添加不在版本控制中的新文件,也用于添加已在版本控制中但是刚修改过的文件。在这两种情况下, git都会获得当前文件的快照并且把内容暂存(stage)到索引中,为下一次commit做好准备。

  • 使用AS

    在AS增加文件会有如下弹框询问你是否将文件添加到Git暂存区,你可以选择添加,还可以记住选择,也可以先不Add。

在文件需要被Add时,在AS文件视图选择要Add的文件,点击右键VCS->Git->Add完成Add。

​ 如何知道文件已经被Add?

​ 当文件名称颜色由处于未Add状态的红色变为已Add但未被commit状态的绿色,文件已经被成功Add。

  • 使用bash

    例如,使用git add命令将新增的2个文件添加到Git暂存区中。

$ git add 1.md 2.md

把文件提交到本地仓库

使用git add命令将想要快照的内容写入缓存区, 而执行git commit则是将缓存区内容添加到本地仓库中。

Git 会为你的每一个提交记录你设置过的的用户名与电子邮箱地址。

  • 使用AS

    想要提交这些修改过的代码时,依次点击VCS->Git->Commit file,勾选需要commit的文件,在Commit Message框输入提交的注解,点击右下方commit按钮完成。

  • 使用bash

    输入git commit命令,在-m 选项后面加上本次修改的注释,完成后就会记录一个新的项目版本。

$ git commit -m "add 1.md 2.md"
[master (root-commit) 692d1f4] add 1.md 2.md
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 1.md
 create mode 100644 2.md

推送到远程仓库

  • 使用AS

    依次点击VCS->Git->Push,点击push。

  • 使用bash

    输入git push命令推送本地的"master" 分支去更新远程的"master"分支。

$ git push
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 211 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://10.20.1.19/practice/git-demo.git
 * [new branch]      master -> master

更新远程库

完成推送后,别人需要拉取你的更新。

  • 使用AS

    依次点击VCS->Git->Pull,在下图上面箭头处勾选想要拉取的分支,点击pull。

  • 使用bash

    输入git pull命令,git pull命令执行两个操作: 它从远程分支(remote branch)抓取修改的内容,然后把它合并进当前的分支。

$ git pull

查看Log日志

在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用git log来查看。

  • 使用AS

    打开底部面板的version control查看log日志,点击某条记录,可以看到该条记录的详细提交信息(提交日志、更新文件细节、本地改变细节、分支等各种信息) 。

  • 使用bash

$ git log
commit c9589dda1b341e604663f3f134a2486e314ab65c (HEAD -> master)
Author: your name 
Date:   Mon Aug 13 14:55:32 2018 +0800

    add files 1.md 2.md

3.分支与合并

查看分支

点击AS右下角的Git:master->New branch,然后出现下面的界面,在这里可以查看本地分支和远程分支情况,并且还能对本地和远程分支进行查看、切换、合并、删除的相关操作。

创建分支

一个Git仓库可以维护很多开发分支,现在我们来创建一个新的叫”dev-1.0.0”的分支。

  • 使用AS

    点击AS右下角的Git:master->New branch,输入分支名称,并勾选Checkout banch。点击ok之后会发现刚才右下角的master变成了你建的分支名字,说明创建成功了。

  • 使用bash

$ git branch dev-1.0.0

不过,到这一步只说明见创建成功了一个本地分支而已,在远程分支上还没有你刚才创建的这个分支。这时候,我们就可以在新的分支上进行各种操作了。

操作分支

  • 使用AS

    切换分支:点击AS右下角的Git:(分支名),点击你想要切换过来的分支名称,点击Checkout完成切换。

    在这个菜单里,你还可以对分支再进行merge、rename和delete等操作。

  • 使用bash

    切换分支时使用git checkout命令。

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

​ 假如你不再需要这个分支了,也可以删除它。

$ git branch -d dev-1.0.0

git branch -d只能删除那些已经被当前分支的合并的分支。

如何合并

现在,我们将分支切到dev-1.0.0,在1.md文件里写入一句话"this is a file named 1.md.",将这个改变add并commit。

将分支切换到master。

  • 使用AS

    点击AS右下角的Git:master,点击想要合并过来的分支dev-1.0.0,点击merge。

  • 使用bash

    你可以用下面的命令来合并两个分离的分支:git merge

$ git merge dev-1.0.0
Updating 692d1f4..656dc61
Fast-forward
 1.md | 1 +
 1 file changed, 1 insertion(+)

​ 可以看到,dev-1.0.0分支上的改变已经被合并到master上了。

$ cat 1.md
this is a file named 1.md.

解决冲突

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

现在切换到dev-1.0.0,创建dev-1.0.1分支并切换到此分支,在1.md文件第2行增加一句话“this is dev-1.0.1.”,并add和commit。

切换到dev-1.0.0,在1.md文件第2行增加一句话“this is dev-1.0.0.”,并add和commit。

这个时候,我们来合并dev-1.0.1分支,发现产生了冲突,那我们就需要来解决冲突了。

  • 使用AS

    有冲突的merge操作后,会弹出这样的界面,告诉了我们产生冲突的文件,在右边也提供了解决冲突的几种方式,可以根据需要解决冲突。 这里有3个选项,接受你自己的代码、接受别人的代码和合并。我们选择合并,进入合并界面。

​ 我们需要在下面的界面手动处理产生冲突的代码,最左边的是你本地的代码,最右边的是要合并的分支上的代码,中间是合并之后的结果。根据实际情况来合并,合并完成后,点击右下角的Apply完成合并。

  • 使用bash

    输入git merge命令。

$ git merge dev-1.0.1
Auto-merging 1.md
CONFLICT (content): Merge conflict in 1.md
Automatic merge failed; fix conflicts and then commit the result.

​ 输入git diff命令就可以查看当前有哪些文件产生了冲突,冲突的详细内容是什么。

$ git diff
diff --cc 1.md
index 420232e,a7a6fd5..0000000
--- a/1.md
+++ b/1.md
@@@ -1,2 -1,2 +1,6 @@@
  this is a file named 1.md.
- this is dev-1.0.0
 -this is dev-1.0.1
++<<<<<<< HEAD
++this is dev-1.0.0
++=======
++this is dev-1.0.1
++>>>>>>> dev-1.0.1

​ 可以看到,当前冲突的内容是在1.md文件里,出现在第2行内容。

​ 编辑有冲突的文件,解决了冲突后把这个文件添add到索引(index)中去,用git commit命令来提交,就像平时修改了一个文件 一样。

​ 使用git log查看我们刚才的操作,已经成功解决冲突,合并完成了。

$ git log
commit 0e04d8d2d516ef507ceebb8b0e4113e5cdf12ded (HEAD -> dev-1.0.0)
Merge: 66f08fc 5cc0fd0
Author: name 
Date:   Thu Aug 9 15:19:02 2018 +0800

    Merge branch 'dev-1.0.1' into dev-1.0.0

4.标签

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。

创建标签

在Git中打标签非常简单,首先,切换到需要打标签的分支上 。

  • 使用AS

    一次点击VCS->Git->Tag,弹出下面窗口,在Tag Name框中输入tag名称,在Commit框选择对应的某个commit,在Message框输入注解,然后点击Create Tag就完成了。

  • 使用bash

    敲命令git tag 就可以打一个新标签。

    默认标签是打在最新提交的commit上的。

    可以用命令git tag查看所有标签。

四、多人协作

1.项目初始化

  • 技术负责人建立代码库,进行项目的初始化工作。

  • mater分支的存放的应该是经过测试的,保持稳定的代码。

  • 只有技术负责人拥有对master分支的操作权限,其他人员对master上的所有变更只能通过merge request从test分支或hotfix分支合并。

  • 技术负责人拥有master分支的merge权限,在每一次merge操作完成之后,应该立即打上对应的版本的tag。

2.日常开发

  • 技术负责人从master分支上拉取以dev-版本号为名称的开发分支(例如dev-1.0.0),供开发人员进行新版本的开发。
  • 在dev进行多人协作时,每位开发人员在提交各自代码的时侯,应注意要先pull代码,如果有冲突,则解决冲突,并在本地提交;没有冲突或者解决掉冲突后,再push到远程库上。
  • 新版本开发完成后,从该版本的dev分支上拉取以test-版本号为名称的测试分支(例如test-1.0.0),准备提测。

3.产品提测

  • test分支用于测试阶段,任何人员不得在上面进行任何的开发和bug修复,所有的改变都从dev分支中合并过来。
  • test分支名称和dev分支名称一一对应,一条dev开发分支就对应一条test测试分支(例如dev-1.0.0分支就对应test-1.0.0分支)。
  • 如果测试出bug,开发人员应该在对应的dev分支上修复bug,并提交,通知技术负责人合并到test分支上面去。
  • test分支测试通过后,通过提merge request通知技术负责人,将该test分支合并到master上,并添加该次版本号tag(例如tag-1.0.0)。

4.紧急修复

  • 线上发生缺陷需要紧急修复时,由技术负责人从master上checkout代码建立hotfix分支,以hotfix-版本号为名称(例如hotfix-1.0.1),开发人员拉起该分支进行修复工作。
  • hotfix分支测试通过之后,通过提merge request通知技术负责人,将该hotfix分支合并到master上,并添加该次版本号tag(例如tag-1.0.1)。

github传送门

你可能感兴趣的:(Android Git在bash环境和Android Studio工具中的使用)