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

您的工作目录和存储库是彼此独立的,因为在提交分支之前,工作目录中的代码不会与分支关联。

为了进一步搅乱局面,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上使用addcommit,它们会在你签出master时消失,在你签下mywork时回来。

这是因为您尚未在mywork分支中提交它们。一旦你提交它们并签出主分支,你就不会发现发生了变化

你会发现这篇SO文章对非常有用

相关内容

最新更新