前言:
一、git是什么?
事情是这样的,自2002年开始,林纳斯·托瓦兹决定使用BitKeeper作为Linux内核主要的版本控制系统用以维护代码。到了2005年,Linux内核开发团队的安德鲁·垂鸠写了一个简单程序,可以连接BitKeeper的存储库。这时BitKeeper著作权拥有者拉里·麦沃伊不高兴了,认为这事对BitKeeper内部使用的协议进行逆向工程,于是决定收回Linux内核开发团队无偿使用BitKeeper的许可。这点小事肯定难不倒大神林纳斯,仅仅10天之后,第一个git版本就写出来了。看到这里大家应该都知道git是一个版本控制管理系统了。对,Git就是一款开源的分布式版本控制系统(Distributed Version Control System)。
二、版本控制系统
上栗中因为他没有使用版本控制工具。如果使用Git做版本控制的话,只需在键盘上敲入几行命令就能找回方案A的代码,阿秃自然不用再通宵了。版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。运用版本控制系统,我们可以对代码进行版本管理,可以随时查看之前版本的内容,随时回溯到之前版本中。团队合作的时候也可以自动合并代码,而不需要用一个共享文件,或者是进行定期的备份。
三、集中式和分布式版本控制系统
版本控制系统目前来讲有两大控制系统:
集中式:svn
分布式:git
要理解SVN和Git的使用差别为什么那么大,最直接的办法是搞清楚集中式和分布式版本控制系统之间的差别。集中式版本控制系统有单一的集中管理服务器,保存所有文件的修订版本,所有的文件。客户端的电脑并不会保存历史版本,所以如果想查看历史版本,必须联网才能查看,并且如果集中管理的服务器出现故障,可能导致历史版本丢失,最多只能从本地的文件恢复到最后的版本。另外网速直接影响提交和下载文件的速度,很多时候很影响使用体验。
分布式版本控制系统没有集中管理的服务器,每个人的电脑都有一个完整的版本库,我们可以在本地进行修改提交,查看历史版本。这里很多人有个疑问,我们平时工作中,经常把代码推到“远程仓库”,这个“远程仓库”不就是集中式版本控制系统里面的集中管理服务器嘛?其实,这只是分布式版本控制系统里面的一个节点而已,这和你自己的电脑还有你同事阿秃的电脑一样,都是可以理解为其中一个节点。为了协作方便,我们都在这个“远程仓库”上面交换“修改”,所以容易给大家造成中央服务器的错觉。
四、基本概念
工作拷贝(工作目录):用于存放产品开发数据本地工作目录。
暂存区 (Index):用于存放待提交数据的缓存区。
本地仓库:远端库的一个完整的拷贝,包括所有文件的修改记录,分支等。
远程仓库:本地仓库clone来源。
快照(snapshot):版本库某个时间点所有文件集合。
全球版本号(commitID):Git库的版本号是通过SHA-1算法根据库中的所有内容计算出一个40位的哈希值,这个哈希值是全球唯一的,基本只要前六位就可以唯一标识了。
五、理解修改文件在Git的流动
我们所有修改都是在工作目录进行的,修改完以后需要先添加到暂存区,然后再提交到本地仓库。提交完以后会产生commitID,标识当次提交。在之后的操作中,可以通过commitID回滚到某次提交状态。最后,我们还需要把本地的仓库的提交记录推送到远程仓库。
六、基本操作
git config --global user.name "herion"
配置全局用户名
执行命令,如果没有任何反应,代表命令执行成功
git config --global user.email "herion@163.com
配置用户邮箱
执行命令,如果没有任何反应,代表命令执行成功
git config --list
查看配置的用户信息
git config user.name "herion"
配置本项目的用户名
git config user.eamil "herion@163.com
配置本项目的邮箱
在当前项目下面查看的配置是全局配置+当前项目的配置, 使用的时候会优先使用当前项目的配置
git init
git初始化本地仓库
git clone 仓库地址
克隆远程仓库到本地,即“复制”远程仓库到本地
git add 文件名
将单个文件添加到暂存区
git add .
将所有的文件添加到暂存区
git commit -m ‘提交信息'
提交更改到当前分支,后面的是提交日志
git status
查看当前git的状态,例如文件是否更改
untracked files
显示未跟踪的文件,即未加入版本控制的文件
git branch
git branch 分支名称
git checkout 分支名称
git log
git pull <远程主机名> <远程分支名>:<本地分支名>
git push <远程主机名> <本地分支名>:<远程分支名>
将分支合并到当前分支
git merge <分支名称>
git branch -d <分支名称>
git push <远程主机名> --delete <BranchName>