在VS中使用TFS/GIT无法切换到主分支,因为存在未提交的更改。

36

我在visualstudio.com上为一个VS 2013解决方案设置了一个GIT存储库。当我习惯使用TFS(以GIT模式)时,这个存储库非常好用。

然后我决定熟悉一下分支,所以我从主分支创建了一个分支。我在这个分支上做了很多改变。我随着时间的推移提交了这些更改,并执行了同步以将我的本地提交推送到visualstudio.com存储库。这一切都很顺利。

我遇到的问题是,我不知何故失去了切换回主分支的能力。我无法将新创建的分支合并到主分支中。每次我尝试执行涉及主分支的任何操作时,在VS中都会收到以下错误:

  

无法切换到主分支,因为有未提交的更改。在切换分支之前,请先提交或撤销您的更改。有关详细信息,请参见“输出”窗口。

“未提交的更改”指的是什么?由于我无法进入主分支,因此我无法提交任何其更改(也不确定是否要提交)。而我现在所在的当前(唯一的其他)分支已被提交和同步。

我只是在学习TFS、GIT和源代码控制。我该如何安全地从这个问题中恢复?


你能提供一下Team Explorer的Changes页面的截图吗?升级到VS 2013 Update 4有帮助吗? - Edward Thomson
更新似乎总是需要停机时间...我正在运行VS 2013.2 - 是否与此问题有关? - rwkiii
在处理 EOL 设置不正确的配置方面,有重大更新。 - Edward Thomson
2
我遇到了同样的问题,我使用的是VS 2003 Update 4。这是一个屏幕截图:http://i.imgur.com/KioiygN.png请注意,它在抱怨更改,但没有列出任何更改。我甚至无法执行提交,因为没有更改。当我使用外部的git客户端,例如git或gitExtensions时,两者都显示没有更改。没有未同步的提交,也没有等待从服务器上拉取的内容。这是一个VS Bug。 - Kushan
javovo的答案还没有得到很多赞,但显然是最好的解决方案。 - DavB.cs
14个回答

53

好的,我自己也遇到了与rwkiii相同的问题 - 这是Visual Studio中的一个错误,不容易修复。以下是症状:

Visual Studio表示您无法合并/切换分支等,因为您有未提交的更改 - 这很好,但所有更改已经提交了。

不能切换到主分支,因为存在未提交的更改。在切换分支之前,请提交或撤消更改。有关详细信息,请参见“输出”窗口。

这里有一张截图以更清楚地说明问题。

如果您查看输出窗口,它可能看起来是空的,但您必须将“显示来自”更改为“源代码控制-Git”。这将列出Visual Studio认为已更改的文件。

确保选择“源代码控制 - Git”

现在,我尝试的东西没有解决它(所以你不用):

  • 重启Visual Studio
  • 重启计算机
  • 切换项目
  • 使用外部git工具(所有都说“没有更改”)
  • git重置
  • 对文件进行任意更改并提交。提交成功,但VS仍然认为有更改

最终,我不得不去删除磁盘上的文件,然后从Team Explorer窗口“撤消”该更改:

单击“撤消”以恢复文件和切换分支的能力

虽然这不是最理想的解决方案,但它似乎可以解决问题。


