更直观地学习 Git 命令
前言
本文参考于 Learn Git Branching 这个有趣的 Git 学习网站。
在该网站,可以使用 show command
命令展示所有可用命令。
直接访问网站的sandbox。
本地篇
基础篇
git commit
git commit
将暂存区的修改提交到本地版本库并创建一个新的提交,新提交会指向前一个提交。
git commit -m "C2"
main
分支是默认主分支。*
表示当前分支所在,也是HEAD
指针指向。我们的提交记录会提交到当前分支。
直接运行git commit
会打开Git
默认编辑器。
git branch
git branch
在此前工作的基础上创建新的分支来指向当前的提交,以此来进行新的工作。
创建一个名为newImage
的分支:
git branch newImage
*
号依然位于main
,说明当前分支仍然是main
。
使用以下命令切换到新分支上:
git checkout newImage
Git 2.23 版本引入了 git switch <branch-name>
命令来取代 git checkout
命令众多功能中的切换分支功能。
最后,git branch <branch-name>
和git checkout <branch-name>
可以合并为一条命令:
git checkout -b <branch-name>
git merge
在新建分支开发完新功能或修复完 Bug 后,我们可以将其合并回主分支。
合并bugFix
分支到main
分支:
git merge bugFix
非快进合并
可以看到,合并分支时创建了新提交,新提交的parent
提交是两个分支合并之前的最新提交。
再把main
分支合并到bugFix
:
git switch bugFix
git merge main
快进合并(Fast Forward)
git rebase
git rebase
是另一种分支合并的方式,称为变基,具体是把一系列的提交记录复制到另一个地方。
使用git rebase
可以使得提交历史更加线性。
git rebase main
git rebase main
将当前分支(*
所在)bugFix
从与main
分支的公共祖先提交部分开始的提交记录复制到以main
分支的最新提交为起始的地方,但复制不是真的复制,是解决冲突后的复制,如图复制后的C3'
提交已经与原提交C3
不同了。
git rebase main
中的main
就是基分支,bugFix
就是变基分支。
高级篇:在提交树上移动
HEAD 简介与 HEAD 分离
HEAD 是一个指针,通常指向当前分支名,偶尔也会指向当前提交。
git checkout C1 # 切换到 C1 提交
git checkout main # 切换到 main
git commit -m "C2" # HEAD 指向的 main 指向 C2
git checkout C2 # 切换到 C2 提交
像git checkout C1
这样将 HEAD 指针指向提交C1
的行为称为 HEAD 分离(Detached HEAD)。分离前,HEAD 指向的是分支引用 main
。
git checkout C1
中的C1
其实是提交的HASH
值。
查看提交记录的哈希值
git log
HASH 值很长,但我们只需要其前面几位可以唯一标识提交的即可,例如63dbb453fbae3d151622f4e91d3aadf90069552d
我们取63dbb
。
查看 HEAD 指向
cat .git/HEAD
如果 HEAD 指向引用而非提交,也可以像下面查看 HEAD 指向:
git symbolic-ref HEAD
相对引用
前文使用 HASH 值来指定提交记录,这也叫做直接引用,难免不方便,Git 提供了相对引用的方式来指定提交:
<branch-name>^
:branch-name
指向的提交的上一个提交。<branch-name>^^
:branch-name
指向的提交的前面第二个提交。<branch-name>~~<num>
:branch-name
指向的提交前面第num
个提交。
git checkout main^
强制修改分支位置
除了切换分支,相对引用用的最多的地方是移动分支。
git branch -f main HEAD~3
如果要移动的分支不存在会自动创建。
撤销变更
git reset
git reset
回退到直接引用或相对引用指向的提交记录,之后的提交记录就撤销了。
git reset HEAD^
C2
提交被reset
后,就不存在于本地版本库中,但是其变更还在,只不过处于未暂存状态。
git reset
只对本地分支有效,无法回退远程分支。
进行git reset
后,如果进行推送,Git 会提示远程仓库较新需要git pull
,你的代码被远程仓库覆盖。如果想要回退生效,则需要追加-f
进行强制推送。
git revert
reset 英文意思有“复位”。
revert 英文意思有“恢复”。
git revert
会创建新提交来撤销更改,它与待撤销提交的前面某个提交内容是相同的。
git revert HEAD
移动提交记录
git cherry-pick
git chery-pick
用于把一些提交复制到当前提交(HEAD
)的下面。
git cherry-pick C2 C4
交互式 rebase
git rebase
后追加 --interactive
或 -i
选项会打开一个窗口(你配置的编辑器)显示将要被复制到目标分支的提交的哈希值和提交说明。
一个打开的示例窗口如下:
pick 63dbb45 2# Rebase 88e2af2..63dbb45 onto 88e2af2 (1 command)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
# commit's log message, unless -C is used, in which case
# keep only this commit's message; -c is same as -C but
# opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# create a merge commit using the original merge commit's
# message (or the oneline, if no original merge commit was
# specified); use -c <commit> to reword the commit message
# u, update-ref <ref> = track a placeholder for the <ref> to be updated
# to this position in the new commits. The <ref> is
# updated at the end of the rebase
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
使用git rebase
经常会遇到要解决冲突的情况,解决冲突后,执行git add
和git rebase --continue
。
杂项
只复制一个提交
有时候,我们开发完一个功能,需要与主分支进行合并时,会希望只合并我想要的那个提交。
我们知道,使用git merge
的合并有快进合并和非快进合并两种。但是这两种合并会将我们不需要的提交也包含在主分支中。
这时候,我们可以使用git cherry-pick
或git rebase -i
来完成。
如上图,我想要将修复问题后的提交bugFix
合并到main
。
如果使用git merge
:
git checkout main
git merge bugFix
这使得主分支 main 中就包含了 C2、C3 这些提交。
使用git cherry-pick
:
git checkout main
git cherry-pick C4
git branch -f bugFix main
修改前面的提交但不在主分支创建新提交1
这样做就唯一的问题就是要进行两次排序,而这有可能造成由 rebase 而导致的冲突。
修改前面的提交但不在主分支创建新提交2
git checkout main
git cherry-pick C2
git commit --amend
git cherry-pick C3
git tag
git tag
为提交记录打上标签,它可以像分支一样引用,但不会像分支一样移动。
git tag V1
git tag V2 C0
git describe
git describe
查找离指定引用最近的标签。
git describe <ref>
输出格式:<tag>_<numCommits>_g<hash>
。
高级话题
多次 rebase
git checkout another
git rebase side
git rebase bugFix
git rebase main
git branch -f main another
相对引用^
中选择 parent 提交记录
相对引用^
可以像~
一样在后面加个数字,该数字是选择第几个 parent 提交记录。
git checkout main^2
^
和~
的链式操作;
git checkout HEAD~^2~2
纠缠不清的分支
git checkout one
git cherrt-pick C4 C3 C2
git checkout two
git cherrt-pick C5 C4 C3 C2
git branch -f three C2
远程篇
Git 远程仓库基本操作
git clone
git clone <远程仓库URL>
远程仓库实际上就是你的本地仓库在另一台电脑上的拷贝。
git clone
从远程仓库克隆一个副本到本地。
远程分支
上一节中的克隆产生的o/main
分支就是远程分支,o
是远程仓库名。你使用git clone
克隆完一个仓库时,已经将远程仓库名设置为origin
了。
查看远程仓库信息:
git remote -v
修改远程仓库名:
git remote rename <远程仓库名>
远程分支反映了远程仓库的状态。
切换到远程分支会自动切换到 HEAD 分离状态。
git checkout o/main
git fetch
git fetch <远程仓库URL>
git fetch
从远程仓库下载缺失的提交记录,并更新远程分支指针。实际上就是更新远程分支。
但是git fetch
不会改变你的本地分支状态,也就是不会改变你的本地仓库文件。
git fecth
git pull
使用git fetch
只更新了远程分支,并未更新本地分支,还需要我们进行进一步合并,使用下面方法之一:
git cherry-pick origin/main
git merge origin/main
git rebase origin/main
不过,Git 的 git pull
命令将拉取和合并操作结合在了一起。
git pull
是git fetch
和git merge
的结合。
git push
git push
不带任何参数时的行为与 Git 的一个名为 push.default
的配置有关。
查看 push.default
值。
git config --get push.default
push.default
通常具有以下几种值:
simple
:这是Git 2.0及以后版本的默认值。它会将当前分支的push操作限制为其上游(通常是origin远程仓库)的同名分支。current
:这也是一个常见的值,它将push操作限制为当前分支。nothing
:这个选项会禁用默认的push行为,您需要明确指定要push 的分支和远程仓库。matching
:在Git 1.x版本中的默认行为,它会将本地的所有分支与远程仓库的同名分支进行匹配,然后将它们都 push 到远程仓库。
修改 push.default
:
git config push.default <new_value>
偏离的提交历史
当你使用 git push
推送代码时,会遇到无法推送,要先与远程仓库合并的提示。这是由于远程仓库已经被你的同事修改了,你调用 API 可能已经不存在或改名了,也就是发生了冲突。
如何解决冲突?
①使用 git rebase
git fetch
git rebase o/main
git push o main
②使用 git merge
git fetch
git merge o/main
git push o main
使用 git merge
会多一个合并提交。
当然 git fetch
和 git merge
可以合并为 git pull
。
③使用 git pull --rebase
,即 git fetch
与 git rebase
的结合
git pull --rebase
git push
锁定的 main
Git 锁定 main 分支是防止主分支遭到未经审核的修改。
如果你直接提交到 main,然后 push,不仅会被拒绝,还会无法再次推送。
你需要 reset main 分支到远程分支处,与远程服务器保持一致。然后新建一个 feature 分支,推送 feature 分支到服务器。
Git 远程仓库高级操作
推送主分支
合并远程仓库
远程追踪
git push 的参数
git push 的参数 2
git fetch 的参数
没有 source 的 source
git pull 的参数
相关文章:
更直观地学习 Git 命令
前言 本文参考于 Learn Git Branching 这个有趣的 Git 学习网站。 在该网站,可以使用 show command 命令展示所有可用命令。 直接访问网站的sandbox。 本地篇 基础篇 git commit git commit将暂存区的修改提交到本地版本库并创建一个新的提交,新提…...
在 Vue 项目中添加字典翻译工具(二)
封装字段翻译组件,可以格式化字典、枚举、字段 优点: 使用简单,一次配置多次使用,缓存降低后端请求次数,扩展性强 没有缓存时造成单页面多次请求解决方法:axios添加缓存请求,防止多次请求&#…...
RDMA Shared Receive Queue(四)
参考知乎文章《RDMA之Shared Receive Queue》:https://zhuanlan.zhihu.com/p/279904125 SRQ SRQ全称为Shared Receive Queue,即共享接受队列。在QP中,SQ用于下发SEND/WRITE/READ等操作,而RQ只用于下发RECV操作,对于本…...
this关键字
作用:出现在成员方法,构造器中代表当前对象的地址,用于访问当前对象的成员变量、成员方法。this出现在 有参数构造器 中的用法 (this.成员变量 局部变量)this出现在 成员方法 中的用法 (this…...
缓存雪崩、缓存击穿、缓存穿透
缓存雪崩 当缓存中大量的键值对同时过期或者Redis宕机了,大量的请求就会直接打到数据库,这种现象就是缓存雪崩 应对策略 有四种,分别是“均匀设置过期时间”、“互斥锁”、“双key策略”、“设置逻辑过期时间,异步更新缓存” …...
Bigemap如何查看历史影像
工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP 很多人都在寻找历史影像图,这块的需求是非常大,历史影像一般可以用于历史地貌的变迁分析,还原以前的生态场景,对范围面积…...
如何离线安装和使用pymysql操作mysql数据库
一、应用背景 在企业内部网络要使用python操作mysql数据库。然而,python未自带访问MySQL数据库的函数库pymysql,需要另外安装。网上有很多安装pymysql都需要互联网支持。本文主要阐述如何离线安装pymysql,并简要介绍pymysql如何进行mysql操作。 pymysq…...
Prometheus-监控Mysql进阶用法(1)(安装配置)
阿丹: 在开发和生产环境中有可能会出现慢mysql等问题,那么这里就需要我们优秀的程序员来进行监控和解决,那么如何借助云原生的监控系统来完成这个操作呢? 环境描述: 使用一台空白的阿里云服务器2核4G。 服务器基本安装…...
网络安全(黑客技术)自学内容
前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防…...
linux centos7 安装mongodb7.0.1 及 mongosh2.0.1
下载数据库并解压 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-7.0.1.tgz tar -zxf mongodb-linux-x86_64-rhel70-7.0.1.tgz #移动到/usr/local/mongo目录 mv mongodb-linux-x86_64-rhel70-7.0.1 /usr/local/mongodbmongosh 命令行下载 #下载命令行…...
c++ | makefile | 编译 | 链接库
简单记一下 看着人家总结的挺好的 点这...
n个骰子掷出m点的概率,C++实现
一.在骰子游戏中,我们会有猜点数的问题。我们该如何用算法来描述呢? 加入我们当前只有一个骰子,我们该如何算概率呢? 我们现在开始推导一下吧: 首先是一个骰子的情况,我们可以简单的知道n个骰子一共可以掷出…...
【JUC系列-08】深入理解CyclicBarrier底层原理和基本使用
JUC系列整体栏目 内容链接地址【一】深入理解JMM内存模型的底层实现原理https://zhenghuisheng.blog.csdn.net/article/details/132400429【二】深入理解CAS底层原理和基本使用https://blog.csdn.net/zhenghuishengq/article/details/132478786【三】熟练掌握Atomic原子系列基本…...
企业专线成本高?贝锐蒲公英轻松实现财务系统远程访问
在办公及信息系统领域,许多企业纷纷采用金蝶等财务管理软件来提升运营效率。以某食品制造企业为例,该企业总部位于广州,并拥有湖北仙桃工厂、广州从化工厂和湖南平江工厂三大生产基地。为提高管理效率,该企业在广州总部局域网内部…...
自学——网络安全——黑客技术
想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客!!! 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队…...
k8s部署gin-vue-admin框架、gitlab-ci、jenkins pipeline 、CICD
测试环境使用的jenkins 正式环境使用的gitlab-ci 测试环境 创建yaml文件 apiVersion: v1 kind: ConfigMap metadata:name: dtk-go-tiktok-admin-configlabels:app.kubernetes.io/name: dtk-go-tiktok-adminapp.kubernetes.io/business: infrastructureapp.kubernetes.io/run…...
【SpringBoot项目】SpringBoot+MyBatis+MySQL电脑商城
在b站听了袁老师的开发课,做了一点笔记。 01-项目环境搭建_哔哩哔哩_bilibili 基于springboot框架的电脑商城项目(一)_springboot商城项目_失重外太空.的博客-CSDN博客 项目环境搭建 1.项目分析 1.项目功能:登录、注册、热销…...
互联网医院|互联网医院系统引领医疗科技新风潮
互联网的迅速发展已经改变了人们的生活方式,而医疗领域也不例外。近年来,互联网医院应运而生,为患者和医生提供了更便捷、高效的医疗服务。本文将深入探讨互联网医院的系统特点、功能以及未来的发展方向,为您展现医疗行业的新时代…...
Mock安装及应用
1、安装 npm install mockjs 2、Mock.Random属性 该属性是一个工具类,用于生成各种随机数据。它提供的方法如下: Basic: boolean,natural,integer,float,character,string,range,date,time,datetime,now; Image: image,dataImage; Color: color; Text: p…...
一起来看看UI设计流程详解吧!通俗易懂
UI设计2023 通俗易懂的UI设计流程详解 首先,大家要明确一下范围:一般分为新产品的从0-1和已有产品上新的模块或功能的从0-1,这两个方向的环节和产出物会有比较大的区别。其实在UI设计师介入之前,我们是需要去了解一些大的方向和…...
TikTok营销成功秘籍:ROI指标的黄金法则
在当今数字营销领域,TikTok已经崭露头角,成为了品牌和营销者们争相追逐的热门平台。 然而,要在TikTok上取得成功,不仅需要创意和内容,还需要精确的ROI(投资回报率)指标来衡量和优化你的营销策略…...
17.适配器模式(Adapter)
意图:将一个类的接口转换为Client希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类在一起工作。 UML图 Target:定义Client使用的与特定领域相关的接口。 Client:与符合Target接口的对象协同工作。 Adaptee…...
leetcode做题笔记154. 寻找旋转排序数组中的最小值 II
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]若旋转 7 次࿰…...
什么是推挽电路?
推挽电路原理: 可以简单理解为推和拉; 此电路总共用到两个元器件,对应图中的Q1----NPN三极管,Q2----PNP三极管,两个电阻R1和R2起到限流的作用;两个三极管的中间对应信号的输出。 下面就举例说明是如何工作的…...
208.Flink(三):窗口的使用,处理函数的使用
目录 一、窗口 1.窗口的概念 2.窗口的分类 (1)按照驱动类型分 (2)按照窗口分配数据的规则分类 3.窗口api概览 (1)按键分区(Keyed)和非按键分区(Non-Keyed) *1)按键分区窗口(Keyed Windows) *2)非按键分区(Non-Keyed Windows) (2)代码中窗口API的调…...
时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测
时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-BiLSTM鹈鹕算…...
【知识点】增量学习、在线学习、离线学习的区别
参考链接:https://www.6aiq.com/article/1613258706447?p1&m0 离线学习 常见的学习方式,一次性将所有数据参与进训练。 离线学习完成了目标函数的优化将不会在改变了离线学习需要一次提供整个训练集时间和空间成本效率低发生数据变更或模型漂移需…...
c++ 学习 之 运算符重载 之 前置++和后置++
前言 int a1;cout << (a) << endl;cout << a << endl;int b1;cout << (b) << endl; // 这个是错误的cout << b << endl;上面样例中, 前置 返回的是引用,所以a 的值变成了3 后置 返回的不是可以改变的…...
K8s Kubelet 垃圾回收机制
前言 Kubelet 垃圾回收(Garbage Collection)是一个非常有用的功能,它负责自动清理节点上的无用镜像和容器。Kubelet 每隔 1 分钟进行一次容器清理,每隔 5 分钟进行一次镜像清理(截止到 v1.15 版本,垃圾回收间隔时间还都是在源码中固化的,不可自定义配置)。如果节点上已…...
docker安装高斯数据库openGauss数据库
1.创建容器 #创建数据没有挂在的容器 docker run --name opengauss --privilegedtrue -d -e GS_PASSWORDEnmo123 -p 8090:5432 enmotech/opengauss:latest 2. 进入容器,并切换omm用户,使用gsql连接高斯数据库 [rootansible ~]# docker ps -a CONTAIN…...
淘宝网站策划怎么做/网络服务器配置与管理
出题:定义一个复杂链表:在单向链表的基础上,每个节点附加一个指向链表中其他任意节点的指针sibling,实现CNode* Clone(Cnode *head)函数复制这个复杂链表; 分析: 解法1:将head复制到CHead中&…...
网站平台优化/百度客服号码
第2课-数据的艺术 数据结构起源(1) 计算机从解决数值计算问题到解决生活中的问题。 (2) 现实生活中的问题涉及不同个体间的复杂联系。 (3) 需要在计算机程序中描述生活中个体间的。 数据结构主要研究非数值计算程序问题中的操作对象以及它们之间的关系。 关键概念(1…...
中小企业建立网站最经济的方式/查关键词排名软件
最近在弄linux系统的环境,搭建vue环境,由于是第一次接触vue以前也没使用过,所以才搭建环境的时候还是挺闷逼的。记录一下,免得以后忘记了。 安装cnpm 由于不知道vue和npm的关系,所以自己想先安装npm并设置成阿里的cnpm…...
淘宝上找人做网站/网络营销和网络推广
♣题目部分在Oracle中,举例说明“集合操作关联转变(Set Join Conversion)”查询转换。♣答案部分1LHRorclasm > SELECT * FROM SCOTT.EMP A WHERE A.EMPNO>74692 2 MINUS3 3 SELECT * FROM SCOTT.EMP A WHERE A.EMPNO>7839;45…...
动态网站编程基础/b站推广链接
1.JS函数的学习(方法)函数也是对象1.1函数有3种声明方法函数声明的三种形式(1) function 函数名(){函数体}(2) var 函数名function(){函数体}(3)var 函数名new Function("函数体");1.2输出方式3种的归纳alert(a);//1.弹窗式输出document.write("HELL…...
呼伦贝尔建设工程检测网站/百度关键词是怎么排名靠前
时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 256M,其他语言512M 热度指数:25218 本题知识点: 链表 题目描述 输入一个链表,输出该链表中倒数第k个结点。 示例1 输入 {1,2,3,4,5},1 返回值 {5} …...