我正在尝试使用我创建的虚拟文件夹和实际的生产git repo来学习git。我不明白在什么情况下会抛出以下错误:
error: Your local changes to the following files would be overwritten by checkout:
index.html
Please commit your changes or stash them before you switch branches.
Aborting
字符串
下面是我在虚拟git文件夹上执行的操作序列:
PS C:\Users\thepav\Desktop\git project> git status
On branch feature-a
Your branch is up to date with 'origin/feature-a'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
PS C:\Users\thepav\Desktop\git project> git checkout main
error: Your local changes to the following files would be overwritten by checkout:
index.html
Please commit your changes or stash them before you switch branches.
Aborting
型
我试图通过修改一个文件在Prod git repo中重现同样的行为,但这是我得到的:
$ git status
On branch develop
Your branch is up to date with 'origin/develop'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: application/ice.ini.php
no changes added to commit (use "git add" and/or "git commit -a")
$ git checkout master
M application/ice.ini.php
Switched to branch 'master'
型
问题是为什么prod git repo不会抛出错误?
1条答案
按热度按时间moiiocjp1#
在第一种情况下,您在本地修改了
index.html
,但在当前分支中的index.html
版本之间的存储库中也存在差异(feature-a
)和要切换到的分支(main
).git checkout
应该用分支main
的版本替换本地index.html
,但这会破坏本地更改(它们还没有在提交中持久化)。这就是为什么它会显示警告并中止 checkout 。在第二个场景中,本地修改的文件(
application/ice.ini.php
)在存储库中的分支之间没有区别,并且在 checkout 时不会修改。在
git checkout
上,Git将HEAD
引用改为指向目标分支,然后将旧分支和新分支之间的差异应用于索引和本地工作树。早在2019年,在version 2.23上,Git引入了两个新命令,
git switch
和git restore
。它们每个都做了git checkout
的一些事情。它们被引入是因为git checkout
做了太多不相关的事情,这取决于它是如何被调用的。建议使用
git switch
切换分支。git switch
的工作方式与使用分支名称调用git checkout
的工作方式相同,并且不使用文件路径作为参数。问题中描述的行为没有改变。只是更容易理解其用途。)*