Git是一个免费的、开源的分布式版本控制系统,旨在快速高效地处理从小型到非常大的项目的所有内容。
Git易于学习,占用空间小,性能快如闪电。它超越了SCM工具,如Subversion,CVS,Perforce和ClearCase,具有廉价的本地分支,方便的暂存区域和多个工作流程等功能。



集中式版本控制工具

分布式版本控制工具

代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库。

双击资料中的Git-2.36.1-64-bit.exe文件,点击Next

选择安装位置,建议安装到非中文无空格的目录下,点击Next

默认勾选即可,无需修改,点击Next

选择开始菜单文件夹,默认即可,点击Next

选择默认的编辑器,默认即可,点击Next

默认分支名设置,还是默认设置(选择让Git决定,分支名默认为master),点击Next

是否将Git添加到环境变量PATH中,选择第一项(不修改环境变量,只在Git Bash中使用Git),点击Next

选择连接协议,默认即可,点击Next

选择后台客户端传输协议,默认即可,点击Next

配置Git文件的行末换行符,Windows使用CRLF,Linux使用LF,默认即可(自动转换),点击Next

选择Git终端类型,默认即可(Git Bash),点击Next

选择Git pull合并模式,默认即可,点击Next

选择Git的凭据管理器,默认即可,点击Next

其他配置,默认即可,点击Next

实验选项配置,新特性,默认都不勾选,点击Install

安装完成,取消勾选第二项,点击Finish

在任何目录下右键出现以下两项说明Git安装成功

在任何目录下右键,点击Git Bash Here

执行以下命令

在当前Windows登录的系统用户路径下,会生成一个.gitconfig的隐含文件,里面可以看到刚刚设置的信息。如果不用命令设置,也可以直接打开文件进行设置。

也可以通过git config --list命令查看配置信息

工作区(Working Directory)
就是你电脑本地硬盘目录,一般是项目当前目录
暂存区(stage)
存放在.git目录下的index文件,我们把暂存区有时也叫作索引(index)。
版本库(Repository)
工作区里的隐藏目录.git,它就是Git的版本库(也称为本地库)。

| 命令名称 | 命令作用 |
|---|---|
| git init | 初始化本地库 |
| git status | 查看本地库状态 |
| git checkout – 文件名 | 将未添加到暂存区的改变删除 |
| git add 文件名 | 将文件添加到暂存区 |
| git commit -m “日志信息” 文件名 | 将文件提交到本地库 |
| git log | 查看日志 |
| git log --pretty=oneline | 在一行显示日志 |
| git reflog | 查看引用日志,即历史记录 |
| git reset --hard HEAD^ | 回退一个版本 |
| git reset --hard HEAD~n | 回退n个版本 |
| git reset --hard 版本号 | 版本穿梭 |
| git branch -v | 查看分支 |
| git branch 分支名 | 创建分支 |
| git checkout 分支名 | 切换分支 |
| git branch -d 分支名 | 删除分支 |
| git merge 分支名 | 把指定的分支合并到当前分支上 |
要使用Git对我们的代码进行版本控制,首先需要获得Git仓库,获取Git仓库通常有两种方式:
本地初始化Git仓库步骤:
在电脑磁盘创建一个目录git_test
进入git_test目录中,右键点击Git Bash Here

执行git init 命令,发现Git默认创建了一个master分支,并且git_test目录中生成了一个.git的目录
master分支

.git目录

查看.git目录结构

本地库初始化完成
执行git status 命令

提示在主分支上没有任何需要提交的文件
执行vim hello.txt 命令打开一个新文件,添加内容后保存退出

再次执行git status 命令

状态说明:
颜色说明:
也可以使用git status -s使输出信息更加简洁

执行git add hello.txt 命令



如果想要将文件从暂存区移除可以执行git rm --cached 文件名或git reset 文件名命令
执行git commit 命令,输入这次改变的描述信息,保存退出

文件被提交到本地库,提示在主分支没有任何需要提交的内容



提示文件被修改,需要再次添加到暂存区并提交到本地库
重复执行以上步骤,以便在版本库中生成多个版本

注意:每次修改完都需要执行add和commit的操作(包括删除了文件),如果不是新建的文件可以将add和commit一起执行,执行命令git commit -am “内容改变描述”

执行git log 命令详细查询,可以显示用户签名和日期

执行git log --pretty=oneline 命令简要查询,只显示版本号即当前指针指向的版本

执行git reflog查询历史记录

执行git reset --hard HEAD^ 命令回退一个版本

查询当前所在版本

查询历史记录

查看文件内容

执行git reset --hard HEAD~3 命令回退三个版本

查询当前所在版本

查看文件内容

查询历史记录

执行git reset --hard 版本号 命令穿梭到最新版本

查看文件内容

