git学习.docx
- 文档编号:27739648
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:79
- 大小:505.12KB
git学习.docx
《git学习.docx》由会员分享,可在线阅读,更多相关《git学习.docx(79页珍藏版)》请在冰豆网上搜索。
git学习
目录
Git教程2
Git简介2
Git的诞生4
集中式vs分布式5
安装Git7
在Linux上安装Git7
在MacOSX上安装Git7
在Windows上安装Git8
创建版本库9
时光机穿梭12
版本回退14
工作区和暂存区18
管理修改21
撤销修改23
删除文件26
远程仓库28
添加远程库30
从远程库克隆32
分支管理34
创建与合并分支35
解决冲突39
分支管理策略43
Bug分支45
Feature分支48
多人协作50
标签管理54
创建标签55
操作标签58
使用GitHub59
自定义Git60
忽略特殊文件61
配置别名63
搭建Git服务器65
期末总结67
Git教程
史上最浅显易懂的Git教程!
为什么要编写这个教程?
因为我在学习Git的过程中,买过书,也在网上Google了一堆Git相关的文章和教程,但令人失望的是,这些教程不是难得令人发指,就是简单得一笔带过,或者,只支离破碎地介绍Git的某几个命令,还有直接从Git手册粘贴帮助文档的,总之,初学者很难找到一个由浅入深,学完后能立刻上手的Git教程。
既然号称史上最浅显易懂的Git教程,那这个教程有什么让你怦然心动的特点呢?
首先,本教程绝对面向初学者,没有接触过版本控制概念的读者也可以轻松入门,不必担心起步难度;
其次,本教程实用性超强,边学边练,一点也不觉得枯燥。
而且,你所学的Git命令是“充分且必要”的,掌握了这些东西,你就可以通过Git轻松地完成你的工作。
文字+图片还看不明白?
有视频!
!
!
本教程只会让你成为Git用户,不会让你成为Git专家。
很多Git命令只有那些专家才明白(事实上我也不明白,因为我不是Git专家),但我保证这些命令可能你一辈子都不会用到。
既然Git是一个工具,就没必要把时间浪费在那些“高级”但几乎永远不会用到的命令上。
一旦你真的非用不可了,到时候再自行Google或者请教专家也未迟。
如果你是一个开发人员,想用上这个世界上目前最先进的分布式版本控制系统,那么,赶快开始学习吧!
关于作者
廖雪峰,十年软件开发经验,业余产品经理,精通Java/Python/Ruby/VisualBasic/ObjectiveC等,对开源框架有深入研究,著有《Spring2.0核心技术与最佳实践》一书,多个业余开源项目托管在GitHub,欢迎微博交流:
Git简介
Git是什么?
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
Git有什么特点?
简单来说就是:
高端大气上档次!
那什么是版本控制系统?
如果你用MicrosoftWord写过长篇大论,那你一定有这样的经历:
想删除一个段落,又怕将来想恢复找不回来怎么办?
有办法,先把当前文件“另存为……”一个新的Word文件,再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的Word文档变成了这样:
过了一周,你想找回被删除的文字,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦。
看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。
更要命的是,有些部分需要你的财务同事帮助填写,于是你把文件Copy到U盘里给她(也可能通过Email发送一份给她),然后,你继续修改Word文件。
一天后,同事再把Word文件传给你,此时,你必须想想,发给她之后到你收到她的文件期间,你作了哪些改动,得把你的改动和她的部分合并,真困难。
于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。
如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?
这个软件用起来就应该像这个样子,能记录每次文件的改动:
版本
用户
说明
日期
1
张三
删除了软件服务条款5
7/1210:
38
2
张三
增加了License人数限制
7/1218:
09
3
李四
财务部门调整了合同金额
7/139:
51
4
张三
延长了免费升级周期
7/1415:
17
这样,你就结束了手动管理多个“版本”的史前时代,进入到版本控制的20世纪。
Git的诞生
很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。
Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?
事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!
你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?
不是有CVS、SVN这些免费的版本控制系统吗?
因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。
有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。
不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。
开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!
),于是BitMover公司怒了,要收回Linux社区的免费使用权。
Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。
实际情况是这样的:
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!
一个月之内,Linux系统的源码已经由Git管理了!
牛是怎么定义的呢?
大家可以体会一下。
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。
集中式vs分布式
Linus一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?
先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
那分布式版本控制系统与集中式版本控制系统有何不同呢?
首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。
既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?
比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。
而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。
因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
当然,Git的优势不单是不必联网这么简单,后面我们还会看到Git极其强大的分支管理,把SVN等远远抛在了后面。
CVS作为最早的开源而且免费的集中式版本控制系统,直到现在还有不少人在用。
由于CVS自身设计的问题,会造成提交文件不完整,版本库莫名其妙损坏的情况。
同样是开源而且免费的SVN修正了CVS的一些稳定性问题,是目前用得最多的集中式版本库控制系统。
除了免费的外,还有收费的集中式版本控制系统,比如IBM的ClearCase(以前是Rational公司的,被IBM收购了),特点是安装比Windows还大,运行比蜗牛还慢,能用ClearCase的一般是世界500强,他们有个共同的特点是财大气粗,或者人傻钱多。
微软自己也有一个集中式版本控制系统叫VSS,集成在VisualStudio中。
由于其反人类的设计,连微软自己都不好意思用了。
分布式版本控制系统除了Git以及促使Git诞生的BitKeeper外,还有类似Git的Mercurial和Bazaar等。
这些分布式版本控制系统各有特点,但最快、最简单也最流行的依然是Git!
安装Git
最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。
不过,慢慢地有人把它移植到了Windows上。
现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。
要使用Git,第一步当然是安装Git了。
根据你当前使用的平台来阅读下面的文字:
在Linux上安装Git
首先,你可以试着输入git,看看系统有没有安装Git:
$git
Theprogram'git'iscurrentlynotinstalled.Youcaninstallitbytyping:
sudoapt-getinstallgit
像上面的命令,有很多Linux会友好地告诉你Git没有安装,还会告诉你如何安装Git。
如果你碰巧用Debian或UbuntuLinux,通过一条“sudoapt-getinstallgit”就可以直接完成Git的安装,非常简单。
老一点的Debian或UbuntuLinux,要把命令改为“sudoapt-getinstallgit-core”,因为以前有个软件也叫GIT(GNUInteractiveTools),结果Git就只能叫git-core了。
由于Git名气实在太大,后来就把GNUInteractiveTools改成gnuit,git-core正式改为git。
如果是其他Linux版本,可以直接通过源码安装。
先从Git官网下载源码,然后解压,依次输入:
./config,make,sudomakeinstall这几个命令安装就好了。
在MacOSX上安装Git
如果你正在使用Mac做开发,有两种安装Git的方法。
一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:
http:
//brew.sh/。
第二种方法更简单,也是推荐的方法,就是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“CommandLineTools”,点“Install”就可以完成安装了。
Xcode是Apple官方IDE,功能非常强大,是开发Mac和iOSApp的必选装备,而且是免费的!
在Windows上安装Git
实话实说,Windows是最烂的开发平台,如果不是开发Windows游戏或者在IE里调试页面,一般不推荐用Windows。
不过,既然已经上了微软的贼船,也是有办法安装Git的。
Windows下要使用很多Linux/Unix的工具时,需要Cygwin这样的模拟环境,Git也一样。
Cygwin的安装和配置都比较复杂,就不建议你折腾了。
不过,有高人已经把模拟环境和Git都打包好了,名叫msysgit,只需要下载一个单独的exe安装程序,其他什么也不用装,绝对好用。
msysgit是Windows版的Git,从http:
//msysgit.github.io/下载,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“GitBash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
$gitconfig--globaluser.name"YourName"
$gitconfig--globaluser.email"email@"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:
你的名字和Email地址。
你也许会担心,如果有人故意冒充别人怎么办?
这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意gitconfig命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
创建版本库
什么是版本库呢?
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
$mkdirlearngit
$cdlearngit
$pwd
/Users/michael/learngit
pwd命令用于显示当前目录。
在我的Mac上,这个仓库位于/Users/michael/learngit。
如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。
第二步,通过gitinit命令把这个目录变成Git可以管理的仓库:
$gitinit
InitializedemptyGitrepositoryin/Users/michael/learngit/.git/
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(emptyGitrepository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
也不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的。
不过,不建议你使用自己正在开发的公司项目来学习Git,否则造成的一切后果概不负责。
把文件添加到版本库
首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。
版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。
而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。
因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。
使用Windows的童鞋要特别注意:
千万不要使用Windows自带的记事本编辑任何文本文件。
原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?
”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。
建议你下载Notepad++代替记事本,不但功能强大,而且免费!
记得把Notepad++的默认编码设置为UTF-8withoutBOM即可:
言归正传,现在我们编写一个readme.txt文件,内容如下:
Gitisaversioncontrolsystem.
Gitisfreesoftware.
一定要放到learngit目录下(子目录也行),因为这是一个Git仓库,放到其他地方Git再厉害也找不到这个文件。
和把大象放到冰箱需要3步相比,把一个文件放到Git仓库只需要两步。
第一步,用命令gitadd告诉Git,把文件添加到仓库:
$gitaddreadme.txt
执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
第二步,用命令gitcommit告诉Git,把文件提交到仓库:
$gitcommit-m"wroteareadmefile"
[master(root-commit)cb926e7]wroteareadmefile
1filechanged,2insertions(+)
createmode100644readme.txt
简单解释一下gitcommit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
嫌麻烦不想输入-m"xxx"行不行?
确实有办法可以这么干,但是强烈不建议你这么干,因为输入说明对自己对别人阅读都很重要。
实在不想输入说明的童鞋请自行Google,我不告诉你这个参数。
gitcommit命令执行成功后会告诉你,1个文件被改动(我们新添加的readme.txt文件),插入了两行内容(readme.txt有两行内容)。
为什么Git添加文件需要add,commit一共两步呢?
因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$gitaddfile1.txt
$gitaddfile2.txt
$gitaddfile3.txt
$gitcommit-m"add3files."
小结
现在总结一下今天学的两点内容:
初始化一个Git仓库,使用gitinit命令。
添加文件到Git仓库,分两步:
∙第一步,使用命令gitadd ,注意,可反复多次使用,添加多个文件;
∙第二步,使用命令gitcommit,完成。
时光机穿梭
我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,改成如下内容:
Gitisadistributedversioncontrolsystem.
Gitisfreesoftware.
现在,运行gitstatus命令看看结果:
$gitstatus
#Onbranchmaster
#Changesnotstagedforcommit:
#(use"gitadd
#(use"gitcheckout--
#
#modified:
readme.txt
#
nochangesaddedtocommit(use"gitadd"and/or"gitcommit-a")
gitstatus命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。
比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用gitdiff这个命令看看:
$gitdiffreadme.txt
diff--gita/readme.txtb/readme.txt
index46d49bf..9247db6100644
---a/readme.txt
+++b/readme.txt
@@-1,2+1,2@@
-Gitisaversioncontrolsystem.
+Gitisadistributedversioncontrolsystem.
Gitisfreesoftware.
gitdiff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个“distributed”单词。
知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是gitadd:
$gitaddreadme.txt
同样没有任何输出。
在执行第二步gitcommit之前,我们再运行gitstatus看看当前仓库的状态:
$gitstatus
#Onbranchmaster
#Changestobecommitted:
#(use"gitresetHEAD
#
#modified:
readme.txt
#
gitstatus告诉我们,将要被提交的修改包括readme.txt,下一步,就可以放心地提交了:
$gitcommit-m"adddistributed"
[masterea34578]adddistributed
1filechanged,1insertion(+),1deletion(-)
提交后,我们再用gitstatus命令看看仓库的当前状态:
$gitstatus
#Onbranchmaster
nothingtocommit(workingdirectoryclean)
Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(workingdirectoryclean)的。
小结
∙要随时掌握工作区的状态,使用gitstatus命令。
∙如果gitstatus告诉你有文件被修改过,用gitdiff可以查看修改内容。
版本回退
现在,你
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- git 学习
