Git介绍及常用命令详解
一、Git的概述
Git是一个分布式版本控制工具,通常用来对软件开发过程中的源代码文件进行管理。
Git 会跟踪我们对文件所做的更改,因此我们可以记录已完成的工作,并且可以在需要时恢复到特定或以前的版本。Git 还使多人协作变得更加容易,允许将多个人的更改全部合并到一个源中。
二、Git的常用命令
| 命令名称 | 作用 |
|---|---|
| git config --global user.name 用户名 | 设置用户签名 |
| git config --global user.email 邮箱 | 设置用户签名 |
| git init | 初始化本地库 |
| git status | 查看本地库状态 |
| git add 文件名 | 添加到暂存区 |
| git commit -m “日志信息” 文件名 | 提交到本地库 |
| git reflog | 查看历史记录 |
| git reset --hard 版本号 | 版本穿梭 |
2.1.设置用户签名
用法
git config --global user.name 用户名
git config --global user.email 邮箱


说明:“
签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。注意: 这里设置用户签名和将来登录 GitHub(或其他代码托管中心) 的账号没有任何关系。“
设置完成之后会在对应的用户下存在.gitconfig文件
2.2.初始化本地库
2.2.1.基本语法
git init

执行完成之后会出现.git文件,初始化成功

2.2.查看本地库状态
git status

2.3.添加暂存区
本地修改完的文件,需要添加到暂存区才可以提交本地仓库。
git add 文件名
或者
git add .

删除暂存区内容
git restore --staged 文件名
git rm --cached 文件名 (这是比较旧的命令)
区别:
git restore 恢复我此次的修改,我此次的修改不提交
git rm 是删除文件,就是本来仓库中已经有了这个文件,但是我把他删除
git restore --staged 文件名 : 将文件从暂存区撤出,但不会撤销文件的更改(我修改了文件,已经放到暂存区了,现在我不想将这次修改放到暂存区,可以使用 这个命令)
git restore 文件名 :将在工作区中的修改丢弃(需要被追踪,也就是也就被版本控制的文件才可以使用git restore命令
比如我已经把这个文件删掉了,那么我就可以使用这个命令放弃这个删除,但是如果我已经将删掉这个文件并且提交到暂存区之后,那么我需要先执行git restore --staged 文件名之后才可以执行这个命令)
git rm --cached命令与git rm命令都可以删除git版本库中的文件,但是两者之间有一些区别。
使用git rm -f 文件名 命令会将文件从版本库中删除,并且同时删除工作区中对应的文件。而使用git rm --cached 文件名命令会将文件从版本库中删除,但是不删除工作区中的对应文件。
1.git rm 会删除工作区中的文件;
2.git rm 会同时将删除的文件添加到暂存区;
【因此 git rm 相当于 rm + git add 两个命令】
【注意】 git rm 删除的文件必须是 没有经过修改的,也就是说必须要和当前版本库的内容一致的。
3.git commit 后,版本库中的此文件记录也会被删除。
如果git rm 文件 删除的文件和上一个版本库内容不一致,那么要执行删除,则会出现报错。
这时可以使用git rm -f 文件 进行强制删除
.git rm --cached 会删除暂存区中的文件,但是会保留工作区中的文件,并将此次删除提交到暂存区;
2.因此:文件从暂存区中删除掉,即不会被提交到版本库中,也就是说此文件被取消了版本控制。
3.注意 : --cached 参数 删除的文件必须是已经被追踪的文件,即之前被版本控制的文件
向暂存区告知本文件已经删除,但工作区却偷偷保留这个文件。于是commit后仓库就不会有这个文件,是为了用户本次不想上传某些缓存文件设立。

2.4.提交本地库
git commit -m "日志信息"

2.5.历史版本
查看提交记录
git refloggit log

git reset --hard 版本号
穿越回对应的版本号

Git 切换版本,底层其实是移动的 HEAD 指针,具体原理如下图所示。

指针指向对应的版本。
三、GIT分支操作
3.1.什么是分支

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

3.2.分支的好处
同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败
的分支删除重新开始即可。
3.3.分支的操作
| 命令名称 | 作用 |
|---|---|
| git branch 分支名 | 创建分支 |
| git branch -v | 查看分支 |
| git checkout 分支名 | 切换分支 |
| git merge 分支名 | 把指定的分支合并到当前分支上 |
3.3.1.查看分支
git branch -v

3.3.2.创建分支
git branch 分支名

3.3.3.切换分支
git checkout 分支名

3.3.4.合并分支
git merge 分支名
正常合并情况(没有出现冲突)

