3

git revert --no-commit众所周知,您可以使用来撤消特定更改的更改。这会更新工作副本索引,但不会提交还原。有没有办法更进一步,更新工作副本而不更新索引?(即更改将是unsteded)。我知道您可以使用它git checkout来获取特定提交的工作副本,但这也会创建一个分离的头。我只想用还原的更改来更新工作副本。

4

2 回答 2

3

您可以使用临时索引来保持原始索引不受干扰:

true_index=$(git rev-parse --git-dir)/index
export GIT_INDEX_FILE=.mytmpindex    
cp "$true_index" .mytmpindex
git revert -n  <some-commit-id>
rm .mytmpindex
unset GIT_INDEX_FILE

如果您没有希望保留的分阶段更改,您可以简单地执行以下操作:

git revert -n <some-commit-id>
git reset
于 2013-11-13T22:59:23.067 回答
2

如果您想要达到的树状态已经存在于您的历史记录中(例如,您正在恢复最新的提交并且绝对希望这样做),只需连续使用两次重置:

wished_index=$(git rev-parse HEAD)
git reset --hard $wished_tree
git reset $wished_index

如果没有,你仍然可以使用revert,你只需要在之后修复你的索引:

git revert $commit
git reset HEAD^

这两种方式都需要一棵干净的工作树(否则git stash才能到达那里),而给你留下一棵肮脏的树。

于 2013-11-13T23:07:51.460 回答