我希望 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 status
在 br2
不会给出干净的信息。我猜这是因为 br1
的负责人和 br2
原来有相同版本的文件foo
, Git 可以自动检测到这一点。
问题:
- Git 何时决定不刷新工作树和索引?还有其他极端情况吗?
最佳答案
git checkout
命令实际上有两种不同的(常见的)操作模式。
如果你运行
git checkout <branch>
, 然后你会切换到分支<branch>
.对工作树的所有更改都将保留——这通过将未提交的更改 merge 到目标分支来实现,因此它可能会失败。索引中的更改将被 stash 。如果你运行
git checkout <path>
, 然后 git 将清除对<path>
的更改通过从当前提交中获取索引和工作副本。
所以 git checkout <branch>
的目的以防万一您决定所做的更改实际上属于不同的分支。
关于Git:修改工作树和索引的 git checkout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13166505/