Git允许在未暂存的更改情况下切换分支。

68

如果我有更改但未暂存(commit)的文件(修改过的文件),Git可以让我切换分支。

这方面有配置吗?

编辑:起初,我认为这是需要设置的配置,以禁止在存在修改但未暂存的文件时在分支之间切换。但根据 Emily 的评论,看来只有当分支之间的文件不同时才会提示,否则不会有提示。


6
这是一个功能--如果你进行更改后发现它们应该属于一个新分支或与当前所在分支不同的分支,那么你只需切换到相应的分支再提交即可。 - antlersoft
这是一个功能,因为您可能会注意到您实际上想将这些未暂存的更改提交到另一个分支。 - jørgensen
18
此外,如果你已经对不同分支中的文件进行了更改,它将不允许你切换。因此也内置了一些保护措施。 - Emily
1
如果你修改了两个分支之间不同的文件,它就会拒绝切换分支而不是提示你。只有在安全的情况下才会切换分支 - 也就是说,你可以立即切换回来,并且恢复到原来的状态。 - Cascabel
2个回答

149

如何决定

进行快速实验后有以下结论。

假设您目前在分支dev上,已经修改了foo.txt文件。未提交更改的情况下,尝试切换到master分支。会发生以下两种情况中的一种。

  1. 如果在dev中没有master分支所拥有的提交的foo.txt文件版本,则不能切换分支而需要先提交更改,因为master拥有与未提交的更改产生冲突的“新”文件版本。

    因此,“检出”master需要Git更新foo.txtmaster拥有的更新版本,销毁您未提交的更改。为防止您遗失工作,Git不会改变分支。

  2. 否则,对foo.txt的修改是从master所知道的版本“之后”进行的,您将能够更改分支。Git无需更新文件,因为master没有关于该文件的新信息。

针对“哎呀”更改

基于上述原因,如果您在一个分支上有未提交的更改,而意识到实际上应该在另一个分支上提交更改,则可能无法检出其他分支。

但是,您可以执行以下操作:

  • git stash save“这是我的更改摘要”(摘要将显示在git stash list中)
  • git checkout otherbranch
  • git stash pop(这是git stash applygit stash drop的组合)

32
我必须说,Git 最让我喜欢的一点是它的实验性操作非常容易。我从来不会为了测试某个东西而搭建一个 Subversion 服务器,但是开始一个 Git 实验只需要像这样简单的几步:mkdir throwaway; cd throwaway; git init。进行几个 Git 操作之后,我就学到了新东西,然后可以删除那个目录。 - Nathan Long
这是一个很好的解决方案,_但是_它似乎只适用于修改过的文件,而不是_新增_的文件。我刚刚丢失了一些:( 诚然,我强制更改了分支,我通过在Visual Studio中使用git并结合命令行来复杂化事情。 - Ian
2
@Ian 如果 foo.txt 是你当前分支上的一个新的、未跟踪(从未提交)的文件,而你又执行了 git checkout other_branch 命令,那么 git 不会对 foo.txt 进行任何操作;因为在其他分支上它没有任何冲突版本,所以 git 会将该文件视为无关紧要。也许你使用的工具还执行了 git clean 命令?https://git-scm.com/docs/git-clean - Nathan Long

11

正如Emily所指出的那样,这是一个特性。只有在执行更改需要修改任何未提交更改的文件时,Git 才会禁止分支更改。如果所有修改过的文件都不受分支检出的影响,Git 将不会发出任何投诉。这意味着无论您检出哪个分支,您都可以始终检出上一个分支,您的工作树将与您离开时完全相同。


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