2
我必须表示同意。我一直在寻找解决方法,但没有成功。我正在使用VS 2013,卡在了构建上 - 无法合并回主分支。我也没有看到输出 - 所以关于切换到“源代码控制-Git”的提示非常有用。需要注意的是:从磁盘中删除文件后,您的文件可能不会出现在“已包含的更改”中。我的文件显示在“已排除的更改”中。 - Rich Ward
2
这对我没用 ;( 这是一个全新的VS2013安装。从主分支进行了全新的克隆,它进行了一个项目“转换”并添加了一个日志文件。我认为即使输出显示了一个随机文件,这也会使它偏离轨道。无论如何,我进行了手动git checkout,问题得到了解决。现在我可以自由更改而没有问题。 - Piotr Kula
1
我也在考虑这么做……不错!在花费了这么多时间来解决这个问题之后,我觉得是时候摆脱 Git 的 Gui 工具了。 - Dhanuka777
在我的VS2015社区版中运行良好。这个bug出现的时候有什么想法吗?当进行FI(正向集成)和RI(反向集成)时,许多不同目录中的文件都出现这种情况,真的很烦人...想念我们使用SVN(Subversion)或TFS源代码控制的日子...从未遇到过这样的问题,即使是TFS源代码控制似乎也更加稳定...这和其他问题让我讨厌Git... - hfrmobile
1
@Sentinel 我建议你更新你的.gitignore文件,使用在github上列出的那个:https://github.com/github/gitignore/blob/master/VisualStudio.gitignore这通常可以解决像你刚才描述的问题,并且对于99%的Visual Studio项目来说是一个很好的起点。 - Kushan
显示剩余4条评论

31

我使用git命令提示符解决了这个问题。我不能保证这是最好的方法或唯一的方法,但在Visual Studio 2013中对我起作用。

在团队资源管理器中的更改下,选择打开命令提示符

在命令提示符中键入:

  

git status

它将列出正在更改的文件。

将这些文件复制出来(以防万一),然后您可以在命令提示符中放弃工作目录中的更改。

  

git checkout -- mysubdir\myfile.ext

不要尝试在Visual Studio中更改分支,它仍然不会起作用!

相反,在命令提示符中切换到相应的分支。

  

git checkout branchname

当您回到Visual Studio时,它将提示您重新加载项目。之后,该分支将正确更新为您从命令行中选择的分支。

希望能帮到你。


5
我没有更改过任何文件(事实上我只是刚刚克隆了这个仓库),但是由于出现了这个错误,VS不让我切换分支。最终,我只需运行命令 git checkout <branch> 就可以切换成功了。显然这是 VS 插件中的一个 bug。 - David Masters
这对我来说似乎很有效,我没有提交过任何东西,我做了一个 git checkout <branchname> ,之后它就起作用了。 - Jay
只是手动运行checkout就解决了我的问题。我进行了全新的VS2013安装,Git Windows安装。克隆后它进行了项目转换,并插入了一个日志文件。它卡在那里,我无法从主分支更改。我手动checkout后,所有分支现在都可以工作了。太好了!+1 - Piotr Kula
我执行了 "git status" 命令,它显示我的分支是最新的,没有需要提交的内容,这应该是正确的。奇怪的是,下一次我尝试合并时它就成功了,我不认为有任何其他变化(除了我的输出窗口中的“显示输出来源”)。 我查看了文档,似乎 git status 不会改变任何东西,所以我不确定如何解释这个突然成功的合并。 - PTansey
打开命令提示符,执行“git status”,然后在VS中执行挂起文件的阶段。 - Patrick Peters
我在vs2013中遇到了同样的情况:在主分支上创建了自己的唯一分支,并提交了所有更改并同步完毕,但当我尝试从当前分支切换到主分支时出现了相同的错误。Git状态未显示需要提交的更改。在git中检出主分支,一切正常。然后回到VS Team Explorer,该分支现在是主分支。接着,在git中检出另一个分支,VS 2013正确地显示了该分支。现在一切都很好。同意:这是一个大的微软漏洞;不修复它是犯罪行为。 - RRRSR

4

嗨,这个方法对我有用...

尝试使用命令提示符 Team Explorer > 未同步提交 > 操作 > 打开命令提示符

执行git checkout 分支名


3

1: 打开git bash

2: 定位到您的git存储库

3: 使用命令“git status”检查分支状态

如果您的更改对其他分支具有可重用性,则使用“git stash save”(这将在本地保存您的更改,您可能会遇到一些冲突错误,您可以暂时忽略)如果在git状态结果中看到任何未合并的文件,并且您想保留更改,请使用“git add <file path>

4: 一旦保存了您的本地更改,请使用命令“git reset --merge

这将将您的本地分支重置为原始检出状态,现在您已准备好切换分支,您可以在Visual Studio Team Explorer>changes中看到冲突文件,如果您不想保留该文件更改,请右键单击并选择撤消更改或使用“git add <file path>”将此文件与其他保存的文件一起添加。

5: 现在您的git分支已准备好切换,请输入“git checkout <branch path>

6: 要弹出保存的更改,请使用“git stash pop”,这将合并保存的更改到当前分支中。


3

我曾经遇到类似的问题,但不需要删除文件或进行新更改。

在将更改提交到BranchA后,通过Git bash合并到Master并推送后,下次打开VS项目并查看Team Explorer时,它显示Master分支上有更改。通过Git bash检查状态时没有发现任何更改,但是VS输出中列出了10个文件。所有文件的差异都没有显示任何更改。此时我尝试进行提交修订,但无法修改先前的提交(关于这一点请参阅下文,因为最终这将解决我的问题)。

尝试在VS中切换到BranchA,但提示由于未提交的更改而无法切换。通过Git bash切换到BranchA,状态显示没有更改。刷新VS Team Explorer以便它现在位于BranchA,显示了14个文件更改,甚至比Master还多,但是所有文件的差异仍然没有显示任何更改。

在Team Explorer的BranchA中,单击操作->修订先前的提交。这次它可以让我这样做,并清除了所有更改。然后它显示了一个挂起的提交,但是在Git bash上检查状态时没有任何挂起的内容,因此返回Team Explorer主页并再次进入,即可清除挂起的提交消息。

在Team Explorer中切换到Master,也不再显示更改。一切正常。


2
未提交的更改意味着您已修改了一个或多个文件,这些文件已经被添加到Git中,并且这些更改尚未在提交或Git存储中“保存”。当您在分支之间切换时,不允许有未提交的更改(尽管尚未添加到Git的新文件是可以的),因为其他分支中的更改可能会覆盖您的未提交的更改。我对Visual Studio如何与Git集成不熟悉,因为我自己使用Powershell的PoshGit
继续操作的方法是:
- 撤消您的更改 - 提交您的更改 - 或者将您的更改存储(请参见中断的工作流程部分)。

我所在的分支很重要,因此我不想从主分支合并/拉取任何更改。老实说,我不认为主分支会有任何更改,因为在创建新分支之前,我已经执行了提交和同步操作。这个问题已经持续了几周... 你知道哪个分支包含未提交的更改吗?它在我的本地GIT存储库还是在visualstudio.com上?未提交的更改是在主分支(我无法获取)还是我一直在工作的新分支中?:S - rwkiii
未提交的更改始终是本地的,并且在您当前所在的分支上。 如果Visual Studio出现问题,无法显示待处理更改,我的建议是从http://git-scm.com/downloads安装git,然后使用Git Gui工具查看任何待处理更改。 - Asser
来自2016年的问候。现在,有时候很难让VS撤销一个更改。有时它会进入一种状态,在这种状态下,您可以点击“撤消更改”和“是的,该死的,我是认真的。这就是为什么我点击了另一个按钮”,但是没有任何效果。一种解决方法是提交(虚构的)更改,然后恢复提交。在提交的描述中,输入类似于“安抚GIT”的内容。 - Jive Dadson

1
我们经常遇到这个问题,因为我们有一个特定的文件必须始终排除在更改之外,但有时会被更改。
当错误消息出现时,对我们有效的方法是:
  1. 在VS中查看输出窗口,查看哪个文件导致了问题。
  2. 在Git bash中运行git update-index --no-assume-unchanged TheNameOfTheFileCausingTheIssue
  3. 在VS中对此文件进行撤销检出
  4. 在VS中在管理分支中更改分支。
这可能适用于你的情况,但我已经添加了它,以防它将某人引入正确的方向。 在运行命令之前,请确保您理解git命令!

VStudio:在解决方案资源管理器中,右键单击项目撤消。 - Jason
@Jason - 但是你每次都必须这样做,这让人感到沮丧。我的解决方案是一次性的修复。 - Dib

1
我注意到有时候sln项目标记为已更改,但在解决方案资源管理器中并没有看起来像这样。我已经按照其他人建议的做法,在命令提示符中进行了操作。
git status (this should show you culprit files)

然后添加单个文件。或者我个人所做的是运行:

git add -A 

这将会把所有更改的文件添加到团队资源管理器中,以便您可以随意撤消/删除。我使用这种方法从未遇到过问题。


1
你可能遇到了一些冲突,需要解决。
以下是一种解决方法:
如果你在Windows上:
1. 进入你的项目文件夹并使用Git Bash打开。 2. 输入“git pull”,你会看到哪些文件引起了问题,只有几个文件。 3. 会出现如下信息: <<<<<<<错误:您对以下文件的本地更改将被合并覆盖: src/UCG.Custodian.WebUI/Web.config 请在合并之前提交您的更改或将它们存储。 中止 正在更新ddd76137..b7ba45fa>>> 4. 撤消或提交那些文件,在我的情况下仅有一个src/UCG.Custodian.WebUI/Web.config。 5. 然后再次输入“git pull”。

1

对我有用的一件事是:-
1)右键单击要检出的分支。
2)单击重置选项。
3)单击删除更改(--hard)
4)右键单击分支并选择检出


哦,我的所有更改都不见了。 - Ashish Kamble
是的,reset --hard 命令会删除您所做的更改。 - rbansal

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