分布式版本控制工具Git

一、版本控制工具是什么

版本控制系统(VCS),用于在项目开发中如实记录整个项目从零到完成上线过程中项目开发过程中或者后续维护过程中项目每次迭代的信息,利用这些版本信息,开发人员可以回退到他想回退到的那一版本进行二次开发或者维护等工作,提高工作效率。
对于版本控制工具大体上分为集中式版本控制系统(CVCS)、分布式版本控制系统;其中集中版本控制系统最富盛名的便是CVS,而分布式版本控制系统Git。

二、分布式版本控制Git和集中式版本控制系统的CVS区别

集中式版本控制系统:采用B/S架构,开发人员通过不同的终端连接到同一个服务器上,服务器上存放的便是项目迭代过程中的版本信息,开发人员每次从服务器上拉取数据都是最新的项目版本,也可以将自己本地项目版本更新服务器上存放的项目版本。其中集中式版本控制系统对于项目迭代过程中的信息存储采用的是增量存储方式,每次只记录提交时不同的地方,通过顺序依次还原这些不同在原始版本上达到最新版本信息。
分布式式版本控制系统:Git对于项目迭代过程中的版本历史信息不仅存放在远程代码托管的远程库上,在每个人开发人员的本地库上也存放着几乎全部的项目迭代历史信息,因此可以有效的避免集中式版本控制系统的单点故障问题。同时每次从远程库上拉取数据时不是只拉取最新的版本,而是会拉取远程库所有的数据到本地库,同时本地库也可以更新远程库。
总结:分布式版本控制系统不仅具有集中式版本控制系统功能更有效解决了集中版本控制系统的单点故障,同时它的许多操作无网络时任可以有效进行。

三、Git的文件组织存储方式

Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。 这类系统(CVS、Subversion、Perforce、Bazaar 等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
在这里插入图片描述
Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引为了高效,如果文件没有修改Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。
在这里插入图片描述

四、Git的三种工作区域

对于Git而言,其中在本地有三种不同的工作区域:工作区、暂存区、本地库
工作区:用于开发项目的区域
暂存区:开发人员一旦对项目开发完成到一定程度,就可以将项目存放到暂存区,用于之后提交到本地库。
本地库:提交到本地库后,项目的迭代历史信息在本地就算有备份了,同时便也将本地库内容提交到远程库

五、Git的分支概念

强烈推荐:官方对Git分支介绍

说分支前,要说下Git的文件组织,其中把文件放入暂存区其实就是在计算文件的检验和,同时但提交到本地库的时候会生成一个tree对象,用于指向暂存区的文件,同时还会生成commit对象用于指向tree对象,和记录提交者的信息。
在这里插入图片描述
Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支。 它会在每次的提交操作中自动向前移动。分支如下图的master指针指向的就是一个commit对象
在这里插入图片描述
HEAD指针的作用便是辨别当前处于哪个分支,即HEAD指向的是分支指针,而分支指针最终会落脚在commit对象上

当再不同的分支上做出了修改时便会产生分叉,如下图所示:
在这里插入图片描述
而不同分支的合并便是将不同分支上最新的快照合在一起,对于三方合并,创建一个新的commit对象用于作为不同分支上最新分支的共同孩子。如下图所示:
在这里插入图片描述
在这里插入图片描述
对于合并中的fast-forward情况,这种合并是不会新建一个新的commit对象来作为不同分支上最新分支的共同孩子的,这种合并只是简单的将分支指针右移,如下图所示:
在这里插入图片描述
在这里插入图片描述
对于合并过程中的合并冲突解决,出现合并过程的冲突是因为可能存在在不同分支上不同的开发人员对同一个文件的同一处做了不同的修改,这个时候再合并的过程中Git不知道该保留谁的修改于是便有了合并冲突这个概念。而解决冲突就是人为的决定保留哪一个改变,同时采用git add 将冲突文件加入暂存标记冲突被解决了之后采用git commit将冲突文件提交到本地库即可。

官方介绍远程跟踪分支
分支中还有一个重要的概念就是远程跟踪分支:它是本地仓库中用于监控远程库上的某个分支的本地分支,本地不能操作它(Git自动创建的远程跟踪分支,自己创建的跟踪分支可以操作),用于在执行fetch命令时更新本地库和远程库在该分支上的内容,如下图所示:
在这里插入图片描述

六、变基

官方介绍变基
Git中对于不同分支上的修改进行整合的方式:合并和变基
其实,还有一种方法:你可以提取在 C4 中引入的补丁和修改,然后在 C3 的基础上应用一次。 在 Git 中,这种操作就叫做 变基。 你可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。
它的原理是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master)的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。(译注:写明了 commit id,以便理解,下同)
在这里插入图片描述

