我的问题是关于git在 checkout 时的行为,下面是一些步骤来解释我不理解的行为。我创建了一个dir testdir
,其中包含foo
和bar
文件,每个文件都只有一行文本。
git init
git add .
git commit
git branch bug
所以我有master
分支和一个相同的bug
分支,在master
中我添加了一行文本到foo
文件中,但没有添加或提交到master,只是在我的本地树中修改了一个文件。
git checkout bug
我希望得到以下错误:
error: Your local chages to the following file would be overwritten by checkout:
foo
Please commit your changes or stash them before you can switch branches.
但是我没有***没有***得到上面的错误,我的问题是为什么在这种情况下git没有出错呢?
root@revision-control ~/testdir# git checkout bug
M foo
Switched to branch 'bug'
我现在在bug
分支中,但是foo
文件具有我在master
中添加的第二行。
有人能解释一下这里发生了什么吗?为什么git让我修改分支时没有错误信息?并且文件中没有合并冲突指示符。
接下来,我更改回master
分支,并将更改添加到foo
文件,然后将更改提交到该文件(因此master
文件foo
具有2行,而bug
文件foo
具有1行)。我在master
中修改了foo
,并添加了第三行文本,现在当我试图 checkout bug
分支时(与上面的git命令相同),我得到:
user@host ~/testdir# git checkout bug
error: Your local changes to the following files would be overwritten by checkout:
foo
Please, commit your changes or stash them before you can switch branches.
Aborting
那么,为什么这个行为现在与以前不同,我得到了错误?(这是我最初预期的行为)。
2条答案
按热度按时间e3bfsja21#
根据git checkout的文档:
分支之间的切换应被视为应用表示它们之间差异的补丁。
在你的第一个案例中没有什么不同。
在第二种情况下,checkout命令甚至没有尝试解决冲突。
pokxtpni2#
我读到过一个解决方案是删除文件(rm)然后执行 checkout 。否则,你也可以添加并隐藏它们。强制 checkout 如下:
可能是另一种选择。
你试过这个链接GIT - Fail to checkout to other branch when nothing to commit - when file is in gitignore吗?也许这也能帮助你。