【问题标题】:Git checkout is moving file from feature branch to dev branch [duplicate]Git结帐正在将文件从功能分支移动到开发分支[重复]
【发布时间】:2019-07-07 08:57:54
【问题描述】:

我已经阅读了官方 git checkout 文档和一些问题,但没有找到我所看到的行为的答案。

在本地,我有一个开发分支。在 dev 分支中,我创建了一个新的功能分支

git checkout -b myBranch

然后,我添加一个新文件

echo foo > myFile.txt

如果我立即返回 dev 分支

git checkout dev

myFile.txt 已经存在,即使

1) 我没有暂存文件 2) 我没有合并分支

我的期望是我在功能分支中对文件所做的任何更改都不会传播到其他分支。

为什么会这样?

【问题讨论】:

  • 如果您没有commitstash 更改,那么更改将转到您签出的分支
  • 我确认这是预期的行为,谢谢@SajibKhan
  • 要添加到前两个 cmets,myFile.txt 也不在分支 dev 中,它只是在您的沙箱中,未跟踪。即使是git reset --hard 也不会触及未跟踪的文件。我知道的唯一涉及未跟踪文件的命令是git stash --include-untracked
  • @phd 这不是真正正确的副本,但我找不到一个好的。

标签: git git-checkout


【解决方案1】:

E.Omar's answer 是正确的(并且被赞成),但值得强调的是,您的工作树——您查看和使用文件的地方——不是一个分支。这不是提交,也不会被保留!它只是您工作的地方。

保留的东西——永远,或者只要提交本身存在,无论如何——是您在创建 new 时创建的完整快照 提交。但是这个快照根本不是你的 work-tree 的副本!相反,它是您放入 Git 的 index 内容的快照。

索引(也称为暂存区,有时也称为缓存)是一个复杂的东西,但我认为最好将其视为:当你提交时,Git 将放入 下一个 提交中的所有文件。 它开始是你提交的所有文件的副本运行git checkout <em>name</em> 时签出。

如果您在工作树中创建新文件,或者在修改现有文件后,索引不会发生任何事情。它仍然是 commit 中内容的副本。运行 git add 告诉 Git 将文件从工作树复制到索引中,使其准备好进入 next 提交。在那之前,它只是工作树中的一个文件:一个未跟踪文件,如果索引中没有它的副本的话。

另请参阅a comment 中的the answer that phd linked-to 问题Modified files in a git branch are spilling over into another branch(我们已将其用作此问题的副本)。请注意,导致新文件被跟踪(通过git add-ing 新文件)是不够的:您还必须运行git commit 以进行包含文件的永久冻结副本的新提交(加上,当然,所有其他文件)。在那之前,它只是一个未跟踪或跟踪的文件,但不在任何提交中。

【讨论】:

    【解决方案2】:

    发生这种情况是因为您在新分支上创建了新文件,但您没有跟踪它。因此,新文件不仅存在于新分支上,而是属于工作目录而不属于任何特定分支。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-18
      • 2015-11-18
      • 2023-04-08
      • 2023-04-09
      • 2022-01-11
      • 2013-07-25
      • 2020-10-23
      • 2017-09-17
      相关资源
      最近更新 更多