对分支master
进行一些更改后,我决定从一个新分支开始工作。我做了git checkout -b new_branch_name
并创建并检出了一个新的分支。 git status
显示了我对master
所做的更改。
我很好奇我的更改现在是在两个分支上(master
和new_branch_name
)还是new_branch_name
。所以我检查了master
并注意到我的更改也在那里。所以我用git checkout -- fileThatChanged
恢复了这些更改。这些变化确实从master
开始。
不幸的是,检出new_branch_name
并运行git status
表示我的更改也会从该分支中恢复。
我想了解发生了什么,以后如何避免这种情况。
一种解决方案是在开始工作之前创建/签出新分支。
答案 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)
索引在所有分支机构之间共享。因为它是当地的工作树。 它代表将要承诺的内容,而不假设它将在什么分支中承诺 但这意味着您恢复更改(即将其从索引或本地工作区中删除),无论您处于何种分支,它都将被还原。
另见:
答案 2 :(得分:1)
您的工作目录/索引中的已修改的更改(您在git status中看到的)未链接到分支但是很常见。因此,当您切换分支时,更改仍将在新分支中。如果撤消更改,则在切换分支时会看到这些更改。您应该在更改分支之前提交或存储。
答案 3 :(得分:1)
正如拉斯克斯所说,你没有提交这些改变。
如果您想在记住工作副本时切换分支,则必须使用git stash
。
完成后,您可以使用git stash pop
恢复进程内工作目录。