我之所以问这个问题,是因为我不小心执行了一个git commit -a
命令,结果提交了一个我不想提交的文件。我的解决方案如下:
git reset --soft HEAD^
git reset -- file/with/changes_not_to_committed
git commit -C HEAD@{1}
在这里,我将分支倒回了一个提交,同时保留了索引和工作树,然后从较旧的修订版本中拉取了 file/with/changes_not_to_committed
到索引中,然后使用前一个分支头提交的提交消息提交了索引。两个 git-reset
调用都不会触及工作副本,因此我对 file/with/changes_not_to_committed
的修改仍然存在,但不再被记录在 HEAD
修订版本中。
但是,如果我可以将 file/with/changes_not_to_committed
直接从 HEAD^
修订版本中拉到索引中,而不触及工作副本,则会更加容易。由于索引已经代表了我想要的状态,因此我只需修复 HEAD
提交即可,形成如下序列:
git magic-pony HEAD^ file/with/changes_not_to_committed
git commit --amend -C HEAD
这几乎就是用git-checkout
替换git-magic-pony
所能得到的结果,唯一不同的是要求保持工作副本不变,只更新索引。似乎没有办法使git-checkout
仅更新索引而不影响工作副本。
我的问题是:是否存在git-magic-pony
,如果存在,它的名称是什么?