这是有效的git分支行为吗?

时间:2016-02-13 23:07:57

标签: git

所以我从master创建了一个新的分支list

git:(master) git co -b list
Switched to a new branch 'list'

然后我在list分支中对文件进行了一些更改。 然后我改回master,然后打开那个文件。它也显示了我的变化。这是预期的吗?

也许我不清楚分支是如何工作的,但我的看法是它创建了父分支的副本(在这种情况下为master),然后我们在分支中进行修改(未在master中反映)然后我们合并。 父(或主)保持不变。

如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:5)

  

它也显示了我的变化。这是预期的吗?

是的。

enter image description here

工作目录和索引/阶段区域在存储库级别共享,因此除非您提交更改,否则无论您现在在哪个分支上,他们都将“继续关注”您(参见答案结束时的图像)。

只有提交后,才能切换到“干净”的工作目录+清理索引。

这就是git的表现方式。

  

也许我不清楚分支是如何工作的,但我的看法是它创建了父分支的副本(在这种情况下为master)

Git不会创建任何重复项,当您创建分支时,它只是存储一个引用,以.git/ref/heads下的新名称提交它。 具有分支名称的文件只包含SHA-1,它是您案例中的上一个HEAD

例如:当你开始工作时,你突然意识到没有在当前分支上工作,但你希望创建新的分支而不是所有的变化都在“移动”你到新的分支。 Git将其数据存储在存储库中。当您切换分支时,您设置了一个新的HEAD,但工作目录+暂存区域保持不变。

这是一个演示 - 创建一些文件,然后切换到另一个分支。你可以看到文件在新分支中也是“可见的”。

enter image description here

答案 1 :(得分:1)

您需要先提交更改。 Git允许您在分支之间移动,并在工作目录中进行未提交的更改。发生这种情况时,git会尝试将未提交的更改重新应用到新分支中。

Git只允许您移动未提交的更改,如果它可以安全地执行,git将阻止您移动分支,如果它无法自动重新应用更改;如果具有未提交更改的文件在移动到另一个分支时发生了更改,则可以“git stash”您的未提交更改,并合并未提交的更改。

如果您开始在一个分支中进行更改,然后意识到您实际上想要将它们提交到另一个分支,或者如果您有一组要在多个分支上测试的更改,则此行为通常很有用。