您的位置:首页 > 其它

git工作流程

2016-03-05 12:07 204 查看
哈哈,又来到了一周一次的技术分享环节了,这次准备给15级的小朋友们分享的是版本控制神器——git。包括如何使用git来管理自己的代码,如何与队友协作完成project。

因为git是用命令行来操控的(当然也有图形化界面的,但是不推荐),很多git的初学者经常会被各式各样的指令、选项给弄晕了,所以这里想按一种“时间上的顺序”,也就是从创建代码仓库,但加入到暂存区,到提交,分支,合并,这整个流程,以及中间其它的需求(比如想撤销修改等),来做介绍,这样比较清晰,也容易学习记忆。

A. 创建你的git仓库

安装的部分就不说了,安装完如何使用呢?

打开命令行,输入git –version

>> git --version
git version 2.5.0


这里可能就会有点小问题了,git软件安装在哪?为什么在命令行里输入git以及它的选项就能够使用它?

这个涉及到shell(命令行)的查找可执行文件的过程,比如它先在当前的目录下查找,如果找不到,就回去系统的路径里面找(ubuntu系统输入echo $PATH查看,windows可在环境变量里查看)。git无论你在哪个目录下打开都可以访问到,说明它是安装在系统的路径的某个目录下的。

好像跑题了,如何创建git仓库呢?

>> git init
Initialized empty Git repository in /home/crt/Desktop/test/.git/


如果你查看一下你现在的文件目录下的文件,就会发现,多了一个.git目录,里面是git自己维护代码仓库所需的各种文件,如果只是使用它,则不用去了解它底层的具体实现。

至此,已经创建好了一个git仓库了,不过里面空荡荡的,什么都没有。那么问题来了,有了仓库之后,怎么管理自己的代码呢?

B. 热身命令

在下一步之前,先看一下几个常用的命令:

1. 查看当前仓库的状态,git status

2. 查看仓库的日志,即所有版本的信息,git log

3. 查看当前所属的分支,git branch(分支这个概念会在后面有介绍)

很明显这几个命令顾名思义就可以了,不需要背的~

C. 管理代码的需求分析

首先看一下如果是我们来设计一款这样的软件,我们会有什么需求?在写代码的时候,经常是迭代式的开发,比如有很多阶段的功能,一个版本一个版本地推进,那么如何保存好一个一个版本的代码不乱?万一某个版本发生了重大的问题,我们需要快速地恢复到另外某个版本,可以吗?这就催生了第一个需求:

1)管理好各个版本的代码,可以快速在各个版本间穿梭;

然后,在编辑当前最新版本的时候,需要你先转去修复另外一部分的功能,那么你现在做的这部分修改得怎么办呢?删掉,待会再重做吗?或者直接提交成为一个新的版本吗?都太不自然了,所以催生了第二个需求(其实暂存区的原因可能不是这个,但是无所谓啦,参考这篇博客):

2)有个缓存区来放置想要的暂时存档的代码场景;

还有,在编辑的时候,加入暂存区,甚至是提交成为一个版本之后,(发现自己手滑,还有不完善的地方),想撤销这部分修改,可以吗?

3)给几颗后悔药吃,可以撤销已经做过的“存档”;

有人可能还会想要比较一下当前做的修改和已经存档好的代码,方便看出哪里修改了:

4)比较现有代码和已存档的代码;

还有最闪亮的一点——多人协作携project的时候怎么办?如何把每个人写的代码合并起来?如果多个人修改同一个部分导致冲突该怎么办?

5)支持合并多人的代码,并有冲突处理机制。

D. 如何管理自己的代码

回顾一下,在A中创建了一个空的代码仓库,B中介绍了3条查看仓库状态的指令,C中分析了使用git可能会有的一些需求。所以接下来会开始介绍git是如何来满足这些需求的,D会介绍前4个需求,第5个将在E中介绍。

First of all,还得介绍一下git对于文件所在的地方的概念:

1)工作目录(working dir):就是我们git init时所在的那个目录,代码的改动都在这里进行;

2)暂存区(index/stage):就是C中提到的那个暂存区,至于它的作用则见仁见智了,不必纠结,用着用着自然就会明白了;

3)HEAD:这是shen me gui?为什么突然冒出个“头”来?说来话长,得从git是如何存储各个版本说起——git维护的是各个版本较其前一个版本的改动,而不是保留每个版本的所有代码的一个副本(因为这样做太占用空间了,也没必要)。git将一个个的版本当做一个链表上一个个的节点,而它们之间的修改,就是串联它们的“边”。这里说的“链表”就是分支的概念了!!!代码版本的一个演化方向和过程就是一个“分支”

说了这么久,HEAD到底是指什么呢?HEAD指向的是当前分支上的最新的一个版本(节点),为什么要有这个东西呢?因为通过这个点,我们可以直接与最新版本的代码打交道,无论是从其中恢复代码,还是通过它返回到以前的旧版本。

按照流程走一遍就好了:

任务:

1)第一个版本,写一个hello world;

2)第二个版本,修改程序使其能够接受一个输入的字符串,并且输出hello, str_that_you_just_input。

过程:

E. 多人合作

现在执行一下git branch,看看结果是什么?

* master


这是什么意思?每次创建一个git仓库,它都会自动创建一个分支:master。那么分支是什么意思呢?我自己的理解是:

分支:代码开发的一条路。比如写个hello world,首先创建一个hello.cpp文件(v1),然后在文件里引入头文件(v2),写一个main函数(v3),最后再写一条cout语句(v4)。这个过程中你总共提交了四个版本的代码,每个版本都是一个点,点和点之间有一条有方向的边连着。


那么多条分支会是怎么样的情况呢?别人拿到你的代码,其实是相当于在当前的主分支上开一条新的分支(分支之间的“发展”互不影响,直到它们合并的时候),就像树枝生长一样。

比如现在小A和小B合作开发hello world,小A负责创建程序文件、引入头文件,而小B负责写main函数的框架,并cout。小A所在的分支是默认的分支master,具体的过程如下:

>> git init
Initialized empty Git repository in /home/crt/Desktop/test/.git/
>> vim hello.cpp
// 此处省略编辑代码的部分
>> git add hello.cpp
>> git commit -m "Little A include the header"
[master (root-commit) b8ffa5d] Little A include the header
1 file changed, 2 insertions(+)
create mode 100644 hello.cpp


至此,小A的工作已经完成了,那小B怎么办呢?假设小A在广州,小B在纽约,总不能让小A拿U盘拷过去给小B吧?或者发一封邮件给小B?No,No,No. 如果嫌自己搭建git服务器麻烦的话,直接使用github的服务就好了,在上面创建一个git仓库,然后小A将代码push上去,小B在美国那边fork下来就好了。

小B直接在

【最近各种烦恼,写得有点乱,未完待续】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  git 版本控制