Git: 在修改了工作区和索引的情况下使用git checkout

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中,因为在br2上运行git status时不会得到干净的消息。我猜这是因为br1br2的头最初具有文件foo的相同版本,Git可以自动检测到这一点。
问题:
Git何时决定不闪存工作树和索引?是否还有其他边角情况?

1
这不是一个边缘情况,而是你可能在提交之前决定要在一个新分支上提交。只要从一个分支切换到另一个分支不会覆盖任何修改过的文件/对索引造成问题,git 就会简单地切换到该分支。 - X-Istence
@X-Istence 但是Git如何决定它不会引起问题呢? - Cyker
1个回答

6
git checkout 命令实际上有两种不同的(常见)操作模式。
  1. 如果您运行 git checkout <branch>,那么您将切换到分支 <branch>。所有对工作树所做的更改都将被保留 - 这是通过将未提交的更改合并到目标分支来完成的,因此可能失败。索引中的更改将被存储。

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

因此,git checkout <branch> 的目的是为了在您决定所做的更改实际上属于另一个分支时使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接