我使用Git相对较新。这就是我到目前为止所做的:
$ git branch
* master
$ git status
# On branch master
nothing to commit (working directory clean)
$ git branch mywork
$ git checkout mywork
$ git branch
* mywork
master
...modify some files...
$ git status
# On branch mywork
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: file1.html
# modified: file2.html
#
no changes added to commit (use "git add" and/or "git commit -a")
现在如果我切换到我的其他分支,我希望我的更改保持在这个分支内。然而,看起来这些变化伴随着我:
$ git checkout master
M file1.html
M file2.html
Switched to branch 'master'
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: file1.html
# modified: file2.html
#
no changes added to commit (use "git add" and/or "git commit -a")
我做错了吗?或者我误解了我对Git的使用?
答案 0 :(得分:4)
您的工作目录和存储库是彼此独立的,因为工作目录中的代码在提交之前不与分支关联。
为了进一步混淆水域,git引入了一个名为索引的新概念,它是工作目录和存储库之间的一个临时基础。当您在文件上运行git add
时,您真正做的是将其添加到索引中。同样,当您运行git commit
时,最终会将索引的内容添加到存储库中。
git status
区分索引和工作目录,如下所示。
Changes to be committed:
表示索引中的更改Changed but not updated:
表示工作目录中已更改为已添加到存储库的文件(以后不会被忽略)Untracked files:
表示工作目录中已更改 not 已添加到存储库的文件如果您暂时想要保存一些更改但不保证自己的分支,请使用git stash
。这是git用于创建极其轻量级的单一提交分支的机制。来自man page(强调是我的):
想要录制时使用
git stash
工作的当前状态 目录和索引,但想要 回到干净的工作目录。 该命令保存您的本地 修改并恢复 工作目录以匹配HEAD
提交。
答案 1 :(得分:3)
在切换回主分支之前,您需要添加更改并将其提交给分支。
使用:
git checkout mywork
# Modify files
git add . # Adds all edited files to the repository
git commit -m "Message about the changes"
git checkout master
您可以在The Git Book
找到有关Git的大量信息答案 2 :(得分:1)
这是因为你没有在mywork分支中提交它们。一旦你提交它们并签出主分支,你就不会发现这些变化
你会发现this SO非常有帮助
答案 3 :(得分:1)
在比其他(正确)答案更简洁的英语中:git checkout
不会踩踏它不知道的文件。由于你没有对file1.html和file2.html进行过git add
,因此git不了解它们,因此在更改分支时不会删除它们。
如果你在分支mywork上add
和commit
,那么当你检查主人时他们会离开,当你检查我的工作时他们会回来。