Git
1.Git简介
1.1 Git说明
全称:分布式版本控制系统
1.2 集中式版本管理
经典产品: CVS、VSS、SVN
特点:由中央仓库统一管理,结构简单,上手容易!
不足:
- 版本管理的服务器一旦崩溃,硬盘损坏,代码如何恢复?
- 程序员上传到服务器的代码要求是完整版本,但是程序员开发过程中想做小版本的管理,以便追溯查询,怎么破?
- 系统正在上线运行,时不时还要修改bug,要增加好几个功能要几个月,如何管理几个版本?
- 如何管理一个分布在世界各地、互不相识的大型开发团队?
1.3 分布式版本管理
2.git安装部署
官网:https://git-scm.com/
2.1 安装流程
傻瓜式安装
注意该步选择 单独用户git,不与windows混用

跨平台相关配置:

在“Configuring the line ending conversions”选项中,
第一个选项:如果是跨平台项目,在windows系统安装,选择;
第二个选项:如果是跨平台项目,在Unix系统安装,选择;
第三个选项:非跨平台项目,选择。
安装成功后:右键菜单,会多出以下选项卡:

2.2 Git账户设置
| 命令 | 含义 |
|---|---|
| git config --list | 查看所有配置 |
| git config --list --show-origin | 查看所有配置以及所在文件位置 |
| git config --global user.name xxx | 设置git用户名 |
| git config --global user.email xxx | 设置git邮箱 |
| git init | 初始化本地库 |
| git config core.autocrlf false | 取消换行符转换的warning提醒 |
- 用户名与邮箱设置案例:

设置方式有两种,一种为针对项目本身的,每一个项目有一个独立的仓库
另外一种为针对独立的一个操作系统用户的,即全局的(一般使用这种)
- 相关配置信息
52645@DESKTOP-3VFQ5L1 MINGW64 /e/gitREP (master)
$ git config --list
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=E:/Git/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
credential.helper=manager
user.name=OrangeLinforCode
user.email=orangelin2435@gmail.com
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
2.3 初始化操作
新建一个本地仓库,即是文件夹
执行
git init命令
52645@DESKTOP-3VFQ5L1 MINGW64 /e/gitREP
$ git init
Initialized empty Git repository in E:/gitREP/.git/
可以在对应新建的文件夹内看到生成的隐藏的
.git文件,该文件不建议修改!!!
- 扩展:
可以在c盘用户目录查看到保存的账户邮箱信息
C:\Users\52645
[user]
name = OrangeLinforCode
email = orangelin2435@gmail.com
3.git入门
3.1 常用命令
| 命令 | 作用 |
|---|---|
| git status | 查看本地库的状态(git status -s 简化输出结果) |
| git add [file] | 多功能命令: 1. 开始跟踪新文件 2. 把已跟踪的文件添加到暂存区 3. 合并时把有冲突的文件标记为已解决状态 |
| git commit –m “xxx” [file] | 将暂存区的文件提交到本地库,-m 后面为修改的说明 |
3.2 命令操作
3.2.1 查看本地库状态

3.2.2 提交到暂存区
- 新建文件
vim b .txt - 查看本地库状态

检测到了文件,但是还无法追踪,使用add命令添加
- 使用 git add命令提交到暂存区

- 查看本地库状态

3.2.3 提交到本地库
- 使用
git commit <fileName>提交到本地库

提交时会要求填入备注为提交的任务做说明
- 使用
git commit –m “xxxx” [file]提交

3.2.4 将修改的文件提交到本地库
- 修改文件 b.txt

- 查看本地库的状态

追踪的文件发生了修改
- 提交修改
先add,再commit

- 查看本地库状态

3.2.5 忽略文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。
通常都是些自动生成的文 件,比如日志文件,或者编译过程中创建的临时文件等。
在这种情况下,我们可以创建一个名为 .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
无需记忆,只需要了解有这个功能
3.3 版本切换
3.3.1 常用命令
| 命令 | 作用 |
|---|---|
| git log | 以完整格式查看本地库状态(查看提交历史) |
| git log --pretty=oneline | 以单行模式查看本地库状态 |
| git reset --hard HEAD^ | 回退一个版本 |
| git reset --hard HEAD~n | 回退N个版本 |
| git reflog | 查看所有操作的历史记录 |
| git reset --hard [具体版本号,例如:1f9a527等] | 回到(回退和前进都行)指定版本号的版本, |
| git checkout – [file] | 从本地库检出最新文件覆盖工作区的文件(文件还没有提交到暂存区, 否则无效) |
| git reset [file] 或者 git restore –staged [file] | 从暂存区撤销文件 |
| git restore | 放弃在工作区的修改(还没有提交到暂存区) |
| git rm --cache [file] | 撤销对文件的跟踪. |
注意:
- 所有已经
commit的东西几乎总是可以恢复的- 未
commit的东西丢失后可能再也找不到
3.3.2 版本回退
作用:更新之后,希望回退到之前的修改版本
- 查看更新日志
git log