出现冲突情况进行合并
产生冲突原因:
合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git 无法替我们决定使用哪一个。必须人为决定新代码内容。“查看状态(检测到有文件有两处修改)“


这时需要手动进行合并分支
- 打开冲突文件

修改前:

修改后

保存之后添加暂存区
git add test4.txt
提交版本库
git commit -m "日志信息" (此时不能带文件名)

master、fix-bug 其实都是指向具体版本记录的指针当前所在的分支,其实是由 HEAD决定的。所以创建分支的本质就是多创建一个指针。“
HEAD 如果指向 master,那么我们现在就在 master 分支上。“HEAD 如果执行 hotfix,那么我们现在就在 hotfix 分支上。“所以切换分支的本质就是移动 HEAD 指针。
3.3.5.创建并切换分支
git checkout -b 分支名 // 新建 分支,并切换到该分支上

3.3.6.删除分支
当之前创建的分支,完成了它的使命,如 Bug 修复完,分支合并以后,这个分支就不在需要了,就可以删除它。
git branch -d 分支名 // 删除 分支

四、GIT团队协作机制
4.1.团队内协作

4.2.跨团队协作

五、GitHub操作
5.1.远程仓库操作
| 命令名称 | 作用 |
|---|---|
| git remote -v | 查看当前所有远程地址别名 |
| git remote add 别名 远程地址 | 起别名 |
| git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
| git clone 远程地址 | 将远程仓库的内容克隆到本地 |
| git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
5.2.创建远程仓库
使用github或者gitee

5.2.1.创建远程仓库别名
git remote -v 查看当前所有远程地址别名
git remote add 别名 远程地址



5.2.2.添加远程仓库
如果你已经有了一个本地仓库,然后你打算将它发布到远程,供其他人协作。那么使用:
git remote add origin your_remote_git_repo // 为本地仓库添加远程仓库

5.2.3.移除当前远程仓库
git remote rm origin //先移除之前的远程仓库

5.3.推送本地分支到远程仓库
git push 别名 分支
或
git push 远程仓库地址 分支
如果出现
fatal: refusing to merge unrelated histories
致命:拒绝合并不相关的历史记录
这是因为本地仓库与远程仓库存在不同的历史记录(不是同一个仓库)
解决方法:
在你操作命令后面加 --allow-unrelated-histories
如git pull 远程仓库地址 分支名 --allow-unrelated-histories

推送远程仓库

5.4.拉取远程库到本地库
git pull 别名 分支名
或
git pull 远程仓库地址 分支名
或
git fetch 别名 master
git fetch 和 git pull 之间的区别:
-
git fetch是仅仅获取远程仓库的更新内容,并不会自动做合并。 -
git pull在获取远程仓库的内容后,会自动做合并,可以看成git fetch之后git merge。 -
注意:建议多使用
git fetch。

5.5.克隆远程仓库到本地
git clone 远程仓库地址(克隆公开代码不需要登录)

git clone 克隆会做三件事
- 拉去远程代码
- 初始化本地仓库
- 创建别名origin
六、SSH免密登录
在对应运用命令生成.ssh密钥目录
ssh-keygen -t rsa -C 892640297@qq.com


生成.ssh文件

在gitee或者github上将公钥输入


之后就可以使用ssh进行项目的拉取以及推送。
七、自建代码托管平台-GitLab
官网地址:https://about.gitlab.com/
安装说明:https://about.gitlab.com/installation/
八、Git可能需要用到的命令
8.1.查看仓库中的具体修改
git diff // 查看版本库中所有的改动
git diff Readme.md // 查看具体文件的改动
很经常的,我们对某个文件做了修改,但过不久就忘记了。这时候就可以通过 git diff 来查看具体的修改内容。

8.2.版本回退
有了 git reflog 来查看提交的历史记录,我们就可以通过 git reset --hard 来回退到我们需要的特定版本,然后使用当时的代码进行各种操作。
git reset --hard HEAD^ // 回退到上一个提交版本
git reset --hard HEAD^^ // 回退到上上一个提交版本
git reset --hard 'commit_id' // 会退到 commit_id 指定的提交版本

8.3.撤销修改
撤销修改同样包括两方面的内容,由于仓库中的文件在提交之前,可能在工作区中,尚未在版本控制范围内,也可能在暂存区中。
8.3.1.丢弃工作区中文件的修改
git checkout -- Readme.md // 如果 Readme.md 文件在工作区,则丢弃其修改
git checkout -- . // 丢弃当前目录下所有工作区中文件的修改
注意: git checkout -- 中的 -- 是必须的。

8.3.2.丢弃已经进入暂存区的修改
git reset HEAD Readme.md // 将 Readme.md 恢复到 HEAD 提交版本的状态
git reset HEAD 文件名 // 将 文件 恢复到 HEAD 提交版本的状态

