首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >分布式版本控制系统Git

分布式版本控制系统Git

作者头像
Java_慈祥
发布2024-08-06 13:56:34
发布2024-08-06 13:56:34
28300
代码可运行
举报
运行总次数:0
代码可运行

什么是版本控制

版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史

方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。

  • 实现跨区域多人协同开发
  • 追踪和记载一个或者多个文件的历史记录
  • 组织和保护你的源代码和文档
  • 统计工作量
  • 并行开发、提高开发效率
  • 跟踪记录整个软件的开发过程
  • 减轻开发人员的负担,节省时间,同时降低人为错误

简单说就是用于管理多人协同开发项目的技术。

常见的版本控制工具

主流的版本控制器有如下这些:Git SVN CVS VSS TFS…**现在影响力最大且使用最广泛的是Git与SVN**

版本控制分类

本地版本控制

本地记录文件每次的更新/手动的保存备份,可以对每个版本做一个快照,或是记录补丁文件,**适合个人用,如RCS。**

就像下面一样:**手动的记录备份,1.0 2.0...的记录版本。。。**

集中版本控制 常见:SVN

所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改

所有的版本数据都存在服务器上

  • 用户的本地只有自己以前所同步的版本。
  • 如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。

而且,所有数据都保存在单一的服务器上

  • 有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。 代表产品:SVN、CVS、VSS (本人目前并没有深入了解, 学习还是Git)

缺点:

必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

分布式版本控制 常见:Git

每个人都拥有全部的代码!**存在安全隐患!**

所有版本信息仓库全部同步到本地的每个用户

  • 这样就可以在本地查看所有版本历史,可以离线在本地提交。 只需在连网时push(上传) 到相应的服务器或其他用户那里。

由于每个用户那里保存的都是所有的版本数据,

只要有一个用户的设备没有问题就可以恢复所有的数据 , 因此 这增加了本地存储空间的占用。

缺点

资料少 (起码中文资料很少) 学习周期相对而言比较长。不符合常规思维。

代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

SVN与Git的优缺点

SVN是集中式版本控制系统,版本库是集中放在中央服务器的
  • 而工作的时候,用的都是自己的电脑
  • 所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。
  • 集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。

最能体现出区别的是,假如你公司SVN服务器挂掉了,那么你就可以放假了。

Git是分布式版本控制系统
  • 没有中央服务器,每个人的电脑就是一个完整的版本库
  • 工作的时候不需要联网了,因为版本都在自己电脑上。
  • 协同的方法是这样的: 比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A 这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。 Git可以直接看到更新了哪些代码和文件!

Git是是目前世界上最先进的分布式版本控制系统

Git是目前世界上最先进的分布式版本控制系统。

Git是免费、开源的,最初Git是为辅助Linux内核开发的 (所以很多的命令和 linux 有很多相同)~,来替代 BitKeeper!

Linux和Git之父李纳斯·托沃兹(Linus Benedic Torvalds)1969、芬兰

Git 下载+安装+配置

下载

官网及下载地址: http://msysgit.github.io/

本人使用的是:Git-2.21.0-64-bit.exe 版本

安装

本人安装:D:\WSMwork\Git\Git 本人喜欢在博客里写安装目录… 时间长了东西多了. 都不知道在那了!

无脑下一步即可!安装完毕就可以使用了!

前面几步就省略了,重点是几个选项界面:一般情况下,这个两个界面都选第一

在“Configuring the line ending conversions”选项中

第一个选项:如果是跨平台项目,在windows系统安装,选择;

第二个选项:如果是跨平台项目,在Unix系统安装,选择;

第三个选项:非跨平台项目,选择

启动:

安装成功后在开始菜单中会有Git项

  • Git Bash: Unix与Linux风格的命令行,使用最多,推荐最多
  • Git CMD: Windows风格的命令行
  • Git GUI: 图形界面的Git,不建议初学者使用,尽量先熟悉常用命令

常用的Linux命令 Linux

git之父就是 linux之父, git的内核就是 liunx…所以里面很多常用的命令都是linux 类似的!

配置

安装完成之后,就需要为你的Git配置账户了:

  • Git是以邮箱 用户名这个组合为一个标识的。打开Git-Bash.exe
代码语言:javascript
代码运行次数:0
运行
复制
# 配置全局用户名
git config --global user.name '输入用户名'

# 配置全局邮箱
git config --global user.email 'xxx@qq.com' 
# 这里配置的是全局的用户名和邮箱,也可以为每一个项目配置一个,这里就不演示了。


#查看系统配置config
git config --system --list

#查看当前用户(global)配置
git config --global  --list
设置用户名与邮箱(用户标识,必要)

在 C:\Users\Administrator\ .gitconfig 中可以看到配置的用户信息

尽量填写自己的, 因为后面靠着这个和 远程仓库github 进行连接的

