我对使用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的使用?
您的工作目录和存储库是彼此独立的,因为在提交分支之前,工作目录中的代码不会与分支关联。
为了进一步搅乱局面,git引入了一个名为索引的新概念,它是工作目录和存储库之间的中转站。当您在文件上运行git add
时,真正要做的是将其添加到索引中。同样,当您运行git commit
时,您最终将索引的内容添加到存储库中。
git status
区分索引和工作目录如下。
Changes to be committed:
表示索引的变化Changed but not updated:
表示工作目录中对已添加到存储库中的文件的更改(随后不会被忽略)Untracked files:
表示工作目录中已将而非添加到存储库的文件的更改
如果您有一些更改想要暂时保存,但不保证有自己的分支,请使用git stash
。这是git的机制,用于创建一个非常轻量级的单提交分支。来自手册页(重点是我的):
要录制时使用
git stash
工作的当前状态目录和索引,但希望返回到干净的工作目录。该命令保存您的本地修改并恢复与HEAD
匹配的工作目录犯罪
在切换回主分支之前,您需要向分支添加并提交更改。
用途:
git checkout mywork
# Modify files
git add . # Adds all edited files to the repository
git commit -m "Message about the changes"
git checkout master
你可以在Git Book 上找到很多关于Git的信息
用比其他(正确)答案更简单的英语:git checkout
不会踩踏它不知道的文件。由于您还没有对file1.html和file2.html执行git add
,git不知道它们,因此在更改分支时不会删除它们。
如果你在分支mywork上使用add
和commit
,它们会在你签出master时消失,在你签下mywork时回来。
这是因为您尚未在mywork分支中提交它们。一旦你提交它们并签出主分支,你就不会发现发生了变化
你会发现这篇SO文章对非常有用