Git是什么?
Git是一款开源的分布式版本控制系统(Distributed version Control System)。
什么是版本控制?为什么需要?
如果你是一个RD,那就应该知道,码农最讨厌的合作伙伴就是产品经理,因为他们总是三天两头的改变主意,不珍惜码农们的辛苦付出。举个例子,产品经理提出一个新需求,码农Lucy通宵达旦,辛苦奋战几晚,终于用方案A完美实现,本想高兴的找产品经理验收,可是产品经理看后,不仅不满意,还痛骂Lucy一顿,什么狗屎,让其该方案。于是Lucy回来愤然删掉A方案,转而实现了B方案,然后等产品经理过目后,后者突然说,我突然觉得A方案更合理,改回A吧... … 此时Lucy脑子里肯定是一万个...也会后悔为什么那么..竟然把A删掉了。
那么问题来了,如果之前lucy使用了版本管理控制,只需要几行命令就可以找回A方案了。
好了,进入正题,版本控制,就是这样一个机制,对程序代码,配置文件以及说明文档的变更历史进行管理和记录,实现随时查看,随时回退到某个版本。
什么是分布式版本控制?
说到分布式,自然有与其相对应的集中式。两者分别以Git和SVN为代表。
集中式版本控制,特点是有单一的集中管理服务器,保存所有文件的修订版本,所有的文件。客户端的电脑并不会保存历史版本,所以想查阅某个历史版本,必须联网到服务器,才可以查阅。这样会受网速的影响,以及担负服务器故障的风险;
与之相比,分布式版本控制,则没有集中管理的服务器,每个人的电脑都有一个完整的版本库,我们可以在本地修改,提交,查阅历史版本。
用过Git的人,这时可能会有一个疑问了,我们修改code后,会需要把code push到远程仓库,这个远程仓库是不是集中管理的服务器呢?No,其实这只是分布式控制管理系统的一个节点而已,为了协作方便,团队合作,我们都需要在这个远程仓库上面进行交换各自的“修改”而已,轻松实现‘’改动‘’共享。
基本概念
工作目录(工作copy):用于存放数据的本地工作目录;
暂存区(Index):用于存放待提交数据的缓存区;
本地仓库:远端库的一个完整拷贝。包括所有文件的修改记录,分支信息等。
远程仓库:本地仓库clone的来源;
快照(snapshot):版本库某个时间点所有文件的集合
全球版本号(commitID):Git库的版本号,是通过SHA-1算法根据库中的所有内容计算出来的一个40位的哈希值,这个哈希值是全球唯一的,基本只需要前6位就可以唯一标识了。
Git修改文件的流动
首先,我们所有的修改都是在工作目录中进行的,修改完以后首先需要添加到暂存区,然后再提交到本地仓库。提交完成以后会产生唯一的CommitID,标识当次提交。在之后的操作中,可以通过commitID实现回滚到某次提交状态。最后,我们需要将本地仓库的提交记录推送到远程仓库,实现分享协作。
基本操作:
- 仓库初始化,一版两种方式
一是,直接在当前目录初始化,命令:
git init
二是,从远程仓库clone,命令:
git clone <中心库名称地址> <本地工作目录名称>
2. 添加文件到暂存区
实际工作中,我们初始化仓库后,就会修改 or 添加 or 删除仓库里的文件,当我们完成修改后,我们需要将这些改动, 添加到暂存区,命令如下
Git add <文件名> //添加某个文件
Git add –A or git add . //添加所有文件
3. 提交到本地仓库
命令:
Git commit –m ‘’提交信息”
4. 更新本地分支
1) 在将本地仓库的提交记录(commitID)push到远程仓库之前,最好先pull远程仓库对应的“追踪分支”的更新,命令:
Git pull <远程主机名> <远程分支名>:<本地分支名>
作用是,拉远程主机某个分支的更新,并与本地的指定分支合并,很多时候,代码冲突是需要这个时候解决的。其实, 远程分支和本地分支之间可以建立一种追踪关系(tracking),在使用git clone初始化的时候,所有本地得知默认与远程仓 库的 同名分支建立追踪关系。例如,本地的master自动追踪origin/master分支;
其中,origin一般指原始仓库地址的别名
2) 另外,也可以手动建立这种分支追踪,命令
Git branch –track <本地分支> <远程分支>
如果已经建立了追踪关系,在pull时就可以省略远程分支名,直接
Git pull origin
如果当前分支只有一个追踪分支,那么别名也可以省略,直接
Git pull
5. 本地仓库提交记录推送到远程仓库
为了实现团队协作,我们的改动需要推到远程仓库,以与团队其他成员合并,命令
Git push <远程主机名> <本地分支名>:<远程分支名>
和git pull一样,如果远程分支和本地分支之间已经建立追踪关系,可以省略远程分支名
Git push <远程主机名> <本地分支名>
这里需要注意,如果省略的是本地分支名,就相当于把一个空的分支推到了远程分支,这个操作就相当于删除远程分支
Git push <远程主机名> <远程分支名>
Git push <远程主机名> --delete <远程分支名>
6. 查看提交历史
Git log
7. 代码回滚
有两种方式:git revert或者git reset
1) Git revert是提交回滚,即忽略指定的版本,然后提交一个新的版本,新的版本中会删除指定的版本。注意:revert 是会产生一次新的提交的
Git revert <commitID>
2)Git reset的作用是重置到指定的版本,通常是配合一些参数使用
(1)默认是--soft,所有commit都会退回到git缓冲区
(2)--hard,则是将所有的commit的修改直接丢弃
Example:
Git reset --hard HEAD^ //会退到上个版本
Git reset --hard <commitID> //回退or前进到指定commitID
3) 人生总是无常的,有时候你回滚玩代码,可能有后悔了,又想回滚到之前的版本,怎么办? Git reflog可以帮助你。 你用git reflog打印你的每一次操作,找到你的操作id,就可以轻松回滚之前的版本了,步骤如下:
Git reflog //查看你回滚操作,找回回滚操作的commitID
Git reset –hard <commitID> //回退到指定的回滚版本
希望以上的总结,能对你认识和使用Git有所帮助。