动图展示10大Git命令,让你轻松掌握Git

C语言与CPP编程 2025-03-18 09:02

击上方“C语言与CPP编程”,选择“关注/置顶/星标公众号

干货福利,第一时间送达!

最近有小伙伴说没有收到当天的文章推送,这是因为微信更改了推送机制,导致没有星标公众号的小伙伴刷不到当天推送的文章,无法接收到一些比较实用的知识和资讯。所以建议大家加个星标⭐️,以后就能第一时间收到推送了。

来自:机器之心

链接:https://dev.to/lydiahallie/cs-visualized-useful-git-commands-37p1

git merge、git rebase、git reset、git revert、git fetch、git pull、git reflog……你知道这些 git 命令执行的究竟是什么任务吗?

如果你还有些分不清楚,那千万不能错过这篇文章。

在本文中,熟知 JavaScript、TypeScript、GraphQL、Serverless、AWS、Docker 和 Golang 的 21 岁年轻软件顾问 Lydia Hallie 通过动图形式直观地介绍了这些常用 git 命令的工作过程,包你过目不忘。



尽管 Git 是一款非常强大的工具,但如果我说 Git 用起来简直是噩梦,大多数人也会认同我的说法。我发现在使用 Git 时,在头脑里可视化地想象它会非常有用:当我执行一个特定命令时,这些分支会如何交互,又会怎样影响历史记录?

为什么当我在 master 上执行硬重启,force push 到原分支以及 rimraf 我们的 .git 文件夹时,我的同事哭了?

我觉得创建一些最常用且最有用的 Git 命令的可视化示例会是一个完美的用例!下面我将介绍的很多命令都有可选参数——你可以使用这些参数来改变对应命令的行为。而我的示例只会涵盖命令的默认行为,而不会添加(或添加太多)可选配置!

合并

拥有多个分支是很方便的,这样可以将不同的新修改互相隔离开,而且还能确保你不会意外地向生产代码推送未经许可或破损的代码修改。但一旦这些修改得到了批准许可,我们就需要将其部署到我们的生产分支中!

可将一个分支的修改融入到另一个分支的一种方式是执行 git merge。Git 可执行两种类型的合并:fast-forward 和 no-fast-forward。现在你可能分不清,但我们马上就来看看它们的差异所在。

Fast-forward (—ff)

在当前分支相比于我们要合并的分支没有额外的提交(commit)时,可以执行 fast-forward 合并。Git 很懒,首先会尝试执行最简单的选项:fast-forward!这类合并不会创建新的提交,而是会将我们正在合并的分支上的提交直接合并到当前分支。



完美!现在,我们在 dev 分支上所做的所有改变都合并到了 master 分支上。那么 no-fast-forward 又是什么意思呢?

No-fast-foward (—no-ff)

如果你的当前分支相比于你想要合并的分支没有任何提交,那当然很好,但很遗憾现实情况很少如此!如果我们在当前分支上提交我们想要合并的分支不具备的改变,那么 git 将会执行 no-fast-forward 合并。

使用 no-fast-forward 合并时,Git 会在当前活动分支上创建新的 merging commit。这个提交的父提交(parent commit)即指向这个活动分支,也指向我们想要合并的分支!



没什么大不了的,完美的合并!现在,我们在 dev 分支上所做的所有改变都合并到了 master 分支上。

合并冲突

尽管 Git 能够很好地决定如何合并分支以及如何向文件添加修改,但它并不总是能完全自己做决定。当我们想要合并的两个分支的同一文件中的同一行代码上有不同的修改,或者一个分支删除了一个文件而另一个分支修改了这个文件时,Git 就不知道如何取舍了。

在这样的情况下,Git 会询问你想要保留哪种选择?假设在这两个分支中,我们都编辑了 README.md 的第一行。

如果我们想把 dev 合并到 master,就会出现一个合并冲突:你想要标题是 Hello! 还是 Hey!?

当尝试合并这些分支时,Git 会向你展示冲突出现的位置。我们可以手动移除我们不想保留的修改,保存这些修改,再次添加这个已修改的文件,然后提交这些修改。


完成!尽管合并冲突往往很让人厌烦,但这是合理的:Git 不应该瞎猜我们想要保留哪些修改。


变基(Rebasing)

我们刚看到可通过执行 git merge 将一个分支的修改应用到另一个分支。另一种可将一个分支的修改融入到另一个分支的方式是执行 git rebase。

git rebase 会将当前分支的提交复制到指定的分支之上。




完美,现在我们在 dev 分支上获取了 master 分支上的所有修改。

