为什么git branch将分阶段更改转移到子分支

时间:2017-04-24 13:16:27

标签: git version-control branch

在Pro Git书籍的在线版本中,我找到了句子"The HEAD in Git is the pointer to the current branch reference, which is in turn a pointer to the last commit you made or the last commit that was checked out into your working directory."。在阅读有关分支的内容时,我读到了从当前HEAD创建的分支,例如here。在我天真的情况下,我得出结论,创建一个分支可以承载任何已经提交的东西(因为它是HEAD的一部分),而不是更多(也就是说,通过分段也不是索引的一部分)。但是,我发现父分支的分阶段更改也是新创建的子分支的一部分。这不是违反直觉的,因为我的分支应该包含HEAD,而HEAD又是父分支中的最新提交吗?

示例

仅在现有分支master中具有一个已提交文件“testfile”的repo。我在此文件echo "test a new line" >> testfile中添加了一行,通过git add .暂存。现在我决定做别的事,但需要一个新的分支。我创建了git branch testbranch。现在我想切换到新的分支(实际上我希望git不会让我切换,因为我已经在master暂停但未提交的更改,但它会{}} git checkout testbranch。现在git status告诉我我已经在testbranch中提交了更改。为什么?我创建了testbranch来做其他事情,并期望它包含其父分支(master)的HEAD中的内容。

1 个答案:

答案 0 :(得分:1)

虽然评论中的答案似乎已经满足了你的好奇心,但还有一点应该说。

当你说分阶段的变化被转移到新的分支时,会出现一些概念上的混淆。分支是数据库的概念。可以有任意数量,如.git/refs/heads和/或packed-refs文件中所示。只有一个索引,它不是任何分支的一部分(或真正与之相关)。它更像是签出状态的一部分。

正如Edmundo所说,你可以使用git stash做你想做的事。当你创建一个存储时,你真的要创建最多两个临时提交(一个代表任何分阶段的更改,一个代表任何未分级的更改)和一个特殊引用(stash - 使用reflog移动和跟踪如果你需要不止一个的话,支持一个堆栈" stashes。这些更改是您的HEAD提交的主要内容,但仍可以在任何地方应用/弹出。这就像你可以得到的那样接近一个特定于分支的索引。