【JavaEE学习笔记】GIT管理版本工具

GIT版本管理工具

A.Git简介

1.传统项目管理的问题

一般情况下,工作目录充满了以日期命名的文件夹

并且经常的拷贝复制项目,文件夹管理不便,很混乱

工作一段时间后,发现代码有问题,想退回某个时间点

协同开发时代码管理更繁琐:不停拷贝复制,占用空间,且无法追溯问题源头

对软件版本管理也不方便,手动效率低,容易出错

怎么办?要借助管理工具

2.版本管理系统VCS

是一种记录项目一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统

有了它就可以将某个文件回退到之前的状态

甚至将整个项目都回退到过去某个时间点的状态

可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出问题出现的原因

使用版本控制系统,可以轻松恢复到原先的样子

但额外增加的工作量却微乎其微

3.分类

a.集中式版本控制系统

版本库是集中存放在*服务器的,而各自工作的时候

用的都是自己的电脑,所以要先从*服务器取得最新的版本

然后开始做各自的工作,各自完成各自的工作任务后

再把自己的任务推送给*服务器

典型的代表是SVN,是目前用得最多的集中式版本库控制系统

最大的问题是必须联网才能工作,如果在局域网内还好

可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件需要5分钟

b.分布式版本控制系统

没有*服务器,每个人的电脑上都是一个完整的版本库

工作时候不需要联网了,当多个人协作的时候

互相之间只需把各自的修改推送给对方

就可以互相看到对方的修改了,典型代表Git

分布式VCS的安全性较高,因为每个人电脑里都有完整的版本库

分布式版本控制系统通常也有一台充当“*服务器”的电脑

仅仅是用来方便“交换”大家的修改

B.Git使用步骤(windows)

1.下载

下载对应版本安装文件,如Git-2.15.1.2-64-bit.exe

2.安装

打开,选好安装路径,下面两项必选,剩下的就一直点击下一步

【JavaEE学习笔记】GIT管理版本工具

3.建立Git仓库

a.方式1

在指定目录下,创建一个新的版本库 gti init

右键创建的版本库文件夹->Git Bash here

【JavaEE学习笔记】GIT管理版本工具

输入以上命令,在文件中会出现一个.git文件夹

【JavaEE学习笔记】GIT管理版本工具

b.方式2

克隆已有的版本库 git clone 远程版本库url

4.工作目录和暂存区

a.工作目录

一个git可以管理的文件夹

这个文件夹里的内容就是工作区

就是项目所在的文件夹目录,是除了版本库之外的其他内容

b.暂存区

是用来暂时存放工作区中修改的内容

保存了下次将提交的文件列表信息

一般在 Git 仓库目录中的index文件中,称为stage 或者 index

5.Git仓库

a.本地版本库

初始化git版本库之后会生成一个隐藏的文件.git

可以将该文件理解为git的本地版本库

是Git 用来保存元数据和对象数据库的地方

是用于存储本地工作区和暂存区提交上来的变更过的文件的地方

操作时,使用git commit –m “提交描述“将暂存区的文件提交到本地仓库

b.远程版本库

Git 命令都是在本地执行,想通过 Git 分享代码或者与其他开发人员合作

就需要将数据放到一台其他开发人员能够连接的服务器上

在功能开始开发前,每个人要下载远程仓库项目到本地计算机

c.工作区、暂存区、本地仓库、远程仓库的关系

【JavaEE学习笔记】GIT管理版本工具

6.Git管理的文件分类

a.已追踪的tracked

已存放在暂存区中的文件,或者已存放在版本库中文件

使用git add fileName可以把新文件变为tracked状态

b.被忽略的ignored

明确声明为不可见或被忽略的文件

在同一目录下或git顶层目录下的.gitignore配置文件中

添加文件名或目录名,使用命令vim .gitignore创建新文件

c.未追踪untracked

工作目录中不在前两类中的文件

7.Git管理的文件状态

对于任何一个文件,在 Git 内都只有三种状态

a.已修改(modified):修改了某个文件,但还没有提交保存

b.已暂存(staged):把已修改的文件放在下次提交时要保存的清单中

c.已提交(committed):文件已经被安全地保存在本地版本库中了

8.Git配置文件

a.git/config

当前项目特定配置,是默认选项,有最高优先级

git config -e --file  .git/config

b.~/.gitconfig

用户特定配置,对用户所有git项目有效

git config -e –global

c./etc/gitconfig

系统范围配置,也可能不存在。git config -e --system

d.查看配置文件中最终设置的值

git config -l

通过命令行设置最终也是写到对应配置文件了

如配置用户commit时必须的name和email(必须执行,否则无法提交)

git config --global user.name ‘名字’

git config –global user.email ‘电子邮件’

【JavaEE学习笔记】GIT管理版本工具

在C:\Users\admin下会生成一个.gitconfig文件,打开查看

name和email需要去github官网注

【JavaEE学习笔记】GIT管理版本工具

C.Git常用命令

1.准备

