我希望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可以自动检测到这一点。
问题:
答案 0 :(得分:5)
git checkout
命令实际上有两种不同的(常见)操作模式。
如果您运行git checkout <branch>
,则会切换到分支<branch>
。将保留对工作树的所有更改 - 这通过将未提交的更改合并到目标分支来工作,因此它可能会失败。索引的变化将被隐藏。
如果你运行git checkout <path>
,那么git将通过从当前提交中获取它们来消除索引和工作副本中对<path>
的更改。
因此,如果您确定所做的更改实际属于不同的分支,则git checkout <branch>
的目的就是这样。