变基与合并有一个重大的区别:Git 不会尝试确定要保留或不保留哪些文件。我们执行 rebase 的分支总是含有我们想要保留的最新近的修改!这样我们不会遇到任何合并冲突,而且可以保留一个漂亮的、线性的 Git 历史记录。

上面这个例子展示了在 master 分支上的变基。但是,在更大型的项目中,你通常不需要这样的操作。git rebase 在为复制的提交创建新的 hash 时会修改项目的历史记录。

如果你在开发一个 feature 分支并且 master 分支已经更新过,那么变基就很好用。你可以在你的分支上获取所有更新,这能防止未来出现合并冲突。

交互式变基(Interactive Rebase)

在为提交执行变基之前,我们可以修改它们!我们可以使用交互式变基来完成这一任务。交互式变基在你当前开发的分支上以及想要修改某些提交时会很有用。

在我们正在 rebase 的提交上,我们可以执行以下 6 个动作:


  • reword:修改提交信息;

  • edit:修改此提交;

  • squash:将提交融合到前一个提交中;

  • fixup:将提交融合到前一个提交中,不保留该提交的日志消息;

  • exec:在每个提交上运行我们想要 rebase 的命令;

  • drop:移除该提交。


很棒!这样我们就能完全控制我们的提交了。如果你想要移除一个提交,只需 drop 即可。


如果你想把多个提交融合到一起以便得到清晰的提交历史,那也没有问题!



交互式变基能为你在 rebase 时提供大量控制,甚至可以控制当前的活动分支。


重置(Resetting)

当我们不想要之前提交的修改时,就会用到这个命令。也许这是一个 WIP 提交或者可能是引入了 bug 的提交,这时候就要执行 git reset。

git reset 能让我们不再使用当前台面上的文件,让我们可以控制 HEAD 应该指向的位置。

软重置

软重置会将 HEAD 移至指定的提交(或与 HEAD 相比的提交的索引),而不会移除该提交之后加入的修改!

假设我们不想保留添加了一个 style.css 文件的提交 9e78i,而且我们也不想保留添加了一个 index.js 文件的提交 035cc。但是,我们确实又想要保留新添加的 style.css 和 index.js 文件!这是软重置的一个完美用例。



输入 git status 后,你会看到我们仍然可以访问在之前的提交上做过的所有修改。这很好,这意味着我们可以修复这些文件的内容,之后再重新提交它们!


硬重置

有时候我们并不想保留特定提交引入的修改。不同于软重置,我们应该再也无需访问它们。Git 应该直接将整体状态直接重置到特定提交之前的状态:这甚至包括你在工作目录中和暂存文件上的修改。



Git 丢弃了 9e78i 和 035cc 引入的修改,并将状态重置到了 ec5be 的状态。


还原(Reverting)

另一种撤销修改的方法是执行 git revert。通过对特定的提交执行还原操作,我们会创建一个包含已还原修改的新提交。

假设 ec5be 添加了一个 index.js 文件。但之后我们发现其实我们再也不需要由这个提交引入的修改了。那就还原 ec5be 提交吧!



完美!提交 9e78i 还原了由提交 ec5be 引入的修改。在撤销特定的提交时,git revert 非常有用,同时也不会修改分支的历史。

拣选(Cherry-picking)

当一个特定分支包含我们的活动分支需要的某个提交时,我们对那个提交执行 cherry-pick!对一个提交执行 cherry-pick 时,我们会在活动分支上创建一个新的提交,其中包含由拣选出来的提交所引入的修改。


假设 dev 分支上的提交 76d12 为 index.js 文件添加了一项修改,而我们希望将其整合到 master 分支中。我们并不想要整个 dev 分支,而只需要这个提交!


现在 master 分支包含 76d12 引入的修改了。


取回(Fetching)

如果你有一个远程 Git 分支,比如在 GitHub 上的分支,当远程分支上包含当前分支没有的提交时,可以使用取回。比如当合并了另一个分支或你的同事推送了一个快速修复时。

通过在这个远程分支上执行 git fetch,我们就可在本地获取这些修改。这不会以任何方式影响你的本地分支:fetch 只是单纯地下载新的数据而已。


现在我们可以看到自上次推送以来的所有修改了。这些新数据也已经在本地了,我们可以决定用这些新数据做什么了。


拉取(Pulling)

尽管 git fetch 可用于获取某个分支的远程信息,但我们也可以执行 git pull。git pull 实际上是两个命令合成了一个:git fetch 和 git merge。当我们从来源拉取修改时,我们首先是像 git fetch 那样取回所有数据,然后最新的修改会自动合并到本地分支中。



