当我试图理解撤销各种git操作的方法时,我想到了一个不确定如何处理它的场景。免责声明:我在实际与git“生产中”合作时没有这种情况,但我仍然认为这不仅仅是一个学术问题。
让我们看看下面的场景
-
操作先前提交的文件:
echo "some content" >> example.txt
-
准备更改:
git add example.txt
-
签出上次提交的更改:
git checkout @ -- example.txt
-
意识到您选择了错误的文件,并且希望撤消最后一个命令以获取更改(
"some content"
)回来
我想在引擎盖下发生的事
每次转移更改时
git add
blob对象是在
.git/对象/
以及索引文件(
.git/索引
)得到更新。如果我多次更改和添加内容,将有多个blob。旧的没有立即被垃圾收集。
当从上面运行checkout命令时,索引会立即得到更新(我还假设内容只在我的工作目录中,但未分页)。这样参考就不见了,我不能用
git checkout-index
还原它们。
除非垃圾收集在技术上仍然存在。但我不知道怎样才能把它弄回来,然后手动地寻找散列,并用
git cat-file
. 跑步也是如此
Git添加
很多次,尽管在这里想要返回先前的阶段性更改可能不是一个真正的用例。(或者当从储藏室弹出变化时?……)
所以所有这些归结为以下问题:
-
有什么像
git reflog
为了索引?
-
是
git checkout @ -- file
被认为是像git这样危险的命令
reset --hard
你在哪里可能会放松工作?
如果答案是“不”或“是”(我目前的推测):
-
有手动更改/重写索引的管道命令吗?(见上例,物体仍在那里)
奖励:有没有其他方法可以在不立即转移文件的情况下签出单个文件?