Git:不应该改变他们的分支吗?

时间:2011-06-08 23:41:19

标签: git

我使用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的使用?

4 个答案:

答案 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上addcommit,那么当你检查主人时他们会离开,当你检查我的工作时他们会回来。