我今天遇到了一种情况,在从上游分支拉出并重新定位之后,最近对上游分支的提交表现得好像它们没有生效一样。
我记得最好的症状:
在本地分支中编码时,Visual Studio 解决方案文件似乎在没有我干预的情况下不断被修改——它的新内容完全撤消了最近提交中的一个文件(但没有撤消其他 3 个 .cs 和 .prj 文件)。似乎 Visual Studio 正在这样做,但我不确定。(也就是说,
git status
显示了一个新修改的 .sln 文件,但我的更改不应该影响项目)。由于此文件已被修改并且解决方案不知道重要的新依赖项(添加到两个项目的引用),我无法构建解决方案。丢弃修改后的文件(理论上我希望从上游提交的最新提交中添加更改)并没有帮助。
我一直在本地开发分支中进行更改,但看不到我的单个本地提交如何导致奇怪——我只是没有进行这些更改。
我不止一次地关闭并重新打开了 VS,并清理并重建了解决方案。
SmartGit 日志显示除了我对本地分支所做的提交或更改之外没有其他提交或更改,并且是预期的。
为了消除任何混淆因素,我从本地开发分支切换到本地主分支(我通常保持未修改,没有任何新的提交)并重建项目,所有结果都相同。
我终于注意到 SmartGit 日志提供了 master 并不是真正的 master 的视觉证据。看一下 SmartGit/Hg 5.0.3 (build #2073) 的屏幕截图:
这是在 git 控制台中发出后的结果
git checkout master
。但是看看连接提交节点的蓝线:它表明我真的签出了历史上第 11 次提交!如果我发出
git checkout master^
,那么它会正确检查第二次提交,并相应地调整蓝线。如果我通过 SHA 检查最近的提交,
git checkout a07df46
那么蓝线一直延伸到最顶部的提交。当我这样做
git show-ref
时,它表明它refs/heads/master
指向来自上游的最新提交的 SHA——正如预期的那样。我尝试了以下一系列命令,这些命令对事物的状态没有任何改善(SHA 是来自上游最近提交的命令):
git checkout HEAD^ git branch -f master master^ git branch -f master a07df46 git checkout master
我想做的就是让我的存储库重新同步,这样我就可以继续开发了!
如果不能很快搞清楚,我会把我所有的本地分支推送到个人远程fork(不同于上游主项目),删除我的本地仓库,在本地重新克隆上游仓库,然后拉取我关心的任何分支都从我的叉子回来。但是,我真的很想知道 git 是如何进入这种奇怪的 master-but-not-master 状态的。
如何在不重新克隆整个存储库的情况下从这种奇怪的状态中恢复?