我刚刚遇到了一个对我来说似乎不合逻辑的情况。我有一个包含大量提交的仓库,因此目前它只有一个分支(掌握)。
假设这个分支有一个名为我的文件.txt。现在我需要创建一个不同的分支,因为我想对一些文件进行一些更改,但我不想直接在 master 分支上进行更改,所以我运行:
git checkout iss53
现在模式如下所示:
好的,我已切换到分支iss53,我跑ls -l
了,我的文件.txt. 其中一个变化是删除我的文件.txt文件,因此:
git rm MyFile.txt
很好,ls -l
再次运行表明没有我的文件.txt所以我又回到了掌握分支:
git checkout master
但...我的文件.txt文件也消失了。我的逻辑是,如果我删除了分支上的文件,它应该应用仅有的到那个分支,那么为什么文件从掌握分支呢?请注意,我还没有做任何提交,只是分支而已。
笔记:两张图片均来自Git 源码。
答案1
答案就在你的问题里:
请注意,我还没有做出任何提交,只是进行分支。
如果您不提交,更改将始终保留在您的工作目录中。切换分支不会影响您的工作目录,工作目录也不会影响您的最后一次提交。您看到文件已被删除,但实际上它只是从您的工作目录中删除。如果您想清除更改并返回到最后一次提交,请使用以下命令:
git reset --hard HEAD
因此该文件将被再次恢复。
也许这对你来说不合逻辑,但这种行为很有用。想象一下,你有两个分支:master
和development
,development
在将更改移至之前,你应该始终在 上工作master
。假设你development
在开始工作之前忘记切换到 ,然后在提交之前,你意识到自己在 上master
。解决方案很简单,只需切换到development
然后提交。
答案2
每当我从我的一个分支(我称之为登录)中删除一个文件时,它都不会将其从主分支中删除。
- 我切换到了登录分支
git checkout login
- 删除了 test.html 文件
git rm --cached test.html
- 已将所有内容添加到暂存区
git add .
- 使用以下方式提交更改
git commit -m 'removed test.html file'
- 使用以下代码将本地仓库推送到 Github 远程仓库:
git push