Git&GitHub

什么是Git

Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容。

版本控制

开发过程中使用版本控制思想管理代码的版本迭代。

集中式版本控制

以SVN为例,开发人员是客户端,文件和版本信息是存放在服务器上的,所以我们是跟服务器进行交互的。

Git&GitHub_第1张图片

缺点
如果服务器一旦宕机、损坏,那所有的数据都会丢失,我们将其称之为单点故障

分布式版本控制

以Git为例,它是从本地就可以进行完整的版本控制。

Git&GitHub_第2张图片
任何一个人都可以把数据传给别人,那样就算自己的数据丢失,也可以从别人的电脑上恢复,这样就可以有效的避免单点故障。

Git的优势

  • 大部分操作在本地完成,不需要联网
  • 使用了hash算法,保证了完整性
  • 尽可能添加数据而不是删除或修改数据
  • 分支操作非常快捷流畅
  • 与 Linux 命令全面兼容

Git结构

Git&GitHub_第3张图片

  • 新创建的文件必须添加到暂存区之后,才可以提交,在暂存区时可以撤回。
  • 修改完已创建的文件则可以直接提交,但是因为越过了暂存区,所以无法撤回。

托管中心

维护远程库

局域网环境下

  • Gitlab服务器

外网环境下

  • GitHub
  • 码云

本地库和远程库

团队内部协作

Git&GitHub_第4张图片

跨团队协作

Git&GitHub_第5张图片

Git命令行操作

本地库初始化

git init

Git&GitHub_第6张图片
注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要随意修改。

设置签名

git config [选项] user.name tom_pro
git config [选项] user.email [email protected]

选项: 
空 代表项目级别
--global 代表系统用户级别

项目级别信息保存的位置,切换到当前目录,执行以下命令
cat .git/config

全局级别信息保存的位置
cat ~/.gitconfig

项目(仓库)级别

  • 仅在当前本地范围内有效

系统用户级别

  • 登录当前操作系统的用户范围

优先级:项目(仓库)级别 > 系统用户级别

基本操作

查看工作区、暂存区的状态
git status

将工作区的“新建/修改”添加到暂存区
git add [file name]

将暂存区的内容提交到本地库
git commit -m "commit message" [file name]
查看含当前版本之前的历史记录
git log [选项]

选项:
空 详细信息
--pretty=oneline 列表
--=oneline 精简Hash值的列表

查看所有回退、前进的历史记录
git reflog 

HEAD@{
     移动到当前版本需要的步数}

前进后退

基于索引值操作【推荐】

git reset --hard 局部索引值

后退

一个^表示后退一步,n个^表示后退n步
git reset --hard HEAD^

表示后退n步
git reset --hard HEAD~n

reset命令的三个参数对比

–soft
仅仅在本地库移动HEAD指针
–mixed
在本地库移动HEAD指针
重置暂存区
–hard
在本地库移动HEAD指针
重置暂存区
重置工作区

删除文件并找回

  • 前提:删除前,文件存在的状态提交到了本地库

  • 删除文件之后,提交暂存区,再提交到本地库,只需要回退到文件存在的版本,即可找回已删除的文件

  • 删除文件之后,只提交到了暂存区,未提交到本地库只需要使用以下命令即可恢复

git reset --hard HEAD

比较文件

将工作区中的文件与缓存区进行比较
git diff [文件名]

将工作区中的文件和本地库的历史记录比较
git diff [历史索引] [文件名]

不指定文件名可比较当前工作区中所有的文件
git diff HEAD 

分支管理

在版本控制中,使用多条线同时推进多个任务

Git&GitHub_第7张图片

hot_fix:临时分支,专门用来修复Bug,修复完之后会合并到主干上
master:主干
feature_bluefeature_game:从主干复制出来的其它分支,可以与主干同时开发,不会互相影响,最终都会合并到主干上

分支的好处

  • 同时并行推进多个功能开发,提高开发效率
  • 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。

分支操作

创建分支
git branch [分支名]

查看分支
git branch -v

切换分支
git checkout [分支名]

合并分支
	第一步:切换到接受修改的分支(被合并,增加新内容)上
		git checkout [被合并分支名]
	第二步:执行merge命令
		git merge [有新内容分支名]

解决冲突

  • 冲突的表现

Git&GitHub_第8张图片