使用该命令观察日志比较混乱
- 单行简单格式查看
`git log --pretty=oneline

- 回退到历史版本
方式一:
git reset -hard HEAD^回退到上一个版本,如果想回退多个版本,就多加几个^,不适用版本太多的情况

方式二:
git reset --hard HEAD~n一次性回退多个版本

缺点:只能往前回退,回退后无法到达前进的版本
3.3.3 版本前进
- 查看所有操作的历史记录
git reflog

- 回退到指定的操作
·git reset --hard [具体版本号,例如:1f9a527等]

3.3.4 文件恢复
- 从本地库检出恢复
作用:当执行未提交操作时,不想保留现有的操作,想回到最新的版本状态
git checkout -- [file]

从暂存区撤回
当add一个文件到暂存区后,可以执行commit操作,也可以执行reset撤回操作!
查看暂存区情况

从暂存区回退
git reset HEAD [file]

3.3.5 删除操作
如果删除一个已经在版本库中的文件!
删除文件

虽然在windows中的文件系统已经没有了

但是 使用 git status查看版本库时,发现:

提示,使用git add/rm <file>命令来更新此次操作!

发现变成了绿色,提交已经成功!
②提交更新
然后执行,提交操作:

再次查看git status,发现完成了此次操作!
3.3.6 比较文件
减号和加号分别代表两个对比的文件!
3.3.6.1 将工作区中的文件和暂存区进行比较
git diff <file>

工作区追加内容为 bbbbb
3.3.6.2 将工作区中的文件和本地库当前版本进行比较
git diff HEAD <file>

删去了前面的字符
3.3.6.3 查看暂存区和本地库中最新提交版本的差别
git diff --cached <file>

对比的是暂存区和本地库中的区别,与工作区无关
4. Git工作机制
4.1 工作区、暂存区、本地库的理解
**工作区(Working Directory)?*就是你电脑本地硬盘目录
**本地库(Repository)?*工作区有个隐藏目录.git,它就是Git的本地版本库
**暂存区(stage)?*一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 图示:


4.2 Git目录

5. 分支
5.1 常用命令
| 命令 | 描述 |
|---|---|
| git branch [分支名] | 创建分支 |
| git branch -v | 查看分支,可以使用-v参数查看详细信息 |
| git checkout [分支名] | 切换分支 |
| git merge [分支名] | 合并分支; 将merge命令中指定的分支合并到当前分支上 例如:如果想将dev分支合并到master分支,那么必须在master分支上执行merge命令 |
| git branch –d[分支名] | 删除分支 |
| git checkout –b [分支名] | 新建并切换到当前分支 |
| git log --oneline --decorate --graph --all | 它会输出你的提交历史、各个分支的指向以及项目的分支分叉情况 |
5.3 分支概念
不使用分支,就是人与人之间协作;
使用分支,就是小组与小组之间的协作;
从主干中拉取分支,开发完成,将工作,合并到主干

5.4 查看分支
git branch -v

5.5 新建分支
git branch [分支名]

5.6 切换分支
git checkout [分支名]

5.7 合并分支
git merge [分支名]
如果在dev分支上面,对一个文件做了修改,这个时候master分支上面对应的文件是没有修改信息的。因此需要将分支合并!

5.7.1 冲突
- 在dev分支上修改a.txt后提交

- 切换到master分支上对a.txt进行修改

- 合并分支

出现合并冲突
原因分析:

目前master分支和dev分支都各自分别有新的提交,这种情况下,Git无法执行快速合并,只能试图把各自的修改合并起来,但是这种合并就会有冲突
5.7.2 解决冲突
vim a.txt
first head asd
aaaaaaa
aasdsad
asdasd
qweqwe
aaaaaa
bbbbbb
asdadw
<<<<<<< HEAD
this is a test2
=======
new dev test
this is a test
>>>>>>> dev
Git用
<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存,如删去关于指针和注释的说明实际情况上出现如下情况时一般都是需要具体的业务沟通来确认最终的保留情况
- 重新add,再commit

注意 此时提交时不能写具体的文件名
- 此时的合并情况

- 使用带参数的
git log查看分支的合并情况

5.5 删除分支
合并分支后,原来的dev分支完结就可以删除了
注意:必须切换到master,才能删除,不能自杀!

5.6 新建切换
上述的创建分支命令创建后不会跳转到相应分支,需要执行相应的跳转分支命令才会跳转,这里有一个简便的方式实现创建后跳转—新建切换
git checkout –b [分支名]

6.GitHub
6.1 概述
GitHub是一个Git项目托管网站,主要提供基于Git的版本托管服务。

6.2 本地库联通Github
- 生成密钥
命令:ssh-keygen
生成的密钥分为私钥和公钥,会保存在用户家目录的.ssh文件夹中。

其中,id_rsa是私钥,id_rsa.pub是公钥。
将公钥告诉github账户,相当于约定一个接头暗号!
- 进入github账户

将公钥密码复制到github的SSH keys
- 测试本地仓库和github的连通性
ssh -T git@github.com

.ssh文件夹中会多一个文件known_hosts,其中记录了连接的github的ip账号。
6.3 push
本地库推送到GitHub
①准备本地库
②在GitHub上创建一个仓库
③增加远程地址
git remote add <远端代号> <远端地址>
<远端代号> 是指远程链接的代号,一般直接用origin作代号,也可以自定义;
<远端地址> 默认远程链接的url
类似主机映射,给对应提交的git地址起一个别名

④本地库推送到远程库
git push -u <远端代号> <本地分支名称>
<远端代号> 是指远程链接的代号;
<分支名称> 是指要提交的分支名字,比如master;
我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

⑤查看远程分支
git remote –v

⑥如果此时本地库做了修改,那么查看:

发现当前的本地库比远程库新增了一些内容。

6.4 fetch
fetch命令可以从远程库获取更新,但是并不合并!
远程库已经更新,此时查看本地库的状态:

执行git fetch 命令,查看远程库的更新;

再查看git status

6.5 pull
本地库抓取远程库
如果远程库的版本新于当前库,那么此时为了使当前库和远程库保持一致,可以执行pull命令
git pull <远端代号> <远端分支名>
例 git pull origin master

查看有哪些本地库:

6.6 clone
实际的情况可能是刚开始做项目的时候,需要从远程库将项目先整到本机。
执行命令:git clone <远端地址> <新项目目录名>
<远端地址> 是指远程链接的地址;
<项目目录名> 是指为克隆的项目在本地新建的目录名称,可以不填,默认是GitHub的项目名;
命令执行完后,会自动为这个远端地址建一个名为origin的代号。
例 git clone https://github.com/user111/Helloworld.git hello_world

地址为相应项目的地址
6.7 解决冲突

尽量避免冲突:
1.尽量不要修改同一文件
2.如果许多个人修改同一文件,如工具类,最好的办法是找一个专人负责修改公共文件
3.每次写代码之前,先更新到最新版本,上班第一件事 先pull
4.上传代码之前,也要先pull,先把产生的冲突先解决,再上传解决冲突的方式:手动合并/自动合并

冲突原因:本地库的版本和远程库的版本都做了更新!
在推送之前,执行git fetch,发现远程库和本地库有版本变化。

查看git status

此时,建议先pull,将远程库的版本和本地库的版本merge后再push!
如果强行push,报错!

解决办法:先pull,pull的时候会发现报错冲突

因此开始解决冲突,编辑冲突文件!

编辑完成:

之后再推:

总结:pull----merge-----push
6.8 参与开源项目、邀请成员
- 在相关的项目设置中, 搜索要邀请的成员:

- 复制邀请连接,手动告知被邀请者:

- 被邀请者,登录自己的账号后,点击连接,接收邀请

6.9 fork
如果其他人,搜索到了你的项目,想对其做一些编辑时,必须先执行fork操作。
- 搜索感兴趣的项目

- fork到自己的远程库,fork到自己的github后,自己可以进行编辑!

- 将自己做的pull request给原作者,以等待原作者采纳!

- 原作者查看后,执行合并操作

- 确认没有冲突后,执行合并操作!

6.10 总结

7. 在IDEA中使用Git和GitHub
7.1 给idea配置git
点击 test, 如果显示 ok,则 idea 自动找到了当前操作系统安装的 git 程序.否则需要手动指定 git.ext 的位置

7.2 给idea配置github

7.3 把项目推送到github
会在本地初始化 git 仓库然后推送到 github



[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dYFwZAIm-1601521745667)(Git.assets\1592826958746.png)]
一般提交时 都不会提交这两个文件:
idea和filename.iml
.idea:是mudules的配置信息
.iml:是project的配置信息一般这两个参数与idea的环境有关,不同的机器的idea配置不同提交时一般也不会提交这两项信息
使用较多的按钮:



