什么情况?我代码没了

ops/2024/11/15 0:35:03/

前两天检视代码时,发现PR里面有两个提交的描述信息一模一样,于是我提出应该将这两个提交合并成一个,保持提交树的清晰。

1 先储存起来!

而同事这时正在开发别的特性,工作区不是干净的,没法直接执行 git rebase 操作,于是很自然地执行

git stash

将正在修改的内容保存到一个栈中,并维持当前工作区干净。

这样就可以执行切换分支、变基等操作,这些操作能执行的前提是当前工作区是干净的。

2 使用 git rebase 合并两个提交

我们先执行 git log 命令,找到要合并的两个提交之前的那个提交:cdedd430

javascript">commit ec0218fffeat: 增加国际化
commit 89f3d02cfeat: 增加国际化
commit cdedd430refactor: pnpm工程改造

然后执行 git rebase 变基命令:

git rebase -i cdedd430

这时会进入一个交互式命令行界面:

javascript">pick 89f3d02 feat: 增加国际化
pick ec0218f feat: 增加国际化# Rebase cdedd43..ec0218f onto cdedd43 (2 commands)
#
# 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 <commit> = like "squash", but discard this commit's log message
# 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.
#
# 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.
#
# Note that empty commits are commented out
"~/my-project/.git/rebase-merge/git-rebase-todo" 28L, 1232B

这时你可以移动光标,但是无法输入字符,因为这是个只读的界面,需要先输入 i 字符进入编辑态,此时界面底部会出现 -- INSERT -- 标识。

javascript">...
# Note that empty commits are commented out
-- INSERT --

下面那些以 # 开头的都是注释,只有前面两行比较关键。

javascript">pick 89f3d02 feat: 增加国际化
pick ec0218f feat: 增加国际化# ...

每一行都由三部分组成:

  • Command:需要执行的命令
  • Commit ID:提交 ID
  • Commit message:提交的描述信息

我们需要将 ec0218f 合并到 89f3d02 上,因此需要将第二行的 pick 改成 squash(s) 或 fixup(f),这两个命令的区别在于:

  • squash(s) 是将当前的提交合并到上一行的提交上,保留两个提交的描述信息,可以在下一步中进行提交信息的编辑
  • fixup(f) 也是将当前的提交合并到上一行的提交上,但不保留当前提交的描述信息

由于我们两次提交信息完全一致,没必要保留,选择 fixup(f):

pick 89f3d02 feat: 增加国际化
f ec0218f feat: 增加国际化

修改好之后,先按 ESC 退出编辑态,然后按 :wq 保存,显示以下信息说明变基成功,两个提交已经合并在一起

Successfully rebased and updated refs/heads/kagol/test-rebase.

执行 git log 看下效果:

javascript">commit 86930d03feat: 增加国际化
commit cdedd430refactor: pnpm工程改造

可以看到两个提交已经合并在一起,并且生成了一个新的 Commit ID: 86930d03。

完美.png

3 我代码没了!

1小时之后,同事慌慌张张地跟我说:

我代码没了!

我心里第一反应是:

刚才一顿变基猛如虎,不过变基变出问题来了吧?

猫猫震惊.png

作为一个成熟稳重的程序员,什么大风大浪没见过,于是轻轻地回了句:

少年,莫慌!你先讲下你刚才做了什么?

我没,没做什么…

没做什么代码怎么会自己丢了呢?

我就执行了一下 git stash pop,然后我之前写了一上午的代码就没…没了…

突然开始心里有点慌,把同事一上午代码搞没了,我怎么赔给人家??

image.png

但心里不能表现出来,不着急,稳住少年!

你先执行下 git stash list 看下储存栈里还有没有内容:

$ git stash list
stash@{0}: WIP on master: f90abfe Initial commit

看到之前储存的内容还在我立马不慌了!

不再执行下 git stash pop,我看下有没有报什么错?

执行完之后果然报了一个错:

javascript">$ git stash pop
error: Your local changes to the following files would be overwritten by merge:main.ts
Please commit your changes or stash them before you merge.
Aborting
The stash entry is kept in case you need it again.

