有没有办法将特定版本的文件添加到git索引?

时间:2008-11-02 17:12:27

标签: git

我问这个的原因是我不小心做了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_committedHEAD^版本权限拉到索引而不触及工作副本,那会更容易。由于索引已经表示我想要的状态,我可以修改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是否存在,如果存在,是什么名称?

3 个答案:

答案 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
相关问题