转载请注明出处:http://blog.csdn.net/sxh951026/article/details/77200003
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布
因为最近有学弟请教Git的知识,在教的时候发现总觉得零零散散的,于是整理了一下,写成了这篇博客。
这里先推荐几个学习Git的网址,希望能帮到大家!
目录
一 Git简介
01 版本控制系统的作用
版本控制系统的功能主要有三个。
- 备份代码。很常见的,今天的工作做完了,提交一下,明天改了改,发现还没昨天的好,使用Git的话,直接回退到上一个版本即可,再也不需要手动分日期保存代码了。爱玩游戏的同学,可以发现这和游戏里的存档功能很像。
- 在多人合作开发时,同步并合并对代码的修改。多个人开发的时候,小明开发了一个功能,小红开发了一个功能,他们需要把各自的功能合并到一起。于是小明先要把自己的代码发给小红,小红把自己要的代码挑出来,合并到自己的代码里(合并的过程真的很麻烦),然后把整个代码再发回给小明,然后继续开发。上述操作通过Git的指令可以自动完成,十分简便。
- 方便项目开发的管理。比如说,在开发下一个版本的同时,可以在前一个版本的基础上修复bug,使用Git可以使这两个工作互不干扰。再比如说,软件出bug了,通过Git可以诊断出是谁在哪次提交上引入了这个bug,方便分锅哇。
注意一下,并不是只能管理代码,word文档,图片,设计稿之类的东西都是可以管理的。
02 Git的诞生
Git是在Linux内核开源项目的维护工作中诞生的,于2005年。父亲是Linux之父Linus Torvalds,从亲缘关系上讲,Git是Linux的弟弟。
那个时候的情况是这个样子的!因为Linux是一款自由软件(具体什么是自由软件,请出门百度),开源,免费,而且谁都可以参与项目开发,所以吸引了一大批牛掰的程序员,他们修改Linux源码,将自己的代码发给Linus,再由Linus将代码合并到Linux内核中去。由于参与者非常多,代码的维护非常繁琐。所以在2002年的时候,启用了一个叫做BitKeeper的分布式版本控制系统。
BitKeeper是一个商业软件,是付费的,不过出于人道主义精神,BitKeeper所属的公司授予了Linux社区免费使用BitKeeper的权限。但是在2005年的时候,由于Andrew Tridgell(Samba的开发者)违反BitKeeper的使用原则,对BitKeeper开始进行逆向工程,使Linux社区失去了免费使用BitKeeper的权限。
然后重点来了,Linus在失去BitKeeper的支持后,根据他对BitKeeper的理解,并综合了当时版本控制系统的一些缺陷,花了一两个星期,用C语言写出了Git!
二 Git配置和仓库初始化
下面会介绍Git的使用,每个小节里会讲解各个功能在命令行中的实现方式,并在每小节的最后介绍在Android Studio中的图形界面里怎么使用对应的功能。
01 Git配置
在安装完Git后,会有一个叫做Git Bash
的程序,打开之后会出现一个跟Linux命令行操作界面神似的命令行窗口,其中可以输入各种Git指令和一些Linux指令。
在使用Git之前,需要进行一步设置,在命令行中输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
这两条指令就相当于给自己的电脑取了个名字。在之后的每次提交(备份)中,这两个属性都会被添加到那一次提交生成的提交对象中。在协同开发时,大家可以通过这个名字来区分是谁完成了这个功能,是谁写出了那个Bug。
当然Git中可以进行的设置还有很多,有兴趣的可以查阅git config
这个命令。另外,--global
这个参数表示电脑上的所有仓库都会使用这个名字,当然你也可以给每个仓库指定不同的用户名和Email地址。
在Android Studio中使用Git还需进行如下配置。
在Android Studio中使用Git需要将安装完成的Git.exe文件配置到Android Stdudio中。具体步骤如下,首先点击File->Settings
打开Settings对话框,接着点击Version Control->Git
进入相应目录,在Path to Git executable
中填入Git.exe
所在位置。之后点击Test进行测试,如果弹出成功信息,则配置完成。
02 创建Git仓库
在Git中,创建Git仓库对应的指令为git init
,它会把当前目录初始化为一个Git仓库。使用命令行的话,你可以先把Android工程建好,再是一顿cd
和mkdir
和ls
来到相应的目录,执行git init
来初始化仓库,也可以先建立好仓库,再把工程建在里面,没毛病!
如果用Android Studio初始化仓库。
首先新建一个工程。再点击VCS->Create Git Repository
,会弹出一个对话框,让你选择Git仓库的初始化目录,一般都会选择工程的根目录。注意: 其实在Android Studio中也可以打命令行,在底部的Terminal栏目里输入命令即可。但是因为各种别扭,打命令行还是喜欢用Git bash。
点击OK即可完成仓库的创建。 在新建Git仓库之后,会发现Android Studio底下多出了一个Version
Control栏目。在其中可以进行许多方便的Git操作,包括分支的图形化显示,文件状态的浏览等。细心的同学应该会发现其中的文件是红色的,这里的颜色表示了文件的状态——文件还没有被加入到暂存区中(后面会具体讲暂存区)。
三 用Git备份代码
我们通常是这么备份代码的。第一步,在上一个备份点继续开发。第二步,在想要备份的时候,打个包,存到电脑上,如果怕电脑中病毒瘫痪之类的,可能还会发一份到云盘上,第三步,继续在这一个备份点上开发,……。在开发中,考虑到包的大小和一些自动生成的配置文件和编译过程中产生的文件等,会在上述步骤中再添加一步。即在备份之前,把需要的改动挑选出来,再进行备份。
Git备份代码,其实也就是这三步。
- 在上一个版本的基础上继续开发,修改代码。
- 用
git add
或者git rm
指令,将需要的改动添加到暂存区(顾名思义,一个暂存文件的区域),对应上面的挑选改动操作。 - 用
git commit
指令,将暂存区中的改动与上一个提交(备份)结合,形成一个新的提交(备份),对应上述操作中的备份操作。
注意:这里的改动并不单单指对原文件的修改,也包括创建文件,删除文件。
01 在本地备份代码
在Git中用git add
和git rm
操作来添加改动到暂存区,并用git commit
来生成一个提交(备份)。接下来分别介绍添加文件,修改,删除这三种改动添加到到暂存区的方法和生成一次提交的方法。
关于暂存区到底是个什么东西。
我们把平时看到的电脑上的目录叫做工作区,里面是我们实际操作的文件。而暂存里面一开始会包含上个提交时的所有文件,然后我们会通过git add
和git rm
操作来把工作区里的改动添加到暂存区,比如添加新文件到暂存区,把修改后的文件添加到暂存区以及删除暂存区中的文件。当最后提交时,Git把暂存区中的所有文件组织成一棵树,再加入时间,作者等信息形成一个commit对象,再把commit对象与上一次提交生成的commit对象连接起来,就完成了一次新的提交。(上述表述不是非常严谨额,大家别太较真,意思懂了就行。Git管理文件的方式与Unix的文件系统类似,想具体了解可以去看Git官网的教程)
在新创建Git仓库后,所有文件都还没有加入到版本控制系统中,当前仓库是空的。这里有的同学就奇怪了???你不是用git init
在这个目录下初始化了Git仓库吗,我这个目录下好多文件呢,你怎么说他是空的呢。!!!注意,当前目录下的文件并不属于Git仓库!!!在git init
之后,会在当前目录下生成一个.git
目录(在windows里这个目录隐藏的,设置了显示隐藏文件之后可以看到),里面有一个objects
目录,这个目录下的文件才是属于Git仓库的。刚初始化的仓库的objects
目录有两个目录,一个info
,一个pack
,不过里面啥也没有,都是空的。
这时,对于Git来说,存在了许多新建文件。在命令行中输入git status
可以查看仓库的状态,其中的Untracked files
中的内容,就是我们还未添加的改动——添加文件。
改动类型一:添加文件
在上面的git status
中显示的untracked files
均是在当前版本中还未添加到暂存区里的文件。可以用git add <file>
来将他们加入暂存区。在加入之后用git status
查看仓库的状态。
$ git add app/src/main/java/com/bigboss/blelock/myapplication/MainActivity.java
$ git status
会发现,多了一段提示,Changes to be committed
(等待提交的改动),其中显示的就是new file
(新文件)。这说明,我们已经将需要的改动添加到暂存区了。这个时候再去查看.git\objects
目录,会发现多了一个文件。
添加完成后用git commit -m "提交信息"
将暂存区中的内容生成一个提交(备份)。
$ git commit -m "添加了MainActivity"
用git log
指令可以查看当前的提交历史。可以看到多了一个提交,提交信息就是我们刚才输入的添加了MainActivity
。从这里也可以看到,在第一步Git配置时,设置的用户名和邮箱都自动添加到了提交信息中。
改动类型二:删除文件
在我们删除文件后,可以通过git rm <file>
来把暂存区中的文件也给删掉,从而将改动更新到暂存区。在我们的第一个版本中,我们添加了一个新的文件MainActivity.java
,下面我们把它删除,并添加另一个activity_main.xml
文件(为了方便修改操作的演示)。
在把工作区中的MainActivity.java
删除后,运行git status
,Git会很机智的告诉我们MainActivity.java
已经被删除了,但还没有更新到暂存区。
我们用git rm <file>
将对MainActivity.java
的改动更新到暂存区,并添加activity_main.xml
到暂存区里。
$ git rm app/src/main/java/com/bigboss/blelock/myapplication/MainActivity.java
$ git add app/src/main/res/layout/activity_main.xml
执行完成后,用git status
查看仓库状态。可以看到Changes to be commited
里有了deleted和new file两条改动信息。
最后提交一下修改。
$ git commit -m "删除了MainActivity.java,添加了activity_main.xml"
$ git log
改动类型三:修改文件
在我们修改了文件之后,将修改更新到暂存区的操作也是git add <file>
,这里可能有同学会觉得奇怪,为什么修改文件也用git add
,add
不是添加文件的意思吗,其实从本质上讲Git对已修改文件的处理方式就是将修改后的文件整个加入到暂存区替换掉原文件,那用add更新修改也就顺理成章了。
现在我在activity_main.xml
的最后加一行modifyTest
,运行git status
会有下面的modified
提示。
我们用git add <file>
来把修改添加到暂存区,然后查看仓库状态。
$ git add app/src/main/res/layout/activity_main.xml
$ git status
最后提交一下修改。再用git log
查看一下提交历史。
$ git commit -m "在activity_main.xml最后加了一行,modifyTest"
$ git log
提交历史如下,又生成了一个提交了哈。
更新所有改动到暂存区并提交
大部分的时候,我们会把所有的改动都更新到缓存区并提交,可以使用git commit -am "提交信息"
,它会自动把所有已经跟踪过的文件暂存起来一并提交,包括修改和删除,他是git add -u
和git commit -m "提交信息"
的结合。如果要把全部文件的添加,修改,删除三种改动全部添加到暂存区去,可以用git add -A
。
通常我们还需要忽略一些指定的文件,比如在java编译后生成的.class文件等,这可以通过配置.gitignore文件来完成。具体见.gitignore的使用这一节。
至此,添加三种改动到暂存区的方式就讲完了,大家可以组合这三种操作完成各种各样的任务!
git status原理
在用git status
查看仓库状态时,经常会看到Untracked files
,Changes not staged for commit
和Changes to be committed
三个标题。大家大概能知道里面的内容是什么意思,但有时还是会感到迷惑。接下来我们会介绍这三个标题下内容的由来。
这三个标题中的内容是根据三个文件树产生的。这三个文件树分别为工作区,暂存区和上一个提交中的文件区(仓库刚初始化的时候,没有提交,相当于文件树为空)。Untracked files
显示的是工作区中存在而暂存区中没有的文件,通常为新建的文件,而Changes not staged for commit
里是工作区中和暂存区中内容不同的文件,通常是因为修改了文件,显示为modified
,以及暂存区里存在但工作区里没有的文件,通常是因为删除了文件,显示为deleted
。而Changes to be committed
里显示的是暂存区里有,但是上一次提交中没有的内容。
Android Studio中的相应操作
先切换到Version Control栏目的子栏目local Changes中,在这里可以看到修改的文件。在里面会看到两个目录,一个是Defult,一个是Unversioned Files。前者中显示的是Git命令行中Changes not staged for commit
栏目的对应文件