冲突的解决
	第一步
		编辑文件,删除特殊符号
	第二步
		把文件修改到满意的程度,保存退出
	第三步
		git add [文件名]
	第四步
		git commit -m "日志信息"
		(注意:此时commit一定不能带文件名)

Git原理

哈希

哈希算法也叫安全散列函数,又称信息摘要,它可以把任意的信息集,用非常简单的信息予以描述。

各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点

  1. 不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
  2. 哈希算法确定,输入数据确定,输出数据能够保证不变
  3. 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
  4. 哈希算法不可逆

Git底层采用的是SHA-1算法

哈希算法也可以用来验证文件
Git&GitHub_第9张图片
Git就是靠这种机制来从根本上保证数据完整性的

Git保存版本的机制

集中式版本控制工具的文件管理机制

以文件变更列表的方式存储信息,这类系统将它们保存的信息看作是一组基本文件和每个文件随时逐步累积的差异。

Git的文件管理机制

Git把数据看作是小型文件系统的一组快照,每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引,为了高效,如果文件没有修改,Git将不再重新存储该文件,而是会创建一个指针指向之前存储的文件,所以Git的工作方式可以称之为快照流。
Git&GitHub_第10张图片
之所以会形成历史记录就是因为各个版本之间的父子关系

Git分支管理机制

分支的创建

就是创建了一个指针

分支的切换

就是切换了指针指向的位置

Github

项目上传至Github

1. 首先在Github上新建一个仓库,获取到仓库地址
	例:https://github.com/UnityAlvin/book.git

2. 创建一个README文件
	echo "# book" >> README.md

3. 初始化工作区
	git init

4. 将工作区所有文件上传到暂存区
	git add .

5. 提交
	git commit -m "first commit"

6. 保存仓库地址到本地
	git remote add origin https://github.com/UnityAlvin/book.git
	
7. 上传
	git push -u origin master

克隆

git clone git地址

效果

  • 完整的把远程库下载到本地
  • 创建origin远程地址别名
  • 初始化本地库

团队成员邀请

Git&GitHub_第11张图片
Git&GitHub_第12张图片
将复制的链接发给被邀请人,让被邀请人打开。
Git&GitHub_第13张图片

远程修改的拉取

拉取
git fetch [远程库地址别名] [远程分支名]

查看 拉取的文件
git checkout [远程库地址别名/远程分支名]

合并
git merge [远程库地址别名/远程分支名]

拉取+合并
git pull [远程库地址别名] [远程分支名]
  • 复杂的文件,建议先拉取,查看没问题之后,再进行合并
  • 简单的文件建议直接pull

协同开发时冲突的解决

  • 如果不是基于GitHub远程库的最新版所做的修改,不能推送,必须先拉取。
  • 拉取下来后如果进入冲突状态,则按照“分支解决冲突”操作解决即可。

跨团队协作

  • Fork
    Git&GitHub_第14张图片
    Git&GitHub_第15张图片
    Git&GitHub_第16张图片
  • 本地修改,然后推送到远程
  • Pull Request
    Git&GitHub_第17张图片
    在这里插入图片描述
    在这里插入图片描述
    Git&GitHub_第18张图片
    Git&GitHub_第19张图片
  • 对话
    Git&GitHub_第20张图片
  • 审核代码
    Git&GitHub_第21张图片
  • 合并代码
    Git&GitHub_第22张图片
    Git&GitHub_第23张图片
  • 将远程库修改拉取到本地

SSH登录

1. 进入当前用户的家目录
	cd ~

2. 删除.ssh 目录
	rm -rvf .ssh

3. 运行命令生成.ssh 密钥目录
	ssh-keygen -t rsa -C 用户名
	注意:这里-C这个参数是大写的 C
	
4. 进入.ssh 目录查看文件列表
	cd .ssh
	ls -lF
	
5. 查看 id_rsa.pub 文件内容
	cat id_rsa.pub
	
6. 复制 id_rsa.pub 文件内容,登录 GitHub,点击用户头像→Settings→SSH and GPGkeys

7.  New SSH Key

8. 输入复制的密钥信息

9. 然后在GitHub→Clone Code的地方,选择Use SSH,复制SSH的远程地址

10. 回到 Git bash 创建远程地址别名
	git remote add origin_ssh [email protected]:UnityAlvin/book.git
11. 测试
	git commit -m "test ssh login" book.sql
	第一次执行后,需要输一次回车 

在IDEA中使用Git

配置Git

Git&GitHub_第24张图片

