Git
1、Git 概述
1.1、版本控制工具
集中式版本控制工具:CVS、SVN(Subversion)、VSS
有一个单一的集中管理的服务器,保存所有文件的修订版本
分布式版本控制工具:Git、Mercurial、Bazaar、Darcs
版本控制是在本地(代码仓库镜像下来)进行的,服务器断网的情况也可以进行开发
每个客户端保存的也都是整个完整的项目,包含历史记录,更加安全
2、Git 常用命令★★★★
2.1、设置用户签名★★★★
安装完成后,在开始菜单里找到“Git”->“Git Bash”,弹一个类似命令行窗口的东西,就说明Git安装成功
接着需要设置一下机器信息,这台机器上的所有Git仓库都会使用这个配置
$ git config --global user.name "username"
$ git config --global user.email "email@example.com"
设置之后可以在此文件中查看用户签名
签名的作用是区分不同操作者身份,Git 首次安装必须设置以下用户签名,否则无法提交代码
2.2、初始化本地库★★★★
步骤:
-
创建一个空目录(最好不要包含中文)
-
然后进入该目录,右击 Git-Bash
-
初始化本地库
git init 命令把这个目录变成 Git 可以管理的仓库
$ git init
-
初始化成功会在此目录下生成一个隐藏的 .git 目录
系统自动创建了唯一一个master分支
版本控制系统只能跟踪文本文件的改动,且编码方式是utf-8
-
可在 Git 中使用 Linux 查看命令
$ ll 查看文件 $ ll -a 查看隐藏文件 Ctrl+l 翻页
2.3、查看本地库状态$ git status
$ git status
首次查看:工作区没有任何文件
$ git status
输出:
On branch master //当前分支
No commits yet //当前没有提交过
nothing to commit (create/copy files and use "git add" to track)
新增文件:hello.txt
$ vim helo.txt
在文件编辑时:i、a、s 进入insert模式,ESC 退出insert模式
退出insert模式后: yy 复制该行;p 粘贴;dd 删除该行;u 撤回;在最下面输入 :wq 保存退出
$ cat helo.txt //查看文件内容
再次查看:检测到未追踪的文件
$ git status
2.4、添加暂存区$ git add 文件名
$ git add 文件名
将工作区的文件添加到暂存区
$ git add hello.txt
输出:
//将Windows的换行符LF替换为Linux换行符CRLF
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
查看状态:检测到暂存区有新文件
$ git status
删除暂存区文件,工作区仍然存在
$ git rm --cached hello.txt
输出:
rm 'hello.txt'
2.5、提交本地库
$ git commit -m"日志信息" 文件名
添加暂存区之后,工作区仍然存在;提交到本地库之后,暂存区就清空了。
将暂存区的文件提交到本地库,形成历史版本
$ git commit -m "first" hello.txt
输出:
//警告换行符自动被替换
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
//分支master内的版本信息 first,自动生成版本号 06d7f87
[master (root-commit) 06d7f87] first
//一个文件被修改,19行数据添加
1 file changed, 19 insertions(+)
create mode 100644 hello.txt
查看状态:没有文件需要提交
$ git status
输出:
On branch master
//没有文件需要提交
nothing to commit, working tree clean
查看引用信息
$ git reflog
输出:
//分支指向master,提交的版本号
06d7f87 (HEAD -> master) HEAD@{0}: commit (initial): first
查看完整信息
$ git log
输出:
//生成的版本号的完整输出
commit 06d7f875e0f4249d612ac7e826c6c93f1fe24a3d (HEAD -> master)
//提交的用户的信息
Author: afei <email@qq.com>
//提交的时间
Date: Tue Feb 8 12:16:04 2022 +0800
//版本号
first
2.6、修改文件$ vim 文件名
修改文件:$ vim 文件名
查看状态:检测到工作区有文件被修改
$ git status //查看本地库状态
将修改的文件再次添加到暂存区
$ git add hello.txt //将文件添加到暂存区
输出:
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
查看状态:工作区的修改添加到了暂存区
$ git status //查看本地库状态
将修改的文件提交到本地库
$ git commit -m "second" hello.txt
输出:
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
//版本号
[master 867c18f] second
//表示修改 5 行
1 file changed, 5 insertions(+), 5 deletions(-)
指针指向的是第二个版本,查看文件信息的时候,查看的就是第二个版本的信息
2.7、历史版本
$ git reflog
查看版本信息
$ git log
查看版本信息信息
$ git reset --hard 版本号
回到旧版本,指针会指向指定版本文件,查看文件时,输出的是指定版本的内容
查看历史版本
ASUS@DESKTOP-07LJMVU MINGW64 /f/Program Files/Git-space/git-demo (master)
$ git reflog
867c18f (HEAD -> master) HEAD@{0}: commit: second
06d7f87 HEAD@{1}: commit (initial): first
版本穿梭:就是回到旧版本
$ git reset --hard 06d7f87 //双击鼠标左键复制
输出:
HEAD is now at 06d7f87 first
$ cat hello.txt
//此时输出文件内容,显示的也是第一个版本
3、Git 分支操作
分支是指为任务创建单独的分支,程序员可以把自己的工作从开发主线上分离开来,开发自己分支得知后,不会影响主线分支的运行,类似于文件复制的副本
分支底层是指针的引用
分支的好处:
- 可以同时并行推进多个功能开发,提交开发效率
- 各个分支在开发过程中,如果某分支失败,不会影响其他分支
3.1、分支的操作:
3.1.1、查看、创建、切换分支
-
查看分支
$ git branch -v
-
创建分支
$ git branch 分支名
-
切换分支
$ git checkout 分支名
-
修改分支
在 hot-fix 分支上修改文件
$ vim hello.txt //修改文件 $ git add hello.txt //添加到暂存区 $ git commit -m "hot-fix first" hello.txt //提交到本地库 $ cat hello.txt //查看文件内容
3.1.2、合并分支的冲突
-
合并分支
$ git merge 分支名
将指定分支合并到当前分支此时hot-fix是在master的基础上进行修改,合并成功
-
产生冲突
当两个分支各自对文件的修改不同,会产生冲突
如:首先二者文件内容一致,然后master进行修改,并添加暂存区、提交本地库
hello git! hello 1111 hot-fix hello git! hello hello git! hello master test hello git! hello hello git!
hot-fix 进行修改,并添加暂存区、提交本地库
hello git! hello 1111 hot-fix hello git! hello hello git! hello hello git! hello hot-fix test hello git!
在 master 分支上,合并 hot-fix ,产生冲突
查看状态
-
解决冲突,需要手动合并代码
-
打开文件
hello git! hello 1111 hot-fix hello git! hello <<<<<<< HEAD //<<<<< HEAD 直到 ====,表示当前分支内容 hello git! hello master test hello git! hello ======= //==== 直到 >>>> hot-fix,表示要合并的代码 hello git! hello hello git! hello hot-fix test >>>>>>> hot-fix hello git!
手动修改,然后保存
-
将文件添加到暂存区
$ git add hello.txt
-
提交到本地库(注意:此时 commit 后不可跟文件名)
$ git commit -m "hot-fix test"
-
合并只会修改当前分支,不会修改其它分支
3.2、切换分支本质
切换分支本质就是移动 HEAD 指针
Git 底层就是两个指针:
- 一个是 HEAD 的指针,指向哪个分支
- 另一个是分支的指针,执行哪个文件版本
4、Git 团队协作机制
4.1、团队内协作
clone :完整的复制下来
push :推送需要有权限
pull :拉取,会更新本地代码
pull 只是拉取更改的部分,clone 是将仓库中整个项目进行拉取
4.2、跨团队协作
fork :远程库复制到远程库
clone : 复制到本地库
pull request :拉取请求
merge :合并
5、GitHub 操作
注册:
邮箱:2371412162@qq.com
密码:leigedexiaomumei123
用户名:leigedexiaomimei
新建仓库:
5.1、远程仓库操作
远程仓库地址获取:
将本地 master 分支推送到远程仓库:
$ git checkout master
$ get push git-demo master
推送之后会弹出窗口,提示登录 GitHub
将远程仓库的代码拉取到本地仓库(就是覆盖下来):会自动将拉取到的文件提交到本地库
$ get pull git-demo ycckmaster
clone 会做如下操作:
- 拉取代码
- 初始化本地仓库
- 创建别名
会将环境都给搭建好
5.2、邀请加入团队:
申请添加成员:
成员同意被添加:
然后就可以推送代码到远程仓库
5.3、跨团队协作
A 将远程仓库的地址复制发送给邀请跨团队协作的人B :
跨团队协作的人 B , 先 fork ,然后可以对此代码进行更改,但是更改的都是自己远程仓库拉取到的文件:
跨团队协作的人 B , 要想将更改的部分推送过去,需要 pull request:
A 这边可以看到有 pull request
A 可以将 B 改好的代码合并到自己的远程仓库
5.4、SSH 免密登录
要想使用 SSH 地址,需要有 SSH 钥匙
步骤:
-
在用户目录下右键 Git Bash:
-
写入以下信息:
//-t表示加密协议为 rsa //-C后跟GitHub账号的邮箱 $ ssh-keygen -t rsa -C 2371412162@qq.com
-
然后分开敲三次回车
-
然后会在用户目录下(C:\Users\ASUS)生成一个 “.ssh” 文件夹
-
Git 进入此目录
$ cd .ssh
-
展示 公钥 文件,复制下来
$ cat id_rsa.pub 输出:复制以下信息 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC0TwcUkC+kKMUcBlILs0aUr4fsEtwCKi8gYG71zD24UcsKxj0a+7Iu3bNZwdI5IhDyRb+ITLrdQcPdVCkhRAmi3qALitoFy7XNH2Upx4x66VtZHLpF2KMYioUrm/da0CVzMDk6gZvJaFhh0MOSx0kDr+FdjZYVlt12jBR9CZhZfwtZESqdBeqZ5ONcxwISlTT6y/d5nx/9CL4X0eouPAE8gMJoOeIsXz9JJ6OLpnAXaXCl02ob1P0t6DOSa9MCVeK8YZbygXCIECcs+KZxoVyfEvhz6lsR3+Nw5Za82iOdItGu661bNQKHmsAs0rjjZUMKScSyVjeEgBlmNCKKgb8sPiEJCUHfMBfH7lEKlE9gFHhaH8Z8yfKeRMUaNu8EAak0XJZsVuHr4WGJP1613D9PGTDgjLx6688OZbxYANm/txFmux1484ZWlAiRw87LUKq22fPSe7PQTNGaDqq5Q6+L/k16yB77utpxgVScAU3dFo9cekKCJ4Pod2A94lV70wk= 2371412162@qq.com
-
在此邮箱的 GitHub 账号上,点击账号设置
-
添加 SSH 公钥
-
测试是否可用:
-
复制 SSH 地址
-
在 本地 Git 拉取远程仓库
-
6、IDEA 集成 Git★★★★
6.1、环境准备★★★★
因为 IDEA 工具中,创建工程的时候本身就有一些文件,不参与部署运行,把它们忽略掉能够屏蔽 IDEA 工具之间的差异
忽略步骤:
-
在用户目录下(C:\Users\ASUS)创建忽略规则文件 xxx.ignore ,建议
git.ignore
写入以下内容:
# Compiled class file *.class # Log file *.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/dowload/help/error_hotspot.xml hs_err_pid* .classpath .project .settings target .idea *.iml
-
在 .gitconfig 文件中引用忽略配置文件(文件在用户目录中)
[user] name = afei email = email@qq.com [core] excludesfile = C:/Users/ASUS/git.ignore 注意: 这里是正斜杠 / ,不是反斜杠 \
-
在 IDEA 中设置,定位 Git 程序
6.2、初始化、添加、提交
-
初始化本地库
选择该项目的根目录
成功之后在根目录就有 .git 文件夹
并且 pom.xml 文件显示为红色,表示暂存在工作区,未追踪
-
添加文件到暂存区
右击文件——Git——Add 就添加到暂存区
也可以右击整个项目——Git——Add
注意此时会弹出提示:是否要将忽略的文件也添加暂存区吗?选Cancel
当新增文件时,会提示是否需要添加到暂存区,点击 Add 就添加到暂存区
添加到暂存区之后,文件名为绿色
-
提交到本地库
右击文件——Git——Commit File 就提交到工作区
提交到工作区之后,文件名为黑色
-
切换版本
在 IDEA 左下角,点击 Version Control ,然后点击 Log 可查看版本
右键选择要切换的版本,然后在菜单里点击 Checkout Revision
文件名为蓝色,表示修改过的文件,未追踪,需要先添加暂存区、然后提交工作区
6.3、创建、切换分支
-
选择 Git ,在 Repository ,点击 Branches 按钮
也可以在 IDEA 右下角,点击 Git : 当前分支名
-
在弹出的 Git Branches 框里,点击 New Branch 按钮
-
填写分支名称,创建 hot-fix 分支
-
切换分支:只需要点击 Git : 当前分支名,选择要切换的分支,点击 Checkout
6.4、合并分支
在 IDEA 窗口右下角,将 hot-fix 分支合并到当前 master 分支
如果代码没有冲突,分支直接合并成功,分之合并成功之后,代码自动提交到本地库,无需手动提交本地库
当有冲突的时候:
对于两个都修改的分支,进行合并时,会发生冲突
发生冲突会弹出下框:Conflicts 冲突
点击 Merge ,进入手动修改代码界面:
合并之后,查看版本:
7、IDEA 集成 GitHub
7.1、设置 GitHub 账号
使用账号密码通常很难登录成功,可使用口令登录
在 GitHub 生成口令:
点击头像——Setting——Develer setting——Personal access tokens ,点击 Create new token,然后输入密码、选择权限,即可生成口令
7.2、分享项目到 GitHub
先在 GitHub 上面创建一个远程库
在 IDEA 点击 VCS
7.3、push 推送本地库到远程库
注意:
push 一定要本地库代码的版本比远程库的版本高
如果本地代码版本已经落后,切记要先 pull 拉取以下远程库的代码,将本地代码更新到最新以后,再修改、提交、push
右键点击项目,可以将当前分支的内容 push 到 GitHub 的远程仓库中
下面这种推送 push 默认是 https ,受网络影响可能推送不成功,推荐使用 SSH
使用 SSH :
-
先到 GitHub 网页复制 SSH 链接
-
回到 IDEA ,点击自定义链接
-
粘贴 SSH 链接,并定义别名
-
选择链接
7.4、pull拉取远程库到本地库
注意:
pull 如果远程库与本地库代码不一致,会自动合并
如果合并失败,会涉及到手动解决冲突问题
右键点击项目,可以将远程仓库的内容 pull 到本地仓库
7.5、clone 克隆远程库到本地
可在 IDEA 初始化界面克隆远程库到本地。可使用 SSH 链接
在 项目内可点击 VCS
8、国内代码托管中心——码云
账号:afei
密码:通用密码
8.1、创建远程库
点击首页右上角的加号,选择下面的新建仓库
填写仓库名称、路径和选择是否开源(公开库、私有库)
在 码云推荐使用 HTTP 链接
8.2、IDEA 集成 Gitee
IDEA 默认不带 码云 插件,第一步要安装 Gitee 插件
登录 Gitee 账号
8.3、分享项目到 Gitee
8.4、push 推送本地库到远程库
修改的代码在本地库提交之后,再进行 push 推送
8.5、pull 拉取远程库到本地
IDEA 拉取远程库
8.6、Gitee 复制 GitHub 项目
新建仓库——导入已有仓库
然后贴入 HTTPS 协议链接
假如 GitHub 上面的代码有更新,Gitee 怎么同步更新?
9、自建代码托管平台——GitLab
需要下载 GitLab
需要 CentOS7 以上版本的服务器,内存 4G ,磁盘 50G,关闭防火墙
9.2、IDEA 集成 GitLab
安装 GitLab 插件