Git允许我在不提交更改的情况下切换分支
我正在学习Git,正在学习教程。我在branch seo_title中,我对mission.html文件有未提交的更改。我确实Git允许我在不提交更改的情况下切换分支,git,Git,我正在学习Git,正在学习教程。我在branch seo_title中,我对mission.html文件有未提交的更改。我确实git checkout master希望得到关于未进行提交的更改、未添加任何更改等的警告,但是它继续进行并切换分支,并显示以下消息: M mission.html Switched to branch 'master' 然后,当我执行git diff 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