GitGit

Git

1. 版本控制

1. 简介

版本控制:是一种记录文件内容变化,将来可以查阅特定版本内容的系统

主要作用:

  • 可以将文件恢复到之前的状态

  • 可以比较文件内容的变化细节

  • 查出最后是谁修改了哪个地方,从而找到出现问题出现的原因

2. 3种版本控制系统

历史上大致出现了3种版本控制系统:本地版本控制、集中式版本控制、分布式版本控制

1. 本地版本控制

本地版本控制:其实就是复制整个项目目录,然后改名加上备份时间用于区别。

  • 唯一的好处:简单,

  • 坏处:

    • 但是特别容易犯错, 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖文件

    • 多个开发者无法共享文件

2. 集中式版本控制

集中式版本控制:有一个集中管理文件的服务器,保存所有文件的历史版本,称之为:远程仓库

  • 所有人员都通过客户端连到这台服务器,取出最新的文件或者提交更新,比如:

这样可以解决多个开发者协同工作的问题,但是它也有一些弊端:

  • 单点故障:服务器宕机,所有人无法使用;硬盘损坏且没有备份,将丢失所有数据

  • 必须联网才能工作:受网络状况、带宽影响

代表作:SVN

3. 分布式版本控制

分布式版本控制:它的客户端从远程仓库把代码完整地复制下来,搞一个本地仓库

上图,一共有3个代码仓库

好处:

  • 任何一处协同工作用的服务器发生故障,事后都可以用任何一个本地仓库恢复

  • 不用联网就可以工作,也可以提交文件到自己本地,因为每个人都有完整的版本库

  • 也有一台"中央服务器",用来"交换"大家的修改,没有它大家一样干活,只是交换修改不方便而已

  • 可以说是 本地和集中式 的合体

代表作:Git

2. Git

1. 介绍

Git:一款免费、开源的分布式版本控制系统,官网:https://git-scm.com/

工作流程如下:

  1. 从远程仓库中克隆 Git 资源作为本地仓库;

  2. 从本地仓库中checkout代码然后进行代码修改;

  3. 提交代码到暂存区

  4. 提交到本地仓库(本地仓库保存着文件的各个历史版本)

  5. 在需要和团队成员共享代码时,可以将修改代码push到远程仓库

Git的历史:

Git 是 Linux 开源社区推出的,Linux 内核有很多人参与开发,这就导致:

  • 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)

2002 年,整个项目组开始启用分布式版本控制系统 BitKeeper 来管理和维护代码

2005 年,开发 BitKeeper 的商业公司同 Linux 开源社区的合作关系结束,他们收回了免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区不得不吸取教训,开发一套属于自己的版本控制系统

利纳斯团队在编写git时,有一些要求:

  • 要求速度

  • 要求简单的设计

  • 要求对非线性开发模式的强力支持(允许上千个并发开发的分支)

  • 要求完全分布式

  • 要求有能力高效管理类似linux内核一样的超大规模项目

2. 核心概念

  • Workspace: 工作区,就是平时存放项目代码的地方

  • Index / Stage: 暂存区,用于临时存放文件的改动

  • Repository: 仓库(或版本库),就是安全存放文件的位置,这里面把汗所有版本数据

    • 其中HEAD指向最新放入仓库的版本
  • Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

3. 下载安装配置

下载

安装

上图,第二个选项下面有个 NEW! ,说很多团队已经重命名他们的默认主干名为 main . 这是因为2020 年非裔男子乔治·弗洛伊德因白人警察暴力执法惨死而掀起的 Black Lives Matter(黑人的命也是命)运动,很多人认为 master 不尊重黑人,呼吁改为 main

之后就是一路 next

安装完成后,在桌面上点击鼠标右键可以看到

基本配置
  • git config --global user.name xxx:设置git全局用户名(名称自定义)

  • git config --global user.email xxx:设置 git 全局邮箱 (邮箱自定义)

现在是本地仓库的配置,这里随意设置,不会影响使用。

如果这里忘记了配置也没关系,因为后续使用的时候,会抛出异常,提示执行这两个指令。

但是,等连接到远程仓库之后,这两个值,需要设置为远程仓库的用户名和邮箱。

在git的命令行中,没有盘符概念。D盘被当做了文件夹。

这个理念是延续了Linux,在Linux系统中,是没有分区和盘符概念的。

