大多数时候,当我尝试签出另一个现有分支时,Git不允许我在当前分支上有一些未提交的更改。因此,我必须先提交或隐藏这些更改。

然而,Git偶尔允许我签出另一个分支而不提交或存储这些更改,它将把这些更改携带到我签出的分支。

这里的规则是什么?更改是阶段性的还是非阶段性的有关系吗?对我来说,把这些变化带到另一个分支没有任何意义,为什么git有时允许这样做?也就是说,它在某些情况下有用吗?


当前回答

如果您不希望这些更改被提交,请做 Git重置——很难。

接下来,您可以签出到想要的分支,但请记住,未提交的更改将会丢失。

其他回答

我也在这件事上挣扎了一段时间,我想给出我的答案。首先,我对这件事的理解来自这里:https://medium.com/swimm/a-visualized-intro-to-git-internals-objects-and-branches-68df85864037

问题是:

然而,Git偶尔允许我签出另一个分支而不提交或存储这些更改,它将把这些更改携带到我签出的分支。 这里的规则是什么?更改是阶段性的还是非阶段性的有关系吗?对我来说,把这些变化带到另一个分支没有任何意义,为什么git有时允许这样做?也就是说,它在某些情况下有用吗?

当你从任何其他分支创建一个分支时,你只是创建了一个指向同一个提交的指针,所以除非你已经提交了你已经开始工作的任何更改,否则你将指向同一个提交,因此git将允许你以这种方式更改分支。只有当你向新分支提交任何更改时,不同分支之间的提交才会开始不同,如果有任何未提交的更改,git在尝试签出这些分支时会报错。

您有两个选择:隐藏您的更改:

git stash

然后再把它们拿回来:

git stash apply

或者将更改放在一个分支上,这样您就可以获得远程分支,然后将更改合并到该分支上。这是git最伟大的地方之一:你可以创建一个分支,提交给它,然后在你所在的分支上获取其他更改。

你说这没有任何意义,但你这么做只是为了在拉之后可以随意合并它们。显然,您的另一个选择是提交分支的副本,然后执行拉取。假设你不想这样做(在这种情况下,我对你不想要分支感到困惑),或者你害怕冲突。

正确答案是

Git checkout -m origin/master

它将来自源主分支的更改与本地甚至未提交的更改合并。

如果您不希望这些更改被提交,请做 Git重置——很难。

接下来,您可以签出到想要的分支,但请记住,未提交的更改将会丢失。

分支切换只发生在您更改两个分支之间没有差异的文件时。在这种情况下,git对两个文件的更改都一视同仁。 当您更改两个分支之间存在差异的文件时,这种情况将被阻止。在这种情况下,你会得到中止信号。

经过一个小时的调查和当地测试,得出了这个结论。