我问这个的原因是我不小心做了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-magic-pony
替换为git-checkout
所得到的,除了要求保持工作副本不受影响且仅更新索引的要求。似乎没有办法让git-checkout
不接触两者。
我的问题是:git-magic-pony
是否存在,如果存在,是什么名称?
答案 0 :(得分:4)
右。如果要将修订从HEAD或其他修订移动到索引,则使用'git reset REVISION - file' - 然后,您将使用'git commit --amend'来修改提交。碰巧我正在进行一项审查,目的是让文件更加明显,如何将文件从A移动到B。
当然更简单的方法是启动'git-gui',点击'修改最后提交'按钮,然后点击gui的commit inventory部分中的文件图标,然后'commit'
答案 1 :(得分:2)
看起来您可以使用git update-index
执行此类操作:
git update-index --cacheinfo 100644 5be7e154c284fb8de8ddca0bb18b72a73089df9b filename
您需要获取要返回的文件的模式(上面的100644)和sha1(您可以从git ls-tree
获取此信息)。然后你可以git commit --amend
,你的工作副本也不会受到影响。
答案 2 :(得分:2)
Sol基于Greg Hewgill回答, git-magic-pony
是我要编写的shell脚本,如下所示:
#!/bin/sh
git ls-tree "$@" | while read mode type hash path ; do
git update-index --cacheinfo $mode $hash "$path"
done