Git入门

原文  : http://www.tcvpr.com/archives/168


开篇废话

开篇废话又回来了,离开博客算是有一年了,之间曾经痛下很多次决心,继续写博客,后来都失败了,前年为了申请个CSDN专家,每天发博客,那个高产的状态,现在已然不行了,时过境迁,当时为了吃口饱饭拼命的武装自己,现在能吃饱了,动力也就没那么强了,还有一个原因是,自己做事情喜欢一气呵成,现在想想,没啥必要,有时候过于追求速度反而虎头蛇尾,莫不如慢慢来,一周一篇的速度坚持下来也是很不错的,好习惯要坚持,Jobs说你只能看到过去,但看不见将来。当站在未来某个时间点t,也许我会非常感激我写下的这篇文字和构思这篇文字的过程。 
本文阅读顺序: 
对于有Git经验的人: 
-1,0,1,2,3,4 
对于0基础的人: 
0,1,2,3,4,-1,1,2,3,4 
本文的目的是学会使用Git,对于不正确,不严谨的地方,请留言,对于想通过本文获取知识点考试的同学,可能要小心一些,本文以大白话为主(好像没有考试考这东西吧。。。)

-1:Git的知识结构

-1.0Git结构图解

废话结束,怎么出来个-1的目录,额,python好像支持这样的索引(但回到的是末尾元素),哈哈,因为我后面标号都写好了,所以懒得改,递减一个知道先后顺序就好,没有任何基础的可以略过这部分,这是本文主要的写作思路和知识结构,可以当做总结,或者提纲来看。 

这里写图片描述

四个区:
1:工作区(本地,可见)
2:暂存区(本地,隐藏)
3:本地库(本地,隐藏)
4:远程库(远程,不可见)
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
主要操作:
1:工作区和暂存区之间的数据交换
2:暂存区和本地版本库之间的数据交换
3:本地版本库和远程版本库之间的数据交换
4:工作区和本地版本库之间的数据交换
5:暂存区和远程版本库的数据交换
6:工作区和远程版本库的数据交换
7:工作区随时间的变化
8:暂存区随时间的变化
9:本地版本库随时间的变化
10:远程版本库随时间的变化
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

0:Git的起源

0.1:Git是啥

做过毕业设计的都有这种感受: 

图0.1-1

没错,Git能解决这个问题,也解决不了这个问题,能解决这个问题是如果你写代码或者其他文本的话,Git是可以记录下你之前随时存档时的版本快照,以便随时快速恢复到以前的状态,解决不了这个问题是,word的文件不行(问我为啥?问大微软去吧。。。)。 
还有一个例子是单机游戏一般都会有的一个读档存档功能,当你要开一个boss的时候为了防止失败以后要从新来过,可以在开打之前存一下档,以便失败后不至于从头再来。 
Git是一款快源的软件,能够帮你管理你文件的版本,多人共同开发等,说来说去就是作为一个程序员,如果不会用版本控制工具,将会被人鄙视,不管你写了多少年,也就算个入门,说相声四门功课(好吧,作者喜欢一遍听相声一边干活——)说学逗唱,我觉得程序员的四门功课:操作系统,编译原理,算法数据结构,软件工程。四门功课都做好了,不会是一个烂程序员,有人可能要问,为啥不提编程语言,“如果你站在操作系统和编译原理的角度看编程语言,其实都是一样的”(我目前认识的最牛的一个工程师跟我说的,一个老华为),而版本控制是软件工程中的重要一环。

0.2:Git能干啥

Git能干啥,存档呗,就是你每次提交一次,Git就咔嚓一下给你的所有文件拍个照,相当于保存一个副本到隐藏的区域,也就是前面图0.1-1中,它帮你隐藏了所有之前的论文版本,只给你看最近修改完成的,也可以瞬间回到之前的任意版本。

0.3:Git怎么来的

下面抄一段Git官网的资料

同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。
Linux 内核开源项目有着为数众广的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。
到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linux Torvalds)基于使用 BitKcheper 时的经验教训,开发出自己的版本系统。 他们对新的系统制订了若干目标:
速度
简单的设计
对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
完全分布式
有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

就是Linux他爸爸们,一开始开发Linux用了别人的版本控制工具,然后一群想把地球都开源多人尝试破解别人的商用版本,然后别人急了,要干爸爸们,然后大爸爸急了,大喊一声“劳资自己搞”!然后牛逼哄哄的Git就诞生了,一个不大不小的典故,告诉我们:只要脑袋里有东西也会用工具,一定能做出能用的东西。

0.4:集中式版本控制

