ITPub博客

首页 > 数据库 > 数据库开发技术 > 入职第一天就在主分支修改了大量代码怎么办?急?

入职第一天就在主分支修改了大量代码怎么办?急?

原创 数据库开发技术 作者:飞天小牛肉 时间:2023-08-23 08:38:00 0 删除 编辑

如标题所示,应该是很多同学都遇到过的情况,忘记切分支就急急忙忙开始敲代码了,等全部敲完了准备 commit 了发现在 master 分支上改了一堆。

遇到这种不要慌,很简单的三条命令就可以让你将修改的代码无缝迁移到新分支:

1. git stash
2. git checkout -b "分支名"
3. git stash pop 

没错,就是 git stash 命令。

Git Stash

通过上篇 三分钟上手!一文看懂 Git 的底层工作原理,想必大伙都知道了 Git 的三大对象 Commit、Tree 和 Blob,下面继续接着上篇文章用实例来演示 git stash 的工作原理:

来看看 stash 之后 .git 文件夹发生了哪些变化:

其实就是 objects 目录中增加了一些对象文件,refs 中增加了一个 stash 文件。通过命令查看该文件内容:

从命令行输出可以看到 git stash 实际上创建了一个新的 Commit 对象 aab0b, 该 Commit 对象有两个父节点:0d6c7 和 4311e,可以通过 git log --oneline --graph stash@{0} 清楚的看到层级关系:

很明显,aabobba 是本次 Commit 对象,拥有两个父节点 4311e 和 0d6c7,其中,0d6c7 的父节点是 78af663,4311e 是保存到暂存区(Stage)的 Commit 对象,它是在 0d6c7(上一次 git commit 命令生成的 Commit 对象)的基础上做的操作

简单理解 Git 三大存储区域:

  • 开发代码的时候在 Git 工作区(Workspace)
  • commit 后就到了暂存区(Stage)
  • push 后就到了仓库区(Repositorys)

从该试验可以得知,git stash 的本质其实就是创建了一个保存到暂存区(Stage)的 Commit 对象而已。

Git Reset

再来看一个场景,当我们通过 git commit 提交代码后,突然测出来代码有问题,希望回退刚才的改动,这个时候就需要用到 git reset 命令。

我们先来提交一个 commit:

通过 git log 查看 commit 日志:

然后通过 git reset 回退到上一个 commit。注意这里 HEAD 是一个指向当前 branch 最后一个 commit 的指针,因此 HEAD~1 表示之前的一个 commit,当然,git reset命令也可以直接使用 commit 哈希值作为命令参数:

再执行 git log 就会发现刚才的 commit 被回退了(不过修改的文件还是存在的,处于 Unstaged 状态 - 已修改但未被 Git 跟踪,你可以对这些文件进行改动后再次提交):

如果你不想保留修改的文件,可以使用 –hard 参数直接回退到指定的commit,该参数会将 HEAD 指向该 commit,并且工作区中的文件也会和该 commit 保持一致,该 commit 后的修改会被直接丢弃:



分享大厂面试真题原创题解 & 成长经验.

面试题库 & 求职信息: itmtx.cn

回复『校招』获取招聘信息和交流群
回复『项目』获取多个项目教程与面试精讲
回复『简历修改』获取简历修改 & 模拟面试服务

原文作者:飞天小牛肉;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-12-31

  • 博文量
    205
  • 访问量
    89244