很好,我们现在与远程分支完美同步了,并且也有了所有最新的修改!


Reflog

每个人都会犯错,但犯错其实没啥!有时候你可能感觉你把 git repo 完全搞坏了,让你想完全删了了事。

git reflog 是一个非常有用的命令,可以展示已经执行过的所有动作的日志。包括合并、重置、还原,基本上包含你对你的分支所做的任何修改。



如果你犯了错,你可以根据 reflog 提供的信息通过重置 HEAD 来轻松地重做!

假设我们实际上并不需要合并原有分支。当我们执行 git reflog 命令时,我们可以看到这个 repo 的状态在合并前位于 HEAD@{1}。那我们就执行一次 git reset,将 HEAD 重新指向在 HEAD@{1} 的位置。


我们可以看到最新的动作已被推送给 reflog。

推荐阅读  点击标题可跳转

1、C++训练营,来了!

2、HarmonyOS 学习资料分享(无套路免费分享)

我组建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起进群交流。

欢迎你添加我的微信,我拉你进技术交流群。此外,我也会经常在微信上分享一些计算机学习经验以及工作体验,还有一些内推机会

加个微信,打开另一扇窗

感谢你的分享,点赞,在看三  

C语言与CPP编程 C语言/C++开发,C语言/C++基础知识,C语言/C++学习路线,C语言/C++进阶,数据结构;算法;python;计算机基础等
评论 (0)
  • 在PCB(印刷电路板)的制造过程中,材料选择对最终产品的性能、稳定性和可靠性有着直接的影响。作为行业领先的PCB制造商,捷多邦始终坚持在材料选择上精益求精,确保每一款PCB产品都能够满足客户对高质量的需求。今天,我们将重点分析FR4、Rogers和铝基板三种常见材料,它们如何影响PCB的质量与性能,以及捷多邦如何通过优化材料选择为客户提供更具竞争力的产品。1. FR4:高性价比的通用材料FR4是最常见的PCB基材,广泛应用于消费电子、通信、计算机等领域。它由玻璃纤维和环氧树脂复合而成,具有良好的
    捷多邦 2025-03-19 10:09 72浏览
  • 这是一个很有意思的话题,在职场人士之间争论不休。证书到底有没有用?有人支持,也有人反对。不过,在正式聊这个话题之前,我想先分享一个我亲身经历的真实故事。那时,我和同学们正在读管理学的研究生课程。有一次,我们的教授要求大家穿正装上课。这时,有个同学问了个很有趣的问题:“教授,某某的董事长可以穿得五颜六色,我们这些职场新人为什么非得穿正装?”教授听后,停顿了一下,然后淡定地回了句:“你当然也可以穿得五颜六色,但前提是——先成为某某的董事长那样的人。”这句话点出了一个事实:同一套规则,并不适用于所有人
    优思学院 2025-03-19 12:02 79浏览
  • 概念在GNSS测量和地理信息系统(GIS)中,基线(Baseline)是指两个或多个接收机之间的直线距离,通常用于描述RTK(实时动态定位)或其他差分GPS技术中的相对位置关系。基线通常由三个分量表示:东向(East)、北向(North)和垂直向(Up),分别表示两个测点之间的东西方向、南北方向和垂直方向的距离差。RTK(Real-Time Kinematic,实时动态)基线是指在RTK GPS测量技术中,两个测站(通常是一个固定的基准站和一个移动的接收站)之间的向量差。这个向量差包括了两个测站
    德思特测试测量 2025-03-19 11:23 90浏览
  • PCB层数越多质量就越好吗?多层板制造中的质量控制要点随着电子产品对性能和功能要求的不断提高,多层PCB(多层印刷电路板)已经成为众多高端应用领域的标准配置。很多人存在一个误区:层数越多的PCB质量就一定越好。实际上,层数与质量并不是直接的正比关系,正确的设计和精确的质量控制才是决定PCB质量的关键。1. 层数并非质量的唯一标准多层PCB的质量并不仅仅取决于层数的多少,而是与其设计、制造精度和材料的选择密切相关。增加层数的目的通常是为了提高电路密度和实现复杂的布线结构。如果设计不合理或制造不精确
    捷多邦 2025-03-19 10:14 126浏览
  • 在PCB制造过程中,表面处理工艺的选择直接影响到电路板的性能、可靠性和成本。捷多邦作为行业领先的PCB制造商,致力于为客户提供高质量、高可靠性的PCB产品。本文将深入探讨沉金、镀金和HASL(热风整平)三种常见表面处理工艺的特点及其对PCB质量的影响,帮助您做出最佳选择。 1. 沉金(ENIG)沉金工艺通过化学沉积在PCB表面形成一层镍金合金,具有以下优势: ​平整度高:适合高密度、细间距的PCB设计,尤其适用于BGA和QFN封装。​抗氧化性强:金层能有效防止铜氧化,延长PC
    捷多邦 2025-03-19 10:11 90浏览
  • 在现代电子行业,PCB(印刷电路板)的质量直接影响到产品的稳定性与性能。作为全球领先的PCB制造商,捷多邦始终将质量放在第一位,致力于为客户提供高可靠性、高精度的PCB产品。为了确保每一块成品PCB都符合最高的质量标准,捷多邦在从设计到生产的每个环节都严格把控,确保质量无可挑剔。1. 精准设计:从需求到规格PCB的质量首先体现在设计阶段。捷多邦的设计团队根据客户需求,使用最新的EDA软件进行电路板布局设计。通过设计规则检查(DRC),确保电路板设计满足行业标准和客户的特殊需求。无论是单面板、双面
    捷多邦 2025-03-19 10:09 70浏览
  • 在电子领域,高品质线路板是众多电子产品稳定运行的基石。那么,究竟达到怎样的标准,才能被称为高品质线路板呢?​捷多邦小编整理了关于高品质线路板的标准解析​,一起看看吧。 从电气性能角度出发,高品质线路板首当其冲要确保线路导通性良好。这意味着电流能顺畅地在铜箔线路中流动,电阻、电容等关键参数必须严格符合设计要求。无论是在初始运行,还是经过长时间的使​用后,都能维持稳定的电气性能,不出现参数漂移等问题。同时,面对复杂的电磁环境,它要有极强的抗干扰能力,有效减少信号传输时的失真与干扰,保证信号
    捷多邦 2025-03-19 09:33 81浏览
  • 在电子制造业中,PCB(印制电路板)作为电子设备的核心组件,其质量直接决定了产品的性能和可靠性。尤其是高端PCB,广泛应用于航空航天、医疗设备、通信设备等领域,对质量的要求近乎苛刻。捷多邦作为PCB行业的领先品牌,深知严格的质量管理体系是确保高端PCB制造成功的关键。1. ​原材料质量控制高端PCB的制造始于原材料的严格筛选。捷多邦采用符合IPC标准的基材,如FR-4、PTFE等,确保材料的电气性能、机械性能和耐热性满足高端应用需求。通过严格的入库检验,包括铜箔附着力、表面平整度等测试。2. ​
    捷多邦 2025-03-19 10:13 81浏览
  • ​ 一、公司及产品概述作为国内领先的语音芯片研发企业,深耕语音技术领域25年,其产品以高稳定性、低功耗和多场景适应性著称。公司推出的语音识别芯片系列(如WTK6900系列)融合了语音识别、自然语言处理、音频编解码等核心技术,广泛应用于智能家居、工业设备、医疗电子及消费类产品中。二、核心技术特点语音识别与处理技术 厂家语音识别芯片采用先进的信号处理算法(如MFCC特征提取)和机器学习模型(如DNN、HMM),支持多语言、方言及复杂环境下的高精度识别。芯片内置噪声抑制和回声消除功能,即使在
    广州唯创电子 2025-03-19 08:48 62浏览
  • 在电子产品制造中,选择合适的PCB至关重要。虽然廉价PCB节省成本,但长期使用下来,它们可能会带来更多的风险和隐患。作为工程师,我们需要权衡PCB的质量与成本,尤其是在高要求的应用中。论文将以捷多邦为例,分析廉价PCB与高质量PCB的差异。 1.材料与性能廉价PCB通常采用低质量材料,这可能会影响其电气和机械性能。相比之下,捷多邦的高质量PCB采用符合行业标准的优质材料(如FR4、PTFE等),确保更高的热稳定性和抗湿性,提升产品的可靠性。 2.准确性与可靠性廉价的PCB工艺
    捷多邦 2025-03-19 09:36 85浏览
  • ​ 在智能设备普及的今天,语音识别已成为人机交互的核心入口。然而,环境噪声、口音差异、硬件设计限制等因素常导致识别率下降,影响用户体验。广州唯创电子凭借25年技术积累,推出 WTK6900系列语音识别芯片,通过“芯片性能+算法优化+场景适配”三位一体的解决方案,将标准方案识别率提升至 97%,为行业树立技术标杆。一、WTK6900系列:破解语音识别难题的核心利器1. 高性能芯片架构,奠定识别基础WTK6900系列采用 32位高性能处理器 与 深度神经网络(DNN)算法,支持实时语音信号
    广州唯创电子 2025-03-19 09:11 44浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