在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本(分支底层其实也是指针的引用)。

执行git branch dev命令创建dev分支

执行git branch -v命令查看分支

带星号的是目前使用的分支
执行git checkout dev命令切换到dev分支

修改dev分支中hello.txt文件的内容

添加到暂存区并提交到本地库

切换到master分支,查看hello.txt文件中文件的内容

执行git merge dev命令将dev分支中的内容添加到master分支中

再次查看hello.txt文件的内容

发现dev分支中添加的内容已经合并到master分支中
冲突产生的原因
合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git无法替我们决定使用哪一个。必须人为决定新代码内容。
产生冲突后文件的效果
dev分支添加

master分支添加

将dev分支合并到master分支时出现冲突

出现冲突时master分支上会有MERGING
查看文件内容

解决冲突
重新编辑hello.txt文件,决定保留那个分支的内容之后将文件添加到暂存区并提交到本地库即可

我们是将master分支和dev分支的内容都保留了下来
容易产生冲突的操作
减少冲突的操作
Gitee(码云) 是开源中国社区2013年推出的基于 Git 的代码托管服务,目前已经成为国内最大的代码托管平台,致力于为国内开发者提供优质稳定的托管服务。
文件大小限制:https://gitee.com/help/articles/4283

| 命令名称 | 命令作用 |
|---|---|
| git remote add 别名 远程库地址 | 给远程仓库起别名 |
| git push 别名 分支名 | 将本地库某个分支中的内容推送到远程库 |
| git clone 远程地址 <本地库名字> | 克隆远程库到本地 |
| git pull 远程库地址别名 远程库分支名 | 拉取远程库分支内容到本地库 |
点击账号头像左边的加号,选择新建仓库

填写仓库名称后,点击底部的创建即可
提示:如需创建公开仓库,请在创建仓库后通过「仓库设置」修改为公开

仓库创建成功页面

点击远程库中的HTTPS按钮,点击复制按钮复制https地址

在本地库执行git remote add 别名 远程库地址 添加远程仓库的地址

在本地库的config文件中会自动添加上远程地址与别名的映射

执行git push origin master命令将本地库的master分支推送到远程库

会弹出一个认证窗口,填写你的Gitee账号密码后点击确定

本地库成功推送到远程库

Gitee中已经有本地库的文件

Windows的凭据管理器中多了一条gitee的凭据

如果想删除Gitee中的仓库,点击仓库中的管理,然后就可以在左侧菜单看到删除仓库的功能

在本地创建一个gitee-A目录,执行git init初始化本地库
配置当前项目的用户签名,配置之后当前项目将不再使用全局的用户签名

执行之后在本地库.git目录中的config文件中会添加上用户签名

在工作区创建新文件、添加内容、添加到暂存区、提交到本地库
在GitHub中创建远程库gitee-demo
在本地库配置gitee-demo远程库别名并将本地库代码推送到远程库,具体操作见4.3

复制远程库gitee-demo的https地址

执行git clone 远程库地址 gitee-B命令在本地生成一个gitee-B目录

弹出认证窗口后,输入开发者B的Gitee账号密码,点击确定




开发者B访问邀请链接,接受即可

开发者B再次克隆远程仓库到本地,弹窗输入开发者B的账号密码,确定后可以看到仓库克隆成功

在.git目录的config文件中也自动添加了远程库地址与别名的映射

进入gitee-B目录,设置gitee-B当前项目的用户签名

修改内容、添加到暂存区并提交到本地库


开发者A在本地执行git pull 远程库地址别名 master 命令,将远程库gitee-demo最新的代码拉取到本地


如果你在远程仓库中发现一个好的项目,而你又不是该项目团队中的一员,比如上图中的开发者X,你可以通过fork的操作将别人的项目拷贝到你的账户中。
开发者A创建一个仓库gitee-fork
点击 初始化readme文件,仓库会自动生成两个文件


将仓库改为公开仓库,进入仓库管理页面,滑到最底部,选择开源

复制仓库链接

登录开发者X的账号打开链接

点击Fork按钮

选择目标空间后,点击确认即可

在开发者X的账户中也创建了一个同样的仓库,并且仓库名字下方会显示fork的谁的仓库

登录开发者A的账号,打开gitee-fork仓库显示被fork了1次

开发者A打开一个文件,然后在线编辑文件内容,修改后提交

登录开发者X的账户,打开gitee-fork仓库,点击更新按钮后,确定即可

更新成功

作为fork者的开发者X,也可以修改内容并通过发送Pull requests请求将代码合并到被fork的开发者A仓库中
开发者X在线修改文件后,提交

点击Pull Requests,再点击新建 Pull Request

填写标题后,点击创建Pull Request

被fork者(开发者A)会收到通知

