签出新分支然后运行"git reset --hard"时丢失原始分支中未保存的更改



最近在共享机器上丢失了一堆未保存的代码更改,我正在努力了解到底出了什么问题,因为这让我意识到git还有一些我不完全理解的地方。发生的事情是:

1( Dev1在主分支中有一堆未记录的更改

2( Dev2登录并想要测试将另一个功能分支与master合并。他运行git branch,发现自己已经在master分支中了。运行git checkout -b test && git fetch origin && git merge origin/feature并构建应用程序。完成测试后,他使用git reset --hard HEAD~1回滚测试分支上的合并,然后使用git checkout master切换回master。

3( Dev1重新登录并发现他丢失了本地主分支中所有未记录的更改

我意识到这与在测试分支中运行git reset --hard HEAD~1有关,但我不明白为什么git在任何时候都不会引发本地文件覆盖错误。

有人能帮我把它分解一下吗?

编辑:对于那些对有人会在不了解git的情况下使用git的想法感到愤怒的人来说,别担心,他们都不是我。我只是目睹了后果,很想知道它是如何发生的。

1(Dev1在主分支中有一堆未记录的更改

否。未暂存的更改不在任何分支中。它们在工作树上。

2(Dev2。。。运行gitcheckout-b测试

这是允许的,因为工作树中未记录的更改不会被分支的签出覆盖。它们仍在工作树中。

然后使用git reset-hard HEAD~1 回滚测试分支上的合并

从而用HEAD~1的确切内容替换整个工作树。未记录的更改现已消失。

3(Dev1重新登录并发现他在本地主分支中丢失了所有未记录的更改

因为它们从未在master分支中。它们未标记。它们在工作树中,这就是被替换的。

如果这听起来像是我认为你不知道"未记录"是什么意思,那你是对的。您需要了解git最基本的事实,即三个位置:repo、stage/index和worktree。当你这样做的时候,你会完全理解,因为你的直觉会得到修复。

最新更新