有没有一种方法可以将特定版本的文件添加到Git索引中?

3

我之所以问这个问题,是因为我不小心执行了一个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,如果存在,它的名称是什么?

3个回答

4

好的。当你想要将修订版本从HEAD或另一个版本移动到索引时,你可以使用'git reset REVISION -- file' - 然后,你可以使用'git commit --amend'来修改提交。恰好我正在进行一项审查,旨在使文件如何像那样从A移动到B更加明显。

当然,一个更简单的方法是打开 'git-gui',点击 'amend last commit' 按钮,然后在 gui 的提交清单部分中单击文件旁边的图标,最后点击 'commit'。


谢谢!这正是我在寻找的。虽然我不同意 GUI 更容易,也许更易发现一些。 :-) - Aristotle Pagaltzis

2

根据Greg Hewgill的回答,git-magic-pony是我要编写的一个shell脚本,其代码如下:

<del>#!/bin/sh
git ls-tree "$@" | while read mode type hash path ; do
    git update-index --cacheinfo $mode $hash "$path"
done</del>

2

看起来你可以使用git update-index实现类似这样的操作:

git update-index --cacheinfo 100644 5be7e154c284fb8de8ddca0bb18b72a73089df9b filename

您需要获取要返回到的文件的模式(100644以上)和sha1值(您可以从git ls-tree中获取此信息)。 然后,您可以使用git commit --amend,而不会影响您的工作副本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接