配置GitHub

配置账户

Git&GitHub_第25张图片

日常使用

初始化

创建Git仓库,位置选择当前项目根目录,完成后,文件名会变成褐色
Git&GitHub_第26张图片

忽略一些不需要提交的东西

修改.git\info\exclude
添加需要忽略的配置
已忽略的文件在IDEA中会置灰

Git&GitHub_第27张图片

添加到缓存区

右键项目→Git→Add,完成后,文件名会变绿

提交到本地库

右键项目→Git→Commit Directory
或者点击工具栏按钮,完成后,文件名会变回默认的颜色

Git&GitHub_第28张图片
添加注释内容后提交

Git&GitHub_第29张图片

版本切换

  1. 在模块上右键或者点击工具栏查看历史

在这里插入图片描述
2. 选择要切换的版本

Git&GitHub_第30张图片
3. 右键→Copy Revision Number.

Git&GitHub_第31张图片
4. 在模块上右键

在这里插入图片描述
5. 选择 Hard 并粘贴版本号

Git&GitHub_第32张图片

  1. 版本切换成功

Git&GitHub_第33张图片

创建分支

  1. 在模块上右键

Git&GitHub_第34张图片

  1. 点击New Branch

Git&GitHub_第35张图片

  1. 给新分支命名

Git&GitHub_第36张图片

  1. 点击Create后自动切换新分支

  2. 在新分支添加新的代码并提交

Git&GitHub_第37张图片

合并分支

  1. 在模块上右键切换到主干

Git&GitHub_第38张图片
Git&GitHub_第39张图片

  1. 在模块上右键选择合并改变

Git&GitHub_第40张图片

  1. 选择要合并的分支

Git&GitHub_第41张图片

  1. 合并成功

Git&GitHub_第42张图片

解决冲突

让主干和分支在同一个位置添加一行代码

  1. 分支添加内容,并添加到暂存区和本地库

Git&GitHub_第43张图片

  1. 主干添加内容,并添加到暂存区和本地库

Git&GitHub_第44张图片

  1. 在主干合并分支内容,出现冲突
    误关闭也可以在Git→Resolve Conflicts打开

Git&GitHub_第45张图片

  1. 选择合并,出现处理窗口

Git&GitHub_第46张图片

  1. 处理之后

Git&GitHub_第47张图片
6. 点击 Apply

Git&GitHub_第48张图片

上传本地库(适用HTTPS与SSH)

  1. 在 GitHub 网站上创建仓库

Git&GitHub_第49张图片

  1. 复制仓库地址

Git&GitHub_第50张图片

  1. 在 Idea 中的模块上右键

Git&GitHub_第51张图片

  1. 设置远程地址别名

Git&GitHub_第52张图片

  1. 点击 Push 推送到 GitHub 仓库

Git&GitHub_第53张图片

  1. 上传成功

Git&GitHub_第54张图片

更新本地库

正常情况下是合作伙伴上传新的代码到 GitHub,如果此时本地库不更新将无法上传

  1. 为了演示,直接在GitHub上在线修改了一个文件
  2. Idea 中的本地库也修改文件、添加到暂存库、添加到本地库,然后上传,发现上传被拒绝

Git&GitHub_第55张图片

  1. 此时点击 Merge 或 Rebase 都可以实现本地库与远程 GitHub 的同步
  2. 也可以点击 Cancel 之后通过以下方式更新本地库

Git&GitHub_第56张图片

  1. 点击 Pull 将 GitHub 上最新的代码合并都本地库

Git&GitHub_第57张图片

  1. 点击 Pull 之后更新本地库成功

Git&GitHub_第58张图片

从 GitHub 上克隆项目到本地

  1. 点击 Idea 中的 CVS 选项

Git&GitHub_第59张图片

  1. 输入 GitHub 中的仓库地址并指定项目的存放路径

Git&GitHub_第60张图片

  1. 提示是否为克隆的项目创建一个新工程

在这里插入图片描述

  1. 点击 Yes 弹出导入工程的提示框

Git&GitHub_第61张图片

  1. 点击 Finish 之后在 Idea 中显示的是一个空工程

Git&GitHub_第62张图片

  1. 需要为新工程配置一下 JDK、导入 Module等等

Git&GitHub_第63张图片

Git&GitHub_第64张图片

  1. 克隆成功

Git&GitHub_第65张图片

你可能感兴趣的:(Git,git,github)