变基和合并的区别:变基可以将项目迭代过程显的更清晰,整洁
合并确能更真实准确的反映项目迭代过程
切记不要对以提交到远程库中的内容做分支,要变基可以在本地做好后再提交到远程库

七、Git使用命令

1、Git使用前的基础配置

配置签名(个人用户名邮箱)用于在提交时区别提交者
git config --local user.name 'lixun'
git config --local user.email 'lixun@sina.com'
其中--local可以替换为--system/--global
--local:只针对在某个特定的库
--system:针对登录系统的用户
--global:针对

查看配置的用户签名
git config --list
或者在.git目录下查看config文件信息(如下图所示)

在这里插入图片描述
2、初始化Git仓库

对于初始化Git仓库有两种情况
1、采用git init 目录名
该命令会生成一个由git管理的文件夹,文件夹中含有.git目录用于存放git管理的信息
2、从远程库上克隆一个仓库
git clone url 本地库名
从远程库上克隆一个仓库会复制远程库上的所有信息

3、三工作区域交互命令

工作区内容存放到暂存区
git add 文件名

暂存区内容提交到本地库
git commit -m " " 文件名

移除某文件不被git管理并在本机上删除该文件
git rm 文件名

移除某文件不被git管理但不在本机上删除该文件
git rm --cached 文件名

对被git管理的文件进行更名
git mv oldname newname

查看工作区和暂存区的工作状态
git status

查看工作区文件和暂存区文件区别
git diff 文件名(不写文件名就默认是工作区全部文件和暂存区全部文件对比)

查看暂存区文件和本地库文件区别
git diff --cached 文件名(不写文件名就默认是暂存区所有文件和本地库所有文件对比)

4、查看历史提交信息

查看最新的几条历史信息
git log -n

以一行的格式显示每次提交信息
git log --pretty=oneline
git log --oneline

以图像的信息展现历史提交信息
git log --graph

用于历史回退时查看历史信息
git log reflog

显示每次提交改变的文件信息
git log --stat

5、撤销操作

改变提交的提示信息
git commit --ammend
该命令在提交后用于修改提交的提示信息,会启动文本编辑器vim,用于修改提交信息

改变之前的提交(覆盖之前的提交)
git commit --ammend
该命令和改变提示信息的命令是一样的不同的是,若要覆盖那么在提交后还要执行其他命令而不是立即执行本命令。

撤销存放到暂存区的文件
git reset HEAD 文件名(不写文件名默认暂存区所有内容和本地库一致,之前所存放到暂存区的内容都会不见)

撤销工作区对文件的修改
git checkout  --文件名(不写文件名默认对工作区的所有已做修改全部撤销)

6、远程库的操作

查看本地中远程库的信息
git remote -v

添加远程库信息
git remote add 别名 url

查看远程库具体信息
git remote show 别名

修改远程库别名
git remote rename newname

删除远程库信息
git remote rm name

拉取远程库信息到本地库
重点说下,在克隆远程库的仓库时会自动在本地创建跟踪远程库中的每个分支的远程跟踪分支,
在拉取远程库的数据时如果没有指定拉取远程库的某个分支,
那么就会把远程库的所有分支上的数据在本地更新。而本地更新的方式就是将本地的远程跟踪分支更新。
git fetch 远程库别名
git fetch 远程库别名/分支名

推送本地库数据到远程库
对于推送,可以将本地库上某个分支上的数据推送到远程库上指定的分支上,也可以将本地库所有的数据推送给远程库
git push 远程库别名 本地分支名
git push 远程库名 本地库分支名:远程分支名(远程库没有这个分支会创建该分支)

7、标签

标签:用于对历史提交标注
轻量标签只是对提交commit对象的一个引用
附注标签含义创建标签的人的具体信息等

查看已有的标签
git tag

创建轻量标签
git tag 标签名(为当前最新的提交对象)
git tag 标签名 hash值(为过去提交对象打轻量标签)

创建附注标签
git tag -a 标签名 -m " "
git tag -a 标签名 -m " " hash值

查看标签信息
git show 标签名

删除标签
git tag -d 标签名

8、设置命令别名

git config --global alias.别名 命令

9、分支操作命令

查看本地的分支
git branch -v

创建本地分支
git branch  分支名

切换分支
git checkout 分支名

创建跟踪分支
git checkout -b 被跟踪的分支名 创建的分支名
git branch -u 远程分支名(将当前工作分支作为远程库上某一分支的远程跟踪分支)
git checkout --track 远程分支名(创建和远程库同名的本地跟踪分支)

合并不同分支上的更新
git merge 分支名(将指定分支的修改和并到当前工作分支上)

删除分支
git branch -d 分支名

10、变基

git rebase master
将当前工作分支变基到master基分支上

git rebase --onto master server client
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值