对git中分支创建的困惑

时间:2011-11-29 18:23:00

标签: git version-control git-branch git-checkout

对分支master进行一些更改后,我决定从一个新分支开始工作。我做了git checkout -b new_branch_name并创建并检出了一个新的分支。 git status显示了我对master所做的更改。

我很好奇我的更改现在是在两个分支上(masternew_branch_name)还是new_branch_name。所以我检查了master并注意到我的更改也在那里。所以我用git checkout -- fileThatChanged恢复了这些更改。这些变化确实从master开始。

不幸的是,检出new_branch_name并运行git status表示我的更改也会从该分支中​​恢复。

我想了解发生了什么,以后如何避免这种情况。

一种解决方案是在开始工作之前创建/签出新分支。

4 个答案:

答案 0 :(得分:5)

您从未将更改提交到任何一个分支。也就是说,如果你这样做了:

$ git status

看到这样的事情:

# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   myfile.txt
#

对“myfile.txt”的更改在任何分支上都不“存在” - 它们仅在您的本地工作副本中。在将它们安装到存储库之前,它们不会最终出现在分支上。

如果此时我输入:

$ git checkout myfile.txt

这会消除我的更改(并将文件返回到我当前分支上次提交时的状态)。

如果我想在新分支上提交这些更改,我可能会这样做:

$ git checkout -b new_branch_name
$ git add myfile.txt
$ git commit -m "made some changes"

答案 1 :(得分:3)

索引在所有分支机构之间共享。因为它是当地的工作树。 它代表将要承诺的内容,而不假设它将在什么分支中承诺 但这意味着您恢复更改(即将其从索引或本地工作区中删除),无论您处于何种分支,它都将被还原。

另见:

git file transition

答案 2 :(得分:1)

您的工作目录/索引中的已修改的更改(您在git status中看到的)未链接到分支但是很常见。因此,当您切换分支时,更改仍将在新分支中。如果撤消更改,则在切换分支时会看到这些更改。您应该在更改分支之前提交或存储。

答案 3 :(得分:1)

正如拉斯克斯所说,你没有提交这些改变。

如果您想在记住工作副本时切换分支,则必须使用git stash

完成后,您可以使用git stash pop恢复进程内工作目录。