Git
版本控制系统演进历史
1. 本地版本控制系统(解决个人的版本管理)
最早时期,版本控制的解决方案一般都是将文件备份,并根据时间或者其他标志做备份。这种方式虽然简单方便,但是当文件数量增多,项目结构复杂的时候,就很容易出错。为了解决这个问题,就出现了VCSS,他可以保留所有文件的版本到简单数据库中。
比如,小说的多个修订版本。
2. 集中式版本控制(SVN)
一个系统不可能一个人员单独开发,个人的版本管理虽然得到了解决,但是当需要多名开发者之间合作市,个人版本控制管理工具就显得力不从心。为了解决这个问题,出现了集中式版本控制系统(CVCs),比如CVS、Subversion和Perfore。集中式版本控制系统中,分为服务端与客户端,所有文件的版本历史以及版本号(一个数字)存储到服务端中,也就是代码仓库。众多客户端从这个server上检出文件(只有文件版本,没有仓库的概念)。
集中式版本控制的主要缺点是中央服务器单点故障,Server的故障,有可能造成长时间代码无法提交、甚至是代码丢失、代码版本历史丢失的情况。
3. 分布式版本控制(Git)
针对集中式版本控制的缺点,演变了分布式版本控制(DVCSs),分布式版本控制不只是检查出文件的最新快照,还会将文件的历史版本完全克隆到本地中。如果远程服务器出现问题,任何客户机的仓库都可以克隆被分到远程仓库中。并且,当Server宕机时,完全不影响代码的commit、reset。
Git 与 SVN 的主要区别
Git是分布式版本控制系统、SVN是集中式版本控制系统
由于Git是分布式版本控制系统,拥有本地仓库,所以Git的大部分操作都可以在离线环境下完成,而SVN严重依赖中心仓库。
Git在存储文件历史时,存储的是完整的文件,而SVN存储的是文件中的差异。所以,Git可以reset文件到指定的版本,而SVN只能获取差异并重新提交。
Git 的分支功能使用更优雅
Git速度更快、效率更高
Git的本地结构
Git作为分布式版本控制系统,主要分为三个部分:
工作区:写的代码文件都存储在工作区中
暂存区:已经添加到版本控制中,但是暂未提交
本地库:每个客户端都是一个代码仓库,代码的修订历史
工作区代码通过 git add
命令讲代码提交到暂存区,暂存区通过命令git commit
提交代码到本地库。
本地库和远程库交互
远程库就是代码托管中心,常见的公共远程库有:Github、Gitee公共代码远程库,可以通过因特网访问的代码仓库。 大部分公司采用私有远程库:在内网环境下搭建Gitlab。
远程库可以让团队内部协同开发:
也可以通过fork和pull request完成跨团队合作:
安装Git
ubuntu:sudo apt-get install git-core
查看git版本
git --version
配置Git
根据邮箱、用户名区分提交人:
配置用户名:
git config --global user.name "杨顺翔"
配置邮箱:
git config --global usr.email "616510229@qq.com"
检查配置:去除上述命令双引号部分即可
本地库常用操作
git init 创建本地库
进入项目根目录 输入命令 git init
,即可创建代码仓库,用于存储代码的修订版本。仓库创建完成后,会在项目根目录下生成一个隐藏的.git
文件夹,这个文件夹用来记录本地所有的git操作。
git add 在工作区编写代码,并将代码提交到暂存区
使用add
命令将想要提交的代码添加到暂存区,比如git add src
,将现在所在的文件夹的src目录以及他的所有文件提交到git上。
git commit 将暂存区代码提交到本地库
git commit -m "First commit."
这样就将代码提交到了本地库中。
commit 命令的 -m 参数用来加上提交的描述信息,没有描述信息的提交是不合法的。
git status 查看本地库状态
刚刚创建好的本地仓库:
创建一个A.txt:
执行 git add ./A.txt,将其加入到暂存区,并且新建一个B.txt:
执行git commit -m "xx" 将代码提交到本地库:
git log 查看版本历史
查看当前仓库的提交历史git log
:
过多条数使用空格到下一页,按B返回上一页,按q退出
查看单个文件提交记录:
pretty展示:
online展示:
git reflog,展示指针当前历史版本,需要走的步数:
git reset 恢复代码到某一版本
--hard参数:
git reset --hard [索引]
,本地库指针移动时,重置暂存区重置工作区(将对应版本的代码修改到工作区和暂存区中) 最常用,执行结束后,会发现工作区代码就是指定版本的代码。
--mixed参数:
git reset --mixed
,本地库指针移动时,重置暂存区,但是工作区不动
--soft参数:
git reset --soft
,本地库指针移动,不重置暂存区和工作区
撤回到上次提交: git reset --hard HEAD
git diff 比较
比对工作区与暂存区的所有不同:
比对工作区与暂存区某一文件的区别:
比较暂存区与本地库之前的区别:
比较暂存区与指定版本本地库之间的区别:
比较暂存区与指定版本本本地库的指定文件的区别:
git clean 清除工作区untracked的文件
git reset --hard
和git clean -f
是一对好基友. 结合使用他们能让你的工作目录完全回退到最近一次commit的时候。
git branch 分支
建立一个分支
查看分支列表与当前分支
星号代表当前分支。
切换分支
合并分支
解决合并冲突
删除分支
tag 标签
打标签。和其他VCS类似,Git也可以对某一时间点上的版本打上标签。们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做。
显示已有的tag
显示此仓库所有的tag:
筛选tag:
切换到某个tag
注意:如果你的当前仓库含有未提交的内容,需要提交后才可以切换tag,否则会出现以下的错误提示:
打一个tag
提交tag到远程
删除tag
删除远端服务器tag
与远程版本库协作
首先创建本地库与远程库,仓库名称最好保持一致。 如何选择开源协议?
将本地库推送到远程库
给远程仓库设置别名
在推送代码时,远程仓库地址较长,可以为其设置别名,方便提交:
现在,你可以通过orign 替代远程库的地址了,比如上面的push操作可以替换为git push origin master
。
克隆远程库代码到本地
如果电脑中没有本地库,需要将远程库代码完整的克隆到本地:
拉取远程库代码的修改
远程库代码可能被团队其他人员修改,需要抓取远程库某一分支的代码:
查看远程分支的修改,确保远程分支修改正确:
合并远程主分支到本地分支:
使用pull代替fetch+merge拉去远程代码的修改:
--set-upstream-to
--set-upstream-to
使用--set-upstream-to将本地分支与远程分支关联,这样在执行git pull 以及 git push 时就无需指定远程分支了:
跨团队合作
假设与A公司与B公司合作,B公司要需要在A公司代码上进行开发。
在Github/Gitlab上Fork A公司的远程库,将会将代码仓库同步到B公司上。B公司员工将会把代码clone到本地,然后在本地库上开发。B公司员工开发完毕,将代码提交,并将代码oush到B远程库。
远程库其他操作
让团队人员加入项目
Github:
免密登录 ssh key
Mac生成公私钥:
Linux下生成公私钥:
Windows下生成公私钥:
最后更新于
这有帮助吗?