登录开发者A的账户,打开仓库gitee-fork发现有一个Pull requests请求,点开

点开选项后还可以对Pull Request请求进行评论

合并前必须先审查通过,测试通过

审查和测试都通过后,点击合并,再点击合并分支

点击接收Pull Request

合并成功

查看文件内容

通过https模式推送代码需要进行账号和密码授权或使用token。
ssh模式比https模式的一个重要好处就是,每次push操作时不用重复填写账号和密码。前提是你必须是这个项目的拥有者或合作者,且配好了ssh key。
配置ssh key的命令:ssh-keygen -t rsa -C 注释
配置ssh key的步骤:
检查Windows登录用户的工作目录是否有.ssh的目录,有则将其删除。

在任意目录右键打开Git Bash Here,执行ssh-keygen -t rsa -C ChengLong 命令

进入Windows登录用户的工作目录,进入.ssh目录,发现两个文件,一个公钥(id_rsa.pub),一个私钥(id_rsa)

查看公钥id_rsa.pub文件中的内容并复制
登录账户,点击用户头像,点击设置,在点击SSH公钥

填写标题,再将公钥文件的内容粘贴到下方,点击确定

输入当前账号的密码完成验证即可

添加成功

选择账户中的一个仓库,例如gitee-demo,复制SSH的地址

命令行执行 git clone 远程仓库地址 目录名称 克隆到本地,第一次建立连接需要输入yes

克隆成功,查看.git目录中的config文件,发现远程仓库的地址不再是HTTPS协议

GitHub是目前全球最大的基于Git的代码托管平台。
GitHub官网:https://github.com/
注意:由于GitHub的服务器在国外,访问比较慢,甚至访问不了,需要在浏览器中安装一下资料中的GitHub加速插件

打开Idea,点击Configure(这种配置对新创建的工程都起作用);如果打开Idea没有下面的窗口也可以创建一个新工程在Settings里设置(这种设置方式只对当前创建的工程起作用)

点击Settings

点击Version Control,点击Git,查看有没有自动识别出Window中安装的git.exe程序,如果路径不对手动选择一下

点击Test按钮测试,弹出Git的版本

Eclipse特定文件

Idea特定文件


Maven工程的target目录

