Git入门学习和使用
#开篇废话
开篇废话又回来了,离开博客算是有一年了,之间曾经痛下很多次决心,继续写博客,后来都失败了,前年为了申请个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好像支持这样的索引(但回到的是末尾元素),哈哈,因为我后面标号都写好了,所以懒得改,递减一个知道先后顺序就好,没有任何基础的可以略过这部分,这是本文主要的写作思路和知识结构,可以当做总结,或者提纲来看。
![这里写图片描述](https://img-blog.csdn.net/20160616230207628)
```
四个区:
1:工作区(本地,可见)
2:暂存区(本地,隐藏)
3:本地库(本地,隐藏)
4:远程库(远程,不可见)
```
```
主要操作:
1:工作区和暂存区之间的数据交换
2:暂存区和本地版本库之间的数据交换
3:本地版本库和远程版本库之间的数据交换
4:工作区和本地版本库之间的数据交换
5:暂存区和远程版本库的数据交换
6:工作区和远程版本库的数据交换
7:工作区随时间的变化
8:暂存区随时间的变化
9:本地版本库随时间的变化
10:远程版本库随时间的变化
```
#0:Git的起源
##0.1:Git是啥
做过毕业设计的都有这种感受:
![图0.1-1](https://img-blog.csdn.net/20160622201452036)
没错,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 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统
就是Linux他爸爸们,一开始开发Linux用了别人的版本控制工具,然后一群想把地球都开源多人尝试破解别人的商用版本,然后别人急了,要干爸爸们,然后大爸爸急了,大喊一声“劳资自己搞”!然后牛逼哄哄的Git就诞生了,一个不大不小的典故,告诉我们:只要脑袋里有东西也会用工具,一定能做出能用的东西。
##0.4:集中式版本控制
集中式版本控制就是同一个工程只在一台服务器上保存最新版本,当你要开发时要从服务器下载完整的最新版本,当你完成开发时候又要重新上传到服务器,当然,问题就来了,一旦服务器挂了,或者彻底挂了,那就彻底挂了。
![这里写图片描述](https://img-blog.csdn.net/20160622203958125)
##0.5:分布式版本控制
于上面说的集中式的版本控制系统不同,分布式的版本控制在所有开发者手里都有一套完整的代码库,也就是只要下载过的开发者都有一个完整的副本,这样带来的好处就是只要这几个人的电脑不同时坏硬盘,这份工程一般是不会丢的,而坏处就是这个项目将会变得很自由,因为所有人都有完整的工程。
![这里写图片描述](https://img-blog.csdn.net/20160622204258845)
#1:Git的文件夹
##1.0:创建一个库
如何安装Git这个问题就不介绍了,这个如果搞不定,请放弃本文,因为你目前掌握的东西已经足够跟别人吹牛x了。此外在Linux和Mac os下使用Git比较方便,因为都是类Unix的系统。
此外,请不要在公司项目的文件中学习实验Git,否则一切后果,我不负责。。。。。。。。。。。。。。
首先我们先建立一个空的文件夹:
![这里写图片描述](https://img-blog.csdn.net/20160622204932482)
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$
新建的文件夹:LearnGit,进入文件夹输入 ls -al 显示这个文件夹下什么也没有,也没有任何隐藏文件。
下面我们使用Git的 init命令来建立一个版本库:
bogon:LearnGit Tony$ git init
Initialized empty Git repository in /Users/Tony/Projects/LearnGit/.git/
英译汉:“Initialized empty Git repository in /Users/Tony/Projects/LearnGit/.git/”
初始化一个Git仓库在xxxxx/.git/文件中。
接着我们观察下有没有产生这个.git:
![这里写图片描述](https://img-blog.csdn.net/20160622205643477)
什么都没有,是的,有Linux经验的同学会说,你484傻,.git是个隐藏文件,是的没错,如果我们在命令行下就能看到:
![这里写图片描述](https://img-blog.csdn.net/20160622205801104)
git文件夹已经出现了,其中也有一些其他文件,初级应用一般不涉及,所以也别进去瞎改,有些技术要弄到最底层,但像这种工具,如果只想灵活使用,本人建议别进去改。
从远程clone一份版本库,命令:
git clone xxxxxxx.git
其中xxxxxx.git是远程版本库的网络地址,我们将clone回来完整的版本库。
##1.1:能看见的
上面我们已经见识到了一些看不见的东西,我们能看到什么呢?新建个文件试试?试试就试试:
![这里写图片描述](https://img-blog.csdn.net/20160622210254979)
![这里写图片描述](https://img-blog.csdn.net/20160622210612902)
我们新建一个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服务站点。
![这里写图片描述](https://img-blog.csdn.net/20160622214230528)
(今天就写到这,下次继续2016年6月22日晚)
#2:Git的文件状态
继续Git的介绍,文件的状态跟文件所在的位置有关,文件所在的位置就是*第-1节*中的那三(四)个区,几个区之间的状态转换就是Git学习最精髓的地方,在这里简单介绍下这几个区的,一个简单的比喻:工作区就是你的书桌,你就在这个书桌上写作业,而且这个书桌附带一个无限大的抽屉,你随时可以把桌子上的作业放入这个抽屉,而且可以无限放进去,但是拿出来的时候一定是*“后进先出”*是的,这个就是工作区的一个简单的比喻,暂存区就是老师的讲桌,交作业的时候你要把作业拿到老师那里,暂时放在讲桌上面,这段时间,你可以取回来(可能老师会不高兴。。哈哈),而当老师把作业拿走的时候,作业可以当做是入库了,就是进入版本库了,更进一步,如果老师把作业交给了学校展出的档案馆(Github)okay,全世界都能看到你的作业了,这个比喻不是很恰当,但是可能会形象一些,直观感受。
##2.0:untracked(未跟踪)
所谓未跟踪的文件,就是你刚拿到桌子上,老师不知道那是个啥的文件,你必须给老师看一下,老师才会知道那是个什么,而这一步的操作可以是任何新加文件到当前工作区,比如创建或者复制过来,都可以:
![这里写图片描述](https://img-blog.csdn.net/20160629215127151)
前面我们创建了一个Readme文件,并且未做任何操作,使用status命令可以看出当前工作区文件的修改状态:
```
git status
```
查询当前文件修改,可以看出Readme处于untracked 状态,使用add命令可以使它被版本库跟踪。
.DS_Store是Mac下的一个系统文件,这里我们忽略。
##2.1:staged(已暂存)
为了让Git盯上Readme并把它加入版本库,我们使用
git add Readme
命令:
![这里写图片描述](https://img-blog.csdn.net/20160629220112930)
好的现在使用git status可以看到Readme已经被跟踪了,而.DS_Store没有被跟踪,如果使用
```
git add .
```
命令,整个工作区下的所有文件将会被跟踪,这样做的好处是速度快一些,但是可能会把一些不必要的文件加入到版本库中。
##2.2:committed(已提交)
将暂存区的修改(文件)送入版本库的命令:
```
git commit -m " xxxxxxx "
```
xxxxxx是本次提交到版本库所修改的简要提醒,这个在当前来看可能是没用的,但是相信我,一个月后你就会完完全全忘记这次修改了什么,为什么修改,所以最好写上一些有意义的简介到里面:
![这里写图片描述](https://img-blog.csdn.net/20160629220946074)
好的这样Readme就入库了,Git将会注意到这个文件的一举一动。
##2.3:modified(已修改)
如果对于已经在版本库中的文件比如Readme来说,如果我们作出修改,会怎么样呢?上面说过Git会注意到Readme的一举一动:
我们向Readme加入一句话
```
Hello Git!
```
![这里写图片描述](https://img-blog.csdn.net/20160629221325779)
通过status命令,可以看出,修改后的Readme处于已修改的状态,如果想把新修改的加入版本库,请重复2.1的过程。
##2.4:ignore(已忽略)
好吧,我承认,那个未被跟踪的系统文件好讨厌,每次都要提示它未跟踪,像个办法不看他,Git支持忽略一系列文件的的方法,就是它会忽略掉工作区呢.gitignore文件内的所有名字:
![这里写图片描述](https://img-blog.csdn.net/20160629222658263)
没错,就这么神奇。
##2.5:小结
简单的介绍了下Git的正向文件状态变化:
![这里写图片描述](https://img-blog.csdn.net/20160616230207628)
主要是这张图上①②⑦的从左到右的变化,如果只学会上面这些,可以使用Git最简单的保存功能,后面我们将会讲解③④⑤⑥从左到右,以及从右往左的变化,这样就基本可以使用Git中级功能了,学会分支了以后,就相当于Git的高级功能已经学会了,至于究极功能,请研究手册和源代码,对于工具使用者,学到高级就够了,专业人员请去看源代码,和设计哲学。
(今天就写到这,下次继续2016年6月29日晚)
#3:Git的分支
##master
##dev(开发)
##debug(修复漏洞)
##zhang3,zhao4,lining,guangkun...
#4:总结
Git入门学习和使用的更多相关文章
- git入门学习(二):新建分支/上传代码/删除分支
一.git新建分支,上传代码到新的不同分支 我要实现的效果,即是多个内容的平行分支:这样做的主要目的是方便统一管理属于同一个内容的不同的项目,互不干扰.如图所示: 前提是我的github上已经有we ...
- git入门学习(一):github for windows上传本地项目到github
Git是目前最先进的分布式版本控制系统,作为一个程序员,我们需要掌握其用法.Github发布了Github for Windows 则大大降低了学习成本和使用难度,他甚至比SVN都简单. 一.首先在g ...
- git入门学习
初步学习笔记. 1.创建仓库:git init 仓库:个人理解为文件存放及版本追踪的容器,对应着一个目录,目录中包含用户的文件及git用来追踪文件版本的一系列文件. 新建并进入HelloWorld目录 ...
- git 入门学习
1. 分享一个我自己的百度网盘地址 链接:https://pan.baidu.com/s/17W7gpJNbqgBFy7VOl6-dvw 提取码:2a7t 2.安装就不说了,基本全默认就OK.安装完城 ...
- Git入门学习总结
用了两天时间看完廖雪峰老师的git教程(http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b0 ...
- Git入门学习和应用笔记
>>关于Git 1.BitMover公司收回Linux社区的BitKeeper免费使用权,Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git.2.什么是集中式版本控制系 ...
- git 入门学习笔记
安装msysgit (模拟环境Git)安装后绑定邮箱和名字$ git config --global user.name "Your Name"$ git config --glo ...
- 1.Linux下Git入门学习
1.在Linux下安装git软件,使用以下命令: yum install git 2.设置用户名和邮箱(必须): git config --global user.name "Your Na ...
- 码云配合git入门命令总结学习
目录 码云配合git入门命令总结学习 基本设置 基本命令总结学习 准备工作以及基本思路 基本命令 码云搭建仓库步骤 准备前工作 具体操作方法 远程仓库基本命令 标签相关命令 所有命令总结 基本命令总结 ...
随机推荐
- Jmeter之Dummy Sampler
Dummy Sampler(Dummy取样器) Dummy Sampler就像是一个模拟器,需要自己填入请求和响应的信息.(原理类似mock服务) 在没有服务的情况下,测试人员依据Dummy Samp ...
- 区间问题 codeforces 422c+hiho区间求差问
先给出一个经典的区间处理方法 对每个区间 我们对其起点用绿色标识 终点用蓝色标识 然后把所有的点离散在一个坐标轴上 如下图 这样做有什么意义呢.由于我们的区间可以离散的放在一条轴上面那么我们在枚举区 ...
- C#面向对象17 23种设计模式
1.简单工厂模式 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- No compiler is provided in this environment. Perhaps you are running on a JR
maven编译项目时出错,提示信息如下: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3 ...
- windows服务总结
一.创建windows服务项目创建完成后结构,如: 其中,Program.cs代码: using System; using System.Collections.Generic; using Sys ...
- ES6入门二:默认值与默认值表达式
默认值 默认值表达式 需要注意的是,这种默认值和默认表达式在IE的最新版本中仍然没有得到兼容,只能通过编译转码的方式降级到ES5使用. 一.默认值 在函数声明时可以给形参赋默认值,当调用函数时不传入或 ...
- 使用svn遇到的问题---(在编辑器没有配置svn的前提下)
日常写代码的过程中新增了文件,一般都是继续文件的书写,写完一部分后提交 新增文件后面经常忘记了add后commit 原来是可以在commit时勾选左下角的 [show unversioned file ...
- Nginx作为代理服务之正反代理
Nginx作为代理服务之正反代理 首先什么是代理,就跟明星的经纪人类似,比如作为苍老师经纪人的我,如果你们需要和苍老师拍小电影,可以跟我这个经纪人来商量比如价格啊,时间等相关信息,那么我就作为一个代理 ...
- 4.ID主键生成策略
保证唯一性(auto_increment) 一.xml方式 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...
- sql语句 小记录
select Name '姓名',Age '年龄',(select LessonName + ',' from Lesson where StudentId=s1.Id FOR XML PATH('' ...