Visual Studio 2015 Git错误信息“无法拉取/切换因为有未提交的更改”

67
我在从 origin 进行拉取时遇到了困难。我一直收到以下提示:
“无法拉取,因为存在未提交的更改。在再次拉取之前,请提交或撤销更改。有关详细信息,请参见“输出”窗口。”
这也适用于切换分支。我会得到类似的消息,但并非总是发生。
我正在使用 Visual Studio 2015 Update 1 和 Visual Studio Team Services Git。在我的计算机上,我有一个本地的 master 分支和开发分支。每次我切换到 master 然后进行拉取时,我都会收到错误消息。我已经采取了存储和删除存储(命令行),有时我使用 TortoiseGit 进行拉取,它可以正常工作。
奇怪的是,即使我尝试使用 TortoiseGit 恢复(对于未提交的文件),它也显示成功恢复了(我已经尝试了 Visual Studio 撤消,但没有任何反应)。再次尝试拉取,仍然存在同样的问题。未提交的文件仍将存在,并且有时当我执行 git status 时,它会显示没有要提交的内容。

请注意:即使从分支切换到master,这种情况也可能发生。在这种情况下,不可能有未提交的更改,因为我一开始就无法进行切换。

我对Git仍然很陌生,但我想知道是否有更好的解决方法,因为我希望使用一个环境而不是在每个任务之间切换不同的环境;对我来说,只需在Visual Studio中完成所有操作更容易。我已经阅读了:

TFS/GIT in VS Cannot switch to master because there are uncommitted changes

更新

看起来这个问题与行尾有关。

通过执行git diff -R,您可以看到添加了一个行尾符号“^M”,并且它是不同的。删除gitattributes中的* text = auto(然后检查更改),然后再次放回它,以便gitattributes不会发出需要提交的自身更改的信号似乎有所帮助,不会有任何更改。


我重新启动了几次Visual Studio,然后我才能够拉取更改,进入合并冲突屏幕。 - Manish Jain
13个回答

66

对于我而言,我没有任何未提交的更改或未跟踪的文件,但Visual Studio 2015仍然出现了警告。

  1. 关闭 Visual Studio 中的解决方案,退出 Visual Studio。
  2. 打开 Git Bash(或您喜欢的 Git UI)
  3. 导航到您的存储库(或使用 Git UI 打开存储库)
  4. git pull(或在 Git UI 上执行 pull)
  5. 进行合并(希望没有冲突,就像我的情况一样),vi 打开(或默认的合并解决工具)
  6. :wq,然后在 vi 中按下 ENTER (或平静地处理可选弹出的合并工具),希望这能像我的情况一样解决它。
  7. 启动 Visual Studio 2015,打开该项目

我通过指示关闭和打开解决方案和 Visual Studio,添加了一个更加安全的分步指南。这可能过于谨慎,也许重新加载就足够了。这种症状可能是 Visual Studio Git 集成部分的 bug,也许将来会得到解决。


1
我同意,一定要检查它是否在VS、命令行或任何其他Git GUI之外工作。 - VladNeacsu
自五月份以来,Visual Studio 已经更新了多个版本,并且还有与 Git 集成相关的更新。我已经好一段时间没有遇到这种问题了。请始终将 VS 及其插件更新到最新版本。 - Csaba Toth
1
经常看到这个错误,我很惊讶在如此重要的产品中存在这样一个基本问题... - Christopher Bonitz
1
我正在使用VS 2015更新3。在从GitHub仓库拉取时遇到了此问题。 -打开命令提示符, -将目录更改为本地的git仓库 -输入git pull - phani

11
git status输入到打开该目录的命令行中。如果出现红色和/或绿色的文本,则表示您更改了一些内容但没有添加并提交。要么还原文件(通过执行git checkout -- <file>),要么添加和提交(通过执行git add --all然后git commit -m "commit message")。然后,您可以切换分支或执行其他操作。

我有未跟踪的文件。这可能是问题所在吗? - kwiri
@kwiri 是的,这意味着你在上次提交后创建了文件,但还没有提交它们。只需执行 git add --allgit commit -m "在此添加您的提交消息"。然后您就可以检出其他分支了。 - TechnicalTophat
我需要检查一下Visual Studio是如何处理这个问题的,因为如果你向项目中添加文件,它们也应该自动添加到提交中。目前我无法访问我的源代码,但我相当确定在切换到尝试pull的主分支之前,我已经在dev分支中提交了这些文件。 - kwiri
@kwiri 好的,如果您能够提供更多信息,比如出错的分支名称、您的 git log 显示了什么以及您最后一次提交编辑了哪些内容(与未跟踪的文件相关),那就太好了。 - TechnicalTophat
@RhysO 自从五月以来,Visual Studio 已经有了几次更新,VS Git 集成也进行了更新。我现在已经很长时间没有遇到这些问题了。请始终将 VS 及其插件更新至最新版本。 - Csaba Toth
显示剩余2条评论

9

在命令提示符中进入项目的工作目录,并尝试使用以下命令。

git add -A
git commit -m "your message"
git fetch origin master
git pull origin master
git push origin master //To push to the Git system

