Git允许我在不提交更改的情况下切换分支

Git允许我在不提交更改的情况下切换分支,git,Git,我正在学习Git,正在学习教程。我在branch seo_title中,我对mission.html文件有未提交的更改。我确实git checkout master希望得到关于未进行提交的更改、未添加任何更改等的警告,但是它继续进行并切换分支,并显示以下消息: M mission.html Switched to branch 'master' 然后,当我执行git diff mission.html时,它显示工作目录仍然包含我在签出另一个分支时所做的更改。 我错过了什么? 无论如

我正在学习Git,正在学习教程。我在branch seo_title中,我对mission.html文件有未提交的更改。我确实
git checkout master
希望得到关于未进行提交的更改、未添加任何更改等的警告,但是它继续进行并切换分支,并显示以下消息:

M       mission.html
Switched to branch 'master'
然后,当我执行
git diff mission.html
时,它显示工作目录仍然包含我在签出另一个分支时所做的更改。 我错过了什么? 无论如何,我在Windows上使用Git Bash

编辑:对mission.html的更改也没有添加到暂存索引中

编辑2:我认为得票最多的答案是正确的,但经过进一步调查,它与我看到的行为不匹配。以下是对我所做工作的更全面描述:

top_directory(master) > git branch new_branch_1
top_directory(master) > git branch new_branch_2
top_directory(master) > git checkout new_branch_1
(打开notepad++并修改resources.html,保存)

top\u目录(主)>git状态
#关于分支机构新分支机构1
#未为提交而暂存的更改:
#(使用“git add…”更新将提交的内容
#(使用“git checkout…”放弃wo中的更改
#
#修改:resources.html
#
未向提交添加任何更改(使用“git add”和/或“git commit
顶级目录(新分支机构1)>git签出新分支机构2
这就是我希望git反对并告诉我隐藏或提交的地方,因为new_branch_1和new_branch_2有不同版本的resources.html,但它只是在没有警告的情况下切换到新分支,并带来未提交的更改:

M       resources.html
Switched to branch 'new_branch_2'
top_directory(new_branch_2) > git status
# On branch new_branch_2
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   resources.html
#
no changes added to commit (use "git add" and/or "git commit -a")
M resources.html
切换到分支机构“新分支机构2”
顶级目录(新分支2)>git状态
#关于分支机构新分支机构2
#未为提交而暂存的更改:
#(使用“git add…”更新将提交的内容)
#(使用“git签出--…”放弃工作目录中的更改)
#
#修改:resources.html
#
未向提交添加任何更改(使用“git add”和/或“git commit-a”)
是否有一种模式或设置会使其以这种方式运行而不是发出警告?或者我仍然误解了这种情况


编辑3:我现在明白了。排名靠前的答案是正确的,请参阅我对该答案的最后一条评论。

。它只使用工作树快照进行操作。主要要求-您应该能够重建工作树。它当然会更新。但是如果修改的文件在两个分支中都是相同的,为什么不允许切换?如果您是通过mistak完成的e、 您可以切换回以前的状态,这没什么大不了的。但是如果文件在分支中不同,您需要合并内容,这就是为什么它坚持提交更改,否则将无法返回。

您上次尝试使用本地更改切换分支时看到的不同行为,现在是由于租赁文件更改

所以,假设我们有一个名为“readme”的分支,您在其中提交了对文件的一些更改,比如readme.md

现在,您已切换回master。您在其他文件(而不是README.md)上执行了一些工作。现在您有了本地更改。如果您尝试在不提交更改的情况下切换回“README”分支,它将允许您。为什么?因为切换到“README”分支不会覆盖任何本地更改

但是,如果您在主分支上修改了README.md文件,那么当您尝试执行

git checkout readme 
你会遇到

error: Your local changes to the following files would be overwritten by checkout: README.md
Please, commit your changes or stash them before you can switch branches.

因为您对README.md的更改需要合并。

Git将允许您签出其他分支(或标记或SHA1哈希),只要您将工作树更改为“提交”,而不是“关闭”本地未提交的更改

在您的情况下,分支
master
的工作树的
missing.html
版本与您当前正在切换的分支尖端中的版本相同。Git不需要触摸工作副本(至少对于
missing.html
)在此处更改分支时,允许保留本地修改

如果您确实尝试
签出
工作树中存在不同版本的
missing.html
(与当前分支中提交的版本不同),git将显示类似于以下内容的错误消息:

$ git checkout some-other-branch
error: Your local changes to the following files would be overwritten by checkout:
        missing.html
Please, commit your changes or stash them before you can switch branches.
Aborting

这是正常的行为。如果您不想在新签出的分支上修改文件,请将其隐藏。如下所示

# on branch dev
$ git stash
$ git checkout master

# do stuff on master

# back to dev
$ git checkout dev
$ git stash pop

这是显而易见的,如果您更改了一个文件,而该文件在您要签出到的分支中没有更改,因为签出的语法是将所有索引和工作目录带到您的新分支中,您将使它们出现在您的新分支中。而如果存在冲突,则可能需要合并这些文件,这意味着在合并之后,如果您签出到旧分支,那么它已经是合并版本而不是以前的版本,您将丢失它。因此,为了确保您保留旧更改,它不会让您这样做。

问题是什么?是的,git允许签出其他分支。这非常有用。如果错误地编辑了错误分支的文件,您可以heckout正确的分支并在那里提交。我感到困惑的是:我认为签出会尝试更新工作目录以匹配新的分支,并且,当它发现未提交的更改(当工作目录更新时会丢失)时,它会中止签出。至少教程中指出了这一点(我亲眼目睹)在早期的lessonIt's中,这可能是因为在主分支之后没有任何提交。因此,您的所有分支都指向同一个提交对象。当您从其他分支签出时,您实际上是从当前分支的同一提交中签出的。我认为这个答案很好地说明了这一点:Git将允许您签出其他分支(或标记或SHA1散列),只要您将工作树更改为的提交不会影响本地未提交的更改
# on branch dev
$ git stash
$ git checkout master

# do stuff on master

# back to dev
$ git checkout dev
$ git stash pop