Git是一款免费、开源的分布式 版本控制系统 ,用于敏捷高效地处理任何或小或大的项目。
这里推荐使用GIT的项目管理工具soucetree等,当然已经深入了解的可以使用git命令行直接操作。
Git初始化,一般代码仓库会自动生成。会在该仓库生成一个.git隐藏文件夹,不能修改该文件夹下的任何内容。
Git仓库分为三个区:工作区、暂存区、仓库区
工作区:日常我们编写代码的地方,一般是本地工作的目录就叫工作区。
暂存区:暂时存储的区域,在git中,代码不会直接从工作区提交到仓库区,而是需要先从工作区提交到暂存区,然后才能从暂存区推送到仓库区。暂存区的目的是避免误操作。
仓库区:一般是远程仓库(如GitHub、码云-开源中国等,远程仓库本质本地仓库拓展而成的,所以也可以自己搭建),也有少部分是本地仓库。将保存在暂存区域的内容推送存储到 Git 仓库中,同时生成版本号可以在版本节点添加标签备注信息。对于仓库的版本节点我们可以任意切回滚到指定节点的代码状态。
Git的常见操作:
克隆(clone):从远程仓库URL加载创建一个与远程仓库一样的本地仓库
标签:仓库中每个节点的备注信息,一个分支可以有多个标签。
文件忽视:忽视某个文件的修改,往往用于配置文件,一般在仓库的根目录下的.gitignore中,改文件中存储忽视文件的路径(文件的修改不会被添加,文件未被删除)。
丢弃:本地文件中修改(添加)的东西会删除,注意不是文件 。
移除:直接删除本地文件。(可以通过拉取获得git服务上的该文件)
提交:把修改的内容提交到暂存区,暂存区内在下一次推送前可进行多次提交,每次提交都需要附加一个标签信息,以区别或者记录这次提交的内容。
添加(add):添加文件到缓存区
暂存(git stash):保存工作现场
拉取:把仓库中所在节点分支的最新信息拉取到暂存区
推送:把暂存区的内容推送到所在的节点分支,并成为该节点分支的最新节点。
回滚:回滚一次提交。
分支(branch):创建/修改/删除分枝
检出(checkout):切换不同分支
变基:在有同一父节点的分支基础上,将提交到某一分支上的所有修改都移至另一分支上,并在当前分支上创建一个新的下一次的节点。
查看历史:查看仓库的分支节点的提交信息。
工作流(Git Flow):团队工作时,每个人创建属于自己的分枝(branch),确定无误后提交到master分枝
Git分支的使用和说明。
举个分支使用例子。假如你有一项任务。给你2箱水,一箱可乐和一箱雪碧,现在你需要把这2箱水搬到地点B并放入仓库记录。但是一个人只能搬动一箱水。那我们就可以指派一个人搬雪碧到地点B,列为分支①;指派另外一个人搬可乐到地点A,列为分支②。在他们搬的过程可能有很多种,可能会耗时、或者磕磕绊绊、又或者绕路等等,当最终2个人都把水搬到地点B的时候,这2个人的任务就结束了,我们需要搬到可乐和雪碧放入仓库记录完成最终结果,这就相当于分支操作中我们把分支①和分支②的结果合并了。
从上面的举例可以看出。分支的好处在于,当我们有一个多任务并发进行的需求时或者多人合作开发时,可以使这些任务或者开发者互不干扰的进行各自的工作,达到最终的目的后再合并各自的结果,从而达到最终目的。当然这里讲的比较简单,合并过程中可能会出现的一些不可避免的如代码冲突等,这些是需要人为解决的。
一般我们会把分支分为主分支和其他分支。其他分支上的任务最终使用会合操作合并并到主分支上。在平时的开发使用过程中,我们需要了解到自己所处的分支属于哪个分支,任务目的是什么,避免分支过多引起的误操作。
单一分支的使用和说明。
上面我们说了多分支的情况,现在我们来讲一下单一分支的操作和使用。在实际的开发使用中我们常常也会遇到这样的需求。同一项任务几个人一起开发,因为周期过短,内容也比较简单,这个时候我们再使用分支的话就会比较繁琐。因为如果遇到一个任务我们就使用分支的话,会使整个项目到处都充满分支,看起来比较乱,维护和迭代也会比较慢。所以大多数的情况下我们也会在单一分支上操作。
在单一分支上多个开发者怎么同时操作呢。除了之前的提交和推送,我们引入拉取这个操作。同样我们举个例子。我们把每个开发者看做在同一个公司的会计。当一个会计完成了手中的财务工作过后,我们需要重新核对整理公司的账目,这个时候我们在提交自己工作之前,就需要拉取更新实时的公司账目信息,看时候跟你做这项工作之前一致,如果不一致,我们就需要拉取最新的公司账目信息,并整理核对自己提交的这项工作到最新的公司账目信息中,其中可能会有修改可能也没有。整理完之后我们在最终推送到公司账目信息中。
这里操作可以简单的分为以下几步:提交(完成你的工作)→拉取(获得项目的最新信息和状态)→合并(把你完成的工作合并到项目的最新信息和状态中)→推送(把你合并后的最新项目信息更新到仓库中,此时你更新的节点就是你所处分支的最新节点)。
切换分支和删除分支。
切换分支,由于项目需求我们常常可能会遇到在某个已经迭代的版本上增加新的需求迭代,这个时候我们就需要切换到那个分支上再进行操作。注意我们在切换到任意分支之前,我们需要保证自己所处分支的修改内容已经提交到仓库中,否则一旦切换过去,你之前的修改内容将不会再有保存。这里可以把切换分支看成是一种覆盖的表现。
删除分支,删除分支的时候需要区别删除本地分支和远程分支,一旦删除,将清除分支节点的所有信息。一般很少会有删除分支操作。如果一个分支被废弃时,我们需要删除分支,在彻底删除一个分支时,需要三个步骤删除①本地分支②删除远程分支③删除本地追踪分支。如果执行了①②③,那么删除的分支就不可恢复了。删除本地可以通过远程恢复本地,删除远程可以通过本地恢复远程。
Git回滚和重置
所处状态的基本定义
HEAD(头)
HEAD 是当前分支引用的指针,它总是指向该分支上的最后一次提交。 这表示 HEAD 将是下一次提交的父结点。 通常,理解 HEAD 的最简方式,就是将它看做 你的上一次提交 的快照,可以看做是一个提交节点。远程仓库就是这些节点连成的。
Index (索引)
也可以被认为是staging area(暂存区),是一堆将在下一次commit中提交的文件,提交之后,它就是HEAD的父节点(git add添加的文件)
working copy (工作副本)
当前工作目录下的文件(一般指,有修改,没有git add,没有git commit的文件)
回滚是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容
重置是把HEAD向后移动了一下,即版本退回。重置有一下几个操作。
git reset hard(强行合并):此次提交之后的修改不做任何保留,干净的工作区。
git reset soft(软合并): 此次提交之后的修改会被退回到暂存区。
git reset mixed(混合合并):此次提交之后的修改会被退回到未暂存区。