为什么Git中一个分支的更改会影响另一个分支?

4
  1. 我在主分支(master branch)上,
  2. 我提交了所有内容,
  3. 然后我创建了一个新的分支 "git checkout -b xxx",
  4. 接着我切回到主分支 "git checkout master",
  5. 然后我没有使用 "git rm" 命令就删除了主分支上的全部文件,
  6. 我切换到分支xxx时,它显示了一个长长的列表,每个文件都有一个'D'状态,表示被删除了,
  7. 然后我发现分支xxx也有一个空文件夹。

这并不是问题,因为我可以通过 "gt reset --hard HEAD" 在分支xxx中还原。

我只是想知道为什么一个分支的删除操作会影响另一个分支?难道分支不是独立存储的吗?


你删掉后有提交吗?请展示你的git status - Anton Kolyaev
2个回答

3

  1. 然后我尝试使用"git merge xxx"合并我的一个分支,它说“已经是最新的了”

这是因为您的xxx分支已经合并到master中,并且之后xxx没有任何更改。

  1. 我切换到xxx分支时,显示了一个长列表,每个文件都有一个“D”状态

您还没有提交更改并切换到了xxx分支,所以所有更改都移动到了该分支中。

我想知道为什么删除一个分支上的文件会影响其他分支?难道不是每个分支都保存了所有内容吗?

是的,确实如此。但是,如果您在未提交更改的情况下在分支之间移动更改,则可以在每个“最新”的分支中看到它。只需在某个地方提交它,它将按预期运行。

编辑: 对于Git来说,删除文件与修改文件是相同的操作,因此您必须在删除之后,在第5步和第6步之间的某个地方提交更改。


1
我已经复现了,似乎如果我没有在 xxx 分支上提交,那么它只是指向其父分支的一个节点,因此其父分支中的任何更改都将反映在该分支中。您能否更新您的引用,以便我可以接受它? - Albert Gao
@AlbertGao 你有点错了。当你对被跟踪的文件进行更改(例如删除它)时,它处于stage状态。然后你可以移动到任何“最新”的分支,这些更改将跟随你。然后你可以在任何“最新”的分支上提交它,这个删除操作只会影响当前分支。在git分支中没有父子关系,一旦分支从“父”分支派生出来,它就与其他分支具有相同的级别状态。 - Anton Kolyaev
谢谢澄清,这意味着“阶段状态”中的任何内容(我使用的是“git add”)将在我切换分支时跟随我吗? - Albert Gao
@AlbertGao 并不完全正确。它仅在您的分支与目标分支保持最新状态时才有效。如果不是,您的“checkout”将被拒绝,直到您提交更改、回滚或隐藏更改为止。 - Anton Kolyaev
嗯,我还没有提到你要*不使用'git rm'*来完成它。好吧,那么git就会像它根本没有在暂存区一样处理它,并将你的更改拖来拖去。 - Anton Kolyaev
显示剩余3条评论

1

如果你使用Windows系统,为了更好地理解Git分支,建议使用应用程序“Git Extensions”。该应用程序可以显示存储库中的所有分支,使理解更加简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接