2012-10-31 19 views
5

我希望git checkout <commit>可以将工作树和索引同时闪烁到<commit>版本。但是,在某些情况下,它会保持工作树和索引中的当前更改。例如:Git:使用修改后的工作树和索引进行git结帐

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 statusbr2不会给人干净的消息。我想这是因为br1br2的头文件最初版本为foo,Git可以自动检测到这一点。

问:

  • 什么时候Git的决定不闪工作树和索引?还有其他的角落案例吗?
+1

这不是一个角落的情况下,想法是,你可能会决定,在提交之前,你想提交一个新的分支。只要从一个分支切换到另一个分支不会覆盖任何已修改的文件/索引问题,git将简单切换到分支。 –

+0

@ X-Istence但git如何决定**它不会导致问题**? – Cyker

回答

5

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

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

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

所以git checkout <branch>目的是在你决定,你实际上做的变化在不同的分支属于情况。