集中式版本控制就是同一个工程只在一台服务器上保存最新版本,当你要开发时要从服务器下载完整的最新版本,当你完成开发时候又要重新上传到服务器,当然,问题就来了,一旦服务器挂了,或者彻底挂了,那就彻底挂了。 

这里写图片描述

0.5:分布式版本控制

于上面说的集中式的版本控制系统不同,分布式的版本控制在所有开发者手里都有一套完整的代码库,也就是只要下载过的开发者都有一个完整的副本,这样带来的好处就是只要这几个人的电脑不同时坏硬盘,这份工程一般是不会丢的,而坏处就是这个项目将会变得很自由,因为所有人都有完整的工程。 

这里写图片描述

1:Git的文件夹

1.0:创建一个库

如何安装Git这个问题就不介绍了,这个如果搞不定,请放弃本文,因为你目前掌握的东西已经足够跟别人吹牛x了。此外在Linux和Mac os下使用Git比较方便,因为都是类Unix的系统。 
此外,请不要在公司项目的文件中学习实验Git,否则一切后果,我不负责。。。。。。。。。。。。。。 
首先我们先建立一个空的文件夹: 

这里写图片描述

bogon:LearnGit Tony$ pwd
/Users/Tony/Projects/LearnGit
bogon:LearnGit Tony$ ls -al
total 0
drwxr-xr-x   2 Tony  staff   68  6 22 20:48 .
drwxr-xr-x  15 Tony  staff  510  6 22 20:48 ..
bogon:LearnGit Tony$ 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

新建的文件夹:LearnGit,进入文件夹输入 ls -al 显示这个文件夹下什么也没有,也没有任何隐藏文件。 
下面我们使用Git的 init命令来建立一个版本库:

bogon:LearnGit Tony$ git init
Initialized empty Git repository in /Users/Tony/Projects/LearnGit/.git/
 
 
  • 1
  • 2

英译汉:“Initialized empty Git repository in /Users/Tony/Projects/LearnGit/.git/” 
初始化一个Git仓库在xxxxx/.git/文件中。 
接着我们观察下有没有产生这个.git: 

这里写图片描述

什么都没有,是的,有Linux经验的同学会说,你484傻,.git是个隐藏文件,是的没错,如果我们在命令行下就能看到: 
这里写图片描述

git文件夹已经出现了,其中也有一些其他文件,初级应用一般不涉及,所以也别进去瞎改,有些技术要弄到最底层,但像这种工具,如果只想灵活使用,本人建议别进去改。

从远程clone一份版本库,命令:

git clone xxxxxxx.git
 
 
  • 1

其中xxxxxx.git是远程版本库的网络地址,我们将clone回来完整的版本库。

1.1:能看见的

上面我们已经见识到了一些看不见的东西,我们能看到什么呢?新建个文件试试?试试就试试: 

这里写图片描述

这里写图片描述

我们新建一个Readme,并输入了Hello world保存,可以看到现在我们的文件夹下有一个文件,而且一切看上去没什么不同。好的,现在我们可以看到一个正常的文件夹,以及正常的文件。我们可以把它当做一张书桌,我们每天趴在这个上面写我们的程序,文档,以及其他的一些资料。

1.2:看不见的

看不见的在1.0中已经说过了,看不见的在一个隐藏的git文件夹下,而在这个文件夹下可以抽象的看成还有两个部分:一个暂存区,和一个版本库,版本库中保存着一个或者多个分支,而每个分支是过去一系列你存在版本库里面的历史版本。关于分支的详细内容在第3部分详细介绍。可以对照图-1.0-1里的形象描述。

1.2.0:本地的

本地版本库就是存在本机中的内容,包括一个版本库的副本(如果进行了修改,那就是被修改到当前状态和从远程拉取回来的版本库的结合)

1.2.1:远程的

听说过Github的同学可能比Git的同学要多,因为很多人都听说过或者去复制过别人的代码,没错Github就是一个大型的Git远程服务器,有人说Github是世界所有软件的基因库,很形象,我们可以把自己的工程发布到Github也可以从Github上clone别人的工程生成一个自己的分支,或者加入别人的项目,Github就是一个典型的远程Git服务站点。 

这里写图片描述

(今天就写到这,下次继续2016年6月22日晚)

2:Git的文件状态