8.4.建立本地分支和远程分支的关联
在本地仓库中的分支和远程仓库中的分支是对应的。一般情况下,远程仓库中的分支名称和本地仓库中的分支名称是一致的。
有的时候,我们会需要指定本地分支与远程分支的关联。
git branch --set-upstream-to=origin/远程分支名 本地分支名

在zkt-git-test上的hello.txt文件中加入zkt-git-test之后,重新拉去,显示如下

git branch --set-upstream 'local_branch' origin/remote_branch
显示不再支持
--set-upstream已经过时,需要用 新的命令 --set-upstream-to

8.5.修改本地仓库对应的远程仓库地址
当远程的仓库地址发生变化时,需要修改本地仓库对应的远程仓库的地址。主要应用在[工程迁移]过程中。
git remote set-url origin 远程仓库地址

8.6.标签管理
在项目开发过程中,当一个版本发布完成时,是需要对代码打上标签,便于后续检索。获取处于其他的原因,需要对某个提交打上特定的标签。
8.6.1.创建标签
git tag -a 标签名 -m '备注信息' 'commit_id'
-a 参数指定标签名, -m 添加备注信息, ‘commit_id’ 指定打标签的提交(某个版本号)。
8.6.2.查看所有标签
git tag // 查看本地仓库中的所有标签
8.6.3.查看具体标签信息
git show 标签名

8.6.4.删除本地标签
如果打的标签出错,或者不在需要某个标签,则可以删除它。
git tag -d 标签名

8.6.5.推送标签到远程仓库
打完标签以后,有需要推送到远程仓库。
//推送单个标签到远程仓库
git push origin 标签名
//一次性推送所有标签到远程仓库。
git push origin --tags

8.6.6.删除远程标签
git push origin :refs/tags/标签名git push origin --delete 标签名git push origin :标签名

8.7.临时保存修改
在执行很多的 Git 操作的时候,是需要保持当前操作的仓库/分支处于 clean 状态,及没有未提交的修改。如 git pull, git merge 等等,如果有未提交的修改,这些将无法操作。
但是做这些事情的时候,你可能修改了比较多的代码,却又不想丢弃它。那么,你需要把这些修改临时保存起来,这就需要用到 git stash。
8.7.1.临时保存修改
临时保存修改,这样仓库就可以回到 clean 状态。
git stash // 保存本地仓库中的临时修改。
注意:可以多次的 git stash 来保存不同的临时修改。

保存之后,仓库回到clean状态,目前在工作区、暂存区的已经没有了,被暂时保存起来了。
8.7.2.查看临时保存。
当你临时保存以后,后面还是要取回来的,那它们在哪里呢?
git stash list // 显示所有临时修改

8.7.3.恢复临时保存
当我们处理完其他操作时,想要恢复临时保存的修改。
git stash apply // 恢复所有保存的临时修改
git stash pop // 恢复最近一次保存的临时修改

8.7.4.丢弃临时保存
我们后面觉得临时保存不想要了,那可以丢弃它。
git stash clear // 丢弃所有保存的临时修改

