Git基础
内容学习自廖雪峰的Git教程
Git基础
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了。
git安装
-
Windows
去官网下载,选择安装路径,默认安装即可 Git官网下载
-
Lunix
- 通常输入git可以查看如否安装,如果没有安装,会提示你安装的命令
- 如果是Ubuntu或Debain可以通过
sudo apt-get install git
即可安装 - 如果是其他版本的Linux,可以采用去官网下载源码,然后解压,依次输入:
./config
,make
,sudo make install
这几个命令安装就好了
-
Mac
在Appstore中下载Xcode这个IDE,这是苹果系统最好的IDE,开发人员一定会下载的那种,Xcode中集成了Git,不过没有默认安装,需要运行Xcode,在Preferences中找到Downloads,选择Command Line Tools,点击install即可
基本应用
创建版本库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
-
选择一个合适的地方,创建一个空目录
mkdir GitHubRepository cd GitHubRepository pwd #显示当前目录
注:为了避免莫名其妙的问题,建议目录(包括父目录)使用英文
-
通过
git init
命令把此目录变成Git管理的仓库git init
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个
.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。 -
把文件添加到版本库
首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。
因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。
- 编写一个
about.txt
文件,内容如下
我是程序员应如是 Git is a version control system
- 使用
git add
命令,把文件添加到仓库
git add about.txt
注:LF和CRLF是两种换行方式,对于这次学习Git没影响
- 使用
git commit
命令,把文件提交到仓库
git commit -m "This is a message about me" # -m 后面的是本次提交的说明信息,最好写的有意义,帮助别人了解此次改动的信息
- 使用
git status
查看结果
git status
注:
git add <file>
可以添加多个文件,反复使用;git commit -m <message>
可以一次提交多个文件 - 编写一个
时光穿梭(版本)
-
现在模仿日常工作,要对项目进行修改,我们修改
about.txt
文件,添加如下信息Git is a free software.
再使用
git status
查看结果通过
git status
命令,我们可以时刻掌握仓库当前的状态,上面的命令输出告诉我们,文件被修改了,但是还没有提交修改- 使用
git diff
命令查看具体修改的内容
git diff about.txt
- 再分别使用
git add;git commit;git status
命令查看状态
git add about.txt git status #查看此时的状态 git commit -m "Add a message" git status #再查看此时的状态
- 使用
-
版本回退
- 使用
git log
命令查看文件的版本
git log
git log
命令显示从最近到最远的提交日志如果嫌输出信息太多,可以加上
--pretty=oneline
参数git log --pretty=oneline
需要友情提示的是,你看到的一大串类似
4b4258ee...
的是commit id
(版本号),和SVN不一样,Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id
和我的肯定不一样,以你自己的为准。为什么commit id
需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。- 版本回退
在Git中,用
HEAD
表示当前版本,也就是最新的提交1094adb...
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。#回到上一个版本 git reset --hard HEAD^
我们已经乘坐时光机回去了
- 想再回来
如果想要再回来,就必须知道
commit id
,如果不记得了,git提供了后悔药git refolg # 记录你的每一次命令 git reset --hard 4b4258e cat about.txt
诶嘿,我胡汉三又回来了
注:版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
- 使用
-
工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
- 工作区(Working Directory)
就是你在电脑里能看到的目录,比如我的
LearnMysql
文件夹就是一个工作区- 版本库(Repository)
工作区有一个隐藏目录
.git
,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支
master
,以及指向master
的一个指针叫HEAD
。- 工作流程
第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。 -
管理修改
Git管理的是修改,当你用
git add
命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。- 可以用
git diff HEAD
命令查看工作区和版本库里面最新版本的区别
git diff HEAD --about.txt
- 可以用
-
撤销修改
当你在深夜加班修改项目时,不小心在项目里添加了如下
TMD,stupid boss
嗯,难受!这个月的奖金,嗯~
- 内容只在工作区,没有使用过
git add
git checkout -- about.txt
git checkout -- file
可以丢弃工作区的修改修改被删除了
注:
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout
命令。- 内容在暂存区,使用了
git add
命令,没使用git commit
命令
git reset HEAD about.txt #把文件从暂存区重新放回工作区
现在修改在工作区,可以使用上面的命令将工作区的修改删除
嗯,奖金总算保住了
- 如果脑子一热,使用了
git commit
命令,可以通过版本回退,回到上一个版本
- 内容只在工作区,没有使用过
-
删除文件
现在我们有一个没用的文件
test.txt
,想要删除,文件已经在版本库中首先我们先删除工作区的文件,可以图形化删除也可以使用命令
rm <file>
现在我们有两个选择
- 删除版本库中的文件
git rm test.txt #从版本库中删除文件 git commit -m "remove test.txt" #也可以使用git add test.txt 代替git rm test.txt 效果一样
- 删除了,从版本库中恢复文件
#git checkout 版本库里文件的版本替换工作区里文件的版本 git checkout -- test.txt
小提示:
-
git 提交信息
查看其他人提交的修改内容或自己的历史记录的时候,提交信息是需要用到的重要资料。所以请用心填写修改内容的提交信息,以方便别人理解。
以下是Git的标准注解:第1行:提交修改内容的摘要 第2行:空行 第3行以后:修改的理由
-
git更新
#查看版本 git --version #git版本是2.17.1之前 git update #git版本是2.17.1之后 git update-git-for-windows