大意是:

你本地修改了文件,储存栈里的内容如果弹出会覆盖掉你本地的代码,所以导致操作失败。
然后建议你先提交你本地的修改或者将你本地的修改储存起来。
并且特意提示你你储存的内容给你保留下来了,方便你下次要用的时候可以用。

不得不说,这 Git 真是太贴心了,考虑得很周到,为 Git 点个赞👍

虽然我其实已经猜到是什么原因了,但是作为成熟稳重的程序员,我依然不动声色地问了句:git rebase 之后,git stash pop 之前,中间你是不是还改了什么东西?

哦,好像是改了 main.ts 文件,我想起来了!

你把你改的东西先撤销下,然后执行 git stash pop 试试?

4 破案!收工!

果然,执行 git stash pop 成功,之前的上百行代码都找回来了!

破案!收工!


http://www.ppmy.cn/ops/89517.html

相关文章

k8s核心知识总结

写在前面 时间一下子到了7月份尾&#xff1b;整个7月份都乱糟糟的&#xff0c;不管怎么样&#xff0c;日子还是得过啊&#xff0c; 1、7月份核心了解个关于k8s&#xff0c;iceberg等相关技术&#xff0c;了解了相关的基础逻辑&#xff0c;虽然和数开主线有点偏&#xff0c;但是…

【机器学习】正则化的基本概念以及正则化成本和梯度的示例

引言 在机器学习中&#xff0c;正则化&#xff08;Regularization&#xff09;是一种技术&#xff0c;用于减少模型复杂度&#xff0c;防止过拟合&#xff0c;并提高模型的泛化能力。通过在损失函数中添加一个额外的惩罚项&#xff0c;正则化鼓励模型学习更简单、更平滑的函数&…

如何将PyCharm 中使用 PDM 管理的 Django 项目迁移到 VS Code 并确保一切正常工作?

嗨&#xff0c;我是兰若姐姐&#xff0c;相信很多小伙伴都遇到过这种情况&#xff0c;使用pycharm用习惯了&#xff0c;想换个编辑器&#xff0c;比如换成vscode&#xff0c;今天就告诉大家&#xff0c;如果轻松切换到vscode 步骤 1&#xff1a;在 VS Code 中打开项目 打开 V…

【C++标准模版库】list的介绍及使用

list 一.list的介绍二.list的使用1.list 构造函数2.list 空间大小3.list 增删查改4.list 迭代器的使用1.正向迭代器2.反向迭代器 5.list 其他成员函数 三.vector与list关于sort性能的比较 一.list的介绍 C中的list标准模板库&#xff08;STL&#xff09;是C标准库中的一个重要组…

数据可视化(王者英雄数据分析)

目 录 第1章 绪 论 1.1 课题背景及研究目的 1.2 课题研究内容 第2章 课题概要及算法原理 2.1 课题概要 2.2 数据说明 2.3 关键技术 第3章 数据分析 3.1 数据统计分析 3.2 可视化分析 3.2.1数据读取及展示 3.2.2数据描述性分析 第4章 数据建模 4.1 数据预处理 4.2…

78.子集

给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 &#xff1a;总 // 注释的都为后来思考不必要的 class Solution {List<List<Integer…

电路元件基本知识详解

电路元件基本知识详解 在现代电子技术中&#xff0c;电路元件是构成各种电子电路的基本单元。它们各自具有不同的特性和功能&#xff0c;通过不同的连接方式实现多种多样的电路功能。本文将详细介绍几种常见的电路元件及其基本知识。 ### 一、电阻器 #### 1. 电阻器的基本概…

unity2D游戏开发16弹弓动画

清理动画器 选中PlayerObject,打开Animator,删除原来的四个状态 右键选择Create State |from New Blend Tree; 冲命名为Walk Tree 双击Walk Tree查看Blend Tree Graph 设置属性为2D Simple Directional,再点击加号选择Add Motion Field 添加四个,如图 点击Base Layer