继续Git的介绍,文件的状态跟文件所在的位置有关,文件所在的位置就是第-1节中的那三(四)个区,几个区之间的状态转换就是Git学习最精髓的地方,在这里简单介绍下这几个区的,一个简单的比喻:工作区就是你的书桌,你就在这个书桌上写作业,而且这个书桌附带一个无限大的抽屉,你随时可以把桌子上的作业放入这个抽屉,而且可以无限放进去,但是拿出来的时候一定是“后进先出”是的,这个就是工作区的一个简单的比喻,暂存区就是老师的讲桌,交作业的时候你要把作业拿到老师那里,暂时放在讲桌上面,这段时间,你可以取回来(可能老师会不高兴。。哈哈),而当老师把作业拿走的时候,作业可以当做是入库了,就是进入版本库了,更进一步,如果老师把作业交给了学校展出的档案馆(Github)okay,全世界都能看到你的作业了,这个比喻不是很恰当,但是可能会形象一些,直观感受。

2.0:untracked(未跟踪)

所谓未跟踪的文件,就是你刚拿到桌子上,老师不知道那是个啥的文件,你必须给老师看一下,老师才会知道那是个什么,而这一步的操作可以是任何新加文件到当前工作区,比如创建或者复制过来,都可以: 

这里写图片描述

前面我们创建了一个Readme文件,并且未做任何操作,使用status命令可以看出当前工作区文件的修改状态:

git status
 
 
  • 1

查询当前文件修改,可以看出Readme处于untracked 状态,使用add命令可以使它被版本库跟踪。 
.DS_Store是Mac下的一个系统文件,这里我们忽略。

2.1:staged(已暂存)

为了让Git盯上Readme并把它加入版本库,我们使用

git add Readme
 
 
  • 1

命令: 

这里写图片描述

好的现在使用git status可以看到Readme已经被跟踪了,而.DS_Store没有被跟踪,如果使用

git add .
 
 
  • 1

命令,整个工作区下的所有文件将会被跟踪,这样做的好处是速度快一些,但是可能会把一些不必要的文件加入到版本库中。

2.2:committed(已提交)

将暂存区的修改(文件)送入版本库的命令:

git commit -m " xxxxxxx "
 
 
  • 1

xxxxxx是本次提交到版本库所修改的简要提醒,这个在当前来看可能是没用的,但是相信我,一个月后你就会完完全全忘记这次修改了什么,为什么修改,所以最好写上一些有意义的简介到里面: 

这里写图片描述

好的这样Readme就入库了,Git将会注意到这个文件的一举一动。

2.3:modified(已修改)

如果对于已经在版本库中的文件比如Readme来说,如果我们作出修改,会怎么样呢?上面说过Git会注意到Readme的一举一动: 
我们向Readme加入一句话

Hello Git!
 
 
  • 1

这里写图片描述

通过status命令,可以看出,修改后的Readme处于已修改的状态,如果想把新修改的加入版本库,请重复2.1的过程。

2.4:ignore(已忽略)

好吧,我承认,那个未被跟踪的系统文件好讨厌,每次都要提示它未跟踪,像个办法不看他,Git支持忽略一系列文件的的方法,就是它会忽略掉工作区呢.gitignore文件内的所有名字: 

这里写图片描述

没错,就这么神奇。


git stash

在研发过程中,经常会遇到处理任务过程中,被更高优先级的任务打断,最早使用的方法是手动把文件进行保存,后来使用git add 和git commit把文件保存在git本地,但是这样的方法都会有很大的缺陷。保存文件,会出现很多的多余文件。而临时提交可能会引起git pull时的冲突,以及误提交的情况。那如何解决这个问题呢?

git早就为我们想好了这种情况,提供了在使用git代码管理工具,进行工作管理时,保存当前的工作现场的方法。此时可以使用

git stash

保存当前的工作现场,这时候就可以切换到其它分支进行工作,或者在当前分支上,完成其它紧急工作。

Git stash的使用与分支无关,即不同分支的git stash会产生stash list。可以通过

git stash list

查看所有stash的内容。如果需要提取某一个stash可以通过

git stash pop stash@{num}

num就是要恢复的工作编号。

清除所有的stashed状态,

git stash clear


2.5:小结

简单的介绍了下Git的正向文件状态变化: 

这里写图片描述

主要是这张图上①②⑦的从左到右的变化,如果只学会上面这些,可以使用Git最简单的保存功能,后面我们将会讲解③④⑤⑥从左到右,以及从右往左的变化,这样就基本可以使用Git中级功能了,学会分支了以后,就相当于Git的高级功能已经学会了,至于究极功能,请研究手册和源代码,对于工具使用者,学到高级就够了,专业人员请去看源代码,和设计哲学。 
(今天就写到这,下次继续2016年6月29日晚)

3:Git的分支

master

dev(开发)

debug(修复漏洞)

zhang3,zhao4,lining,guangkun…

4:总结


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值