使用VS2015/Git时出现无法拉取的问题,因为有未提交的更改。

5

想象以下场景:

管理者创建了一个团队项目,并决定使用(最新的)git作为该项目的版本控制系统。开发团队将使用(最新的)VS2015(企业版)IDE进行工作。 管理者创建了一个名为“master”的新(origin)分支,然后提交并推送了2个文件到该分支。

项目文件层次结构:

  Project (Root) Folder
    | notes.txt
    \ readme.md

由“Jym”和“Bennie”组成的开发团队已经拉取了origin/master分支(并且两者都在本地/master分支上工作)。 Jym已经提交并推送了对“notes.txt”文件的第一个更改(直接到master分支)。 Bennie创建了一个名为“todos.txt”的新文件,并对“notes.txt”文件进行了一些更改。 现在,当Bennie尝试同步/拉取早期由Jym进行的更改时,在同步窗口中显示以下消息:

无法拉取因为有未提交的更改。在再次拉取之前,请提交或撤消您的更改。有关详细信息,请参见输出窗口。

对于团队来说,情况变得更糟糕了,Bennie也遇到了去年12月底提出的相同问题。这意味着Bennie实际上无法运行任何git命令(但是,除了“撤消”功能以外,所有功能似乎都可以使用Visual Studio Git / TFS提供程序正常工作 - 这让他感到非常奇怪)。
此外,由于这个原因,这个问题不是另一个问题的重复。

如何解决Bennie遇到的问题(如上述情况),仅使用Visual Studio?

如果需要提供更多详细信息,请在评论中发布。

编辑1(来自建议答案,用于解决“null”设备):
第一步的结果:那个答案中有一个拼写错误,"nul"应该是"nil"吗?
查看截图

第二步的结果(设备管理器): 勾选“显示隐藏设备”选项后,没有任何带有小“警告”图标(未知/未识别设备)或任何设备名称中带有“null”的设备。
而且,显然,“非即插即用驱动程序”类型甚至没有被列出(当选择“按类型查看设备”时)。

第三步的结果: %SystemRoot%\system32\drivers\null.sys 文件存在并已从磁盘中删除 (从Windows 10复制并粘贴到null.sys文件中)。
更多细节: 右键单击这些sys文件中的任何一个,上下文菜单中没有“安装”或“卸载”选项,默认操作似乎是“打开方式…”(加粗显示)。

第四步的结果: 尝试合并null.reg失败。重新分配了HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root 注册表键的所有者,并设置了适当的权限。
更新注册表键权限后,null.reg文件成功合并到注册表中。
重启计算机。
等待最终答案... 错误仍在显示!
查看截图

编辑2(测试PATH环境变量):
查看截图 即使以管理员身份打开git-cmd.exe或git-bash.exe,仍然会出现相同的错误。 编辑3(电源选项,不使用“允许计算机进入离开模式”设置):
参考线程
查看截图 编辑4
在Bennie将其机器从Windows 8.1升级到10后,问题已解决。我们现在可以简单地得出结论,操作系统已经损坏。

@AndreyPesoshin Bennie收到了“无法拉取,因为存在未提交的更改。在再次拉取之前,请提交或撤消您的更改。有关详细信息,请参见输出窗口。”的错误提示。因此,他在本地进行了更改,但比origin/master落后一个提交,并且无法使用git(或撤消功能-原因不明)。他尝试重新安装Git、Git for Windows(GitHub客户端)、验证Git目录是否设置在PATH环境变量中等,但git始终会响应类似的错误消息:“fatal: open /dev/null or dup failed: No such file or directory”。他还尝试使用SourceTree、Tortoise等,但都没有起作用。 - OmegaExtern
我在谈论重新安装Git for Windows (msysgit),而不是操作系统。也许可以添加来自git-cmd/msysgit的截图或日志信息到主题问题中? - Andrey Pesoshin
@AndreyPesoshin,我更新了问题。增加了更多信息和每个步骤的输出(基于VonC添加的链接)。仍未解决。 - OmegaExtern
太好了!我看到我的升级建议是正确的 \o/ - VonC
1
@AndreyPesoshin 升级是最新的适当选项;重新安装(格式化/清洁安装)不是。两者之间有区别 ;) - OmegaExtern
显示剩余8条评论
1个回答

13
每当GUI(这里是带有Git集成的VS)跳出正常路径(这里是git push不能立即完成),请转到git命令行界面。
在您的情况下,Bernie需要执行git pull --rebase
打开一个git bash,并执行(作为Bernie)。
cd /path/to/repo
git status # make sure everything is committed
git pull --rebase
git status # you see notes.txt as being in conflict
# edit notes.txt and resolve the conflict by removing merge markers
git add .
git rebase --continue

git push

注意,git pull --rebase 很可能很快就会出现在Visual Studio的Git中(关注@gitforvs):

g4vs

尚无官方消息。


关于“Couldn't open /dev/null (or dup failed)”错误,请参见“使用GitHub for Windows时出错”是否有帮助(与空设备有关)。

如果错误仍然存在,例如git-for-windows/git问题583中所述,重新安装Windows仍是摆脱这种困境的最可靠方法。

如在Edit 4中由OP OmegaExtern提到的那样,从win8升级到win10就足以恢复该设备并解决问题。


这是行不通的,因为“这意味着Bennie实际上无法运行任何git命令”。再读一遍问题? - OmegaExtern
@OmegaExtern 我已经阅读了,并且我确信Bernie可以在shell中运行git命令。只需解压缩https://github.com/git-for-windows/git/releases/download/v2.7.0.windows.1/PortableGit-2.7.0-64-bit.7z.exe到Bernie想要的任何位置即可。 - VonC
Bennie使用Windows 8.1(x86 / 32位)。我已经向他发送了32位便携式压缩的Git,然后他根据自述文件中提到的内容更正了环境变量(gitdir和path)。当他以管理员身份运行git-bash可执行文件时,它会显示命令提示符,然后关闭,并创建一个名为“mintty.exe.stackdump”的新文件,以下是该文件的内容:https://gist.github.com/anonymous/3ac9bcdf699d2a6b5f3c#file-mintty-exe-stackdump - OmegaExtern
你忘记了一件事(请阅读我在您的答案中的第二条评论)。当Bennie以管理员身份运行git-bash.exe时,程序/黑色窗口几乎立即关闭,并在便携式git的根目录中编写一个新文件,该文件位于git-bash.exe旁边(名为“mintty.exe.stackdump”):https://gist.github.com/anonymous/3ac9bcdf699d2a6b5f3c#file-mintty-exe-stackdump - OmegaExtern
@OmegaExtern 如果使用简化路径从CMD调用git-bash.exe,它也会关闭吗? - VonC
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接