最近在共享机器上丢失了一堆未保存的代码更改,我正在努力了解到底出了什么问题,因为这让我意识到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。当你这样做的时候,你会完全理解,因为你的直觉会得到修复。