创建一个分支和另一个分支是否继承了彼此之间的变化?

时间:2017-03-17 00:39:24

标签: git

以下是我的观察:

  • 当我对分支上的某些文件进行非分段更改(之后不运行git addgit commit)然后通过git checkout -b newbranch创建新分支时,新分支将也"继承"我对原始分支的更改。

  • 当我在分支上然后创建一个新分支,并对新分支上的某些文件进行非分段更改,并通过git checkout originalbranch切换回原始分支时,原始分支也将"继承"我对新分支的更改。

我不确定我的观察是否正确。

如果我的观察是正确的,那么它们对我来说没有意义,因为当我们从另一个分支创建分支时,我们通常希望对它们进行单独的工作。如果一个分支继承了另一个分支的更改,那么我们在分支上执行的工作将不会与另一个分支分离。那么为什么"继承"?

2 个答案:

答案 0 :(得分:1)

Git是graph, in the computer science sense,意思是提交是彼此连接的节点。分支只是节点上的标志。例如,假设您在master中有3个提交,其ID为A,B和C.

A - B - C [master]

master是一个指向提交C的标志。当你进行新的提交时,D,它随之移动。

A - B - C - D [master]

当您创建分支时,如git branch feature,它会添加一个指向当前提交的新标记。

A - B - C - D [master]
              [feature]

当您提交功能时,主人员仍在D。

A - B - C - D [master]
             \
              E [feature]

当你提交掌握时,功能保持不变。

A - B - C - D - F [master]
             \
              E [feature]

所以你看,分支实际上是分支。 master和feature被称为“branch head”,因为它们指向分支的头部。您可以让多个分支头指向同一个提交。

功能“继承”,或者更确切地说,由于图形的布局,与主服务器共享A,B,C和D.有关A,B,C或D的 ,它们由特定分支拥有。由于图表的布局方式,它们只是功能和主分支头的祖先。

  

当我对分支上的某些文件进行非分段更改(之后不运行git add或git commit)然后通过git checkout -b newbranch创建一个新分支时,新分支也将“继承”我的更改来自原始分支。

     

当我在分支上然后创建一个新分支,并对新分支上的某些文件进行非分段更改,并通过git checkout originalbranch切换回原始分支时,原始分支也将“继承” “我对新分支的更改。

“继承”是错误的词。更像是“独自留下”,因为两个分支指向同一个提交。

只有一个工作目录,只有一个临时区域。签出新提交时,Git必须更改工作目录以匹配新提交并清除暂存区域。如果修改过的文件位于工作目录或暂存区域,它将拒绝将这些更改消除。

$ git checkout some-branch
error: Your local changes to the following files would be overwritten by checkout:
    some-file
Please commit your changes or stash them before you switch branches.
Aborting

但你所描述的是一个特例。由于newbranch是全新的,因此它指向与旧分支相同的提交。检出它不会更改工作目录中的文件。因此,工作目录和暂存区域中的更改将保持不变。

在这种特殊情况下,所有结账都会切换,当你提交时,哪个分支头会移动。

答案 1 :(得分:1)

  

那为什么是“继承”?

Git不会将当前工作目录(即更改)存储在分支中,每个分支都没有自己的暂存区域。两者都是git存储库的“全局”。因此,当您切换到另一个分支时,git可以选择忽略所有更改并删除它们或尝试将它们应用到您要切换到的分支上。由于git不想在没有明确要求的情况下删除你的工作,git默认保留它们并将它们重新应用到另一个分支上。您当然可以提交或存储它们,然后在结账后您将拥有干净的分支。