问题不在于命令,而在于VS 2015中的工具。我想在一个环境中使用VS Team Explorer工作。由于时间紧迫,我不想切换到命令行并尝试记住所有命令,因为我们已经在VS中有一个内置工具。我的想法可能是,由于我们项目的结构存在问题,这可能导致了一些问题。 - kwiri
2
适用于我,谢谢 :)git add -A git commit -m "你的信息" git pull - Amit K Khanchandani
1
这对我完美地起作用了!你可以在VS2015的程序包管理器控制台中编写这些命令,它完美地工作。我的问题已经解决了!@Dhruv - A. Gh

8
我在Visual Studio 2017版本15.5中遇到了这个问题,解决方法是进入Team Explorer的"设置"→"全局设置",将"拉取时修剪远程分支"和"拉取时将本地分支变基"设置为"True"。

Team Explorer Git Settings

http://www.codewrecks.com/blog/index.php/2017/12/23/configure-visual-studio-2017-15-5-for-pull-rebase/

此外,微软在这里提供了说明:https://learn.microsoft.com/en-us/azure/devops/repos/git/git-config?tabs=visual-studio&view=vsts#prune-remote-branches-during-fetch 当你意识到“我们建议在全局级别将此选项设置为True”不是这些项目的默认设置时,会感到非常尴尬。

另一种情况是,当您拥有一个单独的构建服务器并且解决方案经常获得编译器的NuGet更新时,此问题的另一个实例会发生。第一个更新NuGet包并同步仓库的人不会遇到问题,但如果其他人在执行同步之前尝试本地更新,则会弹出此消息,VS将不允许您拉取或推送代码。为了防止这种情况,每个人都应该养成在本地进行任何更新之前先同步的习惯。一旦遇到此问题,我们发现解决它的最佳方法是存储您需要保留的任何未提交的代码(https://marketplace.visualstudio.com/items?itemName=vii.GitStashExtension),然后将您的存储库重置为当前头。

我没有“在获取时修剪远程分支”和“拉取时变基本地分支”。 - Ziggler
@Ziggler 真的吗?我在上面添加了两个来源链接。从VS Pro 2017 v15.5到至少v15.8.7,这些设置都有列出。 - user1431356
“Unset”命令用于删除Git配置,因此在上下文中看起来有些不协调。随着最新的Git扩展更新,Git设置页面增加了几个选项。@Ziggler:你使用的VS版本是多少? - Laurie Stearn
谢谢,这个对我有用。浪费了几个小时在这个问题上。 - deanwilliammills

8

有时候我也会遇到这种情况。如果你正在使用Visual Studio,有一种简单的方法可以使你迅速解决问题。

对于Visual Studio 2013及以上版本,请按照以下步骤进行操作:

  • 进入菜单工具NuGet包管理器程序包管理器控制台
  • 输入git reset并按下Enter键。

就是这样,Git将被重置,然后您就能够轻松地拉取您的请求了。

VS2015:工具 > Nuget 包管理器 > 程序包管理器控制台。非常有效。感谢。


7

当本地有未提交的文件或更改,但这些内容被包含在拉取操作中时,通常会出现此问题。

例如,您可以直接从本地Git仓库文件夹添加新文件“test.txt”(而非通过Visual Studio)。该文件可能会列在“未跟踪的文件”选项中,因此当您提交更改时,该文件不会被跟踪和提交。然后,另一个人也创建了具有相同路径的“test.txt”,并提交并推送了它。现在,在执行拉取操作时,“test.txt”文件包含在拉取操作中,并且您将收到错误消息,指示存在未提交的更改。因此,在拉取之前,您需要检查是否有未提交的文件或更改,并提交它们。


我仍然遇到奇怪的问题。我正在尝试手动合并,Git说有未提交的更改,我进行了存储,但它仍然显示有未提交的更改。我不想提交我的更改,因为我没有对这些文件进行任何更改,并且diff在文件上没有显示任何更改。我尝试了reset --hard,但它仍然显示有未提交的更改和相同的文件。 - kwiri
谢谢。当我在“未跟踪的文件”中删除了文件后,我就能够切换我的分支了。 - Muhammad Ashikuzzaman

4

这对我很有帮助。我只是去了项目目录,检查是否有什么东西存在。

git status

我使用以下命令执行了代码拉取操作:

git pull

然后我重新启动了Visual Studio 2015并拉取了导致此错误的分支。这一次没有出现任何问题。 看起来这是Visual Studio 2015中的一个bug。只有在拉取新更改之前撤消更改时才会出现此问题。在Visual Studio 2017中似乎不存在这个问题。


这解决了我在使用VS 2019应用stash时遇到错误的问题。 - jcs

2

我也遇到过这个问题。一个简单的解决方法是选择 提交 来查看未提交的文件(或者直接使用 Team Explorer更改)。

然后右键每个文件并执行撤销操作。之前,我尝试通过对整个解决方案进行 撤销 测试,但它没有正常工作。然后再次使用 Team Explorer同步拉取,就可以了。


2

因为存在未提交的更改,所以无法拉取。在重试之前,请提交、存储或撤消您的更改。有关详细信息,请参见“输出”窗口。

解决此错误的简单方法如下:

首先提交您的更改,存储或撤消。然后拉取代码。例如:

git pull

然后它应该可以正常工作了。


0
对我来说,这个问题是由于有两个文件“Web.Config”和“web.config”引起的。我猜在Linux/Unix中这没问题,但Windows只能在本地存储其中一个。我在Azure DevOps中浏览文件时发现了这个问题。我删除了其中一个文件,问题就解决了。我猜这个问题可能是由任何文件引起的。

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