在工作目录下建立一个HelloWorld.java

【JavaEE学习笔记】GIT管理版本工具

代码随意,就写个简单的HelloWorld程序即可

2.git status

显示索引状态信息

【JavaEE学习笔记】GIT管理版本工具

On branch master:当前所在分支,后面讲

No commits yet:目前没有提交的

Untracked files:没有被追踪的(即没提交,也没在暂存区)

并且还提示下一步操作

3.git add .(所有文件)或文件名1 文件名2

添加当前目录及子目录文件或指定文件到暂存区

任何编辑之后,提交之前务必使用add更新暂存区索引

【JavaEE学习笔记】GIT管理版本工具

显示暂存区有了新文件,并提示移除或提交

4.git commit[命名文件] -m '提交信息'

【JavaEE学习笔记】GIT管理版本工具

提交时,一定要写上说明,如果之前没有配置个人信息,则无法提交

当status如上显示,没有待提交的,暂存区没有内容

只有当处于这种情况,说明当前空间的相对于提交上去的没有改动

也就是说,你新改动的模块已经上传,方可进行下一步操作

5.git diff

显示工作目录和索引之间的差异

git diff 当前分支名|HEAD

工作目录和给定分支或版本库之间的差异

git diff –cached  当前分支名|HEAD

索引和给定分支之间的差异

6.git mv  旧文件 新文件

给版本库文件重命名,进入暂存库,必须结合commit才最终生效

【JavaEE学习笔记】GIT管理版本工具

查看状态

【JavaEE学习笔记】GIT管理版本工具

7.git rm  [--cached]文件名

从版本库和工作目录中同时删除文件,但历史记录仍在

--cached 删除索引中文件,但工作空间文件仍在

【JavaEE学习笔记】GIT管理版本工具

查看工作空间

8.git checkout HEAD --  文件名

撤销对工作区修改,使用版本库文件替换,改变工作区

【JavaEE学习笔记】GIT管理版本工具

删除的又恢复回来

9.git log 单独提交历史

【JavaEE学习笔记】GIT管理版本工具

10.git reflog 可以查看所有分支的所有操作记录

【JavaEE学习笔记】GIT管理版本工具

11.git reset --hard [HEAD|分支 – file名字|commit id]

版本回退或回退向暂存区add的文件的修

仅改变暂存区,并不改变工作区

【JavaEE学习笔记】GIT管理版本工具

回到第一次提交,查看工作空间

【JavaEE学习笔记】GIT管理版本工具

D.分支

1.概述

从一个统一的 原始的状态分离出来,使开发能在多个方向上同时进行

并可能产生项目的不同版本,原因:

一个单独的客户发布版本

一个开发阶段的封装

一个特性开发或bug解决

【JavaEE学习笔记】GIT管理版本工具

2.创建分支命令

git branch 分支名

基于当前最新提交创建一个分支

为了可扩展性和分类组织,最佳实践是创建一个带层次的分支名

例如bug/1299

分支是动态的,跟随每次提交而移动

版本库默认分支名为master,不要修改其名称

【JavaEE学习笔记】GIT管理版本工具

3.分支切换

git  checkout 分支名

【JavaEE学习笔记】GIT管理版本工具

结果:

a.在被检出分支而不在当前分支的文件夹和目录,从库中检出放置到对象树中

b.不在被检出分支而在当前分支的文件夹和目录,从对象树删除

c.在两分支都有的文件,修改为被检出分支内容

4.合并merge

git  merge  被合并分支名

必须在同一个版本库中两个或多个分支间进行

好的实践是每次合并从干净的工作目录和索引开始

当前分支始终是目标分支,其他分支始终合并到当前分支

如果有冲突,解决完毕后使用add 和commit -i保存

5.显示版本库分支名称

git branch

【JavaEE学习笔记】GIT管理版本工具

6.删除分支

git  branch  –d  分支名

【JavaEE学习笔记】GIT管理版本工具

a.不能删除当前分支

b.不能删除一个包含不存在与当前分支中的提交的分支,阻止意外删除提交中的开发

E.标签,远程仓库

1.标签使用(Tag)

在开发的一些关键时期,例如发布版本, 有重大修改, 升级的时候

会使用标签进行记录,来永久标记项目中的关键历史时刻

2.git tag  -a  标签名  –m '版本说明'

创建一个带说明信息的标签

【JavaEE学习笔记】GIT管理版本工具

3.git push  远程库名  标签名

将标签提交到远程库中,以便共享

4.GitHub

提供Git仓库托管服务,只要注册一个GitHub账号

就可以免费获得Git远程仓库

因本地Git仓库push和GitHub仓库之间的传输是通过SSH加密的

所以需要以下设置

a.创建SSH Key

用户主目录下看有没有.ssh目录

如果有看目录下有没有id_rsa和id_rsa.pub这两个文件

如果已经有了,可直接跳到下一步

如果没有打开Shell(或打开Git Bash):

$ ssh-****** -t rsa –C "[email protected]"