相关文章:
Git介绍及常用命令详解
一、Git的概述 Git是一个分布式版本控制工具,通常用来对软件开发过程中的源代码文件进行管理。 Git 会跟踪我们对文件所做的更改,因此我们可以记录已完成的工作,并且可以在需要时恢复到特定或以前的版本。Git 还使多人协作变得更加容易&…...
赛事 | 第25届中国机器人及人工智能大赛全国决赛榜单发布
第25届中国机器人及人工智能大赛成功举办 2023年6月13日至14日,第二十五届中国机器人及人工智能大赛于海南科技职业大学成功举办。大赛由中国人工智能学会主办,共有来自清华大学、哈尔滨工业大学、中国科学技术大学、西安交通大学等500多所高校进入全国…...
JavaScript+Asp.Net MVC5同时下载多个文件
前端同时启动多个下载任务(但是没有做压缩包下载) 前端JavaScript脚本: var idList [1,2,3];//要下载的列表 $.each(idList, function (index, item) {downloadURL("/File/GetPdf?id" item); });var count 0; var downloadUR…...
如何实现前后端分离-----前端笔记
本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系,将源码补充写的更快哦!!!等一会把源码补一下哦! 拿一个项目看…...
Ceph入门到精通-分布式存储产品的测试实践
分布式存储产品的测试实践 在分布式存储产品的测试过程中,测试到底做了些什么事情呢? 一:测试工作内容 需求,设计评审 测试需要参与到每一个过程中 在设计评审的时候就需要知道验收的标准,这是最重要的开始。因为这…...
【java】设计模式——单例模式
单例模式要点: 一个类只需要一个实例化对象;必须自行创建实例;必须自行向整个系统提供这个实例 实现: 只提供私有构造方法;有一个该类的静态私有对象;提供一个静态公有方法用于创建、获取静态私有对象&…...
【编织时空一:探究顺序表与链表的数据之旅】
本章重点 线性表 顺序表 顺序表OJ题 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结…...
Tesseract用OpenCV进行文本检测
我没有混日子,只是辛苦的时候没人看到罢了 一、什么是Tesseract Tesseract是一个开源的OCR(Optical Character Recognition)引擎,OCR是一种技术,它可以识别和解析图像中的文本内容,使计算机能够理解并处理…...
XLua案例学习
下载 xlua 之后把 asset 文件中的全部文件粘贴到项目文件Asset文件下,将tool粘贴到 asset 同级目录下 然后把 HOTFIX_ENABLE 宏打开 之后 编辑 lua 脚本 更改源代码之后先 Generate Code 然后 HotFix inject in Editor 开发过程: 首先开发业务…...
Linux:Shell编程之免交互
目录 绪论 1、here Document免交互 1.1 格式 1.2 cat结合免交互实现重定向输出到指定文件 1.3 变量替换 2、Expect免交互 2.1 三种写法 3、免交互实现普通用户切换root 3.1 send_user 4、接收参数 5、嵌入执行模式 6、ssh远程登录 绪论 免交互:不需要人…...
最强自动化测试框架Playwright(18)- 执行js脚本
page.evaluate() API 可以在网页上下文中运行 JavaScript 函数,并将结果带回 Playwright 环境。 href page.evaluate(() > document.location.href) 如果结果是 Promise 或函数是异步的,则计算将自动等待,直到解析…...
阿里云云主机_ECS云服务器_轻量_GPU_虚拟主机详解
阿里云云主机分为云虚拟主机、云服务器ECS、轻量应用服务器、GPU云服务器、弹性裸金属服务器、专有宿主机、FPGA云服务器、高性能计算E-HPC、无影云电脑等,阿里云百科来详细说下阿里云云主机详解: 目录 阿里云云主机 云服务器ECS 轻量应用服务器 云…...
[QT编程系列-41]:Qt QML与Qt widget 深入比较,快速了解它们的区别和应用场合
目录 1. Qt QML与Qt widget之争 1.1 出现顺序 1.2 性能比较 1.3 应用应用领域 1.4 发展趋势 1.5 QT Creator兼容上述两种设计风格 2. 界面描述方式的差别 3. QML和Widgets之间的一些比较 4. 选择QML和Widgets之间的Qt技术时,可以考虑以下几个因素ÿ…...
springboot 使用zookeeper实现分布式锁
一.添加ZooKeeper依赖:在pom.xml文件中添加ZooKeeper客户端的依赖项。例如,可以使用Apache Curator作为ZooKeeper客户端库: <dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</…...
ViewUI表格Table嵌套From表单-动态校验数据合法性的解决方法
项目场景: 项目需求:在表格中实现动态加减数据,并且每行表格内的输入框,都要动态校验数据,校验不通过,不让提交数据,并且由于表格内部空间较小,我仅保留红边框提示,文字…...
服务器安装Tomcat
下载Tomcat 下载地址在这: Tomcat官网 下载完成以后把压缩包上传到服务器中(我传到了www/java),进行解压(解压到),如果没有进行指定解压到哪里,默认是到root文件夹中 tar -zxvf /www/java/apache-tomcat-9.0.103.tar.…...
【Apollo】自动驾驶的平台背景,平台介绍
作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖…...
docker 安装与配置
一、 环境准备 IP主机名操作系统版本docker版本192.168.168.128master01CentOS Linux release 7.9.2009 (Core)docker-20.10.15.tgz 二、安装 # 安装包获取 cd /root wget -c https://download.docker.com/linux/static/stable/x86_64/docker-20.10.15.tgz [rootmaster01 ~]…...
Titanic--细节记录三
目录 image sklearn模型算法选择路径图 留出法划分数据集 ‘留出’的含义 基本步骤和解释 具体例子 创造一个数据集 留出法划分 预测结果可视化 分层抽样 设置方法 划分数据集的常用方法 train_test_split 什么情况下切割数据集的时候不用进行随机选取 逻辑回归…...
k8s-----集群调度
目录 一:调度约束 二:Pod 启动创建过程 三:k8s调度过程 1、Predicate 有一系列的常见的算法 2、常见优先级选项 3、指定调度节点 (1)nodeName指定 (2)nodeSelector指定 四:亲和…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