Git所有的配置文件,其实都保存在本地!

Git相关的配置文件:**Git\Git\mingw64\etc\gitconfig** 查看配置 git config -l

本人刚安装配置比较少…

Git 三个区域

工作区+版本库+暂存区

  • 工作区(Working Directory): 平时存放项目代码的地方** 就是你电脑本地硬盘目录
  • 暂存区(stage): 用于临时存放你的改动,**事实上它只是一个文件,保存即将提交到文件列表信息** 一般存放在”git目录” 版本区下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
  • 仓库区 /版本区(Repository): 工作区有个**隐藏目录.git**,它就是Git的**本地版本库** 就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本

Directory**使用Git管理的一个目录,也就是一个仓库** 包含着: 工作区 和 git版本库

  • Directoryc 可以理解为一个普通的目录, 通过**git init**命令初始化为一个**Git管理目录** 之后就会自动生成一个 .git 版本库文件 Directoryc文件夹里面的文件就是 一个个工作区 都是要被管理的文件
  • 创建出的文件最初是 工作区的Untracked: 未跟踪状态文件 通过 add 命令, 状态变为Staged 暂存状态
  • Staged: 暂存状态. 执行git commit则将修改同步到版本库中 进行备份记录版本状态!

Git为我们默认自动创建的第一个主分支master,以及指向master的一个指针叫HEAD

我们把文件往Git版本库里添加的时候,是分两步执行的: 第一步是用git add把文件纳入Git管理暂存区;实际是把本地文件修改添加到暂存区 第二步是用·git commit·提交更改;实际上就是把暂存区的所有内容提交到当前分支默认master主分区

远程仓库:

如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域:

  • Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

自定义创建Directory git管理仓库

找到任意一个盘符位置下不建议路径中存在中文~

Git安装之后右击就会出现选择,右键选择Git Bash Here,然后就会弹框,输入命令:git init~初始化Git 版本库~

创建版本库成功,路径下面多了一个.git的文件夹。这个就是git的本地版本库

并且自动为我们创建了master分支,并且当前已经默认关联上了master分支。

Git 常用操作

查看文件状态+提交修改

代码语言:javascript
代码运行次数:0
运行
复制
# 查看当前路径下所有文件的状态 
git status

# 查看当前文件下的文件状态
git status 文件夹

文件状态!!

  • Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
  • Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处: 如果它被修改, 而变为Modified 如果使用git rm移出版本库, 则成为Untracked文件
  • Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这种类型的文件有两种去处: 通过git add可进入暂存staged状态 使用git checkout 则丢弃修改过, 返回到unmodify状态,这个git checkout即从库中取出文件, 覆盖当前修改 !
  • Staged: 暂存状态. 执行git commit则将修改同步到库中 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified

下面一一介绍: ↓↓↓


  • 首先创建了一个名字叫abc.txt的文件
  • 使用git status查看abc.txt文件的状态。

这里的文件名字显示为红色,表示未被git管理的文件。

暂存区~提交

代码语言:javascript
代码运行次数:0
运行
复制
# 将文件加入到暂存区
git add 文件

# 提交
git commit -m '注释' 文件
# git commit 文件 	提交暂存区的文件;
# -m '表示给文件添加注释说明'    

git status 
# 查看文件:
# nothing to commit,working directory clean(没有什么可以提交,工作区非常干净)
# 如果文件被提交之后在被修改,在此查看 Git 会给出提示!
修改提交后的文件:

将add —— commit的文件,修改之后在 git status 查看 Git 会对文件进行管理跟踪了

需要再次 git add git commit 更新同步文件~ 可以看到这里文件状态个变为modified

日志+版本号+对比不同

代码语言:javascript
代码运行次数:0
运行
复制
# 查看当前路径下所有文件的版本日志信息
git log
 
# 查看当前路径下 指定文件的版本日志信息
git log 文件

# 查看文件的日志信息,以一行显示:作者,时间,注释
git log --pretty=oneline 文件

# 查看版本号信息
git reflog 文件
日志一行显示
查看文件 版本号信息

版本回退、穿梭

Git 最强之处就是对于文件, 项目版本的维护管理!!

底层的默认对 提交 的文件进行 监听并会自动保存对应的版本号~

可以在不同版本之间切换~

如果一项目更新版本出现bug 为了方便使用, 可以直接回归上一个版本…😂

代码语言:javascript
代码运行次数:0
运行
复制
# 版本回退、穿梭
 git reset --hard HEAD^  					# 回退上一个版本  
 git reset --hard HEAD~int 					# 回退int个版本以前 int表示数值类型
 git reset --hard 版本号 					# 穿梭到指定那个版本

执行上面命令,就会在已提交的项目中, 回到上一个/某个 版本!

Git的强大!!这里就不图片了…要注意**结合对应回退版本的文件进行查看!**效果最佳! ,

对比文件差异/不同

