Git
版本控制
版本控制,版本迭代,新的版本!版本管理器
- 实现跨区域多人协同开发
- 追踪和记载一个或多个文件的历史记录
- 组织和保护你的源代码和文档
- 统计工作量
- 并行开发、提高开发效率
- 跟踪记录整个软件的开发过程
- 减轻开发人员的负担,节省时间,同时降低人为错误
1. 本地版本控制
记录文件每次的更新,可以对每个版本做一个快照,或者是记录补丁文件,适合个人用,如RCS,日期分割
- Local Computer
- Version Database -> version1,2,3
- Chekcout -> file
2. 集中版本控制:SVN
所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改
所有的版本数据都存在服务器上,用户的本地只有自己之前的所有版本,不连网用户就看不到历史版本,服务器坏了,数据就没了,解决方案:定期备份。代表产品:SVN
3. 分布式版本控制:GIT
每个人都拥有全部的代码!安全隐患!
所有版本信息仓库全部同步到本地的每个用户,可以在本地查看所有历史版本,可以离线在本地提交。
由于每个用户哪里保存的都是所有版本的数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
不会因为服务器损坏或者网络问题,造成不能工作的情况。
Git与SVN最主要区别
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统必须联网才能工作,对网络宽带要求较高。
Git是分布式版本控制系统,没有中央服务器,每个人的电脑是一个完整的版本库,工作的时候不需要联网,因为版本都在自己电脑上。协同的方法:自己在电脑上改了文件A,其他人也在电脑上改了文件A,这是,两个人之间只需要把各自的修改推送给对方,就可以互相看到对方的修改 。Git可以直接查看到更新了哪些代码和文件!
Git是目前世界上最先进的分布式版本控制系统。
Git历史
Linux 内核开源项目有着广为人数的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002)。到 2002 年,整个项目开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。
到了2005年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux内核社区免费使用 BitKeeper 的权利。这就迫使 Linux 开源社区基于使用 BitKeeper 时的经验教训,开发出自己的版本系统,也就是后来的Git(2周左右)。
Git是目前世界上最先进的分布式版本控制系统
Git是免费的、开源的,最初Git是为辅助 Linux 内核开发的,来替代 BitKeeper 。
Linux和Git之父(Linus Benedic Torvalds)1969、芬兰
Git环境配置
下载
所有东西下载慢的话就可以去找镜像。
官网下载太慢,我们可以使用淘宝镜像下载:http://npm.taobao.org/mirrors/git-for-windows/
windows下载exe,下载对应的版本即可安装。无脑下一步!
卸载:
- 检查电脑环境变量,清理与Git相关
- 程序和功能中,卸载Git
启动
安装成功后在开始菜单会有Git项,下面有3个程序。
Git Bash:Unix与Linux风格的命令行,使用最多,推荐使用 [clear]
Git CMD:Windows风格的命令行 [cls]
Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令
基本的Linux命令
平时一定要多使用这些基础的命令!
- cd:改变目录。
- cd…:回退上一个目录,直接cd进入默认目录。
- pwd:显示当前所在的目录路径。
- ls(ll):都是列出当前目录中的所有文件,只不过II(两个II)列出的内容更为详细。
- touch:新建一个文件 如touch index.js就会在当前目录下新建一个index.js文件。
- rm:删除一个文件。
- mkdir:新建一个目录,就是一个文件夹。
- rm -r:删除一个文件夹。rm -r src 删除src目录。
- mv移动文件,
mv index.html test
把 index.html 移动到 test 目录下。 - reset:重新初始化终端/清屏。
- history:查看命令历史。
- help:帮助。
- exit:退出。
- #表示注释。
Git配置
查看配置
git config -l
查看系统配置
git config --system --list
查看本地配置
git config --global --list
user.name 和 user.email必须配置
设置用户名与邮箱(用户配置,必须设置)
git config --global user.name "xxx"
git config --global user.email "xxx"
Git基本理论(核心)
工作区域
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
- git add files – git checkout
- git commit – git reset
- git push – git pull
Workspace:工作区,平时存放项目代码的地方
Index/Stage:暂存区,临时存放你的改动,实际是一个文件,保存即将提交文件列表信息
Repository:仓库区(本地仓库)安全存放数据的位置,里面有你提交所有版本的数据,其中HEAD指向最新放入仓库的版本
Remote:远程仓库,托管代码的服务器,可以简单认为是你项目中的一台电脑,用于远程数据交换
本地的三个区域确切的说应该是git仓库中HEAD指向的版本:
工作流程
- 在工作目录中添加、修改文件‘
- 将需要进行版本管理的文件放入暂存区域 git add
- 将暂存区域的文件提交到git仓库 git commit
因此,git管理文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
Git项目搭建
创建工作目录与常用指令
工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文。日常使用只要记住下图6个命令:
体验
本地仓库搭建
创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。
1、创建全新的仓库,需要用GIT管理的项目的根目录执行:
$ git init
2、执行后,在项目目录多了一个.git的隐藏目录,关于版本等所有信息都在这个目录里面。
克隆远程仓库
1、 克隆远程目录,将远程服务器上的仓库(gitee)完全镜像一份至本地
$ git clone [url] https://gitee.com/kuangstudy/kuang_livenote.git
2、去gitee或github上克隆一个试试
Git文件操作
文件的四种状态
-
Untracked:未跟踪,文件在文件夹中,但并没有加入到git库,不参与版本控制,通过
git add
状态为Staged
-
Unmodify:文件已入库,未修改,版本库中的文件快照内容与文件夹中完全一致。这类文件有两种去处,如果它被修改,而变为
Modified
,如果使用git rm
移出版本库,则成为Untracked
文件 -
Modified:文件已修改,仅仅是修改,没有进行其他操作,这个文件有两个去处,通过
git add
可进入暂存staged
状态,使用git checkout
则丢弃修改过,返回到umodify
状态,这个git checkout
即从库中取出文件,覆盖当前修改。 -
Staged:暂存状态,执行
git commit
则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify
状态,执行git reset HEAD filename
取消暂存,文件状态为Modified
。
hello.java -> git add . => 暂存区 => git commit => 远程仓库
查看文件状态
# 查看指定文件状态
git status [filename]
# 查看所有文件状态
git status
# git add . 添加所有文件到暂存区
# git commit -m "消息内容" 提交暂存区中的内容到本地仓库 -m 提交信息
忽略文件
在主目录下建立 “.gitignore” 文件
#为注释
☆.txt # 忽略所有 .txt结尾的文件,这样上传就不会被选中
!lib.txt # lib.txt除外
/temp # 忽略项目根目录下的TODO文件,不包括其他目录temp
build/ # 忽略build/目录下的所有文件
doc/☆.txt # 忽略 doc/notes.txt 但不包括 doc/server/arch.txt
例:
*.class
*.log
*.lock
# Package Files #
*.jar
*.war
*.ear
target/
# idea
.idea/
*.iml
*velocity.log*
### STS ###
.apt_generated
.factorypath
.springBeans
### IntelliJ IDEA ###
*.iml
*.ipr
*.iws
.idea
.classpath
.project
.settings/
bin/
*.log
tmp/
#rebel
*rebel.xml
使用码云
github 是有墙的,比较慢,在国内,一般使用gitee,有时会搭建自己的gitlab服务器
- 注册登录码云,完善个人信息
- 设置本机绑定SSH公钥,实现免密登录(免密码登录,这一步挺重要的,码云是远程仓库,我们平时在本地仓库)
进入 本地.ssh目录
生成公钥
ssh-keygen
生成公钥后会生成两个文件
3. 将公钥信息 public key 添加到码云账户中即可。
4. 使用码云创建一个自己的仓库。
许可证:开源是否开源随意转载,开源但是不能商业使用,不能转载。
克隆到本地。
IDEA中集成Git
- 新建项目,绑定git
- 将我们远程git文件目录拷贝到项目中即可
- 修改文件,使用IDEA操作git
- 添加到暂存区
- commit 提交
- push到远程仓库
- 提交测试
这些都是单个人的操作。
Git分支
分支在GIT中相对较难,分支就是科幻电影里的平行宇宙,如果两个宇宙互不干扰,那对现在的你没什么影响,不过,在某个时间点,两个平行宇宙合并了,我们就需要处理一些问题了。
列出分支
git branch
列出所有远程分支
git branch -r
新建一个分支,但依旧停留在当前分支
git branch [branch-name]
新建一个分支,并切换到该分支
git checkout -b [branch]
合并指定分支到当前分支
git merge [branch]
删除分支
git branch -d [branch-name]
删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/barnch]
多个分支如果并行执行,就会导致我们代码不冲突,也就是同时存在多个版本。
web-api -A组开发 (Restful.xx())
web-admin -B组开发
web-app -C组开发
B 会调用 A (修改了A的代码)
C 会调用 B 和 A 的代码
如果冲突了就需要协商即可。
如果同一个文件在合并分支时都被修改了则会引起冲突:解决的办法就是我们开源修改冲突文件后重新提交。选择要保留他的代码还是你的代码。
master主分支应该非常文档,用来发布新版本,一般情况下不允许在上面工作,工作一般情况下在新建的dev分支上工作,工作完后,比如上要发布,或者dev分支代码稳定后可以合并到主分支master上。
练习:找个小伙伴,一起搭建一个远程仓库,来练习Git。
笔记参照视频 B站up主 : 狂神说