在我的git repo master分支中,我有工作dir / tmp / repo_name / secret_code。如果我切换到名为test的新分支,然后切换到rm -rf secret_code
..当我更改回master时,它也会从那里删除secret_code目录。
我认为如果我在git分支上进行更改,它将作为更改的容器,因此在更改为另一个分支时,工作目录将反映分支状态。
为什么当我从分支中删除文件时,这些操作会反映在我的主分支上?
谢谢。
答案 0 :(得分:3)
为什么当我从分支中删除文件时,这些操作会反映在我的主分支上?
因为您修改了工作树:当您切换回master
时,如果master
未对secret_code
进行修改,则会保持工作树不变,git status
将反映删除该文件夹。
这将仅在secret_code
分支中删除test
:
git checkout test
git rm -r secret_code
git add -u .
git commit -m "removes secret_code in test"
然后:
git checkout master
您仍然看到secret_code
分支中的master
。
答案 1 :(得分:2)
VonCs的答案是正确的,但也许它可以帮助您更全面地解释发生了什么。
git中的分支基本上只是指向存储库中提交的指针。你说你在主分支上,然后切换到一个新的分支。那个新分支将开始指向与主分支相同的提交。当您在该新分支上执行提交时,分支将自动更新以指向新提交,而主分支将保持不变。
但是,当你在工作树中更改代码时,它还不是分支的一部分。 Git只是将此视为您在当前HEAD提交之上所做的事情,但它不会将其添加到实际存储库中,直到您告知它为止(通过例如提交或者可能存储)。
现在,当您在工作树中仍有未提交的更改时,切换回主分支。 git应该做什么?您显然希望git使工作树看起来与您正在检出的master的提示完全一样,因此它将恢复您案例中的secret_code目录。但是,正如我之前所说,这些更改尚未在存储库中。这些变化将会丢失。我想你可以想象,如果用户没有意识到他仍然有未提交的更改并且那些会被覆盖,那么这可能会给用户带来很多痛苦......
相反,git会尝试保持工作树的更改。 IIRC,如果您更改了一个也必须通过签出新分支进行修改的文件,它将拒绝签出另一个分支,并将告诉您先提交,存储或还原更改。但在您的情况下,它只能保留更改,以便secret_code目录在您的工作树中保持删除。
但正如改变不是新分支的一部分,它还不是主分支的一部分。只有当您在主分支上实际提交更改时,才会发生这种情况。