这些文件或目录与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽IDE工具之间的差异。
1.创建忽略规则文件.gitignore,该文件放在那里都可以, 建议与.gitconfig放在同一个目录下(.gitconfig在当前Windows登录用户的工作目录中)
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.project
.settings
target
.idea
*.iml
2.在.gitconfig文件中引用忽略规则文件.gitignore
[user]
name = cl
email = 1010056799@qq.com
signingkey = “”
[core]
autocrlf = true
excludesfile = C:/Users/aqr_lmy/.gitignore
[credential “https://gitee.com”]
provider = generic
注意:这里要使用“正斜线(/)”,不要使用“反斜线(\)”
创建一个Maven工程idea_git888

点击工具栏VCS进行初始化(不同的Idea版本位置可能不同)

选择刚刚创建的工程

初始化之后pom.xml变成了橙色,被忽略的文件也变了颜色

项目根目录也生成了.git目录

工具栏出现了Git操作相关工具

新建一个Java文件,发现文件变成了橙色,同时弹出一个提示框提示是否添加到暂存区,如果点击Add只会将当前Java文件添加到暂存区,暂时点击Cancel不添加到暂存区

添加main方法,在控制台打印语句,测试,使用方式跟之前一样,只是文件有颜色而已

在文件上或项目上右键,找到Git选项,点击Add将文件添加到暂存区

添加到暂存区之后文件变成了绿色

在文件或项目上右键,找到Git选项,点击Commit File…或Commit Directory…
在文件上右键效果:

在项目上右键效果:

写提交信息并点击Commit按钮

提交成功,生成版本之后文件变成了正常的黑色

每次修改了文件也可以直接进行提交到本地库操作,只要保证提交时文件被勾选了就行

点击工具类上的绿色√

点击Commit提交更新




项目中添加一个新文件测试软回退和硬回退的区别

软回退到第二次更新的效果:新文件被添加到了暂存区

硬回退到第二次更新的效果:新文件被删除

在文件或项目上右键

点击New Branch

指定分支名称后点击Create按钮创建

点击Git:master,然后点击New Branch

后面的步骤与5.7.1一样
创建分支、切换分支、合并分支都有两种方式,在此只说明第二种方式(点击Idea右下角)。
在Idea中创建新分支之后会自动切换到新分支,在Idea右下角即可看到当前所在的分支

点击Git:dev,点击master,点击Checkout切换到master分支

当前使用的分支点击它只能修改分支名称以及推送分支

在dev分支中修改Java文件

提交到本地库

切换到master分支

合并dev分支到master分支

合并后效果

dev分支在GitTest文件的第9行添加内容,并提交到本地库

master分支在GitTest文件的第9行添加不同的内容,并提交到本地库

将dev分支合并到master,弹出冲突提示框
点击第一个按钮使用当前分支(master)的内容
点击第二个按钮使用被合并的分支(dev)的内容
点击第三个按钮手动决定使用那个分支的内容

点击第三个按钮Merge…的效果
点击左边双箭头使用master分支的内容
点击右边双箭头使用dev分支的内容

先点击左边双箭头再点击右边双箭头,保留master和dev两个分支(也可以只保留某一个分支)的内容,点击Apply按钮冲突便得到解决

查询版本发现版本库中多了一个解决冲突的版本

点击Idea中的Settings,点击Plugins

在搜索框搜索Gitee,点击Install

安装成功点击Restart IDE重启Idea

再次点开Settings,在Versiong Control中就会发现Gitee选项,就可以通过邮箱和密码登录Gitee账户了

点击VCS,找到Share Project on Gitee(不同的Idea版本位置可能不同)

设置远程仓库的名字(默认就是项目名)、是否是私有仓库、远程仓库地址别名,然后点击Share

在Gitee账户中自动创建了一个远程仓库

点击Idea右下角Git:master,找到Push…

默认的origin是https的地址,也可以改用SSH模式推送

点击origin,点击Define Remote

复制远程仓库的SSH地址,粘贴过来,换一个别名,点击OK

选择origin-ssh,点击Push推送

点击Get from Version Control

指定克隆的URL(https或ssh的都可以)和项目名称及存放的路径,点击Clone

克隆成功弹出提示框,点击Yes打开工程

同6.4.1的第一步
点击Gitee账户,选择要克隆的项目

后面的步骤与6.4.1一样
在项目或文件上右键,找到Pull…

选择远程地址的别名和分支后点击Pull按钮

或者点击Idea面板右上角的快捷方式拉取

选择合并到当前分支,点击OK

GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。

点击官网最下方的install可以查看安装说明

选择CentOS7查看安装文档

将资料中的gitlab-ce-13.10.2-ce.0.el7.x86_64.rpm安装包上传到虚拟机的/opt/software目录下
执行以下命令安装依赖的工具包
yum install -y curl policycoreutils-python openssh-server perl
在gitlab的rpm包所在的目录执行以下命令安装gitlab
rpm -ivh gitlab-ce-13.10.2-ce.0.el7.x86_64.rpm
执行以下命令初始化GitLab服务(需要等待很久,大概10分钟)
gitlab-ctl reconfigure
执行以下命令启动GitLab服务
gitlab-ctl start
在浏览器地址栏输入虚拟机的ip地址访问GitLab,GitLab默认端口号80

第一次访问需要修改root密码

修改完密码使用root账户和新的密码进行登录

登录成功,默认英文界面,可以设置为中文


点击新建项目即可创建仓库

点击创建空白项目

创建仓库的界面与Gitee类似,填写项目名称后,点击新建项目即可

如果要关闭GitLab服务执行以下命令
gitlab-ctl stop
只执行上面的命令GitLab依赖的其他服务还在运行,想要彻底关闭所有相关服务需要执行以下命令
systemctl stop gitlab-runsvdir
可以将以上服务的开机自启关闭了
systemctl disable gitlab-runsvdir
将gitlab-runsvdir服务开机自启禁用掉之后,以后开启虚拟机直接执行gitlab-ctl start启动GitLab将失败,直接执行以下命令启动即可,不需要再执行gitlab-ctl start
systemctl start gitlab-runsvdir
在插件商店搜索GitLab

安装GitLab Projects 2020,重启Idea

配置GitLab服务器

配置成功

在GitLab上创建远程库gitlab-demo

点击克隆,复制HTTP地址

修改访问地址
复制出来的地址是一个例子:http://gitlab.example.com/root/gitlab-demo.git,
在Idea中推送时定义GitLab远程仓库的地址

点击Push将Idea中的项目推送到GitLab

输入GitLab的用户名和密码点击Log In

推送成功

简单来说就是一个项目的成员们在工作中统一使用Git的工作方式。
GitFlow工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。
简单的分支

复杂的分支

主干分支(master)
主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境完全一致。
开发分支(develop)
主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。
bug修理分支(hotfix)
主要负责管理生产环境下出现的紧急修复的代码。 从主干分支分出,修理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。
发布版本分支(release)
较大的版本上线前,会从开发分支中分出发布版本分支,进行最后阶段的集成测试。该版本上线后,会合并到主干分支。生产环境运行一段时间较稳定后可以视情况删除。
功能分支(feature)
为了不影响较短周期的开发工作,一般会把中长期开发模块从开发分支中独立出来。 开发完成后会合并到开发分支。