一路回车,使用默认值即可,无需设置密码

【JavaEE学习笔记】GIT管理版本工具

在C:\User\Admin下会生成.ssh文件夹,里面有两个文件

【JavaEE学习笔记】GIT管理版本工具

b.登陆GitHub,https://github.com/

打开“Account settings”,“SSH Keys”页面

【JavaEE学习笔记】GIT管理版本工具

点“Add SSH Key”,填上任意Title

在Key文本框里粘贴id_rsa.pub文件的内容

【JavaEE学习笔记】GIT管理版本工具

确认后

【JavaEE学习笔记】GIT管理版本工具

5.相关命令

a.git clone <远程版本库的网址> [目录名]

从远程主机克隆一个版本库,在本地主机生成一个目录

与远程主机的版本库同名,且默认绑定名字为origin的远程库

如果要指定不同的目录名,作为第二个参数

b.git  remote add  给远程仓库命名 远程url

添加一个远程仓库,便于后续使用,但必须在本地仓库目录才行

如git remote add test   …./test.git

c.git push 远程仓库名 本地分支名

把该分支上的所有本地提交推送到远程库

指定本地分支,Git就会把该分支推送到远程库对应的远程分支上

远程仓库改变了,则需要先pull更新后才能提交

d.git pull

自动的抓取然后合并远程分支到当前分支

F.Egit

1.概述

是Eclipse的Git插件,图形化界面方式使用Git

2.Git插件安装

a.在线下载插件

在Eclipse中点击Help>Install New Software>Add Name:

EGit Location: http://download.eclipse.org/egit/updates

安装后重启Eclipse

b.下载zip包安装

下载EGit的zip包后,解压在自定义文件夹EGit中

拷贝在Eclipse安装目录dropins下,重启Eclipse即可,更加灵活

3.配置EGit

菜单栏Window ->Preferences -> Team -> Git -> Configuration,点击Add Entry

在弹出的对话框中,Key填user.name,Value填姓名信息

Key填user.email,值是github上绑定的邮箱

代码commit到Git时需要用到的name和email

【JavaEE学习笔记】GIT管理版本工具

4.eclipse生成SSH2 key

windows -- perferences--General--Network Commection--SSH2--key  management--General RSA Key

【JavaEE学习笔记】GIT管理版本工具

然后把生成的SSH Key 注册到github上

登录github--settings--add把生成的SSH Key粘贴即可

【JavaEE学习笔记】GIT管理版本工具

5.检查公钥是否正常

【JavaEE学习笔记】GIT管理版本工具

6.本地创建项目如“testGit”和本地git仓库

打开eclipse,创建项目“testGit”里面随便写点什么

然后"File"--"Team"--"Share Project"--"Git"--"next"

【JavaEE学习笔记】GIT管理版本工具

点击finish

【JavaEE学习笔记】GIT管理版本工具

如上图所示到此该项目“testGit”就变成git仓库

到workspace下打开该项目,发现多了一个隐藏文件“.git”

该项目处于untracked状态(文件夹中的符号”?”表示

下面我们需要提交代码到本地仓库,如下图:右键->Team->Commit

首先我们要忽略不必要的文件如maven项目target文件夹

【JavaEE学习笔记】GIT管理版本工具

右键直接忽视

【JavaEE学习笔记】GIT管理版本工具

过滤掉不必要的文件,然后提交修改的文件

必须先add然后commit故通过Team -> Add to index

可以将文件加入git索引,进行版本监控

【JavaEE学习笔记】GIT管理版本工具

若是不想添加到版本库中则“Remove from Index”

该命令前提是为未commit,若是已经commit那么该命令不起作用

添加成功后文件状态发生变化由之前的“?”变成“*”

【JavaEE学习笔记】GIT管理版本工具

最后执行commit:首次提交后,会自动生成master分支

在注释中输入提交信息

【JavaEE学习笔记】GIT管理版本工具

点击Commit,完成提交

【JavaEE学习笔记】GIT管理版本工具

自动产生master分支

7.提交远程仓库

首先在github官网上登录并创建仓库“HelloWorld”

该名称与本地仓库名称一致,表示本地仓库提交到远程仓库并与之关联

创建完毕后执行如下操作 右键->Team->Remote->Push..

【JavaEE学习笔记】GIT管理版本工具

点击Next,若勾选Force Update,表示覆盖提交

【JavaEE学习笔记】GIT管理版本工具

点击Next

【JavaEE学习笔记】GIT管理版本工具

点击Finish

【JavaEE学习笔记】GIT管理版本工具

点击OK,查看Github

【JavaEE学习笔记】GIT管理版本工具

8.修改已提交的项目

已修改的项目文件夹出现“*”号标志

选择带“*”号标志的文件右击“Team”--"commit"

【JavaEE学习笔记】GIT管理版本工具

点击commit and  push 表示提交并推送

即把修改的文件提交至本地,推送到远程仓库

9. 实际开发中,只需要提交以下三个

src

.gitignore

pom.xml