Day 04-Git版本控制

Git版本控制

1. 概述

1.1 什么是版本控制

开发中实际场景

场景一:备份 
	小明负责的模块就要完成了,就在即将Release之前的一瞬间,电脑突然蓝屏,硬盘光荣牺牲!几个月以来的努力付之东流 

场景二:代码还原 
	这个项目中需要一个很复杂的功能,老王摸索了一个星期终于有眉目了,可是这被改得面目全非的 代码已经回不到从前了。什么地方能买到哆啦A梦的时光机啊? 
	
场景三:协同开发 
	张三和李四先后从文件服务器上下载了同一个文件:Count.java。张三在Count.java 文件中的第30行声明了一个方法,叫count(),先保存到了文件服务器上;李四在Count.java文件中的第30行声明了一个方法,叫sum(),也随后保存到了文件服务器上,于是count()方法就只存在于张三的记忆中了 
	
场景四:追溯问题代码的编写人和编写时间!
	老王是另一位项目经理,每次因为项目进度挨骂之后,他都不知道该扣哪个程序员的工资!就拿这次来说吧,有个Bug调试了30多个小时才知道是因为相关属性没有在应用初始化时赋值!可是二胖、王东、刘 流和正经牛都不承认是自己干的!

版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。

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

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

1.2 版本系统

本地版本系统

记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用

集中版本控制SVN

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

所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS.

分布式版本Git

所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。

git和svn主要区别

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

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

1.3 Git简史

同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。

Linux 内核开源项目有着为数众多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。

到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。 他们对新的系统制订了若干目标:

  1. 速度

  2. 简单的设计

  3. 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)

  4. 完全分布式

  5. 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统。

1.4 简单工作原理

2. Git安装

2.1 软件下载安装

https://git-scm.com/,下载git对应操作系统的版本。

所有东西下载慢的话就可以去找镜像!

官网下载太慢,我们可以使用淘宝镜像下载:http://npm.taobao.org/mirrors/git-for-windows/

下载后直接安装

设置个安装路径即可 也可以设置下默认打开方式 其他全部使用默认配置 傻瓜式安装

2.2 Git配置

安装后git会在右键菜单

查看默认配置
git config -l
查看系统配置
git config --system --list
查看全局配置
git config --global --list
查看所有的配置以及它们所在的文件
git config --list --show-origin

必要配置

git config --global user.name "think"  #名称
git config --global user.email "275482002@qq.com"   #邮箱

2.3 基本理论

Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:

  1. Workspace:工作区,就是你平时存放项目代码的地方

  2. Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息

  3. Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本

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

本地的三个区域确切的说应该是git仓库中HEAD指向的版本

1、在工作目录中添加、修改文件;

2、将需要进行版本管理的文件放入暂存区域;

3、将暂存区域的文件提交到git仓库。

整体流程

3. 本地仓库搭建

创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。

3.1 创建全新仓库

1、创建全新的仓库,需要用GIT管理的项目的根目录执行:

git init

2、执行后可以看到,仅仅在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录里面。

3、查看文件状态

4、添加文件到暂存区

5、提交到本地仓库

6、查看log

git log
起别名
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'

3.2 克隆远程仓库

使用码云

1.注册登录码云,完善个人信息

2.设置本机绑定SSH公钥,实现免密码登录!

# 生成公钥
ssh-keygen -t rsa

java -jar landlords-server/target/landlords-server-1.4.0.jar -p 1024
java -jar landlords-client/target/landlords-client-1.4.0.jar -p 1024 -h 127.0.0.1

3.将公钥信息public key 添加到码云账户中即可!

4.使用码云创建一个自己的仓库

5.克隆代码到本地

6.提交代码到远程仓库

7.拉取远程仓库的代码

4.IDEA集成Git

4.1将本地项目添加到git

4.2 Idea基本操作

4.2.1 操作入口

4.2.2 新建文件时弹出窗口

4.3.3 提交按钮

4.3.4 pull按钮

4.3.5 Idea上git命令行方式

快捷键 alt+F12

4.3 关于分支

几乎所有的版本控制系统都以某种形式支持分支。
使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。 
在开发中,一般有如下分支使用原则与流程: 
master (生产) 分支 
线上分支,主分支,中小规模项目作为线上运行的应用对应的分支; 
develop(开发)分支 
是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。 
feature/xxxx分支 
从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完,成后合并到develop分支。 
hotfix/xxxx分支, 
从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、test、 develop分支。 
还有一些其他分支,在此不再详述,例如test分支(用于代码测试)、pre分支(预上线分支)等 等。







命令行操作分支
git branch 分支的名称 	--创建
git branch -d 分支的名称 	--删除分支
git checkout 分支的名称 	--切换分支
git checkout -b 分支名称   --创建并切换分支
git merge 分支名称  		--合并分支到当前分支附

注意:
1. 切换分支前先提交本地的修改 
2. 代码及时提交,提交过了就不会丢 
3. 遇到任何问题都不要删除文件目录

5.附

忽略文件(idea自动配置)

一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。 来看一个实际的 .gitignore 例子:
$ cat .gitignore
*.[oa]
*~
第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。 第二行告诉 Git 忽略所有名字以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。 此外,你可能还需要忽略 log,tmp 或者 pid 目录,以及自动生成的文档等等。 要养成一开始就为你的新仓库设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。
文件 .gitignore 的格式规范如下:
1)所有空行或者以 # 开头的行都会被 Git 忽略。
2)可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
3)匹配模式可以以(/)开头防止递归。
4)匹配模式可以以(/)结尾指定目录。
5)要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号(**)表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。

表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。
我们再看一个 .gitignore 文件的例子:
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf

解决git bash乱码问题

打开GitBash执行下面命令
git config --global core.quotepath false
{git_home}/etc/bash.bashrc 文件最后加入下面两行
export LANG="zh_CN.UTF-8" 
export LC_ALL="zh_CN.UTF-8"

添加后注释会乱码 但是log不会乱码了

基础操作常用命令

# 初始化git仓库 
git init
# 将修改加入暂存区 
git add .
# 将修改提交到本地仓库,提交记录内容为:commit 001 
git commit -m 'commit 001'
# 查看日志  如果设置了别名 可以 git-log
git log
# 配置别名
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
# 版本回退 commitID 可以使用 git-log或 git log指令查看
git reset commitID --hard 


#查看本地分支 
git branch 
#创建本地分支 
git branch 分支名 
#切换分支(checkout) 
git checkout 分支名 
# 我们还可以直接切换到一个不存在的分支(创建并切换) 
git checkout -b 分支名 
#*合并分支(merge) 
#一个分支上的提交可以合并到另一个分支 
git merge 分支名称 
#删除分支 
#不能删除当前分支,只能删除其他分支 
git branch -d b1 # 删除分支时,需要做各种检查 
git branch -D b1 #不做任何检查,强制删除 

关于冲突

在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。 
A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要 推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分支
在B用户拉取代码时,因为A、B用户同一段时间修改了同一个文件的相同位置代码,故会发生合并冲 突。 
远程分支也是分支,所以合并时冲突的解决方式也和解决本地分支冲突相同相同.

解决冲突 
当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解 决冲突,解决冲突步骤如下: 
1. 处理文件中冲突的地方 
2. 将解决完冲突的文件加入暂存区(add) 
3. 提交到仓库(commit) 

部分Windows不能创建 .开头的文件 可以使用bash创建

看不到.开头的文件的话可以现实隐藏文件

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值