理解git在 checkout 时的行为;应在 checkout 时出现错误,但未收到错误

aiazj4mn  于 2023-01-24  发布在  Git
关注(0)|答案(2)|浏览(145)

我的问题是关于git在 checkout 时的行为,下面是一些步骤来解释我不理解的行为。我创建了一个dir testdir,其中包含foobar文件,每个文件都只有一行文本。

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

那么,为什么这个行为现在与以前不同,我得到了错误?(这是我最初预期的行为)。

e3bfsja2

e3bfsja21#

根据git checkout的文档:

git checkout <branch>
Local modifications to the files in the working tree are kept, so that they can be committed to the <branch>.

分支之间的切换应被视为应用表示它们之间差异的补丁。
在你的第一个案例中没有什么不同。
在第二种情况下,checkout命令甚至没有尝试解决冲突。

pokxtpni

pokxtpni2#

我读到过一个解决方案是删除文件(rm)然后执行 checkout 。否则,你也可以添加并隐藏它们。强制 checkout 如下:

git checkout --force master

可能是另一种选择。
你试过这个链接GIT - Fail to checkout to other branch when nothing to commit - when file is in gitignore吗?也许这也能帮助你。

相关问题