4.git操作的三个区

  • 工作区

    • 程序员写代码的地方,就是工作空间
  • 暂存区

    • 代码暂存的地方

    • 主要是为了解决git的误操作。

    • 当我们需要提交代码时,需要先将代码提交到暂存区,然后从暂存区再提交到本地仓库

  • 本地仓库

    • 本地存储代码的地方

    • 对于不同的提交生成不同的版本号,用于版本管理

5 基本使用

Linux系统中,是没有盘符概念的.所以,win中的盘符,变成了文件夹

"/"一直表示根路径

选择一个文件夹,用来存放代码

  • git init

此命令表示初始化git,这个命令会生成一个.git的文件(隐藏文件),并且这个命令会创建暂存区和本地仓库区

  • git add

这个命令是表示将文件从工作区提交到暂存区

复制代码
git add HelloWorld.java   将指定的文件添加到暂存区
git add 文件夹名称          将指定的文件夹下的所有的文件一次性添加到暂存区
git add *.java             将后缀名是java的文件全部添加到暂存区
​
添加当前文件夹下的所有的文件
git add --all             
git add -A
git add .
  • git status

    • 如果忘记配置个人信息,会有异常提示

可以查看文件的状态

如果文件的名称颜色是红色,就是代表还没有提交到暂存区

如果文件的名称颜色是绿色,代表已经提交到了暂存区,但是还没有到本地仓库

  • git commit

这个命令是指把暂存区没有提交过的内容提交到本地仓库,不会提交工作区的

首次提交时需要设置邮箱号和名称

复制代码
git config --global user.email "you@example.com"
git config --global user.name "Your Name"

提交的时候使用的是

git commit -m "版本信息"

如果只执行 git commit 会提示这个错误

复制代码
git commit -m "首次提交" 文件名
  • git config

配置邮箱号和用户名称

复制代码
git config --global user.email "you@example.com"
git config --global user.name "Your Name"

查看配置信息

复制代码
git config --list
  • git log

查看提交的日志

注意:只有commit时,才会生成日志

  • git log --oneline

日志显示一行,只查看简短的日志

  • 其它
复制代码
快速把文件从工作区提交到本地仓库。但是前提提交是这个文件已经被添加过了。
git commit -a -m "提交信息"
​
修改最后一次提交的信息
git commit --amend -m "提交信息"

6 进阶指令

  • git diff

git diff 文件名: 将工作区中的文件和暂存区进行比较

git diff HEAD 文件名: 将工作区中的文件和本地库当前版本进行比较

git diff --cached 文件名: 查看暂存区和本地库最新提交版本的差别

复制代码
git diff 版本号 版本号  比较两个版本之间的不同
  • git reset
复制代码
git reset --hard 版本号   :重置仓库区和暂存区和工作区(掌握)
git reset --soft 版本号   :重置仓库区(不掌握)
git reset --mixed 版本号  :重置仓库区和暂存区(不掌握)
  • git reset --hard

    • 回退上个版本:git reset --hard HEAD^

    • 如果想回退多个版本,就多加几个^

    • git reset --hard HEAD~n ,n:表示回退多少步

    • 注意:是把该仓库内的所有文件都回退,慎重使用

    • 如果仅仅是要把某个文件回退到指定版本:

      • 找到这个文件想要回退的版本

      • 复制它的代码,粘贴过来,然后提交

  • git reflog

    • 查看所有提交、回退记录
  1. 删除操作

在目录中把 daji.txt 删除,这时候硬盘上虽然没有了,但是:

需要使用 git add daji.txt 或 git rm daji.txt 来更新操作,比如:

最后执行:git commit -m "xxx" daji.txt

7 分支

git 分支:其实就是代码副本

实际工作中一个项目至少有2个分支:主分支(master)、开发分支

  • 最初两个分支的代码一样

  • 开发时,主分支的代码保持不变,主要修改开发分支

  • 修改到一定程度(测试完成),就把开发分支上的代码合并到主分支

操作
  • 创建分支
复制代码
git branch   分支名
  • 进入(切换)分支
复制代码
git checkout 分支名
  • 创建并且直接进入
复制代码
git checkout -b 分支名
  • 查看当前所在的分支
复制代码
git branch

注意:当前分支前面有个*
  • 查看分支最新一次提交
复制代码
git branch -v:查看分支最新一次提交
  • 分支合并
