5

我希望git checkout <commit>将工作树和索引都刷新到<commit>版本。但是,在某些情况下,它将保留工作树和索引中的当前更改。例如:

git branch br1
git branch br2
git checkout br1
<make change M1 to file foo>
git add foo
<make change M2 to file foo>
git checkout br2

现在,在分支中所做的所有工作树/索引更改br1都保留在分支中br2,因为git statusonbr2不会给出干净的消息。我猜这是因为文件头br1br2原来有相同版本的文件foo,Git 可以自动检测到这一点。

问题:

  • Git 什么时候决定不刷新工作树和索引?还有其他极端案例吗?
4

1 回答 1

5

git checkout命令实际上有两种不同的(常见的)操作模式。

  1. 如果你运行git checkout <branch>,那么你将切换到分支<branch>。对工作树的所有更改都将被保留——这是通过将未提交的更改合并到目标分支来实现的,因此它可能会失败。索引中的更改将被隐藏。

  2. 如果你运行,那么 git 将通过从当前提交中获取它们来git checkout <path>清除索引和工作副本中的更改。<path>

因此,目的git checkout <branch>是为了以防您决定所做的更改实际上属于不同的分支。

于 2012-10-31T20:02:03.573 回答