代码语言:javascript
代码运行次数:0
运行
复制
# 与修改前文件作比较
git diff 文件

撤销文件修改

代码语言:javascript
代码运行次数:0
运行
复制
# 撤销未加入暂存区的文件修改(也就是未add修改的文件,取消修改)
git checkout 文件;		# 文件状态Modified(修改) ——> unmodify(入库)

# 撤销已加入暂存区但未提交的文件修改(也就是已add未commit的文件)
	# 1.先回到之前版本库 文件的代码 
	git reset HEAD 文件;
	# 2.再checkout 文件
	git checkout 文件;

# 撤销已加入暂存区已提交的文件修改(也就是已add已commit的文件)
# 整体回退到之前版本
git reset –hard HEAD^

# 删除文件 就是基本的linux 的命令了...
git rm -f 文件		
# 使用rm删除之后,使用git status命令,可以看到文件为绿色,需要提交才能生效
git commit -m 'delete 文件' 文件

分支操作:

Git 在创建时候就会默认提供一个分支 Master**(公司中一般代表着小组长)**

而每个成员也都对应一个分支~ Git鼓励使用分支:

  • 每个分支都可以理解为一个独立的操作者, 不会互相影响;
  • 且Git 切换分支时候,当前的工作区也会变为对应分支的工作区: A分支有 abc文件 切换 B分支有就不一定会有abc文件, B分支可以从A分支pull下载/push上传/合并文件~ 分支都是互通
  • 可以多个分支创建修改一个项目, 由主master 进行维护汇总~
代码语言:javascript
代码运行次数:0
运行
复制
# 创建分支
git branch 分支名字 (如dev) // 创建(dev)分支

# 查看分支
git branch

# 切换分支
git checkout 分支名字 // 切换到xx分支

# 拉取分支  就会将目标分支代码拉到此分支;


# 推送分支


# 合并分支
git merge (指定合并的分支)

分支合并(无冲突)

代码语言:javascript
代码运行次数:0
运行
复制
# 假设现在我修改新分支上的文件
# 然后回到主分支,主分支我并没有进行修改,只有新分支修改了,那么进行合并
# 显然是没有冲突的,Git会直接对 master分支里的文件进行了更新

分支合并 (有冲突)

代码语言:javascript
代码运行次数:0
运行
复制
# 如果我修改新分支上的文件
# 然后回到主分支,主分支我也进行修改,那么进行合并
# 就会产生冲突的,Git会将都修改过的相同行代码都保留,以一种特殊格式保留;

结果:

Git 给其进行了特殊的格式, 并且进入了合并模式:

想要退出只有, 对文件进行修改!且重写提交 add commit

需要注意的是这里的 commit不需要在附带文件!

git commit -m '日志注解~' 不要写文件名!不然退不出合并模式, 本次只是为了提交~

删除分支

代码语言:javascript
代码运行次数:0
运行
复制
git branch -d 分支名

Git忽略文件提交

有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等就需要 忽略文件进行版本控制!!

使用.gitignore忽略文件
  • 我们需要在项目的根目录当中创建**.gitignore**文件
  • 使用.gitignore文件的方式很简单 .gitignore文件当中,一行代表一条忽略规则 如果是一个带“.”这种有后缀的字符串那么git就会忽略这个文件。 “*”表示的就是选中所有,如果没有“.”就表示一个文件夹。

.gitignore

代码语言:javascript
代码运行次数:0
运行
复制
#为注释
*.txt        #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt     #但lib.txt除外
/temp        #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/       #忽略build/目录下的所有文件
doc/*.txt    #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是版本控制
  • 常见的版本控制工具
  • 版本控制分类
    • 本地版本控制
    • 集中版本控制 常见:SVN
    • 分布式版本控制 常见:Git
  • SVN与Git的优缺点
    • SVN是集中式版本控制系统,版本库是集中放在中央服务器的
    • Git是分布式版本控制系统
  • Git是是目前世界上最先进的分布式版本控制系统
  • Git 下载+安装+配置
    • 下载
    • 安装
    • 启动:
    • 常用的Linux命令 Linux
    • 配置
      • 设置用户名与邮箱(用户标识,必要)
      • Git所有的配置文件,其实都保存在本地!
  • Git 三个区域
    • 工作区+版本库+暂存区
    • 远程仓库:
    • 自定义创建Directory git管理仓库
  • Git 常用操作
    • 查看文件状态+提交修改
    • 暂存区~提交
      • 修改提交后的文件:
    • 日志+版本号+对比不同
      • 日志一行显示
      • 查看文件 版本号信息
    • 版本回退、穿梭
    • 对比文件差异/不同
    • 撤销文件修改
  • 分支操作:
    • 分支合并(无冲突)
    • 分支合并 (有冲突)
    • 删除分支
    • Git忽略文件提交
      • 使用.gitignore忽略文件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档