复制代码
git merge 分支名

注意:合并分支 要在主分支上操作 ,把分支上的代码合并到主分支上

  • 删除分支
复制代码
git branch -d 分支名

注意:不能在当前分支下删除当前分支

注意:不能删除主分支

3. Gitee

1. 介绍

Gitee :也叫:码云, 是开源中国推出的代码托管平台,提供免费的私有仓库托管

  • gitee和github基本一样,都是开源网站,可以帮助所有用户管理自己或者团队的代码,只是gitee是国内网站,github是全球最大的开源网站,虽然资源多,但全是英文而且有时候不稳定

网址:https://gitee.com

==注册并登录==

2. 创建远程仓库

  • 完善信息

注意:只有认证手机号后,才能创建 '开源'项目

3. 推送本地项目到远程

  • 添加远程仓库地址
复制代码
git remote add origin https://gitee.com/coooola/test1.git
  • 推送本地仓库到远程仓库
复制代码
git push -u origin "master"
测试:从远程仓库下载代码

4. 其他命令

1. 查看配置的远程仓库

git remote -v:查看配置的远程仓库

2. 提交更新

这时如果再次修改本地文件并提交到本地仓库,执行:git status

3. fetch

fetch:从远程库获取更新,但并不合并

4. pull

如果远程库的版本高于本地库,可以执行 pull 命令进行更新

执行: git pull origin master 表示拉取远程仓库的master分支,对本地进行更新

5. clone

实际开发中,一般都是从远程仓库拉取项目到本地,这时就要用到 clone 命令

格式:git clone <远端仓库地址>

比如:git clone https://gitee.com/coooola/test1.git

在一个新的文件夹中打开 Git Bash Here,执行指令

6. 解决冲突

当本地仓库文件版本跟远程仓库版本不一致时会产生冲突

测试:修改远程仓库中文件,本地不更新的情况下,再修改本地仓库同一个文件,制造冲突代码

本地提交之后,推送代码到远程仓库(git push -u origin master),会报异常

解决方案:

复制代码
先执行 git pull  更新代码
本地合并
本地提交
推送到远程仓库

4. idea 集成

如果此时已经打开了idea ,需要你退出重启一下

只有重新启动之后,才能识别最新安装的git客户端

1. idea 中配置 git

如果打开idea之后,安装git,是检测不到的,需要重启idea

2. 从远程仓库拉取代码

3. 切换分支

4. 提交本地项目

选中当前工作空间为 工作区

选择后,文件改变颜色

.gitignore文件

.gitignore文件:是忽略文件,配置在里面的文件不用被 git 管理

提交文件

(红色文件是本地未add到缓存区的)

(绿色文件已经add到缓存区,未commit到本地仓库的)

新建文件之后提示

提交完成之后,文件颜色变正常

推送到远程
提交&推送

5. 从远程更新文件

代码冲突
  • 当代码重提时,提交代码有如下提示:
  • 然后 pull 代码
  • 结果:
  • 合并

  • 再次推送

    合并后直接 push

5. 分支合并

工作中,一般是在开发分支上修改代码,测试成功后再合并到主分支上

1. 创建开发分支

2. 修改开发分支代码

修改文件后 push 到远程:

3. 创建合并请求

把 dev 分支的代码合并到 master 上,需要创建合并请求:

上图,一般创建合并请求后都需要领导审核代码,然后才能真正的合并

相关推荐
又是忙碌的一天2 小时前
Myvatis 动态查询及关联查询
java·数据库·mybatis
没有bug.的程序员2 小时前
Sentinel 流控原理深度解析:构建高可用微服务的底层架构
java·算法·微服务·云原生·架构·sentinel·负载均衡
秋邱2 小时前
Java数组与二维数组:创建、初始化、遍历与实操案例全解析
java·开发语言
独自破碎E2 小时前
消息队列如何处理重复消息?
java·开发语言·rocketmq
a程序小傲3 小时前
得物Java面试被问:Fork/Join框架的使用场景
java·开发语言·面试
伯明翰java3 小时前
Java多态
java·开发语言
秋邱3 小时前
Java String家族全解析:String底层原理、常用方法与StringBuffer/StringBuilder区别
java·开发语言
糕......3 小时前
Java集合框架全解析
java·开发语言·网络·学习·list
okseekw3 小时前
深入理解Java注解:从自定义到实战应用
java·后端