1 git是什么
官方说法:Git是一个开源的分布式版本控制系统。用于敏捷高效地处理任何或小或大的项目。
说白了,git就是帮助我们管理项目的一个工具。他的核心作用只有两点:
版本控制:当我们每向git提交一版代码,git会为我们自动保存这一版代码,当我们开发的时候写崩了某个部分而找不到解决办法时,就可以回滚到上一个版本。
多人协作:当有两个人开发同一个项目时,我今天写了一点,他也写了一点,那第二天我们两的代码不一致了,怎么办。git会告诉我们,当我们每天完成开发之后,将本地的代码上传到git服务器上面,第二天每个人只需要重新拉取一下远程代码,它不仅会将目前git服务器上最新的代码同步到本地,还不会覆盖本地已经修改的部分。
现在已经明白了git是什么,以及他最大的用处。我们还需要了解几个关键定义:
工作区(workspace):通俗来讲,就是本地一个项目的那个文件夹,就是工作区;
暂存区(staging area):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。版本库中最重要的就是暂存区,我们可以把修改之后的代码存在暂存区。
本地仓库(local repository):本地仓库就是一个本地的代码仓库,它的功能与远程仓库没有区别,是在本地存储代码的一个仓库。那么暂存区和本地仓库都是储存代码的,有什么区别呢。
首先,暂存区只是储存了修改过的代码,本地仓库存储了每一个版本的全部代码。你可以理解为需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改;
其次,本地仓库有所有的分支信息,也就是说在本地仓库整个项目的结构,以及仓库的开发结构是完整的,而暂存区只是将修改之后的文件散列的放在了一个地方。
远程仓库(remote repository):远程仓库就是我们一般所指的仓库,我们在开发中的代码基本上都要推送到远程仓库中,以防丢失。
2 git多人开发指南
2.1 创建git仓库
由项目管理员新建一个git远程仓库,此仓库是储存在远程服务器的,我们使用它的地址就可以进行访问。
git init
2.2 从远程仓库克隆到本地
在git远程仓库我们一般是不做开发的,而是先把此项目克隆到本地。
git clone <url>
当克隆到本地之后,我们就可以在本地此文件中进行开发了。
2.3 推送最新代码到服务器
当我们在本地完成开发之后,我们需要把代码推送到远程仓库中,让此项目别的开发者能够直接看到和使用你的代码。
git status //用于查看在你上次提交之后是否有对文件进行再次修改。
git add [file] //此命令用于添加一个修改之后的文件到暂存区
git commit [file] -m [comment] //此命令用于将暂存区的文件提交本地的仓库中,可以使用-m后面做一些修改的备注
git push //用于从将本地的分支版本上传到远程并合并
我们可以使用以上代码将本地修改之后的文件传入远程服务器。
2.4 拉取远程最新代码到本地
现在,程序员小赵已经将自己开发的最新代码放到了远程服务器上面,程序员小民也在同一个仓库进行开发,如果小民一直不从仓库拉去新代码,而一直在本地开发,时间长了之后再将代码上传到仓库中,会出现很多问题,比如命名冲突等,所以我们在开发过程中需要经常拉取最新的代码到本地,保持在最新代码的基础上进行开发。
git remote -v //此命令用于查看远程仓库主机地址及其名称
git pull <远程主机名> <远程分支名>:<本地分支名> //此命令用于将远程分支的最新代码拉取并合并到本地分支,分支后文解释
我们可以使用上面的代码将远程仓库最新的代码同步到本地,并在最新代码的基础上进行开发。
2.5 重置撤销
现在,你学会了提交代码。但是,git作为一个版本控制工具,当然还能支持我们撤销之前的提交。撤销可分为以下几个种类:
撤销工作区更改的文件:我们当然可以使用Command+Z一直撤销到上一次提交的位置,但是如果修改的太多,甚至超出了电脑本身的缓存步数,那么Command+Z显然是不太好用。但如果我们采用直接拉上一个版本的代码覆盖本地代码,会导致修改的其他文件都被覆盖。所以,git为我们提供的专门的命令来完成对工作区文件的修改撤销。
git checkout -- <filepath> //此命令用于撤销工作区某个文件的修改
撤销上传到暂存区:前面我们已经讲过,可以通过git add命令将工作区的文件添加到暂存区,git也为我们提供了把暂存区的某个文件重置为修改未暂存状态的命令:
git reset HEAD <file> //此命令用于撤销暂存区文件
撤销commit:加入我们已经将暂存区的文件commit到了本地仓库,现在我们想撤销这次操作,那么我们可以使用以下的命令:
git reset --soft HEAD^ //此命令用于撤销某次commit
撤销push:前面我们已经讲过,远程仓库和本地仓库没有实质的区别,只是一个是远程仓库,一个是本地仓库,所以当我们push到了某个版本的代码到远程仓库想要撤销时,也是使用git reset命令。
现在我们已经明白了好几个撤销操作,但是我们发现,大多数的撤销操作都是用git reset命令来实现的,这么神奇的命令当然要解析一波。
在我们理解git reset之前,我们首先要弄清楚,git管理项目的方法。git作为管理工具,实际上它是管理了三颗文件树:
一颗是HEAD,它是当前分支引用的指针,它的作用为上一次提交的快照,下一次提交的父结点;
一棵是Index,它用于预期的下一次提交的快照,也就是我们前面提到暂存区;
一颗是Working Directory,它是本地工作区的文件树,称为沙盒。
经典的 Git 工作流程是通过操纵这三个区域来以更加连续的状态记录项目快照的。
现在,让我们来撸一遍提交的整个流程:
**初始化仓库:**假设我们进入到一个新目录,其中有一个文件file.txt。我们称其为该文件的 v1 版本,将它标记为蓝色。现在运行 git init,这会创建一个Git仓库,其中的HEAD引用指向未创建的master分支。那么此时,只有我们暂存区有此文件,而此时git仓库的状态为,没有任何文件。此时我们运行git status命令,显示有Untracked files,提示使用git add命令提交到暂存区。


现在我们运行git