文章目录
- Git入门指南
- 前言
- 什么是版本控制系统(VCS)
- 版本控制系统
- Git
- 1、概述
- 2、目前比较流行的Git和SVN,区别是什么
- 3、Git安装
- 4、Git的工作区、暂存区、本地仓库、远程仓库
- 5、git的分支
- 6、git的标签
- 7、 实际操作下git常用命令
- 准备操作
- git clone
- git config
- git branch
- git checkout
- git status
- git add
- git commit
- git push
- git pull
- git log
- git tag
Git入门指南
前言
什么是版本控制系统(VCS)
百度是这么介绍的:版本控制系统(version control system),是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
主要作用是帮助开发团队的开发人员协同工作,并存档他们工作的完整历史记录。
版本控制系统有两类,一类是集中化版本控制系统(CVCS),一种是分布式版本控制系统(DVCS)。
集中化版本控制系统都有一个单一的集中管理的服务器,用来保存所有文件的修订版本。协同工作的人们都通过客户端连接到这台服务器,获取最新的文件或者提交更新。但集中化的缺点就是,如果中央服务器出了问题,例如宕机,那么就会出现谁也无法更新的情况,因此无法协同工作,再例如,如果磁盘故障,而备份又不够时,那么就有丢失数据的风险,最坏的情况就是丢失整个项目的记录。
所以,分布式版本控制系统诞生了,
在分布式版本控制系统中,客户端不仅仅是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。所以每一次提取的操作,都是对代码仓库的完整备份,因此也就不必担心协同工作用的服务器发生故障。
版本控制系统
最开始的是本地版本控制系统,特点是通过加锁将并发执行转换成顺序执行。 一次只能有一个人处理某个文件。例如RCS(Revision Control System,修订控制系统),允许多个用户开发和维护程序代码或文档。
然后出现了集中式版本控制系统(Centralized Version Control Systems,CVCS),常见的有CVS,Subversion(也就是SVN),SourceSafe等。
CVS(Concurrent Versions System,并发版本控制系统),十年前最为流行的版本控制系统。然后出现了Subversion(SVN)取代了CVS。
常见的SVN客户端图形化软件有
TortoiseSVN(windows流行)
SnailSVN(macos流行)
Ankhsvn(将subversion的操作集成进了Visual Studio的SVN客户端)
Subclipse(将Subversion的操作集成进Eclipse的SVN客户端软件)
SmartSVN(收费,Mac,windows,Linux都适用)
最后目前流行的就是分布式版本控制系统。例如Git,Mercurial,BitKeeper。
Git
1、概述
在 Linux 开源的初期,Linux 开源项目的代码是 linus 本人通过 linux 命令 diff 和 patch 两条命令手动完成。随着 Linux 代码越来越壮大,靠 Linus 一个人来手动合并已经不现实。
2002 年,Linus 选择了一个商业版本控制系统 BitKeeper 作为 Linux 内核的代码管理工具(BitKeeper 的开发商 BitMover 授权 linux 社区免费使用)。但是,免费使用是有很多的限制的,因此 linux 社区的大佬开始破解 BitKeeper。其中,samba 的作者 andrew 破解成功了。但是被 BitMover 公司发现,收回免费使用权。
迫不得已,Linus 选择了自己开发一个分布式版本控制工具以替代 BitKeeper。传说,Linus 闭关一个月,写出了 Git。此后,Git 成功接管了 Linux 社区的版本控制工作。
简单来说,Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件
2、目前比较流行的Git和SVN,区别是什么
1、Git是分布式的,SVN是集中式的。
2、GIt把内容按元数据方式存储,而SVN是按文件(所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里)。
3、Git 分支和 SVN 分支有区别,git分支是指针指向某次提交,而svn分支是拷贝的目录;git又本地分支,而svn没有本地分支
4、Git 没有一个全局的版本号,而 SVN 有。
5、Git的内容完整性要优于SVN(Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏)
3、Git安装
具体可以看菜鸟教程【Git的安装】
安装git之后,右键电脑桌面,可以看到多了下面两个玩意
git Gui是git的图形化界面,git自带的命令行窗口
4、Git的工作区、暂存区、本地仓库、远程仓库
1、工作区:workspace。电脑中存项目文件的目录。
工作区中的每一个文件可能有4种状态,这四种状态共分为两大类:
- 未跟踪(Untracked)
- 不被Git所管理的文件
- 已被 Git 所管理的文件
- 未修改(Unmodified):工作区中文件的内容和 Git 仓库中文件的内容保持一致
- 已修改(Modified):工作区中文件的内容和 Git 仓库中文件的内容不一致
- 已暂存(Staged):工作区中被修改的文件已被放到暂存区,准备将修改后的文件保存到Git仓库中
工作区的状态可以通过git status
命令查看
2、暂存区:stage或者index。一般存放在.git
目录下的index文件中(目录为.git/index),所以有时把暂存区叫做索引(index)
3、本地仓库:local repository。工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
工作区、暂存区和本地仓库的关系如下:
(1)master是git自动为我们创建的第一个分支,也叫主分支,其他分支开发完成后都要合并到master分支上。具体看第四节。
不过目前好像git把master分支重新命名为main分支了
(2)HEAD是一个指针,指向当前分支的最新提交。
(3)图中的Objects标识的区域为Git的对象库,实际位于“.git/objects”目录下,里面包含了创建的各种对象和内容。
(4)当对工作区修改的文件执行git add
命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
(5)当执行提交操作时(git commit
)时,暂存区的目录树写到版本库中,master分支会做相应的更新,即master指向的目录树就是提交时暂存区的目录树。
(6)当执行git reset HEAD
命令时,暂存区的目录树会被重写,被master分支指向的目录树所替代,但是工作区不受影响。
(7)当执行git rm --cached <file>
命令时,会直接从暂存区删除文件,工作区则不做出改变。
(8)当执行 git checkout
. 或者 git checkout -- <file>
命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
(9)当执行 git checkout HEAD.
或者 git checkout HEAD <file>
命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。1
4、远程仓库:remote repository。指的是git服务器上所对应的仓库。
在本地开发完成之后,将本地仓库的提交复制到远程仓库
5、git的分支
几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作,分支最终会和主线合并,达成一致。
有一个叫做 master 的主要分支,当你执行 git init
的时候,默认情况下 Git 就会为你创建 master 分支,主分支的作用是:用来保存和记录整个项目已完成的功能代码,因此,不允许程序员直接在 main 分支上修改代码,因为这样做的风险太高,容易导致整个项目崩溃。
由此,就出现了功能分支:功能分支指的是专门用来开发新功能的分支,它是临时从 main 主分支上分叉出来的,当新功能开发且测试完毕后,最终需要合并到 main 主分支上。
如下:
6、git的标签
标签是用于标记特定的点或提交的历史,通常会用来标记发布版本的名称或版本号,虽然标签有点像分支,但打上标签的提交时固定的,不能随意改动。
发布一个版本时,通常先在版本库中打一个标(tag),这样就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。
所以,标签也是版本库的一个快照。
7、 实际操作下git常用命令
准备操作
注册个github账号,怎么操作可以看这【github操作指南】
创建个远程仓库,命名为gitTest,按操作指南做好之后,打开仓库复制地址仓库地址,例如https://github.com/dxf-keniula/gitTest.git
git clone
从服务器拉取代码
打开终端,输入如下命令
git clone https://github.com/dxf-keniula/gitTest.git
如果拉取太慢,可以搭个梯子,或者像这篇文章写的这么做【github拉取项目速度慢可以这么做】
git config
配置当前仓库开发者用户名和邮箱的信息,也可以用来切换用户名和邮箱
git config user.name jack
git config user.email 223456789@qq.com
每次提交代码的时候都会生成一条提交记录,其中会包含当前仓库配置的用户名和邮箱。
git branch
创建、重命名、查看、删除项目分支,通过git做项目开发时,一般都是在开发分支中进行,开发完成后合并分支到主分支上
# 创建名为func1的分支
git branch func1
# 重命名分支
git branch -m func1 newFunc1
# 查看当前项目分支列表
git branch
# 如果分支完成使命,则可以删除
git branch -d newFunc1
git checkout
切换分支
# 切换到fun2分支
git checkout func2
git status
查看文件变动状态
例如,拉去下来的仓库中有一个README.md文件,我们对其做任何一点改动,并通过这个命令进行监视改动,结果如下:
分支fun1监视到README.md的改变,通过这个命令就差看到了发生改变的文件
git add
添加文件变动到暂存区
git add README.md
添加工作区所有文件到暂存区
git add *
git commit
提交文件变动到版本库
git commit -m "这里是提交原因"
git push
将本地的代码改动推送到服务器
git push origin func1
origin指的是当前的git服务器地址,这行命令的意思是将func1分支推送到服务器,当看到命令行返回如下字符表示成功了
接下里打开github网站,可以看到这个仓库的func1分支进行了更新
git pull
将服务器上的最新代码拉取到本地
git pull origin func1
如果想租成员对项目做了改动并推送到了服务器,那么我就需要将最新的改动拉取下来更新到本地
git log
查看版本提交记录
git log
git tag
给项目做标记
git tag publish/0.0.1
当我们完成某个功能需求发布上线时,应该将此次完整项目的代码做个标记,并将这个标记好的版本发布到线上,例如,看到如下内容则表示发布成功了
好了,以上就是一些常用命令的介绍,如果还想了解其他一些命令可以看我这常用命令汇总
git常用命令大全
感谢阅读!